RTOS任务挂起与恢复的学习笔记

本文详细介绍了FreeRTOS中的任务挂起与恢复功能,包括如何使用`vTaskSuspend`和`vTaskResume`API,以及注意事项,如避免在中断服务函数中使用`vTaskDelay`。
摘要由CSDN通过智能技术生成

关于任务挂起与恢复的API函数

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()的函数

另外,中断函数本来就是为了处理紧急情况,在中断函数中延时是不太合理的。

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值