STM32 有时会在重启时出现硬故障(拇指指令问题?)

问题描述 投票:0回答:2

STM32L496 micro 在循环上电时出现硬故障,但仅在某些固件版本上,其他固件正常。我已经能够追踪到程序集中的特定路径,看起来正在发生的事情是使用 LDR 命令将向量表地址加载到 R3 中,然后使用 BX 对该地址进行分支。有时,它似乎抓住了向量表中的地址,但差了一个字节。这是一个简短的总结:

它应该如何工作:

LDR R3,[R0] ---> R3 = [0x20001188] = 0x080422F0

LDR R3,[R3,#8] ---> R3 = [0x080422F8] = 0x0801E421

BX R3 ---> 分支到地址 0x0801E421

向量表数据:

[0x080422F8] = 0x0801E421

[0x080422FC] = 0x0801E441

但是我有时会在重启时看到硬故障,核心转储显示:

R3 = 0x410801E4

这实际上是正确的数据,但好像它是由一个字节读取的(即,从 0x080422F9 读取,而不是 ...F8)。注意 MSB 是向量表中从上面算起的下一个地址的 LSB。更改代码时,该字节(此处为 41)会发生变化,但在故障中始终显示为该字节,因此我非常有信心它引用的是地址,但偏离了一个字节。 (也就是说,如果 0x080422FC 处的 LSB 为“B1”,则 R3 将等于 0xB10801E4,这是非常可重复的) 注意:这永远不会发生在调试模式下,单步执行代码,但只需循环电源就可以重复。

我知道 cortex m4 使用 Thumb 指令,thumb 使用 bit[0] set to '1'。似乎有道理,这可能就是为什么它似乎访问地址 + 1,但为什么只在这种情况下,为什么只有某些构建?

我已经尝试将堆栈大小添加到我的线程(应该不是问题),很多代码更改和修改都是为了跟踪这个。

cortex-m instruction-set fault thumb
2个回答
1
投票

cortex-m不支持arm模式。仅支持拇指模式。所以如果你的代码切换可能你正在为错误的平台编译


0
投票

从那以后我就想通了。它与拇指指令无关。本质上,引导加载程序有一个递增 tick 的中断,并且在跳转到应用程序之前不会禁用该中断,因此在某些情况下 tick 会递增一次,这实际上会递增存储在应用程序中相同 RAM 地址的闪存地址。 离开引导加载程序时始终禁用中断!

© www.soinside.com 2019 - 2024. All rights reserved.