xTaskCreate 任务创建 API 函数

今天也是元气满满记录流水账的一天
人生总是起起落落落落落落落落落落落落的,即使这样还是需要学习

xTaskCreate

函数名 :xTaskCreate
头文件 :task.h
函数功能:任务创建
函数声明:

portBASE_TYPE xTaskCreate(
pdTASK_CODE pvTaskCode,
const portCHAR * const pcName,
unsigned portSHORT usStackDepth,
void *pvParameters,
unsigned portBASE_TYPE uxPriority,
xTaskHandle *pvCreatedTask
);

如果使用FreeRTOS-MPU,建议使用 xTaskCreateRestricted()来替换xTaskCreate()。 在FreeRTOS-MPU 下使用xTaskCreate(),允许任务被创建于运行在特权模式或者用户模式。特权模式下,可以利用任务访问整个存储器空间;用户模式下,任务只能访问自己的堆栈。在两种情况下,MPU 不会自动捕获堆栈溢出,虽然标准的FRTOS堆栈溢出检测方案依然可以使用。xTaskCreateRestricted() 允许了更大的灵活性。

啥是FreeRTOS、FreeRTOS-MPU

FreeRTOS为开源,免费,用户量大,内核简练的一个实时操作系统。
FreeRTOS-MPU包含完整的内存保护。

【具体参数】

Parameters参数解释
pvTaskCode指向任务函数。任务必须以永不返回的形式实现(比如一个死循环)。【该参数即为任务函数的函数名】
pcName任务函数的别名,仅仅是方便调试所用。最大的长度由configMAX_TASK_NAME_LEN定义。
usStackDepth任务堆栈的深度,定义了堆栈可以包含的变量数——不是字节数。
pvParameters作为参数的指针,当任务创建时。
uxPriority任务的优先级。包括MPU支持的系统可以选择在特权模式(系统模式)创建任务,通过设置优先级参数的portPRIVILEGE_BIT位。比如,创建一个特权任务在优先级2,则uxPriority 应当设置为( 2
pvCreatedTask回传一个句柄,以便创建的任务可以被关联。返回值:pdPASS,如果任务成功创建且添加到就绪列表,否则返回一个错误代码,见 projdefs.h。
给usStackDepth 再做个深刻的解读

例如:如果堆栈的宽度为16BIT,而 usStackDepth定义为100,则200 字节被分配给堆栈存储。堆栈深度乘以堆栈宽度的最大值,**不能**超过 size_t变量能包含的最大值。
大概要问堆栈到底应该定义多大,大体要考虑以下几点:
1、最大级别中断嵌套需要的堆栈;
2、由于RTOS 生成每个任务,该任务天生需要的堆栈,FRTOS至少是16个字节,随着翻译深入会确认这个问题;
3、在每个任务函数中定义局部变量而产生的任务函数的变量堆栈。3者相加即为一个合适的堆栈。

做完阅读理解大概是这个亚子趴

xTaskCreate(App_Event, "app_task", (1*1024), NULL,
			 0, &application_handler.task_handle)

可能还有点晕晕乎乎的,举个栗子趴

void vTaskCode( void * pvParameters )//创建的任务
{
    //如果有初使化,放在死循环之前
    for( ;; ) //一个死循环
    {
     //任务代码
    }
}
//此函数创建一个任务
void vOtherFunction( void )
{
    static unsigned char ucParameterToPass;
    xTaskHandle xHandle;
    /*
    创建任务,存储句柄,注意传递的参数 ucParameterToPass必须在任务生存周期内存在,
    故在此例子的情况下定义为局部静态变量。如果它只是一个自动堆栈变量(局部变量),它可能不再存在或者至少崩溃了,当新的任务试图访问时。
    注:由于该任务一建立就在同一个函数中被删除了,大可以用些局部静态变量和局部变量,如果不是在一个函数中删除之前创建的任务,以上参数请用全局变量。
    */
    xTaskCreate( vTaskCode, "NAME", STACK_SIZE, &ucParameterToPass,
    tskIDLE_PRIORITY, &xHandle );
    //使用句柄删除任务。
    vTaskDelete( xHandle );
}

xTaskDelete 任务删除

xTaskDelete

函数名 :xTaskDelete
头文件 :task. h
函数功能:任务删除
函数声明:

void vTaskDelete( xTaskHandle pxTask ) 
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
xTaskCreate是FreeRTOS中的一个API,用于创建一个新的任务。它的函数原型如下: ``` BaseType_t xTaskCreate(TaskFunction_t pvTaskCode, const char * const pcName, const uint32_t usStackDepth, void * const pvParameters, UBaseType_t uxPriority, TaskHandle_t * const pxCreatedTask); ``` 参数说明如下: - pvTaskCode:函数指针,指向任务函数的起始地址。 - pcName:任务的名称,用于调试和跟踪任务。 - usStackDepth:任务堆栈大小,单位为字节。 - pvParameters:传递给任务函数的参数指针。 - uxPriority:任务优先级,取值范围为0~configMAX_PRIORITIES-1,其中configMAX_PRIORITIES是FreeRTOS配置文件中定义的最大优先级数。 - pxCreatedTask创建任务后,任务句柄将存储在此指针所指向的变量中。 xTaskCreate函数创建一个新的任务,并在任务创建成功后返回pdPASS,如果创建失败,则返回errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY。 下面是一个示例,演示如何使用xTaskCreate函数创建一个简单的任务: ``` void vTaskFunction(void *pvParameters) { while(1) { //任务代码 } } void main() { TaskHandle_t xHandle = NULL; //创建任务 xTaskCreate(vTaskFunction, "TaskName", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle); //启动调度器 vTaskStartScheduler(); //永远不会执行到这里 } ``` 在上面的示例中,我们创建了一个名为vTaskFunction的任务,并将其指定为任务函数。然后,我们使用xTaskCreate函数创建了一个名为TaskName的任务,堆栈大小为configMINIMAL_STACK_SIZE,没有传递任何参数,任务优先级为tskIDLE_PRIORITY,任务句柄存储在xHandle变量中。最后,我们启动了FreeRTOS调度器,开始运行任务。 需要注意的是,任务函数必须永远不会返回,并且必须通过调用vTaskDelete函数来删除自己,否则任务将一直运行,而且可能会导致系统崩溃。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值