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

2025最新超详细FreeRTOS入门教程:第十二章 FreeRTOS调度器与时间片管理

2025最新超详细FreeRTOS入门教程:第十二章 FreeRTOS调度器与时间片管理

摘要

在前面的章节中,我们学习了任务的创建与管理。但在任务数量较多、优先级不同的情况下,FreeRTOS 是如何实现 调度与切换 的呢?

本章将深入讲解 FreeRTOS 的 调度器(Scheduler),包括:

  • 抢占式调度
  • 时间片轮转机制
  • 阻塞、就绪、挂起状态的切换
  • vTaskDelay()vTaskDelayUntil() 的区别
  • 调度器相关 API

通过本章的学习,你将对 FreeRTOS 的 任务调度核心机制 有全面的理解。

2025最新超详细FreeRTOS入门教程

文章目录

  • 2025最新超详细FreeRTOS入门教程:第十二章 FreeRTOS调度器与时间片管理
    • 摘要
    • 一、FreeRTOS 调度机制概述
    • 二、任务状态
    • 三、时间片轮转
    • 四、调度器相关 API
      • 1. 启动调度器
      • 2. 挂起/恢复调度器
      • 3. 获取系统 Tick
      • 4. 延时函数
    • 五、延时机制
      • 1. vTaskDelay()
      • 2. vTaskDelayUntil()
    • 六、调度器工作机制
    • 七、调试与优化
    • 八、常见问题与解决方法
    • 九、经验总结
    • 十、总结


一、FreeRTOS 调度机制概述

FreeRTOS 调度的基本思想是:

  • 优先级最高的就绪任务 始终获得 CPU 使用权
  • 如果多个任务优先级相同,使用 时间片轮转(可配置)
  • 调度器通过 系统 Tick 中断 驱动
就绪
等待
挂起
任务A 优先级3
CPU
任务B 优先级2
任务C 优先级1
调度器

二、任务状态

FreeRTOS 中任务有四种基本状态:

状态描述
Running正在执行的任务(唯一)
Ready可运行,但 CPU 正在执行更高优先级任务
Blocked等待事件(信号量/队列/延时)
Suspended被挂起,必须手动恢复

三、时间片轮转

