FreeRTOS :动态和静态创建任务

FreeRTOS 提供了两种创建任务的方式:动态创建和静态创建。这两种方式的主要区别在于内存分配的时机和灵活性。

动态创建任务

动态创建任务时,FreeRTOS 会在堆中为任务栈和控制块分配内存。这种方式更为灵活,但需要确保有足够的堆空间来支持任务的创建。

函数原型
BaseType_t xTaskCreate(
                     TaskFunction_t pvTaskCode,
                     const char * const pcName,
                     configSTACK_DEPTH_TYPE usStackDepth,
                     void *pvParameters,
                     UBaseType_t uxPriority,
                     TaskHandle_t *pxCreatedTask );
  • pvTaskCode: 指向任务函数的指针。
  • pcName: 任务名称字符串。
  • usStackDepth: 任务栈大小(单位取决于 configUSE_16_BIT_TICKS 配置)。
  • pvParameters: 传递给任务的参数。
  • uxPriority: 任务优先级。
  • pxCreatedTask
    • pxCreatedTask 是一个指向 TaskHandle_t 类型的指针。
    • 它用于接收新创建任务的任务句柄。
    • 通过任务句柄,可以对任务进行各种管理和控制操作。
    • 任务管理: 通过任务句柄,你可以对任务执行各种操作,例如:
      • 挂起任务: 使用 vTaskSuspend(xTaskHandle)
      • 恢复任务: 使用 vTaskResume(xTaskHandle)
      • 删除任务: 使用 vTaskDelete(xTaskHandle)
      • 查询任务状态: 使用 eTaskGetState(xTaskHandle)

静态创建任务

静态创建任务时,所有必要的内存都需要在编译时预先分配好,这使得系统更加稳定和可预测,适用于对内存使用有严格要求的应用场景。

函数原型
TaskHandle_t xTaskCreateStatic(
                              TaskFunction_t pvTaskCode,
                              const char * const pcName,
                              uint32_t ulStackDepth,
                              void *pvParameters,
                              UBaseType_t uxPriority,
                              StackType_t *puxStackBuffer,
                              StaticTask_t *pxTaskBuffer );
  • pvTaskCode: 指向任务函数的指针。
  • pcName: 任务名称字符串。
  • ulStackDepth: 任务栈大小(单位是 StackType_t 类型的元素数量)。
  • pvParameters: 传递给任务的参数。
  • uxPriority: 任务优先级。
  • puxStackBuffer: 指向预先分配好的栈缓冲区。
  • pxTaskBuffer: 指向预先分配好的任务控制块缓冲区。
重点讲解

        当使用 xTaskCreateStatic 创建静态任务时,你需要提供两个缓冲区:

        StackType_t *puxStackBuffer: 用于任务的堆栈。

StackType_t 和 栈深度

  1. StackType_t

    • 定义StackType_t 是一个平台相关的类型,通常定义为 uint32_t 或 uint16_t,具体取决于配置选项 configSTACK_DEPTH_TYPE
    • 作用: 用于表示堆栈中的每个元素。

       StaticTask_t *pxTaskBuffer: 用于任务的 任务控制块TCB。

         在 FreeRTOS 中,StaticTask_t *pxTaskBuffer 和任务控制块(Task Control Block, TCB)之间有着密切的关系。StaticTask_t 实际上是一个结构体,用于存储任务的所有状态信息,即任务控制块的内容。

        

  1. TCB (Task Control Block)

    • 定义: TCB 是一个数据结构,包含了任务的所有必要信息,如任务的状态、优先级、堆栈指针、任务函数指针等。
    • 作用: 操作系统使用 TCB 来管理任务的生命周期和调度。
  2. StaticTask_t

    • 定义StaticTask_t 是一个结构体,专门用于静态任务的 TCB 存储。
    • 作用: 在静态任务创建时,StaticTask_t 提供了预先分配的内存空间来存储任务的 TCB。

对比

特性动态创建任务静态创建任务
内存分配在运行时从堆中分配在编译时由用户预先分配
灵活性更高,易于管理大量任务较低,每个任务需要单独配置内存
可靠性中等,依赖于堆可用性更高,避免了堆碎片化问题
性能较差,涉及堆分配更好,没有额外的内存分配开销
应用场景适合大多数应用,尤其是资源相对充足的情况适合对内存使用有严格限制或实时性能要求较高的场合

等待补充。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半个番茄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值