Exception 与 Interrupt
- Interrupt 是由内部 timer 或 I/O 装置发出的。
- Exception 是由於程序 Error 或是处於异常状态才会发出。
上图是(Exception Nuber 1~15) ARM Cortex-M 架构的 内部定义的 Exception,16~255 就是 Interrupt 是开发人员要自己定义,在ARM的架构上来说,Interrupt是一种Exception。
- Reset:
- NMI: 无法被Mask 的 interrupt
- Hard fault: 这个故障的功能就是当kernel运行到错误的程序码会导致产生硬体故障,用於指示出程序出现不可修复的异常,需要程序人员关注与处理。
- MemManage: 在 MPU (记忆体保护单元) 发生的一些记忆体管理的错误
- Bus fault: 在获取指令、资料读写、获取中断向量检测到访问错误则产生Bus故障。
- Usage fault: 一些错误程序导致的异常,例如使用一条无效的指令或是非法的状态转换
- SVC:SVC 参考资料
- PendSV:如果systick抢占了其他ISRs,不会在其中执行上下文切换。会等到全部的ISRs执行完毕後(期间一定是无任务排程的),才执行pendsv异常,完成上下文的切换。==差别在於生成pendsv异常的时机
- SYSTICK:系统滴答定时器(SYSTICK)中断 cortex-M3 的SVC、PendSV异常`
- IRQ: 通常是周边或外部输入产生的
Exception 优先权
每个Exception都有自己的优先权,在ARM Cortex-M中数值越小代表优先权越高,因为IRQ 都是从0开始设定优先权数值,Exception Nuber 1~15 通常在软件会被定义成-14~-1。
在发生Exception时,会直接备份一些暂存器(xPSR,R15,R14,R12,R3,R2,R2,R1,R0),比较特别的是这些备份机制在硬体层就直接做掉了,不需要软件额外来做,return 就把他还原。
Priority Group
在ARM Cortex-M里,设定优先权的register bits被分为两个栏位
- group priority(靠近MSB这一边)(或称为preempt priority)
- 如果一个exception handler正在执行,突然一个exception又进来,假设此exception 的 group priority 比你大的话就可以 preempt。
- subpriority within group(靠近LSB这一边)
- 如果有多个相同优先权的exception handler在等待执行(Pending),那麽先比较subpriority,比较高的排前面先执行,如果还是一样,Exception Number小的优先。
Excpetion 有 四种状态
- Pending - 中断信号已经被asserted,即中断已经到来,并且被识别到,这个可以是硬体产生或软件产生的。此时处於等待CPU处理的阶段。
- Active - 中断已经被CPU确认过,并且当前中断正在被处理。此时同一个中断不会被递交到此状态的CPU。直到此中断不再处於active状态
- Pending & Active - 中断正在处理,并且新的中断也已经到来。
- Inactive - 描述中断没有到来的状态,这里的定义是,不是处於active和pending状态。
参考资料
【嵌入式放牛班】Cortex-M Interrupt
浅谈优先权,从ARM Cortex-M到FreeRTOS设定