当前位置: 首页 > 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.lryc.cn/news/601046.html

相关文章:

  • FastAPI入门:安装、Pydantic、并发和并行
  • Day04–链表–24. 两两交换链表中的节点,19. 删除链表的倒数第 N 个结点,面试题 02.07. 链表相交,142. 环形链表 II
  • TCP如何解决网络切换问题
  • Java模块化编程深度指南:从过程式到面向对象的进化之路
  • JavaSE:初识数组
  • 小架构step系列26:Spring提供的validator
  • 详细介绍MySQL的索引类型
  • Maven之依赖管理
  • 基于tk界面库的扩展类
  • 网络:基础概念
  • nacos启动报错:Unable to start embedded Tomcat。
  • 基于POD和DMD的压气机叶片瞬态流场分析与神经网络预测
  • iview: 对输入框进行Poptip 换行提示
  • 【Redis】 Redis 基础命令和原理
  • 从治理到共情——平台伦理的乡村共建之路
  • 数据空间技术在智慧水库管理平台中的赋能
  • 每日面试题15:如何解决堆溢出?
  • 2.JVM跨平台原理(字节码机制)
  • 嵌入式硬件篇---zigbee无线串口通信问题解决方法
  • 【6G新技术探索】AG-UI(Agent User Interaction Protocol) 协议介绍
  • 大语言模型 LLM 通过 Excel 知识库 增强日志分析,根因分析能力的技术方案(1):总体介绍
  • 设计模式十一:享元模式(Flyweight Pattern)
  • 融合为体,AI为用:数据库在智能时代的破局之道
  • 快速入门Linux操作系统(一)
  • 测试分类
  • AWD的攻击和防御手段
  • base64魔改算法 | jsvmp日志分析并还原
  • HCLP--MGER综合实验
  • JVM常见工具
  • AI 编程还有多远?我们如何迎接 AI 编程时代?