任务既然可以被创建,那么自然也可以被删除,对于某些执行一次或几次就不需要的任务来说,可以在执行完成后,把此任务删除,可以通过别的任务将其删除,也可以任务自己删除自己。
任务删除函数:
void vTaskDelete( TaskHandle_t xTaskToDelete );
他的参数就是任务的句柄,就是创建任务函数的第五个参数。
任务句柄实际上就是一个TCB结构体,存放任务的一些信息,对任务进行某些操作的时候,把任务句柄传入对应的函数即可。所以删除任务就把要删除的任务的句柄传递给删除任务函数即可。
首先创建三个任务,在任务2中,任务2执行100次之后,调用vTaskDelete(NULL);函数,自己把自己删除;在任务3中,任务3执行200次之后,任务3调用vTaskDelete(xHandleTask1);函数把任务1删除。注意vTaskDelete()中,参数写入NULL则代表删除此任务本身。
例子:
- static volatile int Task1RunningFlag = 0;
- static volatile int Task2RunningFlag = 0;
- static volatile int Task3RunningFlag = 0;
- TaskHandle_t xHandleTask1;
- void Task1(void * param)
- {
- while(1)
- {
- Task1RunningFlag = 1;
- Task2RunningFlag = 0;
- Task3RunningFlag = 0;
- printf("A");
- }
- }
- TaskHandle_t xHandleTask2;
- void Task2(void * param)
- {
- int i = 0;
- while(1)
- {
- Task1RunningFlag = 0;
- Task2RunningFlag = 1;
- Task3RunningFlag = 0;
- printf("a");
- if(i++ == 100)
- {
- vTaskDelete(NULL);
- }
- }
- }
- StackType_t xTask3Stack[100];
- StaticTask_t xTask3Tcb;
- void Task3(void * param)
- {
- int i = 0;
-
- while(1)
- {
- Task1RunningFlag = 0;
- Task2RunningFlag = 0;
- Task3RunningFlag = 1;
- printf("1");
- if(i++ == 200)
- {
- vTaskDelete(xHandleTask1);
- }
- }
- }
- StackType_t xIdleTaskStack[100];
- StaticTask_t xIdleTaskTcb;
- void vApplicationGetIdleTaskMemory(StaticTask_t * * ppxIdleTaskTCBBuffer, StackType_t * * ppxIdleTaskStackBuffer, uint32_t * pulIdleTaskStackSize)
- {
- *ppxIdleTaskTCBBuffer = &xIdleTaskTcb;
- *ppxIdleTaskStackBuffer = xIdleTaskStack;
- *pulIdleTaskStackSize = 100;
- }
主函数:
-
- int main( void )
- {
- prvSetupHardware();
- printf("Hello World!\r\n");
-
- xTaskCreate(Task1,"Task1",100,NULL,1,&xHandleTask1);
- xTaskCreate(Task2,"Task2",100,NULL,1,&xHandleTask2);
- xTaskCreateStatic(Task3,"Task3",100,NULL,1,xTask3Stack,&xTask3Tcb);
-
- vTaskStartScheduler();
- return 0;
- }
输出结果:
可以看到,任务2执行一段时间(100次)后被删除,任务1在这之后又执行一段时间(共200次)之后被删除,在以后就只剩下任务3执行了。
vTaskDelete();函数既可以删除动态创建任务函数xTaskCreate创建的任务,也可以删除静态创建任务函数xTaskCreateStatic创建的任务。对于xTaskCreate()我们在创建的时候就已经定了了该任务的任务句柄,删除的时候直接传入即可。
对于xTaskCreateStatic,我们可以从下图看到,此函数的返回值就是一个任务句柄,所以要提前用一个创建个结构体获取该任务的句柄。
TaskHandle_t TaskStaticHandle = xTaskCreateStatic(Task3,"Task3",100,NULL,1,xTask3Stack,&xTask3Tcb);