全部博文(31)
分类: 嵌入式
2010-08-23 16:52:12
现实的世界如此复杂,对于嵌入式系统而言, 有些异常,辅以一定的代码处理,可以恢复;有些异常,代码自身不一定有能力从异常中恢复。一个健全的系统,需要考虑各种异常的情况,甚至不能恢复的异常也需要考虑。
当Cortex-M0/M3遇到严重的异常时,它会将自己的PC指针置于某个地址处,并锁死自己。下面列举可能锁死的原因(译自ARMv6-M Architecture Reference Manual B1.5.15)
原因 | 发生时机 | 行为 | 锁死时的PC地址 |
启动时读向量表错误 | 启动时不能读SP或PC | 锁死在优先级-1 | 0xFFFFFFFE |
进入NMI中断时,读向量表错误 | 不能读NMI的中断向量 | 锁死在优先级-2 | 0xFFFFFFFE |
进入HardFault中断时,读向量表错误 | 不能读HardFault的中断向量 | 锁死在优先级-1 | 0xFFFFFFFE |
内存错误 - Instruction | 优先级-1或-2 | 锁死在当前优先级 | 0xFFFFFFFE |
内存错误 - Imprecise Data | 优先级-1或-2 | 锁死在当前优先级 | 0xFFFFFFFE |
内存错误 - Precise Data | 优先级-1或-2 | 锁死在当前优先级 | 0xFFFFFFFE |
内存错误 - 进入NMI中断时,压栈内容出错 | 在进入NMI之前的优先级为-1(HardFault) | 锁死在优先级-1或-2(跟实现相关) | 0xFFFFFFFE |
内存错误 - 出栈错误 | 出栈时发生错误 | 锁死在优先级-1或-2或进入HardFault中断 | 0xFFFFFFFE |
SVC | 优先级-1或-2 | 锁死在当前优先级 | 0xFFFFFFFE |
Usage Fault | 优先级-1或-2 | 锁死在当前优先级 | 0xFFFFFFFE |
未定义指令 | 优先级-1或-2 | 锁死在当前优先级 | 0xFFFFFFFE |
断点(BKPT) | 优先级-1或-2 | 锁死在当前优先级 | 0xFFFFFFFE |
原因一堆,总之就一句话,排除硬件故障的话,就是程序出错了,然后PC就跑到0xFFFFFFFE处不回来了。
当这种情况出现时,用IAR+Nu-Link调试,会做静默处理,需要留意PC的值以便作出判定;
用Keil+Nu-Link调试,会尝试读PC处的内容,于是显示读不到数据的对话框。