四、FreeRTOS的stm32任务的挂起和恢复(标准库)
4.1、任务挂起和恢复函数介绍:
(1)注意:
挂起:挂起任务类似暂停、可恢复。
恢复:恢复被挂起的任务。
"FromISR":带有FromISR后缀是在中断函数中专用的API函数。
任务优先级是数字越大越高优先级,中断优先级是数字越小越高优先级
(2)介绍:
①任务挂起:
void vTaskSuspend(TaskHandle_t xTaskToSuspend),参数为待挂起任务句柄。
此函数用于挂起任务,使用时需要将宏INCLUDE_vTaskSuspend配置为1。
无论优先级如何,被挂起的任务都将不再被执行,直到任务被恢复。
注意:当传入的参数为NULL,则代表挂起任务自身(当前正在运行的任务)
②任务恢复(任务中恢复):
void vTaskResume(TaskHandle_t xTaskToResume),参数为待恢复任务句柄。
此函数用于恢复挂起的任务,使用需要进行宏INCLUDE_vTaskSuspend为1。
注意:任务无论被vTaskSuspend()挂起多少次,只需要在任务中调用vTaskResume()继续运行。并且被恢复的任务会进行就绪态!
③任务恢复(中断中恢复):
BaseType_t xTaskResumeFromlSR(TaskHandle_t xTaskToResume),参数为待恢复的任务句柄。
使用该函数需要注意宏:INCLUDE_vTaskSuspend和INCLUDE_xTaskResumeFromISR必须定义为1。
此函数专用于中断服务函数中,用于解挂被挂起任务
注意:中断服务程序中要调用freeRTOS的API函数则中断优先级不能高于FreeRTOS所管理的最高优先级。
4.2、任务挂起和恢复实验:
(1)实验目的:学会使用FreeRTOS中的任务挂起和恢复函数。
(2)实验设计:按键挂起任务,按键恢复任务,按键中断恢复任务。
(3)代码操作:
复制我发布的FreeRTOS的动态任务创建。只需要修改两个部分:
①一个部分是FreeRTOSConfig.h头文件里对INCLUDE_vTaskSuspend和INCLUDE_xTaskResumeFromISR置1。
②另一个部分是修改myTask3的函数即可(按键1按下挂起,按键2按下恢复,按键3在中断恢复)
//——————task_demo.c————————//
void myTask3(void *arg )
{
while(1)
{
//printf("task3正在运行\n");
KNum=Key_GetNum();
if(KNum==1)
{
printf("guaqi\t\n");
vTaskSuspend(myTaskHandler1);//挂起任务
}
else if(KNum==2)
{
printf("huifu\t\n");
vTaskResume(myTaskHandler1);//恢复任务
}
vTaskDelay(10);
}
}
外部中断恢复的操作,我没能成功,后续在进行尝试。