【发布时间】:2014-01-31 19:33:38
【问题描述】:
我遇到了指针算术的奇怪行为。我正在开发一个程序,使用 ARM GNU 工具链(在 Linux 上)从 LPC2148 开发 SD 卡。我的 SD 卡一个扇区包含数据(十六进制),如(从 linux“xxd”命令检查): fe 2a 01 34 21 45 aa 35 90 75 52 78 打印单个字节时,打印效果很好。
char *ch = buffer; /* char buffer[512]; */
for(i=0; i<12; i++)
debug("%x ", *ch++);
这里调试函数在 UART 上发送输出。 然而,指针算术特别添加一个不是 4 的倍数的数字,给出了太奇怪的结果。 uint32_t *p; // uint32_t 是 typedef 到 unsigned long。
p = (uint32_t*)((char*)buffer + 0);
debug("%x ", *p); // prints 34012afe // correct
p = (uint32_t*)((char*)buffer + 4);
debug("%x ", *p); // prints 35aa4521 // correct
p = (uint32_t*)((char*)buffer + 2);
debug("%x ", *p); // prints 0134fe2a // TOO STRANGE??
我是否选择了错误的编译器选项?请帮忙。 我尝试了优化选项 -0 和 -s;但没有变化。
我可以想到小/大端,但在这里我得到了意想不到的数据(以前的字节)并且没有顺序颠倒。
【问题讨论】:
-
感谢您快速回复,将我重定向到重复的问题。我的 ARM 架构是 ARM7TDMI,正如大家所指出的,它不支持非对齐访问。但可能出于同样的原因,即使结构成员访问也会给出不正确的结果。出于这个原因,我无法在我的 SD 卡上使用任何现成的库,比如 fat。任何提示/解决方案都会有很大帮助。
-
@user3258584 尝试禁用旋转功能并强制 cpu 创建中止并在那里处理未对齐的访问。您在编译时尝试过
-mno-unaligned-access吗? gcc.gnu.org/onlinedocs/gcc/ARM-Options.html -
感谢您的建议。我一定会尝试这个解决方案。并在此处更新结果。
标签: gcc arm pointer-arithmetic