中断很难?看完这篇就懂了
1.内核,总线,外设
这三个概念是理解中断的必要前提,一个芯片具有内核、总线、外设这三个结构
内核:芯片里的内核有很多架构,如ARM架构内核,它包含了许多核心部件,是整个芯片的大脑
总线:是连接内核与外设,外设与外设之间的通道
外设:通过总线与内核,用于实现芯片的功能,如GPIO输出高低电平,ADC采集电压,串口发送数据
2.NVIC
它是专门负责管理中断的控制器,处于芯片的内核中,响应速度很快
它可以接收外设的中断请求,然后给CPU发送信号,执行中断
3.中断与异常
异常:发生在CPU内部,CPU的运行流被打断,可能是某些致命错误,也有可能是中断引起的
中断:被外部事件打断,如按键检测、定时器触发,然后NVIC接收到中断信号,再给CPU发送信号,触发CPU异常,执行中断函数
4.中断向量表
中断向量表是一段存储所有中断的地址表,当中断发生时,CPU会根据中断编号,在向量表中找到对应的地址,直接跳转到该地址执行函数。
如定时器完成了自动重装载值的刷新,CPU就会检测并判断是定时器发生的中断,然后就会通过中断向量表找到中断回调函数的地址,并执行中断回调函数。
5.中断悬起和中断延迟(产生单一一次中断的中断处理过程)
中断悬起:当外设触发中断条件时,会通过总线向NVIC发送一个中断悬起的信号,而NVIC中有很多悬起寄存器和解悬寄存器,信号传输到NVIC后,就会根据是哪个外设的中断将某个悬起寄存器的某个比特位置1,等待着CPU的响应
中断延迟:从外设触发中断条件向NVIC发送中断悬起信号到CPU开始执行中断回调函数的时间间隔。里面包含了信号在总线的传输过程,CPU还在执行更高优先级任务或当前指令未完成时悬起寄存器保持高的时候。
最后补充一点,在开始执行中断回调函数时,悬起寄存器那个被置1的比特位就会被置回0。
6.产生持续中断的中断处理过程
举个例子,将GPIO设置成低电平触发中断,然后我们把按键设置成上拉模式并按下,那中断请求就会不断从外设通过总线向NVIC发送,接着悬起寄存器就会置1,然后过了中断延迟后就会开始执行中断回调函数,此时比特位就从1变成了0,即使中断悬起信号在不断被传输进NVIC但比特位不会重新置1了,直到中断回调函数执行完比特位才会置1,此时处理器模式又还是处于Handler模式,所以会极快又进行终端回调函数。
7.产生多次中断悬起信号的中断处理过程
1)多个中断请求产生于寄存器的比特位已经置1的情况,简单来说就是有个外设发出了中断悬起信号,然后将寄存器的某个比特位置1,然后再中断延迟期间,即中断回调函数还没执行,那个外设又传来很多个信号,但是其作用还是将那个比特位置1,并不能记住他的次数,所以到最后中断回调函数还是只会执行一次
2)第二种特殊情况就是前面和单一一次中断的中断处理过程一样,不同的是当在执行中断回调函数的过程中时,此时属于那个外设的寄存器的比特位是0,然后这时来了个中断悬起信号,把它重新置1了,然后当中断回调函数结束时,没有多余的出栈入栈操作,就直接连着执行中断回调函数了。
8.异常流程(压栈)
由于异常其实就是中断的一个流程,所以异常流程是可以套用在中断中的。
压栈就是指CPU检测到异常时,自动将当前程序的“上下文信息”保存到栈内存的过程,这里的上下文指的有xPSR、PC、LR、R12、R3、R2、R1、R0等寄存器。
其主要作用就是保存并保护主程序。
谢谢您的驻足浏览!
