• FreeRTOS任务创建删除


    FreeRTOS 当前使用的api 接口为

    xTaskCreate()
    xTaskCreateRestricted()
    xTaskCreateStatic()
    vTaskDelete()

     xTaskCreate() 函数原型

    BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,      
                 const char * const pcName,      
                 const uint16_t usStackDepth,     
                 void * const pvParameters,      
                 UBaseType_t uxPriority,        
                   TaskHandle_t * const pxCreatedTask )

     pxTaskCode : 实现任务的主要功能的函数,其返回值是void 类型,参数是void * 类型

    const pcName:任务名,其长度由宏 configMAX_TASK_NAME_LEN 决定,一般16
    StackDepth : 堆栈的大小设置。实际大小是该值4倍,因为它是4字节大小。
    pvParameters :需要传递给任务的参数,
    uxPriority : 任务优先级,范围:0-configMAX_PRIORITIES
    pxCreatedTask :创建成功后的任务句柄保存在这个参数里面,供其他API 使用。比如任务删除

    创建成功后,返回值为: pdPASS.   其他则为失败,可能的原因堆内存分配失败。

    由于任务需要ram 来进行堆栈的分配和存储,这部分自动从FreeRTOS 的堆中分配。由于这个函数需要系统来帮助任务做这些处理所以需要freertos 提供内存管理和分配,因此对于freeRTOS 来说需要提供一个内存管理文件,如heap_x.c ,同时宏configSUPPORT_DYNAMIC_ALLOCATION 需要定义为1.

    xTaskCreateStatic() 函数原型

    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 )

    pxTaskCode: 要实现的任务的功能函数,返回类型void, 参数类型: void *

    pcName: 任务的名字

    ulStackDepth: 堆栈的大小,实际大小是该值的4倍,因为其对应的是int型大小字节空间

    pvParameters: 传递给任务的参数

    uxPriority: 优先级。范围:0-configMAX_PRIORITIES

    puxStackBuffer: 堆栈空间,这是由用户指定的,一般就是一个数组,数组的大小就是上面ulStackDepth值。类型

            为StackType_t 类型。

    pxTaskBuffer: 任务控制块。

    任务创建成功,返回任务句柄。

    从参数上可以看出上面两个函数区别,static 类型的任务创建,需要用户手动指定堆栈,同时,增加了一个任务控制块。


    xTaskCreateRestricted() 函数原型

    BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask )

    这个函数创建的任务会受到MPU的保护,所以要求对应的mcu有MPU(内存保护单元), 除此以外,其他功能就和xTaskCreate 一样了

    vTaskDelete() 函数原型

    void vTaskDelete( TaskHandle_t xTaskToDelete )

    用于删除一个由上面的xTaskCreate 和 xTaskCreateStatic创建的函数

    调用次函数之后需要注意一些事项,

    1,调用次函数之后,任务就不存在了,此时任务所占用的内存相关空间会在idle 任务运行时给释放,因此

      需要给idle 任务一定的运行时间。

    2,在任务中由用户手动分配的空间,需要由用户自己手动释放,否则会造成内存泄漏

  • 相关阅读:
    【Qt】无边框窗体中带有ActiveX组件时的一个BUG
    Qt:正确判断文件、文件夹是否存在的方法
    自定义Data Service Providers
    Facebook的ATOM Editor的底层Electron
    ASP.NET Web API中使用OData
    Oracle 使用
    ODP.NET 之访问 Oracle 数据库
    Oracle安装及使用入门
    架构设计
    CQRS模式实现
  • 原文地址:https://www.cnblogs.com/yunxiangworld/p/8029008.html
Copyright © 2020-2023  润新知