首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Arm Cortex-M4 LDRD指令导致硬故障

Arm Cortex-M4 LDRD指令导致硬故障
EN

Stack Overflow用户
提问于 2021-04-30 13:40:58
回答 1查看 523关注 0票数 1

我注意到,在Cortex-M3中,LDRD (load double word)是在勘误表中列出,但是我没有发现与Cortex-M4类似的情况,而且无论如何,在执行过程中似乎没有出现中断。我正在使用一个M4微控制器,并将数据传递给或从主机传送。处理主机(相同体系结构)处理数据的形状非常方便--例如,如果主机传递一个无符号16位整数,我接受它为uint16_t,即使它位于两个字节数组data_in中。

代码语言:javascript
复制
uint16_t some_data = *(uint16_t *)data_in;

但是,当我尝试使用无符号64位整数执行此操作时,生成的LDRD指令会出现一个硬错误:

代码语言:javascript
复制
uint64_t some_data = *(uint64_t *)data_in;

生成:

代码语言:javascript
复制
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来读取?不管是哪种情况,有没有人看到过这条指令的错误信息?我在官方文件里找不到。

而且,为了完整起见,这段不那么有趣的代码工作得很好:

代码语言:javascript
复制
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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-30 14:03:02

在ARMv7M架构参考手册中,A3.2.1节“对齐行为”中写道:

以下数据访问总是生成对齐错误:

  • 非半字对齐LDREXH和STREXH。
  • 非字对齐LDREX和STREX。
  • 非字对齐LDRD,LDMIA,LDMDB,POP,最不发达国家,VLDR,VLDM和VPOP。
  • 非字对齐STRD,STMIA,STMDB,PUSH,STC,VSTR,VSTM和VPUSH .

因此,除非您知道data_in至少对32位,否则不能将其转换为(uint64_t*)并期望它工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67334962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档