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

2025最新超详细FreeRTOS入门教程:第二章 FreeRTOS任务创建

2025最新超详细FreeRTOS入门教程:第二章 FreeRTOS任务创建

摘要

在完成第一章 FreeRTOS 移植到 STM32 后,我们已经能够运行一个最小任务。本章将带你深入理解 任务(Task) 的概念、创建方式、运行机制和调度策略。
任务是 FreeRTOS 的核心,掌握任务的创建和使用,意味着你已经正式踏入 RTOS 世界。
2025最新超详细FreeRTOS入门教程

文章目录

  • 2025最新超详细FreeRTOS入门教程:第二章 FreeRTOS任务创建
    • 摘要
    • 一、任务的基本概念
      • 特点
    • 二、任务创建 API
      • 1. 动态创建任务
      • 2. 静态创建任务
    • 三、任务的优先级与调度
      • 调度策略
      • 示例
    • 四、任务创建实战
      • 示例:两个任务并发
    • 五、任务句柄的使用
      • 获取任务信息
    • 六、任务生命周期
    • 七、常见问题与解决方法
    • 八、经验分享
    • 九、总结


一、任务的基本概念

📌 在 裸机系统 中,程序代码通常放在 while(1) 循环中顺序执行,而 FreeRTOS 将应用划分为 多个任务,每个任务都可以看作一个独立的线程,内核负责任务的调度和切换。

特点

  • 每个任务都有自己的 堆栈空间
  • 内核根据 优先级调度算法 切换任务
  • 每个任务都像一个无限循环,通常以 for(;;)while(1) 形式实现
裸机程序
单一循环
FreeRTOS程序
任务1: LED闪烁
任务2: 串口打印
任务3: 数据处理

二、任务创建 API

FreeRTOS 提供了 xTaskCreate()xTaskCreateStatic() 两种方式。

1. 动态创建任务

BaseType_t xTaskCreate(TaskFunction_t pvTaskCode,      // 任务函数const char * const pcName,      // 任务名字configSTACK_DEPTH_TYPE usStackDepth, // 栈深度void *pvParameters,             // 任务参数UBaseType_t uxPriority,         // 优先级TaskHandle_t *pxCreatedTask     // 任务句柄
);

参数说明:

参数说明
pvTaskCode任务入口函数
pcName任务名(调试用)
usStackDepth栈大小,以 word 计
pvParameters传入参数
uxPriority优先级(数值越大,优先级越高)
pxCreatedTask任务句柄(可为空)

2. 静态创建任务

xTaskCreateStatic() 需要手动分配堆栈和任务控制块(TCB),常用于安全性要求高的系统:

TaskHandle_t xTaskCreateStatic(TaskFunction_t pvTaskCode,const char * const pcName,uint32_t ulStackDepth,void *pvParameters,UBaseType_t uxPriority,StackType_t *puxStackBuffer,StaticTask_t *pxTaskBuffer
);

静态任务不会依赖 FreeRTOS 的堆管理,更稳定,但更复杂


三、任务的优先级与调度

调度策略

  • 基于优先级:高优先级任务优先运行
  • 同优先级任务:采用时间片轮转

示例

000001002003004LED任务 UART任务 LED任务 UART任务 高优先级任务低优先级任务FreeRTOS 调度示意

四、任务创建实战

示例:两个任务并发

#include "FreeRTOS.h"
#include "task.h"void vTaskLED(void *pvParameters)
{while(1){HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);vTaskDelay(500); // 延时500ms}
}void vTaskUART(void *pvParameters)
{while(1){printf("Hello FreeRTOS!\n");vTaskDelay(1000);}
}int main(void)
{HAL_Init();SystemClock_Config();// 创建两个任务xTaskCreate(vTaskLED, "LED", 128, NULL, 2, NULL);xTaskCreate(vTaskUART, "UART", 128, NULL, 1, NULL);// 启动调度器vTaskStartScheduler();while(1) {}
}

五、任务句柄的使用

获取任务信息

