我注意到,在Cortex-M3中,LDRD (load double word)是在勘误表中列出,但是我没有发现与Cortex-M4类似的情况,而且无论如何,在执行过程中似乎没有出现中断。我正在使用一个M4微控制器,并将数据传递给或从主机传送。处理主机(相同体系结构)处理数据的形状非常方便--例如,如果主机传递一个无符号16位整数,我接受它为uint16_t,即使它位于两个字节数组data_in中。
uint16_t some_data = *(uint16_t *)data_in;但是,当我尝试使用无符号64位整数执行此操作时,生成的LDRD指令会出现一个硬错误:
uint64_t some_data = *(uint64_t *)data_in;生成:
9B01 ldr r3, [sp, #4]
330C adds r3, #12
E9D32300 ldrd r2, r3, [r3, #0]
4902 ldr r1, =SOME_ADDR <some_data>
E9C12306 strd r2, r3, [r1, #24]我在E9D32300 ldrd r2, r3, [r3, #0]上表现很差。
所以问题是,除了可能的可移植性问题(这里不是问题),我是否做了一些根本错误的事情,指向一个uint64_t的位置,并试图将它作为一个uint64_t来读取?不管是哪种情况,有没有人看到过这条指令的错误信息?我在官方文件里找不到。
而且,为了完整起见,这段不那么有趣的代码工作得很好:
uint64_t some_data = ((uint64_t)data_in[7] << 8*7) |
((uint64_t)data_in[6] << 8*6) |
((uint64_t)data_in[5] << 8*5) |
((uint64_t)data_in[4] << 8*4) |
((uint64_t)data_in[3] << 8*3) |
((uint64_t)data_in[2] << 8*2) |
((uint64_t)data_in[1] << 8*1) |
((uint64_t)data_in[0] << 8*0);发布于 2021-04-30 14:03:02
在ARMv7M架构参考手册中,A3.2.1节“对齐行为”中写道:
以下数据访问总是生成对齐错误:
因此,除非您知道data_in至少对32位,否则不能将其转换为(uint64_t*)并期望它工作。
https://stackoverflow.com/questions/67334962
复制相似问题