FreeRTOS浅析:解决两个任务运行冲突,系统停止一个任务唤醒另一个任务的方法

FreeRTOS中的任务和多线程的概念差不多,但是任务的本质是把时间片无限的切小,小到人分辨不出来,其实还是一个时间只能运行一个任务,这是和多线程的根本区别。

FreeRTOS中的任务有几种运行态:

如果我正在运行A任务,但是B任务起来的时候我需要把A任务挂起,等B任务结束A任务继续运行,不能冲突。下面是demo。

首先运行一个主程序,开启一个任务,里面再开启两个任务

extern xTaskHandle dTask_Handler;//定义任务句柄
extern xTaskHandle cTask_Handler;

static void democode_thread2(void *param)
{

    xTaskCreate(democode_thread, ((const char*)"socket_service_thread"), 1024, NULL, tskIDLE_PRIORITY + 1, (TaskHandle_t*)&dTask_Handler);


	xTaskCreate(democode_thread1, ((const char*)"socket_service_thread1"), 1024, NULL, tskIDLE_PRIORITY + 1, (TaskHandle_t*)&cTask_Handler);
    
    eTaskGetState(dTask_Handler);//查询任务状态
    eTaskGetState(cTask_Handler);
    
    vTaskDelete(NULL);

}


void demo2()
{
    if(xTaskCreate(democode_thread2, ((const char*)"socket_service_thread1"), 1024, NULL, \
            tskIDLE_PRIORITY + 1, (TaskHandle_t*)&eTask_Handler) != pdPASS)
            Ihoment_printf(IHOMENT_ERROR, "\n\r%s xTaskCreate(socket_service_thread) failed", __FUNCTION__);

}

任务一开启之后挂起.任务2开启之后暂停十秒之后释放任务1。

static void democode_thread1(void *param)
{
    printf("into democode_thread1\n");
    vTaskSuspend(NULL);//挂起任务
    while(1)
    {
        printf("demo1 start!\n");
        vTaskDelay(200);
    }
}

static void democode_thread(void *param)
{
    while(1)
    {
         printf("demo start!\n");
         vTaskDelay(10000);//延时十秒
         vTaskResume(cTask_Handler);//释放任务
    }
}

这样就会是这种情况,先democode_thread1进去任务,然后挂起,等到democode_thread10s之后唤醒democode_thread1之后再继续运行。

这是给某些项目情景中两个任务不能冲突运行提供一种解决方案。

发布了37 篇原创文章 · 获赞 16 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/double_lee3/article/details/104001211