在调试期间,我收到以下错误消息。
Alignment trap: my_main (29858) PC=0x00170ad8 Instr=0xe5960008 Address=0x00f28daa FSR 0x0f3
我看了一下,发现了很多关于real-time embedded website的信息。
所以现在我知道PC
和Instr
指的是什么,但我仍然没有找到关于Address
和FSR
部分的任何内容。
什么是FSR
? Address
指的是什么地址?根据{{1}},该地址甚至超出了我的计划范围。有人知道最后两项是什么意思吗?我需要有关这些的信息来解决这种对齐问题。
MAP输出
proc/xxxx/maps
答案 0 :(得分:16)
PC=0x00170ad8
这告诉您程序计数器的当前值,它可用于确定程序中哪条指令导致陷阱。如果您按照我的想法使用ARM,那么这实际上是当前指令加上8,因此导致陷阱的指令位于0x00170ad0
。
Instr=0xe5960008
这是错误指令的编码。如果这是在ARM上,那么该指令是ldr r0, [r6, #8]
Address=0x00f28daa
这告诉您程序尝试加载的地址,从而导致错误。假设到目前为止的其他所有内容都是正确的,这是r6 + 8
,因此r6
在发生错误时保持0x00f28da2
。
FSR 0xf3
这是故障状态寄存器中保存的值。它告诉你发生了什么错误。此特定值是对齐故障的旧编码(ARMv7之前版本)。
答案 1 :(得分:1)
很可能您的CPU不支持在未对齐的地址处从/向内存读取/写入。如果你正在访问一个4字节的变量,那么显然地址= 0x00f28daa不是4的倍数。只能在任意对齐的地址读/写单个字节。
那篇文章解释得很好。