04-第四章Cortex-M3的异常处理知识分享
- 格式:ppt
- 大小:1.40 MB
- 文档页数:53


Cortex-M3寄存器等基础知识1.寄存器 CM3拥有R0~R15通⽤寄存器和⼀些特殊功能寄存器 R0~R12这些通⽤寄存器,复位初始值都是不可预料的2.CM3有R0到R15的通⽤寄存器组注:绝⼤部分的16位thumb只能访问R0到R7,⽽32位thumb-2可以访问全部寄存器3.特殊功能寄存器3.1程序状态寄存器组(应⽤程序PSR+中断号PSR+执⾏PSR)3.2中断屏蔽寄存器组:⽤于控制异常的除能和使能3.3控制寄存器:⽤于定义特权级别和当前使⽤哪个堆栈指针4.操作模式和特权级别:两种操作模式(处理器模式):Handler模式和线程模式(⽤于区分异常服务例程的代码和普通程序的代码)两种特权等级:特权级和⽤户级(是指在硬件层⾯上对存储器访问权限的设置)注:CM3在运⾏主程序(即线程模式)可以使⽤特权级别和⽤户级别;但是异常服务例程(即handler模式)只能使⽤特权级别。
当处于线程+⽤户模式时⼀些访问权限将被禁⽌将代码区分成⽤户级和特权级,有利于程序架构的稳定,如某⼀个⽤户代码出问题,不会使其成为害群之狗,因为⽤户级别的代码是禁⽌对⼀些要害寄存器操作的。
5.异常处理5.1CONTROL[0]=0;5.2CONTROL[0]=1;CONTROL[0]只有在特权级别下可以访问,若在⽤户级别想访问先通过"系统服务呼叫指令(SVC)"来触发SVC异常,然后在该异常的服务例程中可以修改CONTROL[0]。
6.下⾯是各操作模式的转换7.异常和中断可以有11个系统异常和最多240个外部中断(IRQ),具体芯⽚使⽤了多少要看芯⽚制造⼚商。
作为中断功能的强化,NVIC 还有⼀条NMI输⼊信号线,具体做什么由芯⽚制造商决定,NMI(not masked interrupted)8.向量表:当⼀个异常被CM3内核接受。
对应的异常Handler就会执⾏,向量表⽤来决定Handler的⼊⼝地址。
简述cortex-m3 位带操作的基本原理和作用Cortex-M3是Arm公司开发的针对嵌入式应用的32位处理器,其具有高性能、低功耗、易于使用和可扩展等特点。
其中,位带操作是Cortex-M3的一个重要特性。
本文将对Cortex-M3位带操作的基本原理和作用做一个简述。
1.基本原理位带操作是通过将一个位的访问映射到一个字中的某个位,从而实现原子性访问的技术。
在Cortex-M3中,每个位都被映射到对应的地址,通过使用对应的地址访问该位,就可以实现对该位的原子性访问。
具体地说,Cortex-M3中提供了两种方式来实现位带操作:位带别名寄存器和位带寄存器。
1.1位带别名寄存器位带别名寄存器是将一个位的访问映射到字节的两个别名位上。
例如,如果要访问一个位的地址为0x20000000,那么其对应的别名寄存器地址为0x22000000。
该寄存器的第0位相当于原始地址的第0位,第1位相当于原始地址的第0位的别名位。
使用位带别名寄存器可以将一个位的访问转化为对应字节的别名位的原子性访问。
1.2位带寄存器位带寄存器是将一个位的访问映射到对应位带位的地址上。
例如,如果要访问一个位的地址为0x20000000,那么其对应的位带寄存器地址为0x22000000 + 0x20 * (0x20000000 - 0x20000000) + 0x04 * 0。
该寄存器的第0位相当于原始地址的第0位的位带位,第1位相当于原始地址的第1位的位带位,以此类推。
使用位带寄存器可以直接对位带位进行原子性访问。
2.作用位带操作可以提供原子性访问,即对一个位的读写操作是原子性的,不会被中断打断。
这对于嵌入式应用来说非常重要,因为这些应用通常需要保证数据的一致性和可靠性。
通过使用位带操作,可以避免非原子性的读写操作和竞争条件带来的数据异常和系统故障。
除此之外,位带操作还可以提高处理器的运算效率。
在常规操作中,为了访问一个位,需要用位运算符和移位运算符等操作来读写位数据。
Cortex-M3咬尾中断与晚到中断【咬尾中断】在处理器在响应某些异常时,如果⼜发⽣其他异常,但它们优先级不够⾼,则它们会被阻塞。
那么,在当前的异常执⾏返回后,系统处理悬起的异常时,倘若还是先POP,然后⼜把POP处理的内容PUSH回去,那么就⽩⽩浪费CPU 时间了。
因此,Cortex-M3不会再POP这些寄存器,⽽是继续使⽤上⼀个异常已经PUSH好的结果,消除POP和PUSH操作的耗时。
这么⼀来,看上去好像后⼀个异常把前⼀个的尾巴要掉了,前前后后只执⾏了⼀次PUSH/POP操作。
于是,这两个异常之间的“时间沟”就变窄了很多,如图所⽰:和常规中断处理(ARM7)的⽐较:【晚到中断】Cortex-M3的中断处理还有另⼀个机制,它强调了优先级的作⽤,这就是“晚到的异常处理”。
当Cortex-M3对某异常的响应序列还处在早期:⼊栈的阶段,尚未执⾏其他服务程序时。
如果此时收到了更⾼优先级异常的请求,则本次⼊栈就成了⾼优先级中断做的了。
⼊栈后,将执⾏⾼优先级的异常服务程序。
可见,⾼优先级的异常虽然来晚了,却因为优先级⾼使得服务程序可以被先处理,低优先级异常的⼊栈操作则变成了为⾼优先级异常的⼊栈。
⽐如,若在响应某低优先级异常#1的早起,检测到了⾼优先级异常#2,则只要#2没有太晚,就能以“晚到中断”的⽅式处理,在⼊栈完毕后执⾏ISR#2。
如图所⽰:如果异常#2来得太晚,以⾄于已经执⾏了ISR#1的指令,则按普通的抢占处理,这会需要更多的处理器时间和额外32字节的堆栈空间。
在ISR#2执⾏完毕后,则以“咬尾中断”的⽅式来启动ISR#1的执⾏。
参考摘录:《Cortex-M内核系列和STM32-讲座2教程.pdf》《ARM Cortex-M3权威指南.pdf》。