当前位置:   article > 正文

三、FreeRTOS学习之 freertos的任务创建_freertos创建任务

freertos创建任务

目录

一、任务创建:

1、静态创建:

2、动态创建:

3、任务句柄

4、例:


一、任务创建:

在freertos中,提供了两种创建任务的方式:静态创建,动态创建。

1、静态创建:

需要提前分配好栈空间和TCB结构体(任务控制块)

  1. //注意:在FreeRTOSConfig.h中定义使能宏
  2. //#define configSUPPORT_STATIC_ALLOCATION 1
  3. TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,//任务函数名
  4. const char * const pcName, //任务名
  5. uint32_t ulStackDepth,//栈大小
  6. void *pvParameters,//参数
  7. UBaseType_t uxPriority,//优先级
  8. StackType_t * const puxStackBuffer,//任务栈
  9. StaticTask_t * const pxTaskBuffer //任务控制块
  10. )

2、动态创建:

栈空间和任务控制块由系统自动分配

  1. //注意:在FreeRTOSConfig.h中定义使能宏
  2. //#define configSUPPORT_DYNAMIC_ALLOCATION 1
  3. BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, //函数指针
  4. const char * const pcName, //函数名
  5. unsigned short usStackDepth, //栈深度
  6. void *pvParameters, //参数
  7. UBaseType_t uxPriority, //优先级
  8. TaskHandle_t * const pxCreatedTask // 任务句柄)

3、任务句柄

定义:又叫任务控制块,包含了任务的所有信息。

  1. struct tskTaskControlBlock; // 原型
  2. typedef struct tskTaskControlBlock* TaskHandle_t;//重定义,取别名
  3. typedef struct tskTaskControlBlock
  4. {
  5. volatile StackType_t *pxTopOfStack;
  6. ListItem_t xStateListItem; //任务状态列表
  7. ListItem_t xEventListItem; //任务事件列表
  8. UBaseType_t uxPriority; //优先级
  9. StackType_t *pxStack; //栈指针
  10. char pcTaskName[ configMAX_TASK_NAME_LEN ];
  11. } tskTCB;

所以,可以删除句柄来删除任务,vTaskDelete(句柄)

4、例:

  1. /* FreeRTOS头文件 */
  2. #include "FreeRTOS.h"
  3. #include "task.h"
  4. StackType_t xIdleTask2Stack[100];
  5. StaticTask_t xIdleTask2Tcb;
  6. void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize)
  7. {
  8. *ppxIdleTaskTCBBuffer = &xIdleTask2Tcb;
  9. *ppxIdleTaskStackBuffer = xIdleTask2Stack;
  10. *pulIdleTaskStackSize = 100;
  11. }
  12. TaskHandle_t xHandleTask1 = NULL;//任务句柄,用于删除
  13. void Task1(void * param)
  14. {
  15. while(1)
  16. {
  17. printf("动态");
  18. }
  19. }
  20. TaskHandle_t xHandleTask2 = NULL;
  21. void Task2(void * param)
  22. {
  23. while(1)
  24. {
  25. printf("static");
  26. }
  27. }
  28. int main( void )
  29. {
  30. xTaskCreate(Task1,"Task1",100,NULL,1,&xHandleTask1);
  31. xHandlerTask2=xTaskCreateStatic(Task2,"Task2",100,NULL,1,xIdleTask2Stack,&xIdleTask2Tcb);
  32. vTaskStartScheduler(); // 启动任务,开启调度
  33. while(1); // 正常不会执行到这里
  34. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/825911
推荐阅读
相关标签
  

闽ICP备14008679号