读 “cortexM3” 权威指南 小记(二) --中断具体行为及存储系统
1,中断异常的响应
当CM3 开始响应一个中断时,会在它看不见的体内奔涌起三股暗流:
入栈: 把8 个寄存器的值压入栈 ::响应异常的第一个行动,就是自动保存现场的必要部分:依次把xPSR, PC, LR, R12 以及R3‐ R0由硬件自动压入适当的堆栈中:如果当响应异常时,当前的代码正在使用PSP,则压入PSP,即使用线程堆栈;否则压入MSP,使用主堆栈。一旦进入了服务例程,就将一直使用主堆栈
取向量:从向量表中找出对应的服务程序入口地址 ::当数据总线(系统总线)正在为入栈操作而忙得团团转时,指令总线(I‐ Code总线)可不是凉快地坐着看热闹——它正在为响应中断紧张有序地执行另一项重要的任务:从向量表中找出正确的异常向量,然后在服务程序的入口处预取指。入栈与取指这两个工作能同时进行。
选择堆栈指针MSP/PSP,更新堆栈指针SP ,更新连接寄存器 LR ,更新程序计数器PC
2.异常返回
当异常服务例程执行完毕后,需要很正式地做一个“异常返回”动作序列,从而恢复先前的系统状态,才能使被中断的程序得以继续执行。从形式上看,有3 种途径可以触发异常
返回序列,如表所示;不管使用哪一种,都需要用到先前储的LR 的值。
存储器的位带操作
支持了位带中,有两个区中实现了位带。其中一个是SRAM 区的最低1MB 范围,第二个则是片内外设区的最低1MB 范围。这两个区中的地址除了可以像普通的 RAM 一样使用外,它们还都有自己的“位带别名区”,位带别名区把每个比特膨胀成一个32位的字。当你通过位带别名区访问这些字时,就可以达到访问原始比特的目的。
支持位带操作的两个内存区的范围是:
0x2000_0000‐0x200F_FFFF(SRAM 区中的
0x4000_0000‐0x400F_FFFF(片上外设区中的最低1MB )