一、vTaskDelete()的使用方法
在freeROTS中,函数原型如下:
void vTaskDelete( TaskHandle_t xTaskToDelete );
参数xTaskToDelete :传递的是任务句柄或者NULL。传递对应的任务句柄删除对应的函数,当传入的是NULL时,删除该函数所在的任务。
vTaskDelete()函数主要有三种使用场景:
第一个种:在当前任务中删除自己(自杀)
传递的参数为NULL。
第二种:在当前任务中删除其它任务(杀人)
传递的时要删除任务的句柄。
第三种:被其它任务删除(被杀)
vTaskDelete()函数在其它任务中使用,传递的是自己的句柄。
二、使用vTaskDelete( )遇到的坑
本人在学习时该函数是,使用当前任务删除别的任务时,发现执行vTaskDelete( )函数后,所有的任务均停止,而不是只停止被删除的函数。最后发现在使用vTaskDelete( )函数删除其它任务时,应该先任务的句柄进行判断。在freeROTS中,一个任务不能被删除两次,不然程序会跑飞。在删除任务后,也要手动将句柄赋值为NULL。下面是修改后的程序:
void task_1ms(void *param)
{
while (1)
{
#ifdef DEBUG
(*g_debug)++;
if(*g_debug > 10)
{
if(task_10ms_TaskHandle!=NULL)//不能删除两次,不然程序跑飞
{
vTaskDelete(task_10ms_TaskHandle);
task_10ms_TaskHandle = NULL;//vTaskDelete(Htask) 执行后,Htask不会赋值为NULL,需要手动赋值
}
}
#endif // DEBUG
LED_TIP(Tog);
osDelay(1); // 阻塞
}
}
参考链接第9章 任务管理 | 百问网