zoukankan      html  css  js  c++  java
  • 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,在任务中由用户手动分配的空间,需要由用户自己手动释放,否则会造成内存泄漏

  • 相关阅读:
    OpenAL
    VS2013关于“当前不会命中断点源代码与原始版本不同”的BUG
    Windows中的句柄
    (转)OpenGL中位图的操作(glReadPixels,glDrawPixels和glCopyPixels应用举例)
    全局变量的初始化顺序
    与时间有关的windows函数
    unity中的协程
    Unity3d碰撞检测中碰撞器与触发器的区别
    unity脚本入门
    面试总结关于Spring面试问题(精选)
  • 原文地址:https://www.cnblogs.com/yunxiangworld/p/8029008.html
Copyright © 2011-2022 走看看