嵌入式-中断的概念,优先级,编程-Day17
一、中断的概念
1.概念
简单来说,就是正常程序运行的过程中,要去应发一个突发事件,应发完后就继续做自己原来的事。
2.编程举例(中断的由来)
目的:外部串口去发送给单片机0慢闪,发送1正常闪,发送2快闪
首先,正常的思维就是先开始实现闪灯,然后你发送指令,然后单片机如果读到值,就使用接收指令去读对应的值并采取相应的行为,这看着是没啥问题的。
但是注意一个比较容易忽略的问题,假设writebit往灯写数据使灯亮或者灭是100ms一次,那么一次闪烁就是200ms,而串口接收或者发送的周期:比如波特率是常见的115200,然后发送的时候,起始位1+8个数据位+1结束位,这样就是每秒发送115200/10个字节,那就是发送或者接收就是0.1ms左右,那根据下面的第二个图片看到,当始终不读取数据的时候,你的接受寄存器的值始终会被覆盖,最后等你一次闪烁完,我可能只拿到了第一次发送的数据和被覆盖的就剩的最后一层的数据,所以这时候我们可以使用中断。
那这里就可以使用中断,就拿USART来说,他的右上角所示的每个标志位都可以引起中断,我们这里使用RXNE去产生中断,比如一判断到当前接收数据寄存器有值,就中断,中断响应函数里面接收数据就行
二、中断的优先级
1.中断优先级的概念
优先级就分为两种,一种是子优先级,就是同类的中断排队现象。
另一种是只有 抢占优先级才会发生的中断嵌套现象。
2.中断流程
如下所示,片上外设靠标志位启动全局中断,因为片上外设很多,既而传给单片机的中断也很多(注意:每个外设对应的全局中断都有对应的名称,然后给这个名称的中断配置优先级),那么就需要一个中断管理员:NVIC去管理中断(在这里管理里面定义了管理规则,即中断的优先级),之后执行中断,执行中断的时候,需要去中断向量表里面找每个中断名对应的中断响应函数(比如USART的中断名下这个也有其对应的中断响应函数)
一般来说,中断响应函数,在底层制作声明,你自己调用然后实现自己想要实现的具体中断功能就行。
3.中断优先级的表示方法
中断优先级,就是前面提到的管理规则,即具体就是NVIC这块,他给每个字段配置了4位的数据,有一根中断分组线,线左边的叫抢占优先级,右边的叫子优先级。
这根线可以左右移动,既而导致了5个不同的分组。
同一个类别的优先级,谁的值越小,谁就是优先,但是特比注意抢占优先级和子优先级二者是不能直接相比的,要比就是你的抢占和我的抢占比,你的子优先级和我的子优先级比。

3.抢占优先级与中断嵌套
4.子占优先级与中断排队
这里唯一一个特别注意的就是中断排队不会打断当前中断的执行,即一定不会发送抢占所造成的嵌套中断的情况