FreeRTOS-8-中断管理

这是FreeRTOS系列学习文章的第八篇,主要介绍FreeRTOS中断管理机制。

中断延迟

即使操作系统的响应很快了,对于中断的处理也存在中断延迟响应的问题,我们称之为中断延迟(interrupt latency)。中断延迟是指从硬件中断发生到开始执行中断处理程序第一条指令的这段时间。也就是系统接收到中断信号到操作系统做出响应,并完成转入中断服务程序的时间。

中断延迟=识别中断时间+[等待中断打开时间]+[关闭中断时间]

注意:“[]”的时间是不一定都存在的,此处为最大可能的中断延迟时间。

识别中断时间

中断的处理过程是,外界硬件发生中断后,CPU到中断处理器读取中断向量,并且查找中断向量表,找到对应的中断服务子程序(ISR)的首地址,然后跳转到对应的ISR去做相应处理。这部分时间可称为识别中断时间。

等待中断打开时间

在允许中断嵌套的实时操作系统中,中断也是基于优先级的,允许高优先级中断抢断正在处理的低优先级中断,所以,如果当前正在处理更高优先级的中断,即使此时有低优先级的中断,系统也不会立刻响应,而是等到高优先级的中断处理完之后才会响应。在不支持中断嵌套的情况下,即中断是没有优先级的,不允许打断,如果当前系统正在处理一个中断,而此时另一个中断到来了,系统是不会立即响应的,而是等处理完当前的中断之后,才会处理后来的中断。此部分时间可称为等待中断打开时间。

关闭中断时间

在操作系统中,很多时候我们会主动进入临界段,系统不允许当前状态被中断打断,所以在临界区发生的中断会被挂起,直到退出临界段时才打开中断。此部分时间,可称为关闭中断时间。

ARM Cortex-M的中断管理

用户可以配置系统可管理的最高中断优先级的宏定义configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY,它用于配置内核中的BASEPRI寄存器,当BASEPRI设置为某个值时,NVIC不会响应比该优先级低的中断,而优先级比之更高的中断则不受影响。也就是说,当这个宏定义配置为5时,中断优先级数值在0、1、2、3、4的这些中断是不受FreeRTOS屏蔽的,即使在系统进入临界段时,这些中断也能被触发而不是等到退出临界段的时候才被触发,当然,这些中断服务函数中也不能调用FreeRTOS提供的API函数接口,而中断优先级在5~15的这些中断是可以被屏蔽的,也能安全调用FreeRTOS提供的API函数接口。

ARM Cortex-M NVIC支持中断嵌套功能:当一个中断触发并且系统进行响应时,处理器硬件会将当前运行的部分上下文寄存器自动压入中断栈中,这部分寄存器包括PSR、r0、r1、r2、r3以及r12。当系统正在服务一个中断时,如果有一个更高优先级的中断触发,那么处理器同样会打断当前运行的中断服务例程,然后把旧的中断服务例程上下文的PSR、r0、r1、r2、r3和r12寄存器自动保存到中断栈中。这部分上下文寄存器保存到中断栈的行为完全是硬件行为,这一点是与其他ARM处理器区别最大之处(以往都需要依赖于软件保存上下文)。

另外,在ARM Cortex-M系列处理器上,所有中断都采用中断向量表的方式进行处理,即当一个中断触发时,处理器将直接判定是哪个中断源,然后直接跳转到相应的固定位置进行处理。而在ARM7、ARM9中,一般是先跳转进入IRQ入口,然后由软件判断是哪个中断源触发,获得相对应的中断服务例程入口地址后,再进行后续的中断处理。ARM7、ARM9的好处在于,所有中断都有统一的入口地址,便于操作系统统一管理。而ARM Cortex-M系列处理器则恰恰相反,每个中断服务例程必须排列在一起放在统一的地址上(这个地址必须设置到NVIC的中断向量偏移寄存器中)。中断向量表一般由一个数组定义(或在起始代码中给出),在STM32上,默认采用起始代码给出


FreeRTOS-8-中断管理
https://ysc2.github.io/ysc2.github.io/2024/01/25/FreeRTOS-8-中断管理/
作者
Ysc
发布于
2024年1月25日
许可协议