Cortex-M3 异常返回值EXC_RETURN 迈不过友情╰ 2021-11-18 01:10 349阅读 0赞 **【EXC\_RETURN】** 在进入异常服务程序后,硬件自动更新LR的值为特殊的EXC\_RETURN。 当程序从异常服务程序返回,把这个EXC\_RETURN值送往PC时,就会启动处理器的异常中断返回序列。 因为LR的值EXC\_RETURN是由硬件自动设置的,所以只要没有特殊需求,就不要改动它。 RETURN的高28位全为1,只有bit\[3:0\]的值有特殊含义。位段如下: ![333765-20190729114626593-1511092716.jpg][] 合法的EXC\_RETURN值共有3个,如下: ![333765-20190729114636358-189533455.jpg][] * 如果主程序在线程模式下运行,并且在使用MSP时被中断,则在服务程序中LR=0xFFFFFFF9(主程序被打断前LR已被自动入栈)。 * 如果主程序在线程模式下运行,并且在使用PSP时被中断,则在服务程序中LR=0xFFFFFFFD(主程序被打断前LR已被自动入栈)。 * 如果主程序在Handler模式下运行,则服务程序中LR=0xFFFFFFF1(主程序被打断前LR已自动入栈)。这是所谓的“主程序”,其实更可能时被抢占的中断服务程序。事实上,在嵌套时,更深层ISR所看到的LR总是0xFFFFFFF1。 **【LR的值在异常期间被设置为EXC\_RETURN(线程模式使用主堆栈)】** ![333765-20190729114736534-1921492233.jpg][] **【LR的值在异常期间被设置为EXC\_RETURN(线程模式使用进程堆栈)】** ![333765-20190729114753597-864352133.jpg][] **【注意】** * 进入中断时LR的值是CPU自动设置的,不会有错,为什么退出中断时会有可能LR值变成非法的了呢?只有一个原因:中断例程修改了LR的值,改错了。 * 由EXC\_RETURN的格式可见,我们不能把0xFFFFFFF0~0xFFFFFFFF的地址作为任何返回地址。其实也不用担心会弄错,因为Cortex-M3已经把这个范围标记成“取指不可区”了。 -------------------- 参考摘录: 《Cortex-M内核系列和STM32-讲座2教程.pdf》 《ARM Cortex-M3权威指南.pdf》 转载于:https://www.cnblogs.com/utank/p/11263073.html [333765-20190729114626593-1511092716.jpg]: /images/20211116/931dcc6448c44bdfaccdfc6073790166.png [333765-20190729114636358-189533455.jpg]: /images/20211116/718464c8c35c4eda9f56e41a2aaca5c3.png [333765-20190729114736534-1921492233.jpg]: /images/20211116/7dab56940e074defbc907f5c352d6970.png [333765-20190729114753597-864352133.jpg]: /images/20211116/957496c894f243e4acddd25693ef8b6c.png
还没有评论,来说两句吧...