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

52Hz——FreeRTOS学习笔记——任务的创建

主要API

xTaskCreate

xTaskCreateStatic

两者区别

特性xTaskCreatexTaskCreateStatic
内存分配动态分配(从FreeRTOS堆中)静态分配(用户提供内存块)
TCB和栈内存来源FreeRTOS内存管理器自动分配用户预先定义好的全局数组
是否需要用户管理内存不需要,创建/删除由内核管理需要用户预先分配内存
内存确定性不确定(依赖堆内存状态)确定(编译时即确定)

xTaskCreateStatic补充

FreeRTOS 在启动调度器 (vTaskStartScheduler()) 时,必须创建一个空闲任务。这个任务在没有任何其他任务运行时工作,进行内存清理等维护工作。

使用静态分配时,你需要实现 vApplicationGetIdleTaskMemory 函数来为空闲任务提供必要的内存块。

这个函数有三个参数,都是输出参数,意味着你需要在这些参数指向的位置填写合适的内存地址或大小值:

参数类型说明
ppxIdleTaskTCBBufferStaticTask_t**指向空闲任务任务控制块(TCB) 内存地址的指针。
ppxIdleTaskStackBufferStackType_t**指向空闲任务堆栈空间起始地址的指针。
pulIdleTaskStackSizeuint32_t*指向空闲任务堆栈深度的指针。

vTaskDelay与Hal_Delay

特性vTaskDelay (FreeRTOS)HAL_Delay (HAL库)
工作原理协作式任务调度忙等待阻塞
CPU行为让出CPU,其他任务可以运行独占CPU,空转消耗
适用场景FreeRTOS多任务环境裸机程序或初始化代码
对系统影响提高CPU利用率,支持多任务浪费CPU资源,阻塞整个系统
精度影响受任务调度影响,可能有少许抖动相对精确,但会被中断打断

总结:逻辑开发与FreeRTOS开发 根本区别

方面裸机开发FreeRTOS 开发
程序结构单一超级循环多任务并行
时间管理主动等待/轮询事件驱动/阻塞等待
资源访问直接访问全局变量通过IPC机制安全访问
响应性受最长任务影响优先级保障实时性
开发思维顺序思维,关注执行流程并发思维,关注任务划分
调试难度相对简单(单线程)复杂(并发问题)
适用场景简单应用,资源受限复杂应用,需要多任务

根本转变:从时间分片的手工管理(裸机)到任务调度的自动管理(FreeRTOS)。

选择哪种方式取决于项目的复杂度。简单的项目用裸机更高效,复杂的项目用 FreeRTOS 更易于管理和维护。

案例

