1、异常与中断的基本概念
异常是指任何打断处理器正常执行,并且迫使处理器进入一个由有特权的特殊指令执行的事件。
异常可以分为两类:同步异常和异步异常。
由内部事件(像处理器指令运行产生的事件)引起的异常称为同步异常。异步异常主要是指由于外部异常源产生的异常,是一个由外部硬件装置产生的事件引起的异步异常。
中断属于异步异常。所谓中断是指CPU正在处理某件事的时候,外部发生了某一事件,请求CPU迅速处理,CPU暂时中断当前的工作,转入处理所发生的事件,处理完后,再回到原来被中断的地方,继续原来的工作。
中断能打断任务的运行,无论该任务具有什么样的优先级,因此中断一般用于处理比较紧急的事件,而且只做简单处理,例如标记该事件,在使用FreeRTOS系统时,一般建议使用信号量、消息或事件标志组等标志中断的发生,将这些内核对象发布给处理任务,处理任务再做具体处理。
FreeRTOS的中断管理支持:
开/关中断。
恢复中断。
中断使能。
中断屏蔽。
可选择系统管理的中断优先级。
中断的介绍
与中断有关的硬件可以分为三类:外设、中断控制器、CPU本身。
外设:当外设需要请求CPU时,产生一个中断信号,该信号连接至中断控制器。
中断控制器:中断控制器是CPU众多外设中的一个,它一方面接收其他外设中断信号的输入,另一方面,它会发出中断信号给CPU。可以通过对中断控制器编程实现对中断源的优先级、触发方式、打开和关闭源等设置操作。
CPU:CPU会响应中断源的请求,中断当前正在执行的任务,转而执行中断处理程序。
和中断相关的名词解释
2、中断延迟的概念
中断延迟是指从硬件中断发生到开始执行中断处理程序第一条指令之间的这段时间。也就是:系统接收到中断信号到操作系统做出响应,并完成转换到中断服务程序的时间。
中断延迟=识别中断时间+[等待中断打开时间]+[关闭中断时间]。
识别中断时间:中断的处理过程是:外界硬件发生了中断后,CPU到中断控制器读取中断向量,并且查找中断向量表,找到对应的中断服务子程序的首地址,然后跳转到对应的ISR去做相应处理。这部分时间我们称之为识别中断时间。
等待中断打开时间:在允许中断嵌套的实时操作系统中,中断也是基于优先级的,允许高优先级中断抢占正在处理的低优先级中断,所以,如果当前正在处理更高优先级的中断,即使此时有低优先级的中断,系统也不会立刻响应,而是等到高优先级中断处理完之后,才会响应。而即使在不支持中断嵌套的系统中,中断是不允许被打断的,所以,如果当前系统正在处理一个中断,而此时另一个中断到来了,系统也是不会立即响应的,而只是等待处理完当前的中断之后,才会处理后来的中断。此部分时间,称为等待中段打开时间。
关闭中断时间:在操作系统中,很多时候我们会主动进入临界段,系统不允许当前状态被中断打断,故而在临界区发生的中断会被挂起,直到跳出临界段的时候打开中断。此部分时间,称为关闭中断时间。
3、中断管理讲解
ARM Cortex-M系列内核的中断是由硬件管理的,而FreeRTOS是软件,它并不接管由硬件管理的相关中断,只支持简单的开关中断等,所以FreeRTOS中的中断使用其实跟裸机差不多,需要我们自己配置中断,并且使能中断,编写中断服务函数,在中断服务函数中使用内核IPC通信机制,一般建议使用信号量、消息列表或事件标志组等标记事件的发生,将事件发布给处理任务,等退出中断后再由相关处理任务具体处理中断。
用户可以自定义配置系统可管理的最高中断优先级的宏定义:configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY。它是用于配置内核中的basepri寄存器的,当basepri设置为某个值的时候,NVIC不会响应比该优先级低的中断,而优先级比之更高的中断则不受影响。