Free RTOS动态与静态创建任务

一、动态创建任务(简单省事)

         优点 : 动态创建任务时FreeRTOS会在任务任务创建和删除时自动创建和回收任务堆栈空间,用户无需担心内存的申请与释放问题(五种动态内存管理算法分别为:heap_1、heap_2、heap_3、heap_4、heap_5)

        缺点:

1)占用大量的代码空间,不适合用在资源紧缺的嵌入式系统中;

2)没有线程安全的相关机制;

3)运行具有不确定性,每次调用这些函数时花费的时间可能都不相同;

4)内存碎片化-->内存空间会被分割成不同大小且不连续的区域

       使用: 使用 xTaskCreate()

BaseType_t xTaskCreate(
    TaskFunction_t pvTaskCode,
    const char * const pcName,
    const configSTACK_DEPTH_TYPE usStackDepth,
    void * const pvParameters,
    UBaseType_t uxPriority,
    TaskHandle_t * const pxCreatedTask
);

1.TaskFunction_t pvTaskCode:任务函数的指针。这个参数是一个函数指针,指向一个任务的实际执行代码。任务函数的原型必须符合 TaskFunction_t 类型,即 void func(void *pvParameters),其中 pvParameters 是一个指向和任务相关的参数的指针。

2.const char * const pcName:任务的名称。这个参数是一个字符串常量,用于标识任务。

3.const configSTACK_DEPTH_TYPE usStackDepth:任务栈的大小。这个参数表示任务栈的深度、空间或者大小,以字节为单位。在创建任务时需要提供一个足够大的堆栈以确保任务可以运行。

4.void * const pvParameters:任务参数的指针。这个参数是任务的实际参数,它的类型可以是 void 指针或者其他任意类型的指针。在任务执行时,可以通过此参数来传递任务需要的参数。

5.UBaseType_t uxPriority:任务的优先级。这个参数用于指定任务的优先级,数值越大表示优先级越高。优先级的取值范围根据量化数值的位数而定,一般来说,取值范围是 0-31,在 FreeRTOS 中,0 号优先级最低,而 31 号优先级最高。

6.TaskHandle_t * const pxCreatedTask:用于返回创建的任务的句柄。创建任务成功后,系统将返回一个指向该任务的任务句柄

二、静态创建任务(麻烦但可靠)

        用户自己提供内存空间,并且使用静态方式占用的内存空间一般固定了,即使创建的任务队列被删除后,这些被占用的空间一般没有其他用途。

        通过静态创建方式,可以使用编译器的内存分配器来分配任务所需的内存空间,从而避免了动态分配内存的开销和潜在的内存泄漏问题。静态创建方式还可以在一些对内存使用有限制的场合下有效地管理系统资源,提高系统的稳定性和性能

静态创建任务使用前需先为空闲任务分配内存空间vApplicationGetIdleTaskMemory

StackType_t xIdleTaskStack[100];
StaticTask_t xIdleTaskTCB;

void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,
                                    StackType_t ** ppxIdleTaskStackBuffer,
                                    uint32_t * pulIdleTaskStackSize )
{
    *ppxIdleTaskTCBBuffer = &xIdleTaskTCB;
    *ppxIdleTaskStackBuffer = xIdleTaskStack;
    *pulIdleTaskStackSize = 100;
}

静态创建任务

TaskHandle_t xTaskCreateStatic(           //此函数返回值为任务句柄
    TaskFunction_t pxTaskCode,
    const char * const pcName,
    const uint32_t ulStackDepth,
    void * const pvParameters,
    UBaseType_t uxPriority,
    StackType_t * const puxStackBuffer,    //此处为任务内存空间,可使用数组
    StaticTask_t * const pxTaskBuffer      //任务控制块句柄
);

三、静态创建任务和动态创建任务的区别

  动态创建任务是在运行时通过动态内存分配函数分配任务内存。这种分配方式可以更灵活地适应不同大小和数量的任务,并且支持删除或重新创建任务。然而,在动态方式下,程序需要在运行时使用动态内存分配函数,这可能会导致内存泄漏和堆碎片等问题。在动态方式下,任务需要使用xTaskCreate()函数创建。

   静态创建任务是在编译时为任务分配内存,这意味着任务在运行时之前已经预分配了足够的内存。这种方法不需要在运行时使用动态内存分配函数,因此更加可靠和节省内存。在静态方式下,任务可以使用xTaskCreateStatic()函数创建。

       选择使用哪种方式创建任务取决于应用程序的设计和实际需要。如果应用程序中的任务数量和大小已知,则可以使用静态方式分配内存,并且无需动态内存分配。如果应用程序需要更多的灵活性,并且需要在运行时根据需要创建或删除任务,则应使用动态方式分配内存。

   需要注意的是,静态方式创建任务需要事先知道任务所需的内存大小,以及将任务的堆栈和控制块明确地分配给该任务。如果任务使用的内存超出了分配的内存,则可能会发生严重错误,例如内存泄漏或严重的崩溃。在动态方式下,内存分配在运行时动态进行,因此可以更好地处理任务所需的内存。

参考自:FreeRTOS任务的创建(动态方法和静态方法) (rply.cn)

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值