#include "MyTesk.h"
#include "stdio.h"typedef enum{TASK_PREORIY_0,TASK_PREORIY_1,TASK_PREORIY_2,TASK_PREORIY_3,TASK_PREORIY_4,}task_preority;// void led01_task(void *pvParameters);
// TaskHandle_t led01_task_handle;
// #define LED01_TASK_NAME "led01_task"
// #define LED01_TASK_STACK_DEPTH 128// void led02_task(void *pvParameters);
// TaskHandle_t led02_task_handle;
// #define LED02_TASK_NAME "led02_task"
// #define LED02_TASK_STACK_DEPTH 128// void led03_task(void *pvParameters);
// TaskHandle_t led03_task_handle;
// #define LED03_TASK_NAME "led03_task"
// #define LED03_TASK_STACK_DEPTH 128void led01_task(void *pvParameters);
TaskHandle_t Led01_Task_Handle;
#define LED01_TASK_NAME "led01_task"
#define LED01_TASK_STACK_DEPTH 128
StackType_t Led01_Stack_Buff[LED01_TASK_STACK_DEPTH];
StaticTask_t Led01_Task_TCB;//空闲任务相关参数
#define IDLE_TASK_STACK_DEPTH 128
StackType_t Idle_Stack_Buff[IDLE_TASK_STACK_DEPTH];
StaticTask_t Idle_Task_TCB;void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer, StackType_t ** ppxIdleTaskStackBuffer, uint32_t * pulIdleTaskStackSize )
{*ppxIdleTaskTCBBuffer = &Idle_Task_TCB;*ppxIdleTaskStackBuffer = Idle_Stack_Buff;*pulIdleTaskStackSize = IDLE_TASK_STACK_DEPTH;
}void Mytask_Start_Work(void){// 创建任务 自动分配任务栈// xTaskCreate(led01_task, LED01_TASK_NAME, LED01_TASK_STACK_DEPTH, NULL, 4, &led01_task_handle);// xTaskCreate(led02_task, LED02_TASK_NAME, LED02_TASK_STACK_DEPTH, NULL, 4, &led02_task_handle);// xTaskCreate(led03_task, LED03_TASK_NAME, LED03_TASK_STACK_DEPTH, NULL, 4, &led03_task_handle);//静态创建 任务  任务栈手动指定 Led01_Stack_Buff[LED01_TASK_STACK_DEPTH]xTaskCreateStatic(led01_task, LED01_TASK_NAME, LED01_TASK_STACK_DEPTH, NULL, TASK_PREORIY_4, Led01_Stack_Buff, &Led01_Task_TCB);//启动调度器vTaskStartScheduler();}void led01_task(void *pvParameters)
{while (1){Int_LED_Toggle(LED1_GPIO_Port, LED1_Pin);vTaskDelay(200);}}void led02_task(void *pvParameters)
{while (1){Int_LED_Toggle(LED2_GPIO_Port, LED2_Pin);vTaskDelay(200);}
}void led03_task(void *pvParameters)
{while (1){Int_LED_Toggle(LED3_GPIO_Port, LED3_Pin);vTaskDelay(200);}
}

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

相关文章:

  • 百度权重排名高的网站如何用ps做网站效果图
  • 动态设计网站p2p理财网站开发要求
  • 【AI】【Java后端】RAG 实战示例:SpringBoot + 向量检索 + LLM 问答系统
  • Google Pixel 10 vs iPhone 17
  • 2种方式从springbean中获取bean实例
  • iPhone 无线充电发展历史
  • 做康复医院网站推广普通话手抄报
  • Win版 Visual Studio Code配置C++环境
  • 住房与住房建设部网站中美最新军事新闻最新消息
  • uniapp 项目打包时提示未添加videoplayer模块
  • 深入理解Roo Code中的Temperature参数
  • 四、PyTorch训练分类器教程:小张的CIFAR-10实战之旅
  • Unity-序列帧动画
  • 【每日一问】容性负载和感性负载有什么区别?
  • 做汽车保养的网站上企业信息的网站
  • 4-3〔O҉S҉C҉P҉ ◈ 研记〕❘ WEB应用攻击▸文件包含漏洞-A
  • 郑州网站建设国奥大厦南昌营销网站建设
  • 微服务项目->在线oj系统(Java-Spring)----7.0
  • Ant Design Vue Vue3 table 表头筛选重置不清空Bug
  • 【踩坑记录】PyTorch 被误装 CPU 版本导致 CUDA 丢失的解决办法(Windows + Anaconda)
  • 5个问题,帮你选择合适的API测试工具
  • 唐山做网站公司费用郑州做网站哪家好熊掌号
  • 为什么齐次线性方程组的系数行列式为零时有非零解?
  • Cursor Agent模式下面在指定的conda虚拟环境中执行python脚本
  • 福州网站建设加推广怎样把网站打包做百度小程序
  • 元宇宙的工业应用:数字工厂与智能制造
  • C语言程序设计笔记—printf的使用
  • 【UE5】使用虚幻引擎编辑器创建游戏
  • Nginx 部署及配置
  • 服务器建设一个自己的网站奖券世界推广网站