中断系统
中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行;
以上是中断的定义,对于外部中断来说,可以是引脚电平发生了变化;对于定时器来说,可以是定时的时间到了,对于串口通信来说,可以是接收到了数据;这些都是需要CPU暂停当前正在运行的程序,转而去处理中断程序;
使用中断系统主要是为了提高主程序运行的效率,否则程序要一直循环的去检测有没有对应事件的发生;
中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源
中断优先级是可配置的,根据自己的需求设置对应的优先级;
中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回;
中断嵌套是为了照顾非常紧急的中断,是由中断优先级决定的;
中断执行流程
中断来了,主程序需要立即暂停,程序由硬件电路控制,自动跳转到中断程序中; 暂停的地方称为断点,中断执行前,会对程序现场进行保护,中断执行后再还原现场(这里联想了一下,线程或者进程切换的开销中,就有保存程序当前进程/线程的运行状态比如寄存器信息等,往下深入想一下,进程/线程切换也是中断PendSV去触发)
STM32中断简介
68个可屏蔽中断通道,包含EXTI、TIM、ADC、USART、SPI、I2C、RTC等多个外设;具体型号可能没有这么多,还是要参考手册为准;
使用NVIC统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级和响应优先级;
灰色的部分是系统内核的中断,在实际的项目中会经常要用到的,引入系统之后,比如FreeRTOS就需要配置这些中断,用来处理系统运行中出现的错误;
其他的是一些外设中断;
中断向量表,中断发生后硬件电路能控制跳转到固定地址,但是中断函数是编译在编译时才能确定地址的,所以就可以在跳转到的固定地址里再加一条跳转指令,跳转到中断函数,这一块连续的跳转指令,被称为中断向量表;
NVIC基本结构
NVIC是一个内核外设,用来辅助CPU处理外部中断的; NVIC有很多输入口,但是只有一个输出口,根据中断优先级分配中断的先后顺序,CPU无需关注中断的先后顺序,只要处理就行;n表示一个外设可能同时占有多个中断通道;
NVIC优先级分组
NVIC的中断优先级由优先级寄存器的4位(0~15)决定,这4位可以进行切分,分为高n位的抢占优先级和低4-n位的响应优先级
抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级均相同的按中断号排队
数值越低优先级越高
NVIC有两种优先级,一种是响应优先级,这个决定你在中断队列中排队的位置,高优先级的可以插队到低优先级的前面;一种是抢占优先级,抢占优先级高的可以直接打断低优先级的中断,形成中断嵌套,如果低的话就在外面乖乖排队(按着响应优先级);每次中断响应时都会比较这两个优先级,两个优先级同时起作用; 如果抢占优先级和响应优先级都一样的情况下,就按着中断号来决定谁先响应;