中断和异常的区别
-
中断是指系统停止当前正在运行的程序转到其他的服务,可能是程序接收了比自身高优先级的请求,或者是人为设置中断,中断是属于正常现象。
-
异常是指由于CPU本身故障、程序故障或者请求服务等引起的错误,异常属于不正常现象。
Cortex-M3
内核总共支持256个中断,其中包含16个内核异常和240个外部中断,但是各个芯片产商在设计芯片的时候会对CM3
内核的芯片进行精简设计,如STM32F103
系列,所搭载的异常响应系统,包含10个系统异常和60个外部中断,用一张表将它们管理起来,编号0~15为系统异常(优先级为-3到6),16以上称为外部中断。
系统异常清单:
比较常见的异常就是hardfault
异常了,可以看到他的优先级被设置为了-1,而且是不允许用户修改的。
外部中断清单:
……
外部中断信号从核外发出,信号最终要传递到NVIC
(嵌套向量中断控制器)。NVIC
跟内核紧密耦合,它控制着整个芯片中断的相关功能。
中断优先级
STM32
支持两种优先级:抢占优先级和子优先级。所有优先级可编程的中断源都需要指定这两种优先级。抢占优先级决定是否可以产生中断嵌套,子优先级决定中断响应顺序,若两种优先级一样则看中断源在中断向量表中的偏移量,偏移量小的先响应。
对这句话的解释为:
- 抢占优先级高的中断源可以中断抢占优先级低的中断处理函数,进而执行高优先级的中断处理函数,执行完毕后再继续执行被中断的低优先级的处理函数。
- 当两个中断源的抢占优先级相同时,即这两个中断将没有嵌套关系,当一个中断到来后,若此时
cpu
正在处理另一个中断,则这个后到来的中断就要等到前一个中断处理函数处理完毕后才能被处理,当这两个中断同时到达,则中断控制器会根据它们的子优先级决定先处理哪个。 - 如果两个中断的优先级都设置为一样了,那么谁先触发的就谁先执行;如果是同时触发的,那么就根据中断向量表的位置来决定谁先执行。
中断和事件的区别
产生中断线路目的是把输入信号输入到 NVIC
,进一步会运行中断服务函数,实现功能,这样是软件级的。而产生事件线路目的就是传输一个脉冲信号给其他外设使用,并且是电路级别的信号传输,属于硬件级的。
简单点来说,就是中断最终会自动进入中断服务函数,而事件则不会有对应的服务函数。中断是软件级的,而事件是硬件级的。