FreeRTOS API参考——任务创建

本文详细介绍了FreeRTOS中任务创建的两种方式:xTaskCreate和xTaskCreateStatic,包括它们的参数、返回值及用法示例。文章还对比了动态和静态内存分配的区别,帮助开发者理解如何高效地在嵌入式系统中创建和管理任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Modules

TaskHandle_t
task. h

    引用任务的类型。 例如,对xTaskCreate的调用(通过指针参数)返回TaskHandle_t变量,然后可以将该变量用作vTaskDelete的参数以删除任务。

 

xTaskCreate

task. h

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

 

        创建一个新任务,并将其添加到准备运行的任务列表中。 要使此RTOS API函数可用,必须在FreeRTOSConfig.h中将configSUPPORT_DYNAMIC_ALLOCATION设置为1,或将其保留为未定义状态(在这种情况下,它将默认为1)。

        每个任务都需要用于保持任务状态的RAM,并由任务用作其堆栈。 如果使用xTaskCreate()创建任务,则从FreeRTOS堆中自动分配所需的RAM。 如果使用xTaskCreateStatic()创建任务,则RAM由应用程序编写器提供,因此可以在编译时静态分配。 有关更多信息,请参见静态与动态分配页面。

        如果您使用的是FreeRTOS-MPU,则建议使用xTaskCreateRestricted()代替xTaskCreate()。

 

参数:

pvTaskCode  

指向任务输入功能的指针(仅是实现任务的功能的名称,请参见下面的示例)。

    任务通常被实现为无限循环,并且决不能尝试从其实现函数中返回或退出。但是,任务可以自行删除。

pcName  

任务的描述性名称。 这主要用于方便调试,但也可以用于获取任务句柄。

使用FreeRTOSConfig.h中的configMAX_TASK_NAME_LEN参数设置任务名称的最大长度。

usStackDepth  

分配用作任务堆栈的字数(不是字节!)。 例如,如果堆栈为16位宽,而usStackDepth为100,则将分配200个字节用作任务的堆栈。 再举一个例子,如果堆栈为32位宽,而usStackDepth为400,则将分配1600字节用作任务的堆栈。

堆栈深度乘以堆栈宽度不得超过size_t类型变量中可以包含的最大值。

pvParameters  

该值将作为任务的参数传递到创建的任务中。

如果将pvParameters设置为变量的地址,则在创建的任务执行时该变量必须仍然存在–因此传递堆栈变量的地址无效。

uxPriority  

创建的任务将执行的优先级。

包含MPU支持的系统可以通过在uxPrriority中设置portPRIVILEGE_BIT位来选择在特权(系统)模式下创建任务。 例如,要创建优先级为2的特权任务,请将uxPriority设置为(2 | portPRIVILEGE_BIT)。

pxCreatedTask

用于通过xTaskCreate()函数将句柄传递给创建的任务。 pxCreatedTask是可选的,可以设置为NULL。

返回值:

如果任务创建成功,则返回pdPASS。 否则,返回errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY。

 

用法示例:

