
1. 异常与中断基本概念1.1. 异常异常是导致处理器脱离正常运行转向执行有特权的特殊代码的任何事件。如果不及时处理轻则系统出错重则系统瘫痪。正确的处理异常避免错误是提高软件鲁棒性的重要一环。异常通常分为两类同步异常和异步异常。同步异常由内部事件像处理器指令运行产生的事件引起的异常称为同步异常。【被零除的算数运算引发的一个异常某些处理器体系结构中对于确定的数据尺寸必须从内存的偶数地址进行读和写操作从一个奇数内存地址的读和写操作将引起存储器存取一个错误事件并引发一个异常异常校准】异步异常主要是指由于外部异常源产生的异常是一个由外部硬件装置产生的事件引起的异步异常例如按下按钮。异步异常与同步异常不同的地方是事件的来源以及处理实时性异步异常的来源是外部硬件装置同步异常的来源是由于执行某些指令而从处理器内部产生的。异步异常触发后可以延缓处理甚至忽略而同步异常出发后系统必须立即进行处理而不能够依然执行原有程序指令步骤。1.2. 中断1.2.1. 中断基本概念中断属于异步异常。中断就是CPU在处理某件事情的时候外部发生了某一事件请求CPU迅速处理CPU暂时中断当前的工作转入处理所发生的事件处理完后回到原来被中断的地方继续原来的工作。中断能够打断任务的运行无论任务具有什么优先级都能打断。因此中断一般用于处理比较紧急的事件而且一般快进快出中断中只做简单处理一般是标记发生事件用信号量、消息或事件标志组然后将这些内核对象发布给对应的处理任务然后处理任务再做中断处理。通过中断机制在外设不需要CPU介入的时候CPU可以执行其他任务当外设需要CPU时通过中断信号使CPU停止当前任务来响应中断请求。这样可以节省CPU等待、查询外设状态的时间提升实时性。FreeRTOS中有很多临界段保护的操作临界段虽然保护了关键代码不被打断但是会影响系统实时性。临界段屏蔽了中断但如果进入临界段太久会使得紧急中断事件的处理被延迟导致严重后果。因此进入临界段也需要快进快出。FreeRTOS也可以允许高优先级的中断不被屏蔽BASERI不过这些中断就不受系统管理也不允许调用FreeRTOS中与中断相关的任何API函数接口。FreeRTOS的中断管理支持开/关中断恢复中断中断使能中断屏蔽可选择系统管理的中断优先级1.2.2. 和中断相关的名词解释中断号每个中断请求信号都会有特定的标志使得计算机能够判断是哪个设备提出的中断请求这个标志就是中断号。中断请求“紧急事件”需向CPU提出申请要求CPU暂停当前的任务转而响应中断申请即执行中断处理程序。中断优先级为使系统能够及时响应并处理所有中断系统根据中断时间的重要性和紧迫程度将中断源分配若干登记成为中断优先级。中断处理程序当外设产生中断请求后CPU暂停当前的任务转而响应中断申请即执行中断处理程序。中断触发中断源发出并送给CPU控制信号将中断触发器置“1”表明该中断源产生了中断要求CPU去响应该中断CPU暂停当前任务执行相应的中断处理程序。中断触发类型外部中断申请通过一个物理信号发送到NVIC可以是电平触发或者边缘触发。中断向量中断服务程序的入口地址。中断向量表存储中断向量的存储区中断向量与中断号对应中断向量在中断向量表中按照中断号顺序存储。临界段代码的临界段成为临界区一旦这部分代码开始执行则不允许任务中断打断。为确保临界段代码的执行不被中断在进入临界段之前须关中断而临界段代码执行完毕后要立刻开中断。2. 中断管理的运作机制当中断产生时处理机将按照如下顺序执行保存处理机状态信息载入异常或中断处理函数到PC寄存器把控制权转交给处理函数并开始执行当处理函数执行完成时恢复处理器状态信息从异常或中断中返回到前一个程序执行点中断使得CPU可以在事件发生才处理而不必让CPU一直查询。可以通过特殊指令开关中断让处理器响应或者不响应中断。在关闭中断的时候处理器会把新产生的中断挂起当中断打开时立刻响应所以会有适当的延时响应中断故用户在进入临界段时应该快进快出。中断发生的环境有两种任务中和中断服务函数中。任务在工作的时候如果此时发生了一个中断无论中断的优先级是多大都会打断当前任务转到对应的中断服务函数中去。如下13任务执行的时候触发中断。于是暂停任务运行操作系统保存当前任务的上下文环境转而处理中断服务函数。24中断服务函数处理完中断恢复任务的上下文环境继续运行任务。TIPS如果在中断服务例程执行过程中由更高优先级的中断源触发中断这时不同的处理器架构有不同的处理方式。比如新的中断挂起等待当前中断处理完成后再响应或新的高优先级中断打断当前中断处理程序转而直接响应更高优先级的新中断【中断嵌套软件处理允许、硬件不允许】如下3. 中断延迟Interrupt Latency的概念中断的处理存在着中断延迟响应的问题即中断延迟。中断延迟指硬件中断发生到开始执行中断处理程序第一条指令之间这段时间。也就是系统接收到中断信号到操作系统作出响应并完成转入中断服务程序的时间。简单理解为外部硬件设备发生中断到系统执行中断服务程序第一条指令的时间。中断的处理过程是外界硬件发生了中断后CPU到中断处理器读取中断向量并且查找中断向量表找到对应的中断服务子程序ISR首地址然后跳转到对应的ISR去做处理。这部分时间是识别中断时间。在允许中断嵌套的场景中高优先级中断可以抢占低优先级中断但是低优先级中断如果在高优先级中断处理过程中被触发需要等待高优先级中断执行完毕后才能被系统响应甚者子啊不允许中断嵌套的场景中系统必须执行完一个中断才会响应另外一个中断无论优先级。这部分中断等待中断的时间称为等待中断打开时间。临界段会关闭中断响应中断需要等待退出临界段后才可以被响应。这部分时间称为关闭中断时间。然后中断延迟可以定义为从中断开始的时刻到中断服务例程开始执行的时刻之间的时间段。有以下公式中断延迟识别中断时间 [等待中断打开时间] [关闭中断时间]。4. 中断管理讲解ARM Cortex-M系列内核的中断是由硬件管理的而FreeRTOS是软件并不接管由硬件管理的相关中断接管简单来说就是所有的中断都由 RTOS的软件管理硬件来了中断时由软件决定是否响应可以挂起中断延迟响应或者不响应只支持简单的开关中断所以FreeRTOS中的中断使用其实和裸机中断差不多需要我们自己配置中断并且使能中断编写中断服务函数在中断服务函数中使用内核IPC通信机制一般建议使用信号量、消息或事件标志组标志事件的发生将事件发布给处理任务退出中断后由相关的处理任务处理具体中断。用户可以自定义配置系统可管理的最高中断优先级的宏定义configLIBARY_MAX_SYSCALL_INTERRUPT_PRIORITY它用来配置内核中的basepri寄存器NVIC不会响应优先级低于basepri的中断。也就是说在临界段之中高于basepri的中断也可以被响应。TIPS这些被屏蔽的中断的中断服务函数中不能调用FreeRTOS提供的API接口而被屏蔽的中断是可以调用FreeRTOS提供的API函数接口的。ARM Cortex-M NVIC支持中断嵌套功能中断中触发高优先级中断处理器硬件会把当前运行的部分上下文寄存器自动压入中断栈中包括PSR、R0、R1、R2、R3、以及R12寄存器。这部分上下文寄存器保存到中断栈中断额行为完全是硬件行为这就是ARM Cortex-M与其他ARM处理器最大的区别另外ARM Cortex-M系统列处理器上所有中断都采用中断向量表的方式进行处理一个中断触发处理器判断是哪个中断源然后执行相应的中断服务程序。在ARM 7 9中一般先跳转IRQ入口然后再由软件判断是哪个中断源然后到中断服务程序这样的话所有中断都有统一入口便于统一管理。而ARM Cortex-M相反每个中断服务例程必须排列在放在统一的地址上这个地址需要设置到NVIC的中断向量偏移寄存器中。中断向量表一般由一个数组定义或在启动文件中给出在 STM32上默认采用起始代码给出FreeRTOS在Cortex-M系列处理器上也遵循与裸机中断一致的方法当用户需要使用自定义的中断服务例程时只需要定义相同名称的函数覆盖弱化符号即可。所以FreeRTOS 在Cortex-M系列处理器的中断控制其实与裸机没什么差别。