gpt4 book ai didi

c - 来自 LDRH 指令的 CortexM0+ 故障

转载 作者:太空宇宙 更新时间:2023-11-04 02:51:30 27 4
gpt4 key购买 nike

我有一个在 M3 架构上运行良好的代码库,并且正在将一些代码移植到 M0+。我遇到了错误,我不知道为什么。我使用的确切微型是 KL36Z128 (Freescale)。我正在为我的工具链使用 ARM-GCC-2013-Q3 版本。

这里是 C 代码(它用于解析传入的数据包,所以一旦我获得足够的数据,我就开始挑选我需要的内容来填写命令结构):

状态->cmd = *((U16*)&din[15]);//代码库有“遗留”类型定义

生成的程序集是:

0x4250 <+0x0014> 添加 r1, #15

0x4252 <+0x0016> ldrh r1, [r1, #0] <--- 错误指令!

0x4254 <+0x0018> strh r1, [r0, #2]

故障发生时的寄存器值为:

r0 = 0x1ffff2ccr1 = 0x1ffffad8

我不知道这里发生了什么——这看起来非常简单。寻址似乎还可以。飞思卡尔数据表说 RAM 由 2 个部分组成:

SRAM_L:(0x20000000-1KB) 到 0x20000000(所以它的下半部分是总 SRAM 的 1/4)

SRAM_H:0x20000000 到 (0x20000000+3KB)

我最初认为生成的代码可能有问题,以及可以使用哪些指令访问不同库中的内存 - 但我一无所获。

此外,“din”值在函数参数列表中定义为:const U8 *din

有什么想法吗?

最佳答案

state->cmd = *((U16*)&din[15]);

* 操作执行未对齐访问,因为 din[15] 元素是 uint8_t 类型但作为 uint16_t 访问(或 U16)对象。 Cortex-M0/M0+ 不支持未对齐访问,任何执行未对齐访问的尝试都会引发 HardFault。

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0497a/BABFAIGG.html

要修复您的程序,请将 din 元素作为 uint8_t 对象访问:

 state->cmd = (din[16] << 8) | din[15];

关于c - 来自 LDRH 指令的 CortexM0+ 故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21661119/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com