中断基础知识
为什么需要使用中断?
如果通过查询接收标志查看一个字节是否收到,则需要时刻花费CPU等资源。但中断机制能够在收到一个字节后,通知CPU把收到的字节取走。
异常:CPU强行从正常运行的程序切换到由某些内部或外部条件所要求的处理任务(优先度高于正在运行的任务)。
引起异常的外部条件:来自外围硬件、硬件断点请求、访问错误和复位等。
引起异常的内部条件:指令、不对等错误、违反特权和跟踪等。
硬件复位(具有最高优先级)和硬件中断归类为异常;
中断:来自CPU外围设备的强行任务切换请求。软件上表现为将程序PC计数器指针强制转换到中断服务程序入口的地址运行。CPU对复位、中断异常具有相同的处理过程,可统一称为中断。
中断源:可以引起CPU产生中断的外部器件。一个CPU可以识别多个中断源。每个中断源产生中断后,分别要进行相应的中断服务例程ISR,ISR的起始地址为中断向量地址连续几存储在中断向量表。中断向量表是一个指针数组。明,内容是中断服务例程ISR的首地址。
中断向量号:每个CPU能够识别的中断源编号。
中断服务例程ISR:中断产生后转去运行的程序。
中断发生以后,中断硬件、软件机制通知所有正在运行的程序,并保存当前CPU状态,转而运行一个中断处理程序。处理程序完成以后,恢复CPU至运行中断之前的状态,使得中断前的程序得以继续运行。
中断处理过程
中断请求:当某一个中断源需要CPU为其服务时,它会向CPU发送中断请求信号。中断控制器获取其中断向量号,并对其相应寄存器的“中断请求位”置位,以便通知CPU是何种中断请求。
中断检测:CPU会在每条指令结束时检测有没有中断请求情况,若有中断确实允许中断,则响应该中断请求。
中断响应:CPU会查找中断源所对应的模块中断是否被允许,若被允许,则响应该中断请求。
中断处理:中断响应的过程要求CPU保存当前环境的上下文于堆栈中,通过中断向量号找到中断向量表中对应的中断服务例程ISR,转而运行中断处理服务ISR。由于CPU在中断服务例程要使用CPU内部寄存器,所以需要调用ISR之前,将CPU内部寄存器保存至指定的RAM地址中,即堆栈。
中断返回:中断结束后,再将该RAM地址(堆栈)中的数据恢复到CPU内部寄存器中,从而使中断前后程序运行现场没有任何变化。
ARM Cortex-M0+中断编程结构
中断过程
- 模块中断源向嵌套中断向量控制寄存器NVIC发出中断请求信号。
- NVIC对发来的中断信号进行管理,判断该模块中断是否被使能。若使能,通过私有外设总线PPB发送给M0+内核,由内核进行中断处理。
- 如果同时有多个中断信号到来,NVIC根据设定好的中断优先级进行判断,优先级高的中断首先响应,优先级低的中断挂起,压入堆栈保存;
- 如果优先级相同的对个中断源同时请求,则先响应IRQ号较小的,其他的被挂起。
中断向量号&非内核中断请求号IRQ
串口接收中断编程步骤
- 在头文件uart.h中,设定UART_2的实际使用的引脚。
- 修改main.c文件,在初始化外设模块位置调用uart构件中的初始化函数。
- 在初始化外设模块位置调用uart构件中使能模块中断函数。
- 在开总中断位置调用common.h文件中的开总中断宏函数。
- 在中断向量表文件中根据中断向量号的顺序找到串口2接收中断服务例程的函数名。然后在中断处理程序文件中添加该函数名。
- 只要串口2接收到一个字节,这个中断处理程序就会被执行一次。
为规范管理,同一将各个中断服务程序放在工程框架中的isr.c文件中。
串口中断服务例程
当串口2有一个字节的数据到来时产生接收中断,将会执行串口2中断处理函数。
该程序先进入临界区关总中断,接收一个带来的字符。如果接收成功,则把该字符发送回去,退出临界区。