当前位置: 首页 > ds >正文

freertos中xTaskCreate和vTaskDelete详解

freertos中文资料官网,大家可以自行查看

https://www.freertos.org/zh-cn-cmn-s/Documentation/00-Overview

xTaskCreate

功能:创建一项新任务 并将其添加到准备运行的任务列表中。

// task.h 
BaseType_t xTaskCreate( TaskFunction_t pvTaskCode,const char * const pcName,const configSTACK_DEPTH_TYPE uxStackDepth,void *pvParameters,UBaseType_t uxPriority,TaskHandle_t *pxCreatedTask);

configSUPPORT_DYNAMIC_ALLOCATION 必须在 FreeRTOSConfig.h 中设置为 1,或处于未定义状态(默认为 1), 才可使用此 RTOS API 函数。

每项任务都需要 RAM 来保存任务状态,并由任务用作其堆栈。如果 使用 xTaskCreate() 创建任务,则所需的 RAM 会自动 从 freertos堆分配。

参数:

pvTaskCode

指向任务入口函数的指针(即实现任务的函数名称,请参阅如下示例)。 任务通常已无限循环的形式实现;

注意:实现任务的函数 绝不能尝试返回或退出,但是任务可以使用API接口删除;

pcName

任务的描述性名称。此参数主要用于方便调试,但也可用于 获取任务句柄。任务名称的最大长度 由 FreeRTOSConfig.h 中的 configMAX_TASK_NAME_LEN 定义。

注意:任务名称长度一定不要大于最大程度,防止溢出;

uxStackDepth

要分配用作任务堆栈的字数(不是字节数!)。例如,如果 堆栈宽度为 16 位,uxStackDepth 为 100,则将分配 200 字节用作任务 堆栈。再举一例,如果堆栈宽度为 32 位,uxStackDepth 为 400, 则将分配 1600 字节用作任务堆栈。堆栈深度与堆栈宽度的乘积不得超过 size_t 类型变量所能包含的最大值。

注意:实际创建任务的时候,会*sizeof( StackType_t );

           configTOTAL_HEAP_SIZE 定义的是字节数长度,两个宏一定要区分清楚;

    static TCB_t * prvCreateTask( TaskFunction_t pxTaskCode,const char * const pcName,const configSTACK_DEPTH_TYPE uxStackDepth,void * const pvParameters,UBaseType_t uxPriority,TaskHandle_t * const pxCreatedTask )
{...pxStack = pvPortMallocStack( ( ( ( size_t ) uxStackDepth ) * sizeof( StackType_t ) ) );....
}

pvParameters

作为参数传递给所创建任务的值。如果 pvParameters 设置为某变量的地址, 则在创建的任务执行时,该变量必须仍然存在, 因此,不能传递堆栈变量的地址。

uxPriority

创建的任务将以该指定优先级执行。应断言优先级 低于 configMAX_PRIORITIES。如果 configASSERT 未定义,则优先级默认上限为 (configMAX_PRIORITIES - 1)。

注意:任务优先级数值越小,任务优先级越低

pxCreatedTask

用于将句柄传递至由 xTaskCreate() 函数创建的任务。pxCreatedTask 是可选参数, 可设置为 NULL。

注意:建议不要使用NULL, 后面很多API接口都是使用该句柄;

返回:

如果任务创建成功,则返回 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 thepvParameters 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 );}
}

vTaskDelete

// task.h
void vTaskDelete( TaskHandle_t xTask );

INCLUDE_vTaskDelete 必须定义为 1,才可使用此函数。

从 RTOS 内核管理中移除任务。要删除的任务将从所有就绪、 阻塞、挂起和事件列表中移除。

注意:空闲任务负责释放由 RTOS 内核分配给已删除任务的 内存。因此,如果应用程序调用了 

vTaskDelete(),请务必确保空闲任务获得足够的微控制器处理时间。任务代码分配的内存不会自动释放, 应在任务删除之前手动释放。

参数:

xTask

要删除的任务的句柄。如果传递 NULL,会删除调用任务。 建议大家创建任务的时候使用 pxCreatedTask 参数

用法示例

void vOtherFunction( void )
{TaskHandle_t xHandle = NULL;// Create the task, storing the handle.xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );// Use the handle to delete the task.if( xHandle != NULL ){vTaskDelete( xHandle );}
}

http://www.xdnf.cn/news/6885.html

相关文章:

  • 如何提高redis缓存命中率
  • display:grid网格布局属性说明
  • 运营级 印度Rummy源码
  • 收放卷“材料停机减速距离“计算FC(算法公式+ST源代码+C++代码)
  • 考研数学微分学(第一讲)
  • 线程和进程
  • std::tuple 用法
  • yocto项目例子
  • 单元化架构
  • AutoCompose - 携程自动编排框架的简单介绍
  • 昇腾NPU环境搭建
  • FC7300 IO 无法正常输出高低电平问题排查
  • C++:赋值重载
  • 开放世界地形渲染:以三角洲行动为例(下篇)
  • 集星云推碰一碰:跨平台发布与源码定制全解析OEM源码部署
  • 携程token纯算分析
  • 【程序员AI入门:模型】19.开源模型工程化全攻略:从选型部署到高效集成,LangChain与One-API双剑合璧
  • 【匹配】Gotoh
  • RoboDual-上海交大-2025-2-6-开源
  • PCIe Switch 问题点
  • 【知识产权出版社-注册安全分析报告-无验证方式导致安全隐患】
  • 文章记单词 | 第82篇(六级)
  • 如何与“不安”和平共处?
  • 召回12:曝光过滤 Bloom Filter
  • 03算法学习_977、有序数组的平方
  • 经典案例 | 筑基与跃升:解码制造企业产供销协同难题
  • Go语言之路————并发
  • 【基础】Windows开发设置入门5:WinGet开发者完全指南(AI整理)
  • Spring 框架中适配器模式的五大典型应用场景
  • 轨道炮--范围得遍历,map巧统计