中断管理
- 什么是中断管理?
用户可以自定义配置系统可管理的最高中断优先级的宏定义configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY(高四位有效),它是用于配置内核中的basepri 寄存器的,当 basepri 设置为某个值的时候,NVIC 不会响应比该优先级低的中断,而优先级比之更高的中断则不受影响。
例如:
就是说当这个宏定义配置为 5 的时候,中断优先级数值在 0、1、2、3、4 的这些中断是不受 FreeRTOS 屏蔽的,也就是说即使在系统进入临界段的时候,这些中断也能被触发而不是等到退出临界段的时候才被触发,当然,这些中断服务函数中也不能调用 FreeRTOS 提供的 API 函数接口,而中断优先级在 5 到 15 的这些中断是可以被屏蔽的,也能安全调用 FreeRTOS 提供的 API 函数接口。
中断管理主要应用于临界段保护中
- 临界段保护
临界段用一句话概括就是一段在执行的时候不能被中断的代码段。在 FreeRTOS 里面,这个临界段最常出现的就是对全局变量的操作。
Cortex-M内核快速开关中断指令
细看一下下边的寄存器的配置的含义
- 关中断
FreeRTOS 关中断的函数在 portmacro.h 中定义,分不带返回值和带返回值两种。
不带返回值
可以看到关中断函数中应用了configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY这个宏定义。将这个定义的值写入basepri寄存器(在上方的寄存器中可以看到)
因此这个关中断的含义就是,比configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY这个宏设置的值高(带等于)的中断都被关闭,比这值小的中断没有被关闭(优先级号越大,优先级越低)。
相当于是低优先级的中断都被关闭,高优先级的中断都可以正常使用
带中断保护的关中断,带返回值
- 开中断
- 在使用临界段保护代码的时候怎么体现的
临界段代码也叫做临界区,是指那些必须完整运行,不能被打断的代码段,比如有的外设的初始化需要严格的时序,初始化过程中不能被打断。
临界段代码为taskENTER_CRITICAL()
taskEXIT_CRITICAL()
上边这段代码是进入临界段代码的具体实现
可以看到:函数内部是先引用的关中断函数
在退出临界段代码的函数中
可以看到,最终是引用了开中断函数
- 举例说明
任务级临界段代码保护
中断级临界段代码保护