Cortex-M3/M4处理器进入异常/中断时寄存器的压栈内容+压栈顺序

2019-12-21 12:07发布

大致简介:
小弟最近在看<<权威指南>>,想稍微深入点了解下cm3/cm4内核机制,遇到如下问题,恳请指教...

开发环境:
stm32f103zet6+mdk5.14 硬件仿真

具体问题:
<<权威指南>>上说,进入异常/中断时的压栈顺序如下图(暂时不考虑浮点寄存器):

001.png (124.65 KB, 下载次数: 0) 下载附件 2017-5-31 17:27 上传

第一张图:
xPSR->XXX->XXX->R12->R3->R2->R1->R0

问题1: XXX XXX 分别是指什么啊???

问题2: EXC_RETURN搞哪去了???

第二张图:

问题3: 此时都已经进入ISR服务函数内部,现在才存储EXC_RETURN?会不会太晚?

问题4: 如果是这样的话,那总共压栈的字内存就已经超过8字了(计算不考虑压入的R8-R4用作保存局部变量,那总共压栈的字数也有9个字了啊)?

恳请大神指教~~~


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
有缘于你
1楼-- · 2019-12-21 17:56
 精彩回答 2  元偷偷看……
擦鞋匠
2楼-- · 2019-12-21 18:36
准备好小板凳,等待大神入座...
XA144F
3楼-- · 2019-12-21 20:06
追踪Hardfault发生位置时就用的这个,很好使呢。
norman33
4楼-- · 2019-12-21 20:52
第二张图对的,明显是进入中断后又有入栈操作了 也就是说在断点前已经有过进中断入栈操作并且比进中断的入栈还多了几次 具体为什么多几次入栈要看反汇编了
有缘于你
5楼-- · 2019-12-21 23:30

问题1: XXX XXX 分别是指什么啊???
XXX XXX应该就是LR和PC, 你这个断点在C函数里面, 执行到断点处LR和PC值已经被更改, 不能看图中的LR和PC

问题2: EXC_RETURN搞哪去了???
参考第一问

问题3: 此时都已经进入ISR服务函数内部,现在才存储EXC_RETURN?会不会太晚?
此时的LR是新的值, 与中断发生的LR无关, 此时入栈的是C函数的调用LR

问题4: 如果是这样的话,那总共压栈的字内存就已经超过8字了(计算不考虑压入的R8-R4用作保存局部变量,那总共压栈的字数也有9个字了啊)?
入栈dword个数多少都没有关系, handler中的出入栈可以不管, 编译器会处理好, 与中断的堆栈保存无关, 中断还是8个dword
擦鞋匠
6楼-- · 2019-12-22 00:33
 精彩回答 2  元偷偷看……

一周热门 更多>