关于任务挂起与恢复的API函数![](https://img-blog.csdnimg.cn/direct/270f8769e4444b9286210a8a70e11335.png)
void vTaskSuspend(TaskHandle_t xTaskToSuspend)
xTaskToSuspend:传入的参数为任务句柄;如果写NULL为挂起目前执行的任务。
想要挂起一个任务就要写入该任务的任务句柄无论优先级如何,被挂起的任务都将不再被执行,直到任务被恢复 。
任务中恢复被挂起函数:void vTaskResume(TaskHandle_t xTaskToResume)
xTaskToResume:传入参数为待恢复任务的任务句柄
注意:任务无论被 vTaskSuspend() 挂起多少次,只需在任务中调用 vTakResume() 恢复一次,就可以继续运行。且被恢复的任务会进入就绪态!
任务被恢复后就进入就绪态等待,这个任务完全准备好了,随时可以运行:只是还轮不到它。这时,它就处于就绪态(Ready)。
示例:
创建的任务
defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);
/* USER CODE BEGIN RTOS_THREADS */
/* add threads, ... */
taskHandle= osThreadNew(task1, NULL, &task);
musicHandle=xTaskCreate(music,"music",128,NULL,osPriorityNormal+1,&xmusichandle);
音乐任务函数
/**
* @Function name MUSIC_Begin
* @Introduce 开始播放音乐
* @Return NULL
*/
void MUSIC_Analysis(void){
uint16_t MusicBeatNum = ((((sizeof(Music_Lone_Brave))/2)/3)-1);
uint16_t MusicSpeed = Music_Lone_Brave[0][2];
for(uint16_t i = 1;i<=MusicBeatNum;i++){
//BSP_Buzzer_SetFrequency(Tone_Index[Music_Lone_Brave[i][0]][Music_Lone_Brave[i][1]]);
PassiveBuzzer_Set_Freq_Duty(Tone_Index[Music_Lone_Brave[i][0]][Music_Lone_Brave[i][1]], 50);
//HAL_Delay(MusicSpeed/Music_Lone_Brave[i][2]);
//mdelay(MusicSpeed/Music_Lone_Brave[i][2]);
vTaskDelay(MusicSpeed/Music_Lone_Brave[i][2]);
}
}
/* USER CODE END FD */
/************************ (C) COPYRIGHT Lesterbor *****END OF FILE****/
void music(void *argument)
{
PassiveBuzzer_Init();
while (1)
{
MUSIC_Analysis();
}
}
挂起与恢复的函数的使用
void StartDefaultTask(void *argument)
{
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
LCD_Init();
LCD_Clear();
uint8_t dev, data;
IRReceiver_Init();
while (1)
{
if (0 == IRReceiver_Read(&dev, &data))
{ LCD_PrintString(0, 2, "Device Data");
if(data==0xe0||data==0x90)
{
LCD_PrintString(0, 0, "Suspend");
vTaskSuspend(xmusichandle);//挂起该任务
}
if(data==0xa8)
{
LCD_PrintString(0, 0, "Create");
vTaskResume(xmusichandle);//恢复该任务
}
}
}
中断中恢复被挂起函数: BaseType_t xTaskResumeFromISR(TaskHandle_t xTaskToResume)
xTaskToResume:传入参数为待恢复任务的任务句柄
该函数专用于中断服务函数中,用于解挂被挂起任务
注意:中断服务程序中要调用freeRTOS的API函数则中断优先级不能高于FreeRTOS所管理的最高优先级
注意事项(避免程序卡死)!!!
中断函数中不可以使用vTaskDelay()!也不能调用有vTaskDelay()的函数
另外,中断函数本来就是为了处理紧急情况,在中断函数中延时是不太合理的。