在 FreeRTOS 中,任务挂起(Suspend)和恢复(Resume)是用于控制任务执行流程的两个重要操作。挂起一个任务会使其暂停执行,而恢复一个任务则使其重新进入调度器的考虑范围,可能在适当的时候被调度执行。
在 FreeRTOS 中,如果需要临时停止某个任务的执行,但又希望保留其状态和变量值,可以使用任务挂起和恢复的功能,而不是删除并重新创建任务。当任务需要暂停一段时间时,可以将其挂起;当准备再次运行该任务时,可以将其恢复。这样,任务的运行状态和变量值都会保持不变,避免了删除和重建任务时可能导致的数据丢失问题。通过这种方式,可以有效地管理任务的执行流程,同时确保任务数据的完整性。
任务挂起
void vTaskSuspend( TaskHandle_t xTaskToSuspend );
此函数用于将某个任务设置为挂起态,进入挂起态的任务永远都不会进入运行态。退出挂 起态的唯一方法就是调用任务恢复函数vTaskResume()或xTaskResumeFromISR()。
参数
- xTaskToSuspend:要挂起的任务的句柄。
- 注意!如果参数为NULL的话表示挂起任务自己。
无返回值
功能描述
- 当调用
vTaskSuspend()
时,指定的任务会被挂起。如果该任务正在执行,它将立即停止,并从就绪任务列表中移除,直到被显式恢复。补充:
如果使用函数 xTaskCreate()创建任务的话那么函数的参数 pxCreatedTask 就是此任务的任务句柄,如果使用函数xTaskCreateStatic() 创建任务的话那么函数的返回值就是此任务的任务句柄。也可以通过函 数xTaskGetHandle()来根据任务名字来获取某个任务的任务句柄
任务恢复
void vTaskResume( TaskHandle_t xTaskToResume );
将一个任务从挂起态恢复到就绪态,只有通过函数 vTaskSuspend()设置为挂起态的任务才 可以使用vTaskRexume()恢复!
参数
- xTaskToResume:要恢复的任务的句柄。
功能描述
vTaskResume()
用于恢复之前被挂起的任务。该任务将重新被放入就绪任务列表,调度器将根据任务优先级决定何时执行它。
中断管理
FreeRTOS使用的是中断优先级分组是:NVIC_PriorityGroup_4
通过调用函数HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4)即可完成设置
抢占优先级:0-15级抢占优先级;子优先级:0级子优先级
低于configMAX_SYSCALL_INTERRUPT_PRIORITY优先级(5-15)的中断里才允许调用FreeRTOS 的API函数
FreeRTOS 的任务调度器依赖于一个稳定的时钟中断来定期执行任务切换。如果一个高优先级的中断服务例程(ISR)调用了可能会引起任务切换的 FreeRTOS API 函数,那么它可能会破坏调度器的状态,导致不可预测的行为和系统崩溃。
中断优先级数值越小越优先,任务优先级数值越大越优先