1. FreeRTOS任务挂起与恢复
1.1 任务的挂起与恢复的API函数
-
挂起任务
挂起任务类似暂停,可恢复;删除任务,无法恢复 vTaskSuspend(),使用时需要将宏 INCLUDE_vTaskSupend 配置为1. 无论优先级如何,被挂起的任务都将不会再被执行,直到任务被恢复。 当函数传入的参数为NULL,则代表挂起任务自身(当前正在运行的任务)。
-
恢复挂起的任务
恢复被挂起的任务 vTaskResume(),宏 INCLUDE_vTaskSuspend 必须定义为1.任务无论被vTaskSuspend()挂起多少次, 只需在任务中调用vTaskResume()恢复一次,就可以继续运行。且被恢复的任务会进入就绪态。
-
在中断中恢复被挂起的任务
xTaskResumeFROMISR(),带FromISR是在中断函数中专用的API函数。 宏 INCLUDE_vTaskSuspend 和 INCLUDE_xTaskResumeFromlSR 必须定义为1,用于解挂被挂起任务
中断服务程序中要调用freeRTOS的API函数则中断优先级不能高于FreeRTOS所管理的最高优先级
2. FreeRTOS中断管理
2.1 中断
让CPU打断正常程序的运行,转而紧急处理的事件(程序),就叫中断。
2.2 中断优先级分组设置
ARM Cortex-M使用了8位宽的寄存器来配置中断的优先等级,这个寄存器就是中断优先级配置寄存器
但STM32,只用了中断优先级配置寄存器的高4位[7∶4],所以STM32提供了最大16级的中断优先等级
STM32的中断优先级可以分为抢占优先级和子优先级:
- 抢占优先级: 抢占优先级高的中断可以打断正在执行但抢占优先级低的中断
- 子优先级: 当同时发生具有相同抢占优先级的两个中断时,子优先级数值小的优先执行
2.2.1 5种优先级分组分配方式
调用函数HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4)
2.2.2 特点
- 中断优先级数值越小越优先!!任务优先级数值越大越优先
- 将所有优先级位指定为抢占优先级可以方便FreeRTOS管理
- 低于configMAX_SYSCALL_INTERRUPT_PRIORITY优先级的中断里才允许调用FreeRTOS的API函数
2.3 中断相关寄存器
三个系统中断优先级配置寄存器,分别为SHPR1、SHPR2、SHPR3。
通过SHPR3将PendSV和SysTick的中断优先级设置为最低优先级,保证系统任务切换不会阻塞系统其他中断的响应
三个中断屏蔽寄存器,分别为PRIMASK、FAULTMASK和BASEPRI
FreeRTOS所使用的中断管理就是利用BASEPRI这个寄存器。
BASEPRI:屏蔽优先级低于某一个阈值的中断,当设置为0时,则不关闭任何中断