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之后再继续运行。
这是给某些项目情景中两个任务不能冲突运行提供一种解决方案。