cpu运行模式切换以及异常处理
来源:互联网 发布:经济增长数据 编辑:程序博客网 时间:2024/05/17 09:04
s3c6410的cpu核总共有7中模式,体现在cpsr[4..0]寄存器上:
user 用户模式
fiq 快速中断模式
irq 通常的中断模式
svc 管理模式
abt 数据访问终止模式
sys 系统模式
und 未定义指令中止模式
一般在发生异常的时候会伴随cpu运行模式的自动切换,通常都是切换至除用户模式以外的其他模式。用户模式只有手动切换(即通过修改cpsr的值来切换模式),那么在发生异常的时候:
硬件会做如下的事情:
①cpu切换到该异常对应的模式(如 swi软中断指令会使cpu进入svc模式,发生一般中断则进入irq模式,遇到cpu不认识的机器码则会使cpu切换到未定义指令中止模式)
②cpu切换正在使用的寄存器R13(sp),R14(lr)
③保存当前cpsr到当前模式下的spsr,将下一条指令的地址保存到当前模式下的R14(lr)
④接着跳转到相应的异常处理的地址下。(如reset跳到0x0 swi跳到0x8 等等)
——此处延伸出了一个实验时遇到的问题:用了正确的程序,即使运行也得不到正确的结果。究其原因是因为我程序运行的时候是在superboot上downlaod并run在ddram上的。从0x5000_0000地址上开始运行。而跳转时跳到0x0 即开发板刚上电的时候映射到的那块区域。如果是nandflash 启动,开发板会自动将前8K搬到stepping stone,如果是sd卡启动,则是sd卡的前8K(此处是猜的)。 所以使用superboot在运行程序的时候就不会出现正确的结果,就算发生中断了也是跳到superboot程序的第x条语句执行。
那么在编程时候,软件应该做什么呢?
①设置新的堆栈(因为每个模式都有对应的新的R13(sp 堆栈指针))
②保存现场(将每个模式下非独有的,公共的寄存器保存下来,以及R14(lr 此时R14存的是跳转前的下一条地址,用于中断返回))
③处理中断(根据相应参数,或进行相应轮询的过程来确定选择哪个中断服务程序,或直接在此处贴上公共的处理代码)
④恢复现场(将刚刚保存的对应寄存器恢复,并且将硬件上保存下来的spsr恢复到cpsr中)
0 0
- cpu运行模式切换以及异常处理
- 多核CPU运行模式
- CPU的运行模式
- java里面的运行异常与普通异常的区别以及spring boot统一异常处理
- CPU-上下文切换,运行队列和使用率
- CPU-上下文切换,运行队列和使用率
- CPU-上下文切换,运行队列和使用率
- Hibernate异常以及处理
- 异常以及处理
- 异常处理以及引申
- linux下查看CPU个数、核数、运行模式以及是否支持超线程技术
- linux查看CPU个数、核数、运行模式以及是否支持超线程技术
- Keras下GPU/CPU模式切换
- Keras下GPU/CPU模式切换
- Keras下GPU/CPU模式切换
- IO 异常处理模式
- .Net异常处理模式
- 异常处理反模式
- ScaleDrawable的正确打开方式
- Disjoint-Set并查集
- 报告
- UVA 1368(p58)----DNA Consensus String
- Leetcode 160:Intersection of Two Linked Lists
- cpu运行模式切换以及异常处理
- math数学部分
- Heap和stack有什么区别?
- leetcode 5. Longest Palindromic Substring
- GenyMotion不能启动的问题,Unable to start the virtual device.VirtualBox cannot start the virtual device
- 支付宝福卡破解——飘雪效果
- Post-quantum key exchange for the TLS protocol from the ring learning with errors problem
- 如何使用 F12 开发人员工具调试网页
- Android中 Parcelable和Serializable