FreeRTOS之xTaskCreateStatic()

xTaskCreateStatic()函数解析

task. h

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

总结

创建新的任务实例。
每个任务都需要RAM来保存任务状态(任务控制块,或TCB),并被任务用作其堆栈。如果任务是使用xTaskCreate()创建的,则需要从FreeRTOS的堆中自动分配RAM。如果使用xTaskCreateStatic()创建任务,则由应用程序编写器提供RAM,这将导致两个额外的函数参数,但允许在编译时静态分配RAM。
新创建的任务最初处于就绪状态,但如果没有更高优先级的任务可以运行,则会立即成为正在运行的状态任务。
创建任务可以在启动调度程序之前和之后。

参数

参数功能
pvTaskCode任务是简单的C函数,永远不会退出,因此,通常被实现为一个无限循环。pvTaskCode参数只是一个指针,指向实现任务的函数(实际上就是函数名)。
pcName任务的描述性名称。这主要用于方便调试,但也可以用于调用xTaskGetHandle()来获得任务句柄。应用程序定义的常量configMAX_TASK_NAME_LEN以字符定义名称的最大长度—包括空终止符。提供的字符串长度超过这个最大值将导致字符串被自动截断。
ulStackDepthpuxStackBuffer参数用于将StackType_t变量数组传递给xTaskCreateStatic()。ulStackDepth必须设置为数组中索引的数量。
pvParameters任务函数接受类型为“指针指向void”(void*)的参数。分配给pvParameters的值将是传递给任务的值。此参数具有类型“指针指向void”,以允许任务参数有效地、间接地通过强制转换接收任何类型的参数。例如,可以将整数类型传递到任务函数中,方法是在任务创建时将该整数类型转换为void指针,然后将void指针参数转换回任务函数定义本身中的整数。
uxPriority定义任务执行的优先级。优先级可以从0(最低优先级)分配到(configMAX_PRIORITIES - 1)(最高优先级)。configMAX_PRIORITIES是一个用户定义的常量。如果configUSE_PORT_OPTIMISED_TASK_SELECTION设置为0然后没有上限的优先级数量可用(除了使用的数据类型的极限和可用的RAM单片机),但建议使用所需的最低数量的优先级,以避免浪费内存。传递上面的uxPriority值(configMAX_PRIORITIES - 1)将导致分配给任务的优先级被静默封顶为最大合法值。
puxStackBuffer必须指向至少具有ulStackDepth索引的StackType_t变量数组(请参阅上面的ulStackDepth参数)。数组将被用作已创建任务的堆栈,因此必须是持久的(不能在函数创建的堆栈框架中声明,也不能在任何其他可以在应用程序执行时合法覆盖的内存中声明)。
pxTaskBuffer必须指向类型为StaticTask_t的变量。该变量将用于保存创建的任务的数据结构(TCB),因此它必须是持久的(不是在函数创建的堆栈框架中声明的,也不是在应用程序执行时可以合法覆盖的任何其他内存中声明的)。

返回值

返回值意义
None无法创建任务,因为puxStackBuffer或pxTaskBuffer为空
Any other value如果返回一个非空值,则创建任务,返回的值是创建的任务的句柄。

使用例程

/* Task to be created. */
void vTaskCode( void * pvParameters )
{
    /* The parameter value is expected to be 1 as 1 is passed in the
    pvParameters value in the call to xTaskCreate() below. 
    configASSERT( ( ( uint32_t ) pvParameters ) == 1 );

    for( ;; )
    {
        /* Task code goes here. */
    }
}

/* Function that creates a task. */
void vOtherFunction( void )
{
BaseType_t xReturned;
TaskHandle_t xHandle = NULL;

    /* Create the task, storing the handle. */
    xReturned = xTaskCreate(
                    vTaskCode,       /* Function that implements the task. */
                    "NAME",          /* Text name for the task. */
                    STACK_SIZE,      /* Stack size in words, not bytes. */
                    ( void * ) 1,    /* Parameter passed into the task. */
                    tskIDLE_PRIORITY,/* Priority at which the task is created. */
                    &xHandle );      /* Used to pass out the created task's handle. */

    if( xReturned == pdPASS )
    {
        /* The task was created.  Use the task's handle to delete the task. */
        vTaskDelete( xHandle );
    }
}

说明

在FreeRTOSConfig.h中,configSUPPORT_DYNAMIC_ALLOCATION必须设置为1(支持动态内存申请),或者简单地未定义,使这个函数可用。

Freertos更多精彩

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值