• FreeRTOS——删除任务


    任务既然可以被创建,那么自然也可以被删除,对于某些执行一次或几次就不需要的任务来说,可以在执行完成后,把此任务删除,可以通过别的任务将其删除,也可以任务自己删除自己。

    任务删除函数:

    void vTaskDelete( TaskHandle_t xTaskToDelete );

     他的参数就是任务的句柄,就是创建任务函数的第五个参数。

    任务句柄实际上就是一个TCB结构体,存放任务的一些信息,对任务进行某些操作的时候,把任务句柄传入对应的函数即可。所以删除任务就把要删除的任务的句柄传递给删除任务函数即可。

    首先创建三个任务,在任务2中,任务2执行100次之后,调用vTaskDelete(NULL);函数,自己把自己删除;在任务3中,任务3执行200次之后,任务3调用vTaskDelete(xHandleTask1);函数把任务1删除。注意vTaskDelete()中,参数写入NULL则代表删除此任务本身。

    例子:

    1. static volatile int Task1RunningFlag = 0;
    2. static volatile int Task2RunningFlag = 0;
    3. static volatile int Task3RunningFlag = 0;
    4. TaskHandle_t xHandleTask1;
    5. void Task1(void * param)
    6. {
    7. while(1)
    8. {
    9. Task1RunningFlag = 1;
    10. Task2RunningFlag = 0;
    11. Task3RunningFlag = 0;
    12. printf("A");
    13. }
    14. }
    15. TaskHandle_t xHandleTask2;
    16. void Task2(void * param)
    17. {
    18. int i = 0;
    19. while(1)
    20. {
    21. Task1RunningFlag = 0;
    22. Task2RunningFlag = 1;
    23. Task3RunningFlag = 0;
    24. printf("a");
    25. if(i++ == 100)
    26. {
    27. vTaskDelete(NULL);
    28. }
    29. }
    30. }
    31. StackType_t xTask3Stack[100];
    32. StaticTask_t xTask3Tcb;
    33. void Task3(void * param)
    34. {
    35. int i = 0;
    36. while(1)
    37. {
    38. Task1RunningFlag = 0;
    39. Task2RunningFlag = 0;
    40. Task3RunningFlag = 1;
    41. printf("1");
    42. if(i++ == 200)
    43. {
    44. vTaskDelete(xHandleTask1);
    45. }
    46. }
    47. }
    48. StackType_t xIdleTaskStack[100];
    49. StaticTask_t xIdleTaskTcb;
    50. void vApplicationGetIdleTaskMemory(StaticTask_t * * ppxIdleTaskTCBBuffer, StackType_t * * ppxIdleTaskStackBuffer, uint32_t * pulIdleTaskStackSize)
    51. {
    52. *ppxIdleTaskTCBBuffer = &xIdleTaskTcb;
    53. *ppxIdleTaskStackBuffer = xIdleTaskStack;
    54. *pulIdleTaskStackSize = 100;
    55. }

    主函数:

    1. int main( void )
    2. {
    3. prvSetupHardware();
    4. printf("Hello World!\r\n");
    5. xTaskCreate(Task1,"Task1",100,NULL,1,&xHandleTask1);
    6. xTaskCreate(Task2,"Task2",100,NULL,1,&xHandleTask2);
    7. xTaskCreateStatic(Task3,"Task3",100,NULL,1,xTask3Stack,&xTask3Tcb);
    8. vTaskStartScheduler();
    9. return 0;
    10. }

    输出结果:

     可以看到,任务2执行一段时间(100次)后被删除,任务1在这之后又执行一段时间(共200次)之后被删除,在以后就只剩下任务3执行了。
    vTaskDelete();函数既可以删除动态创建任务函数xTaskCreate创建的任务,也可以删除静态创建任务函数xTaskCreateStatic创建的任务。对于xTaskCreate()我们在创建的时候就已经定了了该任务的任务句柄,删除的时候直接传入即可。
    对于xTaskCreateStatic,我们可以从下图看到,此函数的返回值就是一个任务句柄,所以要提前用一个创建个结构体获取该任务的句柄。

    TaskHandle_t TaskStaticHandle = xTaskCreateStatic(Task3,"Task3",100,NULL,1,xTask3Stack,&xTask3Tcb); 

     

  • 相关阅读:
    python爬虫request和BeautifulSoup使用
    基于JavaWeb+SpringBoot+微信小程序的酒店商品配送平台系统的设计和实现
    如何使用 saplink 安装其他网站上提供的 ABAP 程序
    23种设计模式之职责链模式(Chain of Responsibility Pattern)
    免费主机|永久免费空间|php虚拟主机|博客主机|论坛主机|免费域名|云主机
    SPARK中的wholeStageCodegen全代码生成--以aggregate代码生成为例说起(2)
    unity学习(51)——服务器三次注册限制以及数据库化角色信息6--完结
    JS中的对象
    小程序插件——开发者开发神器
    从零开始学Spring Boot系列-SpringApplication
  • 原文地址:https://blog.csdn.net/weixin_48100941/article/details/127457414