적어도 ARMv5까지의 ARM CPU는 워드 정렬되지 않은 메모리 주소에 대한 임의 액세스를 허용하지 않습니다. 문제의 길이는 여기에 설명되어 있습니다 : http://lecs.cs.ucla.edu/wiki/index.php/XScale_alignment - 하나의 해결책은 코드를 다시 작성하거나 처음부터이 정렬을 고려하는 것입니다. 그러나 그것은 어떻게 말하지 않았습니다. 바이트 스트림에서 2 바이트 또는 4 바이트 정수가 있고 스트림에 단어가 정렬되어 있지 않습니다. 성능을 많이 저하시키지 않으면 서이 데이터에 현명한 방법으로 어떻게 액세스합니까?ARM 프로세서에서 워드 정렬 데이터에 무작위로 액세스하는 방법은 무엇입니까?
filling buffer: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10
accessing with short: 0100 0201 0302 0403 0504 0605 0706 0807 0908 0A09 0B0A 0C0B 0D0C 0E0D 0F0E
accessing with long: 03020100 04030201 05040302 06050403 07060504 08070605 09080706 0A090807 0B0A0908 0C0B0A09 0D0C0B0A 0E0D0C0B 0F0E0D0C
ATMEL AT91SAM9G20 ARMv5 코어에 내가 (주 얻을 :
내가 문제를 설명하는 코드가 있습니다 출력 이것을 86 CPU에
#include <stdio.h>
#include <stdlib.h>
#define BUF_LEN 17
int main(int argc, char *argv[]) {
unsigned char buf[BUF_LEN];
int i;
unsigned short *p_short;
unsigned long *p_long;
/* fill array */
(void) printf("filling buffer:");
for (i = 0; i < BUF_LEN; i++) {
/* buf[i] = 1 << (i % 8); */
buf[i] = i;
(void) printf(" %02hhX", buf[i]);
}
(void) printf("\n");
/* testing with short */
(void) printf("accessing with short:");
for (i = 0; i < BUF_LEN - sizeof(unsigned short); i++) {
p_short = (unsigned short *) &buf[i];
(void) printf(" %04hX", *p_short);
}
(void) printf("\n");
/* testing with long */
(void) printf("accessing with long:");
for (i = 0; i < BUF_LEN - sizeof(unsigned long); i++) {
p_long = (unsigned long *) &buf[i];
(void) printf(" %08lX", *p_long);
}
(void) printf("\n");
return EXIT_SUCCESS;
}
인이있다 이 CPU의 예상되는 동작!) :
filling buffer: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10
accessing with short: 0100 0100 0302 0302 0504 0504 0706 0706 0908 0908 0B0A 0B0A 0D0C 0D0C 0F0E
accessing with long: 03020100 00030201 01000302 02010003 07060504 04070605 05040706 06050407 0B0A0908 080B0A09 09080B0A 0A09080B 0F0E0D0C
그래서 주어진 바이트 스트림에 액세스해야합니다. 정렬되지 않은 주소에서 : ARM에서 어떻게 효율적으로 처리 할 수 있습니까?
정렬을하면 성능이 떨어지며 팔과 밉 등으로 제한되지 않습니다. x86 정렬 액세스에서도 성능이 크게 향상되고 ARM뿐 아니라 모든 곳에서 수행해야하는 작업입니다. –