TaskHandle_t xHandleLED, xHandleUART;xTaskCreate(vTaskLED, "LED", 128, NULL, 2, &xHandleLED);
xTaskCreate(vTaskUART, "UART", 128, NULL, 1, &xHandleUART);

任务句柄可用于:

  • 删除任务 vTaskDelete(xHandle)
  • 挂起/恢复任务 vTaskSuspend(xHandle) / vTaskResume(xHandle)
  • 动态修改优先级 vTaskPrioritySet(xHandle, newPriority)

六、任务生命周期

被调度
时间片用完
vTaskDelay / 等待资源
超时/资源可用
创建
就绪
运行
阻塞
删除

七、常见问题与解决方法

问题可能原因解决方法
任务未运行调度器未启动确认 vTaskStartScheduler()
栈溢出栈设置过小增大 usStackDepth
多任务不切换SysTick 中断未配置检查 SysTick_Handler
打印乱码串口任务未同步使用信号量/队列管理输出

八、经验分享

📌 开发建议

  1. 任务数量不要太多,模块化设计 更重要
  2. 建议使用 configCHECK_FOR_STACK_OVERFLOW 开启栈检测
  3. 调试时多用 uxTaskGetStackHighWaterMark() 观察剩余栈空间
  4. 使用 vTaskDelay() 而不是阻塞式 for 循环,保证调度公平

九、总结

通过本章学习,你应该掌握:

  • 使用 xTaskCreate() 创建任务
  • 理解任务的优先级和调度规则
  • 管理任务的生命周期(创建、挂起、恢复、删除)
  • 编写多任务并发程序

至此,你已经能够写出一个 多任务系统,并亲身感受到 RTOS 与裸机的差异。


🔗 FreeRTOS专栏👉 下一章:2025最新超详细FreeRTOS入门教程:第三章 FreeRTOS任务管理 —— 将深入讲解任务的挂起、删除、优先级动态调整等更高级操作。


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

相关文章:

  • 设计一个 AB 测试平台
  • 实例和对象的区别
  • 【目录-单选】鸿蒙HarmonyOS开发者基础
  • 自适应滤波器:Ch4 最小均方(LMS)算法
  • [光学原理与应用-433]:晶体光学 - 晶体光学是研究光在单晶体中传播规律及其伴随现象的分支学科,聚焦于各向异性光学媒质的光学特性
  • 上海“我店”模式:消费增值新玩法及其隐忧
  • 论文阅读:VGGT Visual Geometry Grounded Transformer
  • 【C++】引用的本质与高效应用
  • 【高等数学】第十一章 曲线积分与曲面积分——第三节 格林公式及其应用
  • javascript 国际化方法
  • AI 生成式艺术重塑动漫角色创作:从技术逻辑到多元可能性(一)
  • GPT-5发布:统一智能体时代的开启——从“工具”到“协作者”的范式跃迁
  • 详解MySQL环境变量配置及其在备份中的应用
  • 计算机内存的工作原理
  • 打工人日报#20250906
  • 模电仿真软件:MultSim14.3下载与安装
  • 【面板数据】各省制造业出口技术复杂度数据集(2010-2023年)
  • AP1271:高性能低功耗LDO稳压器,为精密电子设备提供稳定动力
  • python graphviz中文测试
  • queue容器的常用函数 和注意事项
  • windows server 2022安装终端
  • 计算机视觉(八):开运算和闭运算
  • C++:深入剖析vector
  • 数字化赋能全球扩张:名创优品携手巨益科技的信息化转型深度实践
  • 【开题答辩全过程】以 哈尔滨裕丰草莓园管理系统为例,包含答辩的问题和答案
  • JVM中常见的GC垃圾收集器
  • OpenCV 实战篇——如何测算出任一副图片中的物体的实际尺寸?传感器尺寸与像元尺寸的关系?
  • SQL 进阶指南:视图的创建与使用(视图语法 / 作用 / 权限控制)
  • Obsidian: 图片本地化插件-Local Images Plus与图片重命名插件-Paste Image Rename使用说明
  • Day28 打卡