FreeRTOS调度器:抢占与轮转机制 📅 发布时间:2026/7/12 14:36:28 👁️ 浏览次数: 关注星标公众号不错过精彩内容来源 | 嵌入式大杂烩很多工作多年的嵌入式攻城狮都没明白FreeRTOS 调度器的原理。你要明白调度器是整个 RTOS 的核心决定谁在跑、什么时候换人。今天就来展开说说1. FreeRTOS调度器调度器持续监控所有任务状态就绪 / 运行 / 阻塞从就绪链表中选优先级最高的任务占用 CPU状态变化时触发切换。FreeRTOS 默认两种策略并行工作抢占式调度不同优先级之间高优先级随时抢占不管低优先级跑没跑完时间片轮转同优先级之间每人轮流跑一个时间片默认 1ms核心原则优先级高于时间片。这两种行为由FreeRTOSConfig.h中的两个宏独立控制/* FreeRTOSConfig.h */ #define configUSE_PREEMPTION 1 /* 1抢占式0合作式任务必须主动让步 */ #define configUSE_TIME_SLICING 1 /* 1同优先级时间片轮转0关闭轮转 */两个宏都开启才是默认的抢占 时间片模式关掉configUSE_PREEMPTION则退化为合作式调度任务必须调用taskYIELD()才切换。2. 时钟节拍SysTickSysTick 是调度器的心跳默认 1000Hz每 1ms 中断一次。每次中断主要做两件事tick 计数 1 并检查阻塞任务然后决定是否需要上下文切换切换xTaskIncrementTick()内部除了唤醒延时到期任务还包含时间片轮转判断逻辑——如果当前优先级就绪链表里还有其他任务则返回pdTRUE触发切换这段代码说明时间片轮转不是一个独立机制它内嵌在xTaskIncrementTick()里每次 SysTick 中断都会顺带判断。3. 抢占式调度3.1 运行流程假设系统中有3个任务优先级TaskA高优先级3、TaskB中优先级2、TaskC低优先级13.2 调度触发时机调度触发点/调度点说明SysTick 中断最常见每 1ms 检查一次任务主动阻塞vTaskDelay()、xQueueReceive()等任务创建 / 删除 / 改优先级状态变化重新调度ISR 中唤醒高优先级任务中断退出后触发在 ISR 里唤醒任务后需用portYIELD_FROM_ISR()通知调度器不然即便唤醒了高优先级任务也要等下一个 SysTick 才切换3.3 核心源码vTaskSwitchContext()的核心是taskSELECT_HIGHEST_PRIORITY_TASK()宏展开后等效逻辑如下vTaskStartScheduler()启动时做四件事创建空闲任务 → 关中断 → 置xSchedulerRunning pdTRUE→ 调用xPortStartScheduler()内部启动 SysTick 并切换到第一个任务。空闲任务不可缺所有用户任务阻塞时 CPU 有任务可跑同时负责回收被删除任务的 TCB 和栈资源。4. 时间片轮转4.1 运行流程同优先级任务按就绪链表顺序轮流跑每人一个时间片用完切下一个4.2 配置与注意事项#define configTICK_RATE_HZ 1000UL /* 时间片 1ms改成 500 则为 2ms */ /* 延时必须用宏换算不能写死 tick 数 */ vTaskDelay(pdMS_TO_TICKS(100));时间片大小的取舍太小 → 切换频繁上下文保存/恢复的 CPU 开销上升太大 → 同优先级任务响应延迟增大按实际场景平衡。5. 上下文切换无论哪种调度触发最终都走上下文切换三步完成PendSV 优先级设为最低目的是让所有业务中断先处理完再做任务切换不影响中断实时性。PendSV_Handler 汇编实现的核心逻辑ARM Cortex-M3 精简版6. 常见QAQ抢占式调度和时间片轮转的区别A抢占式针对不同优先级高优先级随时抢时间片轮转针对同优先级按时间片顺序切换。两者同时工作优先级优先。Q为什么上下文切换用 PendSV 而不直接在 SysTick 里切ASysTick 优先级比外部中断高若直接切换会打断正在处理的中断。PendSV 优先级最低所有中断处理完后才执行切换保证中断实时性。Q空闲任务有什么用能删掉吗A不能删。空闲任务负责回收被删除任务的 TCB 和栈内存所有用户任务全部阻塞时 CPU 也有任务可跑避免调度器无任务可选。7. 常见问题坑1改了 configTICK_RATE_HZ延时写死 tick 数频率从 1000Hz 改成 500HzvTaskDelay(1000)实际延时变 2 秒。统一换成pdMS_TO_TICKS()即可避免。坑2高优先级任务死循环不让步高优先级任务循环体没有任何阻塞调用低优先级任务永远抢不到 CPU系统假死。高优先级任务循环里需要加阻塞操作如vTaskDelay主动释放低优先级任务有机会运行坑3同优先级任务操作共享资源时间片轮转是轮流任意时刻只有一个任务在跑共享资源照样需要加互斥锁别因为优先级一样就省掉保护。你在项目里遇到过调度相关的问题吗评论区聊聊。------------END------------基于MCU的冰箱压缩机控制方案免费测评并赠送Cortex-M23开发板解锁嵌入式开发新技能部分元器件涨价近10倍小公司最担心什么
Youtu-Parsing像素级定位解析体验:精确框出每个元素,表格/图表一键转HTML/Mermaid Youtu-Parsing像素级定位解析体验:精确框出每个元素,表格/图表一键转HTML/Mermaid 1. 前言:当文档解析遇上“像素级”精度 想象一下,你手头有一份扫描的PDF合同,里面混杂着文字、表格、手写签名和公司印章。你需要把… 2026/7/11 18:53:20
SDXL 1.0电影级绘图工坊惊艳效果:赛博朋克城市夜景高清细节展示 SDXL 1.0电影级绘图工坊惊艳效果:赛博朋克城市夜景高清细节展示 基于Stable Diffusion XL Base 1.0(SDXL 1.0)的RTX 4090专属AI绘图工具,针对4090 24G大显存做极致性能优化,直接全模型加载至GPU无需CPU卸载,… 2026/5/17 7:28:25
XXMI Launcher:一站式多游戏模型管理解决方案 XXMI Launcher:一站式多游戏模型管理解决方案 【免费下载链接】XXMI-Launcher Modding platform for GI, HSR, WW and ZZZ 项目地址: https://gitcode.com/gh_mirrors/xx/XXMI-Launcher 在游戏玩家的数字世界里,模型管理往往是一场与复杂性的持久… 2026/7/10 3:29:16
别再盲盒抽卡!内容创作者如何搭建专属 Seedance 2.0 视频提示词模板库? AI 视频生成正迅速步入工业化量产时代。作为近期备受瞩目的视频生成大模型,Seedance 2.0 凭借出色的物理规律理解和原生音画同步能力,成为不少创作者的生产力工具。然而,许多创作者在使用 yingcaiai.com(AI 模型聚合平台ÿ… 2026/7/12 14:36:23
DCIM 3.0 架构解析:从1.0集成化到3.0云化AI化的5级演进路径 DCIM 3.0 架构解析:从1.0集成化到3.0云化AI化的5级演进路径数据中心基础设施管理(DCIM)技术正经历从基础监控到智能运营的质变。当L5级系统自动调节设备负载时,制冷能耗可降低40%——这标志着数据中心管理已进入算法驱动时代。本文… 2026/7/12 14:36:23
AD7490与PIC18LF26K42构建高精度数据采集系统 1. AD7490与PIC18LF26K42的硬件选型解析在嵌入式系统设计中,模拟信号采集是连接物理世界与数字系统的关键环节。AD7490作为ADI公司推出的16位逐次逼近型(SAR)ADC芯片,与Microchip的PIC18LF26K42单片机组合,能够构建高性价比的数据采集系统。这… 2026/7/12 14:34:22
SSMS 22 性能调优:3 项关键设置提升大型数据库查询效率 20% SSMS 22 性能调优:3 项关键设置提升大型数据库查询效率 20% 当数据库表规模突破10GB门槛时,即使是经验丰富的DBA也会面临查询响应缓慢的困扰。许多开发者习惯将性能问题归咎于SQL语句或索引设计,却忽略了SSMS工具本身的配置优化空间。事实上&… 2026/7/12 14:32:21
终极指南:如何在5分钟内掌握CAN数据库格式转换 终极指南:如何在5分钟内掌握CAN数据库格式转换 【免费下载链接】canmatrix Converting Can (Controller Area Network) Database Formats .arxml .dbc .dbf .kcd ... 项目地址: https://gitcode.com/gh_mirrors/ca/canmatrix canmatrix是一个强大的Python包&… 2026/7/12 14:32:21
1080p、2K、4K 分辨率选购避坑:从像素定义到屏幕实测的 3 个关键误区 1080p、2K、4K分辨率选购避坑指南:从像素定义到屏幕实测的3个关键误区 当你站在电器卖场的显示器专区,面对琳琅满目的"4K超清"、"2K电竞"、"1080p全高清"标签时,是否曾困惑这些数字背后的真实含义?… 2026/7/12 14:30:20
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/12 0:01:13
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/12 0:01:13
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/12 0:03:14
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/12 0:01:13
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/12 0:01:13
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/12 0:03:14