Cortex M3处理器工作模式及中断过程
2015-10-03 19:58
274 查看
来自::http://blog.csdn.net/ffgamelife/article/details/6947300
1. 工作模式
线程模式(Thread mode):处理器复位或异常退出时为此模式。此模式下的代码可以是特权代码也可以是用户及代码,通过CONTROL[0]控制。
处理模式(Handler mode):出现异常(包括中断)时进入此模式,此模式下所有代码为特权访问。
2. 工作状态
Thumb状态(正常执行指令状态)和调试状态
3. 代码限权
特权访问:对处理器资源拥有完全访问限权;处理器复位后进入此访问模式;清零 CONTROL[0]进入用户模式。
用户访问:禁止访问多数系统寄存器。只能通过进入异常(中断)来返回特权模式。进入异常前是用户级访问,则退出异常时自动回到用户及,除非在异常中修改CONTROL[0]位。
4. M3寄存器
r0-r12:通用寄存器,其中r8-r12只能被32位指令访问。
r13(SP):堆栈指针;线程模式时可以在线程堆栈和主堆栈之间切换,但处理模式只使用主堆栈。两个堆栈同一时刻只有一个可见,进入、退出异常时自动切换堆栈。
r14(LR):链接寄存器,保存子程序或异常的返回地址(要实现嵌套,必须入栈)。
r15(PC):程序计数器
xPSR:特殊用途的程序状态寄存器
5. 异常
进入异常步骤:
1. 处理器在当前堆栈上把xPSR、PC、LR、r12、r3~r0八个寄存器自动依次入栈。
2. 读取向量表(如果是复位中断,更新SP值)
3. 根据向量表更新PC值
4. 加载新PC处的指令(2、3、4步与1步同时进行)
5. 更新LR为EXC_RETURN(EXC_RETURN表示退出异常后返回的模式及使用的堆栈)。
退出异常步骤:
1. 根据EXC_RETURN指示的堆栈,弹出进入中断时被压栈的8个寄存器。
2. 从刚出栈的IPSR寄存器[8:0]位检测恢复到那个异常(此时为嵌套中断中),若为0则恢复到线程模式。
3. 根据EXC_RETURN,选择使用相应SP。
末尾连锁(Tail-chaining):当前正在执行中断,又有一个中断到来且这个中断优先级比正在执行的中断优先级低(如果有其他被压栈的低优先级中断则要比这些中断优先级高),这个中断暂时被挂起,等到当前中断执行完后不再执行堆栈操作,而直接进入挂起的中断。
迟来:前一个中断还没有进入执行阶段(但处理器状态已经保存),后面来了一个高优先级中,则前一个中断被抢占,后来的高优先级中断不需要再保存寄存器状态。
1. 工作模式
线程模式(Thread mode):处理器复位或异常退出时为此模式。此模式下的代码可以是特权代码也可以是用户及代码,通过CONTROL[0]控制。
处理模式(Handler mode):出现异常(包括中断)时进入此模式,此模式下所有代码为特权访问。
2. 工作状态
Thumb状态(正常执行指令状态)和调试状态
3. 代码限权
特权访问:对处理器资源拥有完全访问限权;处理器复位后进入此访问模式;清零 CONTROL[0]进入用户模式。
用户访问:禁止访问多数系统寄存器。只能通过进入异常(中断)来返回特权模式。进入异常前是用户级访问,则退出异常时自动回到用户及,除非在异常中修改CONTROL[0]位。
4. M3寄存器
r0-r12:通用寄存器,其中r8-r12只能被32位指令访问。
r13(SP):堆栈指针;线程模式时可以在线程堆栈和主堆栈之间切换,但处理模式只使用主堆栈。两个堆栈同一时刻只有一个可见,进入、退出异常时自动切换堆栈。
r14(LR):链接寄存器,保存子程序或异常的返回地址(要实现嵌套,必须入栈)。
r15(PC):程序计数器
xPSR:特殊用途的程序状态寄存器
5. 异常
进入异常步骤:
1. 处理器在当前堆栈上把xPSR、PC、LR、r12、r3~r0八个寄存器自动依次入栈。
2. 读取向量表(如果是复位中断,更新SP值)
3. 根据向量表更新PC值
4. 加载新PC处的指令(2、3、4步与1步同时进行)
5. 更新LR为EXC_RETURN(EXC_RETURN表示退出异常后返回的模式及使用的堆栈)。
退出异常步骤:
1. 根据EXC_RETURN指示的堆栈,弹出进入中断时被压栈的8个寄存器。
2. 从刚出栈的IPSR寄存器[8:0]位检测恢复到那个异常(此时为嵌套中断中),若为0则恢复到线程模式。
3. 根据EXC_RETURN,选择使用相应SP。
末尾连锁(Tail-chaining):当前正在执行中断,又有一个中断到来且这个中断优先级比正在执行的中断优先级低(如果有其他被压栈的低优先级中断则要比这些中断优先级高),这个中断暂时被挂起,等到当前中断执行完后不再执行堆栈操作,而直接进入挂起的中断。
迟来:前一个中断还没有进入执行阶段(但处理器状态已经保存),后面来了一个高优先级中,则前一个中断被抢占,后来的高优先级中断不需要再保存寄存器状态。
相关文章推荐
- ZOJ 2674-Strange Limit(指数循环节)
- 📱
- 拷贝构造函数是必须要带引用类型的参数的, 而且这也是编译器强制性要求的
- BX LR
- 1.Python深入_对象的属性
- Tomcat用到的设计模式
- nyoj 47 过河问题
- Ubuntu 14.04 循环启动问题
- MVC在Web系统中的模式与应用--架构模式
- linux系统解疑
- C++ 基础知识点 二 第3章 C++程序的流程控制
- python闭包
- 脉冲产生于整形电路
- 20135327郭皓——信息安全系统设计基础第三周学习总结
- HTML5学习之一:HTML5的结构
- Cocoa框架<1>
- java16:构造器 继承
- Python核心编程笔记 - 杂记第1章至第8章
- HDU 1281 棋盘游戏(二分图匹配)
- Oracle PL/SQL入门语法点