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

freeRTOS 静态创建任务

 静态创建任务需要提供任务栈的地址和任务控制块tcb的地址,并且需要实现给空闲函数分配空间vApplicationGetIdleTaskMemory()函数

1、FreeRTOSConfig.h配置

/* 开启静态分配 */
#define configSUPPORT_STATIC_ALLOCATION 1/* 软件定时器相关定义 */
#define configUSE_TIMERS                                1                               /* 1: 使能软件定时器, 默认: 0 */
#define configTIMER_TASK_PRIORITY                       ( configMAX_PRIORITIES - 1 )    /* 定义软件定时器任务的优先级, 无默认configUSE_TIMERS为1时需定义 */
#define configTIMER_QUEUE_LENGTH                        5                               /* 定义软件定时器命令队列的长度, 无默认configUSE_TIMERS为1时需定义 */
#define configTIMER_TASK_STACK_DEPTH                    ( configMINIMAL_STACK_SIZE * 2) /* 定义软件定时器任务的栈空间大小, 无默认configUSE_TIMERS为1时需定义 */

 2、创建静态任务、启动任务调度器

StackType_t Start_Task_Stack[STACK_SIZE];
StaticTask_t Start_Task_Tcb;
void freertos_start()
{/*1、创建任务*/Start_Task_Handle = xTaskCreateStatic( (TaskFunction_t) startTask,(const char * const) "startTask", (const uint32_t) STACK_SIZE,(void * const) NULL,(UBaseType_t) START_TASK_PRIORITY,(StackType_t * const) Start_Task_Stack,//任务栈地址,数组形式存储(StaticTask_t * const) &Start_Task_Tcb );//tcb地址/*2、启动任务调度器, 会自动创建空闲任务和软件定时器(如果开启)静态创建的方式需要去实现2个分配资源的接口函数*/vTaskStartScheduler();
}

 3、实现接口函数

 选择静态创建任务,需要实现vApplicationGetIdleTaskMemory(); 

开启软件定时器需要实现vApplicationGetTimerTaskMemory

StackType_t Idle_Task_Stack[configMINIMAL_STACK_SIZE];
StaticTask_t Idle_Task_Tcb;
/*静态方法创建任务需要实现的函数*/
/*分配空闲任务的资源*/
void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,StackType_t ** ppxIdleTaskStackBuffer,uint32_t * pulIdleTaskStackSize )
{*ppxIdleTaskTCBBuffer = &Idle_Task_Tcb;*ppxIdleTaskStackBuffer = Idle_Task_Stack;*pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
}
StackType_t Timer_Task_Stack[configTIMER_TASK_STACK_DEPTH];
StaticTask_t Timer_Task_Tcb;
/*静态方法创建任务,开启软件定时器*/
/*分配软件定时器的资源*/
void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer,StackType_t ** ppxTimerTaskStackBuffer,uint32_t * pulTimerTaskStackSize )
{*ppxTimerTaskTCBBuffer = &Timer_Task_Tcb;*ppxTimerTaskStackBuffer = Timer_Task_Stack;*pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH;
}

http://www.dtcms.com/a/300309.html

相关文章:

  • TIM 输入捕获
  • pip, github 突然连不上?报错和解决方法如下
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-29,(知识点:非易失存储器)
  • 【AI周报】2025年7月26日
  • CUDA杂记--FP16与FP32用途
  • MoE替代LLM
  • linux内核电源管理
  • 面试150 加一
  • 一文速通《多元函数微分学》
  • C++11 右值引用 Lambda 表达式
  • AutoDL 数据盘清理指南:彻底删除 .Trash-0 内文件释放空间
  • 电脑负载监控接入了IOT物联网平台
  • 深入浅出 MyBatis-Plus Wrapper:让条件构造更简单高效
  • 定义域第一题
  • iview: 对输入框进行Poptip 换行提示
  • python---元组解包(Tuple Unpacking)
  • 银行营销数据预测分析:从数据到精准营销决策
  • 表征工程 中怎么 调整参数或比例
  • 【RHCSA 问答题】第 13 章 访问 Linux 文件系统
  • 水下目标识别准确率↑89%!陌讯多模态融合算法在智慧水务的落地实践
  • ArkData-关系型数据库
  • 测试分类
  • Swagger 配置及使用指南
  • Redis C++客户端——通用命令
  • 多模态大模型与 AI 落地:从技术原理到实践路径的深度解析
  • 力扣刷题(第九十九天)
  • 【C语言进阶】程序环境和预处理
  • [Python 基础课程]注释
  • C++高效实现AI人工智能实例
  • IntelliJ IDEA 中左上方未显示项目根目录问题