/* 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 );
    }
}

xTaskCreateStatic

task. h

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 );

 

创建一个新任务,并将其添加到准备运行的任务列表中。 必须在FreeRTOSConfig.h中将configSUPPORT_STATIC_ALLOCATION设置为1,此RTOS API函数才可用。

 

每个任务都需要用于保持任务状态的RAM,并由任务用作其堆栈。 如果使用xTaskCreate()创建任务,则从FreeRTOS堆中自动分配所需的RAM。 如果使用xTaskCreateStatic()创建任务,则应用程序编写器将提供RAM,这将导致大量参数,但允许在编译时静态分配RAM。 有关更多信息,请参见静态与动态分配页面。

 

如果您使用的是FreeRTOS-MPU,则建议使用xTaskCreateRestricted()代替xTaskCreateStatic()。

 

参数:

pvTaskCode  

指向任务输入功能的指针(仅是实现任务的功能的名称,请参见下面的示例)。

    任务通常被实现为无限循环,并且决不能尝试从其实现函数中返回或退出。但是,任务可以自行删除。

pcName  

任务的描述性名称。 这主要用于方便调试,但也可以用于获取任务句柄。

使用FreeRTOSConfig.h中的configMAX_TASK_NAME_LEN参数设置任务名称的最大长度。

usStackDepth  

分配用作任务堆栈的字数(不是字节!)。 例如,如果堆栈为16位宽,而usStackDepth为100,则将分配200个字节用作任务的堆栈。 再举一个例子,如果堆栈为32位宽,而usStackDepth为400,则将分配1600字节用作任务的堆栈。

堆栈深度乘以堆栈宽度不得超过size_t类型变量中可以包含的最大值。

pvParameters  

该值将作为任务的参数传递到创建的任务中。

如果将pvParameters设置为变量的地址,则在创建的任务执行时该变量必须仍然存在–因此传递堆栈变量的地址无效。

uxPriority  

创建的任务将执行的优先级。

包含MPU支持的系统可以通过在uxPrriority中设置portPRIVILEGE_BIT位来选择在特权(系统)模式下创建任务。 例如,要创建优先级为2的特权任务,请将uxPriority设置为(2 | portPRIVILEGE_BIT)。

puxStackBuffer

必须指向至少具有ulStackDepth索引的StackType_t数组(请参见上面的ulStackDepth参数)–该数组将用作任务的堆栈,因此必须是持久性的(未在函数的堆栈上声明)。

pxTaskBuffer

必须指向StaticTask_t类型的变量。 该变量将用于保存新任务的数据结构(TCB),因此它必须是持久性的(未在函数堆栈中声明)。

返回值:

如果puxStackBuffer或pxTaskBuffer都不为NULL,则将创建任务,并返回任务的句柄。 如果puxStackBuffer或pxTaskBuffer为NULL,则不会创建任务,并且将返回NULL。

 

用法示例:

/* Dimensions the buffer that the task being created will use as its stack.
NOTE:  This is the number of words the stack will hold, not the number of
bytes.  For example, if each stack item is 32-bits, and this is set to 100,
then 400 bytes (100 * 32-bits) will be allocated. */
#define STACK_SIZE 200

/* Structure that will hold the TCB of the task being created. */
StaticTask_t xTaskBuffer;

/* Buffer that the task being created will use as its stack.  Note this is
an array of StackType_t variables.  The size of StackType_t is dependent on
the RTOS port. */
StackType_t xStack[ STACK_SIZE ];

/* Function that implements the task being 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 xTaskCreateStatic(). */
    configASSERT( ( uint32_t ) pvParameters == 1UL );

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


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

    /* Create the task without using any dynamic memory allocation. */
    xHandle = xTaskCreateStatic(
                  vTaskCode,       /* Function that implements the task. */
                  "NAME",          /* Text name for the task. */
                  STACK_SIZE,      /* Number of indexes in the xStack array. */
                  ( void * ) 1,    /* Parameter passed into the task. */
                  tskIDLE_PRIORITY,/* Priority at which the task is created. */
                  xStack,          /* Array to use as the task's stack. */
                  &xTaskBuffer );  /* Variable to hold the task's data structure. */

    /* puxStackBuffer and pxTaskBuffer were not NULL, so the task will have
    been created, and xHandle will be the task's handle.  Use the handle
    to suspend the task. */
    vTaskSuspend( xHandle );
}

 

 

 