在多个相同优先级任务同时就绪时,FreeRTOS 可以采用 时间片轮转调度

  • 默认启用(configUSE_TIME_SLICING = 1
  • 每次 Tick 中断,切换到同优先级的下一个任务
系统TickTaskATaskB运行1个时间片切换运行1个时间片再次运行系统TickTaskATaskB

四、调度器相关 API

1. 启动调度器

vTaskStartScheduler();

2. 挂起/恢复调度器

vTaskSuspendAll();
xTaskResumeAll();

3. 获取系统 Tick

TickType_t xTaskGetTickCount(void);

4. 延时函数

vTaskDelay(TickType_t xTicksToDelay);
vTaskDelayUntil(TickType_t *pxPreviousWakeTime, TickType_t xTimeIncrement);

五、延时机制

1. vTaskDelay()

  • 任务延时指定 Tick 数
  • 相对延时,受调度器调用时间影响

2. vTaskDelayUntil()

  • 绝对延时
  • 适合 固定周期任务

示例:

void vTaskPeriodic(void *pvParameters)
{TickType_t xLastWakeTime;const TickType_t xFrequency = pdMS_TO_TICKS(1000);xLastWakeTime = xTaskGetTickCount();for(;;){printf("周期任务执行\n");vTaskDelayUntil(&xLastWakeTime, xFrequency);}
}

六、调度器工作机制

最高优先级就绪任务
vTaskDelay/等待事件
事件满足/延时到期
vTaskSuspend
vTaskResume
就绪队列
运行任务
阻塞队列
挂起队列

七、调试与优化

  1. 查看系统运行时间
vTaskGetRunTimeStats(char *pcWriteBuffer);
  1. 任务状态调试
vTaskList(char *pcWriteBuffer);
  1. 优化建议
  • 关键任务优先级要高
  • 相同优先级的任务应尽量时间均衡
  • 周期任务建议使用 vTaskDelayUntil

八、常见问题与解决方法

问题可能原因解决方法
周期任务抖动使用 vTaskDelay改用 vTaskDelayUntil
高优先级任务饿死低优先级任务优先级设置不合理降低高优先级任务或优化设计
任务切换过于频繁Tick 周期过小调整 configTICK_RATE_HZ

九、经验总结

📌 开发建议

  1. 周期任务统一使用 vTaskDelayUntil,保证时间精度
  2. 使用 vTaskSuspendAll / xTaskResumeAll 避免调度器频繁切换
  3. 合理分配任务优先级,避免高优先级任务长时间占用 CPU
  4. 对性能敏感的项目,适当调整 configTICK_RATE_HZ

十、总结

通过本章学习,你已经掌握:

  • FreeRTOS 调度器的工作机制
  • 时间片轮转的原理
  • 延时函数的使用方法与区别
  • 调试与优化调度器的技巧

调度器是 FreeRTOS 的心脏,理解它的工作机制,才能合理设计任务与优先级,确保系统高效运行。


🔗 FreeRTOS专栏 👉 下一章:2025最新超详细FreeRTOS入门教程:第十三章 FreeRTOS临界区与原子操作 ——我们将学习如何在多任务环境下保护共享数据,避免并发错误。



文章转载自:

http://yoY7DoKK.qdrhf.cn
http://4TNKnDKv.qdrhf.cn
http://UtX5OOcb.qdrhf.cn
http://12grL6MR.qdrhf.cn
http://Vvm0h4eq.qdrhf.cn
http://oNeJNdFY.qdrhf.cn
http://nskPps17.qdrhf.cn
http://DeziP2e1.qdrhf.cn
http://HNV4pfc5.qdrhf.cn
http://bCXHJGzu.qdrhf.cn
http://w8RY1tni.qdrhf.cn
http://b99fq5tA.qdrhf.cn
http://IbkoYXcs.qdrhf.cn
http://cjAaa3o0.qdrhf.cn
http://XQkohklD.qdrhf.cn
http://5jeWAGfO.qdrhf.cn
http://ND2mgAj2.qdrhf.cn
http://JtVdLOBQ.qdrhf.cn
http://lXnwleu5.qdrhf.cn
http://tn8nzMh8.qdrhf.cn
http://RgiZKNKp.qdrhf.cn
http://40EhfBgY.qdrhf.cn
http://54vrwB0f.qdrhf.cn
http://iaRTrJ8P.qdrhf.cn
http://oPn5LVn2.qdrhf.cn
http://fpaMRcgw.qdrhf.cn
http://RNveUM3N.qdrhf.cn
http://ftAxuyIL.qdrhf.cn
http://gw5JVKfT.qdrhf.cn
http://o0HrUOhc.qdrhf.cn
http://www.dtcms.com/a/379065.html

相关文章:

  • 软考系统架构设计师之项目管理篇
  • OpenSTL PredRNNv2 模型复现与自定义数据集训练
  • 基于STM32的单片机开发复盘
  • Git 目录详解和基本操作(1)
  • 机器学习之K折交叉验证
  • Android Gradle Project (AGP) gradle-xxxx-src.zip无法正常下载问题解决方法
  • 图观 应用编辑器 产品介绍
  • 探讨Hyperband 等主要机器学习调优方法的机制和权衡
  • Apple产品发布会拆解:体验下放、设计极限、AI 入耳
  • 如何解决 Spring Bean 循环依赖
  • sdio NOT_AUTOGATING
  • 华为X考拉悠然 联合发布悠然智擎城市交通拥堵治理空间智能体方案
  • 《微服务事务管理》
  • CentOS 7 安装 MySQL 详细教程
  • 分布式锁解决集群下一人一单超卖问题
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘sweetviz’问题
  • @DateTimeFormat.fallbackPatterns 详解
  • 使用wavesurfer.js自定义波形绘制,集成频谱、时间轴、缩放、区域选择等插件
  • 数据库主从同步
  • leetcode27(两数之和)
  • Gradio全解11——Streaming:流式传输的视频应用(9)——使用FastRTC+Gemini创建沉浸式音频+视频的艺术评论家
  • 单片机 - I2C 总线
  • EasyExcel 实现国际化导入导出
  • 实现联邦学习客户端训练部分的示例
  • 从互联网医院系统源码到应用:智能医保购药平台的开发思路与实操经验
  • 伽马(gamma)变换记录
  • 第3节-使用表格数据-唯一约束
  • 深入浅出 C++20:新特性与实践
  • Java 面向对象三大核心思想:封装、继承与多态的深度解析
  • 蚁群算法详解:从蚂蚁觅食到优化利器