<think>首先,用户的问题是:“我想查找FreeRTOS中用于创建任务的函数所在的头文件 请问FreeRTOS task creation function header file”。翻译成英文是“I want to find the header file for the task creation function in FreeRTOS. What is the FreeRTOS task creation function header file?” 关键点是:用户想知道FreeRTOS创建任务的函数在哪个头文件中。 从系统级指令: - 所有行内数学表达式必须使用$...$格式。但这里的问题是关于FreeRTOS编程,可能不涉及数学表达式,所以可能不需要数学格式。 - 独立公式用$$...$$,但同样,这里可能不需要。 - LaTeX语法正确:确保在需要时正确使用。 - 使用中文回答:整个回答必须用中文。 - 生成相关问题:在回答末尾添加相关问题。 - 引用的段落末尾添加引用标识:如[^1],但用户提供了引用[1]到[5],我需要参考这些来回答问题。 用户提供的引用: - [^1]: 关于创建任务使用任务参数的视频和链接。 - [^2]: 在main.c代码中启动任务调度,并有一个LED闪灯任务的示例。 - [^3]: 配置FreeRTOS使用heap4动态内存空间。 - [^4]: 使用软件定时器和任务控制LED。 - [^5]: STM32CUBEIDE配置FreeRTOS实现LED闪灯。 这些引用是关于FreeRTOS在STM32上的配置和任务创建,但用户的问题是具体关于创建任务的函数所在的头文件。 在FreeRTOS中,创建任务的函数通常是`xTaskCreate`或`xTaskCreateStatic`。这些函数通常在FreeRTOS的头文件中定义。 标准FreeRTOS头文件: - `task.h` 是包含任务管理函数的头文件,包括创建任务的函数。 所以,答案应该是指出`task.h`是创建任务的函数所在的头文件。 现在,构建回答: 1. **结构清晰**:逐步解决问题。 - 先确认问题:用户想知道创建任务的函数在哪个头文件。 - 给出答案:头文件是`task.h`。 - 解释一下:简要说明FreeRTOS任务创建函数,如`xTaskCreate`。 - 参考用户提供的引用:引用中提到创建任务,可以引用[^1]或[^2],因为它们涉及任务创建。 - [^1] 是关于创建任务使用任务参数的视频。 - [^2] 有代码示例,其中可能隐含了头文件的使用。 在代码中,通常会包含`FreeRTOS.h`和`task.h`来使用这些函数。 2. **使用中文回答**:整个回答用中文。 3. **添加引用标识**:如果引用用户提供的段落,在末尾添加[^n]。 例如,如果提到[^1]中的内容,就在相关句子末尾加[^1]。 4. **生成相关问题**:在回答末尾添加相关问题部分。 相关问题建议: - 关于FreeRTOS任务创建的其他问题,如: - 如何创建任务? - 任务参数如何使用? - 任务调度的工作原理? 完整回答结构: - 开头:直接回答问题。 - 中间:解释细节,参考引用。 - 结尾:相关问题。 最终答案:头文件是`task.h`。</think>### FreeRTOS任务创建函数所在头文件 在FreeRTOS中,用于创建任务的函数(如`xTaskCreate`或`xTaskCreateStatic`)定义在`task.h`头文件中。这是FreeRTOS核心API的一部分,用于管理任务创建、调度和删除等操作。以下是详细解释: 1. **头文件位置和功能**: - `task.h` 是FreeRTOS标准库中的头文件,包含了任务管理相关的函数声明和宏定义。 - 创建任务的主要函数是`xTaskCreate`,其原型如下: ```c 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`: 任务堆栈大小(以字为单位)。 - `pvParameters`: 传递给任务的参数(可自定义)。 - `uxPriority`: 任务优先级。 - `pxCreatedTask`: 返回的任务句柄。 - 使用此函数时,需在代码中包含`#include "task.h"`,并确保FreeRTOS配置正确[^1]。 2. **在实际项目中的使用**: - 在STM32开发中,如使用STM32CubeIDE或STM32CubeMX配置FreeRTOS,`task.h`会自动包含在工程中。例如,在`main.c`文件中创建任务时,会引用此头文件来实现任务调度: ```c #include "FreeRTOS.h" #include "task.h" void StartTask_TASK_LED_FLASH(void *argument) { for(;;) { vTaskDelay(1000); // 延时函数 HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // LED闪灯示例 } } ``` 此代码片段展示了如何在任务函数中使用`vTaskDelay`(也定义在`task.h`中)来实现周期性操作[^2][^5]。 - 配置FreeRTOS时,STM32CubeIDE会自动处理头文件包含,无需手动移植,用户只需关注任务逻辑[^3][^4]。 3. **注意事项**: - 确保工程中包含FreeRTOS的源文件和头文件路径(通常在STM32CubeIDE中自动设置)。 - 如果使用动态内存创建任务,需配置heap方案(如heap_4.c),这会影响任务创建函数的实现[^3]。 - 创建任务时,任务优先级和堆栈大小需合理设置,以避免系统崩溃。 总之,FreeRTOS任务创建函数的核心头文件是`task.h`。在实际开发中,结合STM32CubeIDE工具,可以简化配置过程[^1][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值