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

[stm32 freertos 任务调度 ]

任务调度我们有很更多 的任务 对于我们的内核 他不知道到底是先运行 哪一个

任务调度和优先级的区别有的同学可能有一点不理解 优先级我们类比于 病人是大出血 很紧急 但是任务调度 是给他 看的那给人 也就是说任务调度是做决定的 过程 它决定了 医生到底想给谁看病

FreeRTOS 是一款实时操作系统,采用以下调度机制:

  1. 抢占式调度:高优先级任务可抢占低优先级任务,系统始终执行当前最高优先级的任务
  2. 时间片调度:相同优先级的任务采用轮转方式公平分配CPU时间

任务设定:
Task3(玩游戏):优先级 1 (最低),持续运行。
Task2(女朋友喊看电视):优先级 2,可打断Task3。
Task1(老妈喊吃饭):优先级 3 (最高),可打断所有任务。
运行过程(时间线推演):

初始状态:系统正在运行Task3(玩游戏),因为此时没有更高优先级的任务就绪。
事件1(抢占发生):Task2(女朋友,优先级2)​ 就绪。由于它的优先级(2)高于当前运行任务(1),系统立即抢占
Task3​ 被强制挂起,进入就绪态,等待再次运行。
Task2​ 开始运行(看电视)。
事件2(更高优先级抢占):Task1(老妈,优先级3)​ 就绪。它的优先级(3)比当前运行的Task2(2)更高,系统再次发生抢占:
Task2​ 被强制挂起,进入就绪态。
Task1​ 开始运行(吃饭)。
事件3(高优先级完成):Task1(吃饭)​ 执行完毕。
系统立即从就绪态的任务中,找出优先级最高的来执行。此时就绪的有 Task2(优先级2)和 Task3(优先级1)。
于是,Task2(看电视)​ 从刚才被挂起的地方恢复运行。
事件4(次高优先级完成):Task2(看电视)​ 执行完毕。
系统再次查找就绪任务,只剩下 Task3(玩游戏,优先级1)。
Task3​ 恢复运行,直到被其他更高优先级任务打断或自己完成。

高优先级任务优先执行,且不会被中断。

低优先级任务必须等待高优先级任务完成。

被抢占的任务将转入就绪状态。

时间片调度

同等优先级任务,轮流执行,时间片流转;
一个时间片大小,取决于滴答定时器中断周期;
注意:没有用完的时间片不会再使用,下次任务 Task3 得到执行,还是按照一个时间片的时钟节拍运行

FreeRTOS 中任务共存在 4 种状态:

  1. Running 运行态

    当任务处于实际运行状态称之为运行态,即 CPU 的使用权被这个任务占用(同一时间仅一个任务处于运行态)。

  2. Ready 就绪态

    处于就绪态的任务是指那些能够运行(没有被阻塞和挂起),但是当前没有运行的任务,因为同优先级或更高优先级的任务正在运行。

  3. Blocked 阻塞态

    如果一个任务因延时,或等待信号量、消息队列、事件标志组等而处于的状态被称之为阻塞态。

  4. Suspended 挂起态

    类似暂停,通过调用函数vTaskSuspend()​ 对指定任务进行挂起,挂起后这个任务将不被执行,只有调用函数xTaskResume()​ 才可以将这个任务从挂起态

  5. 总之 只有就绪态可以变为 运行态 其他的想要变成运行态 必须先变成就绪态

下面我们做一个综合的小实验

KEY1​ 控制 taskLED1​ 的创建与删除;
KEY2​ 控制 taskLED2​ 的挂起与恢复。

(小提示配置的时候 按键我们配置的是 input)

如果是低电平的状态 就代表 按键按下 而且图片里面我已经 加了 防抖动处理 也就是我延时20ms 再去读一变

我们会发现 出现了 许多的key按下

while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET);

因此我们要加一个按键等待释放阻塞式电平检测语句 防止系统卡死

那么我们怎么判断taskLED1 存在没有存在 我们就是要看他的句柄 我们在调用 创建任务的时候 返回值 他会返回一个句柄

如图 会有一个句柄 我们看他是不是等于 NULL 如果是 那就是没有创建成功

key1 和key2

http://www.jsqmd.com/news/551332/

相关文章:

  • LoRA微调实战:如何用peft.LoraConfig()优化你的大模型(附参数详解)
  • 5分钟快速搭建:基于xterm.js的Web终端实时监控系统
  • BongoCat:重新定义桌面体验的互动工具
  • LyricsX:3个简单步骤让Mac桌面歌词显示变得如此智能
  • Windows PDF处理终极指南:Poppler完整工具包快速入门
  • ML _0-1_概念
  • fuzz.txt高级技巧:自动化安全测试与持续集成部署
  • AIGlasses_for_navigation实际应用:为听障视障双重障碍者定制多模态反馈系统
  • Node.js调试
  • OpenClaw移动端适配:手机飞书调用Qwen3-VL:30B的优化技巧
  • Updog完全指南:如何用简单命令替代Python SimpleHTTPServer
  • 2026最新!AI论文软件测评:这几款让你写作更高效
  • 告别网页刷题时代!VSCode+LeetCode插件打造高效本地解题环境
  • 工业能量:01 电源是谁?开关电源 vs UPS
  • 2026年气动吊直销厂家联系电话,15吨气动葫芦/0.5吨气动葫芦/气动吊车/天顺牌气动葫芦,气动吊订做厂家有哪些 - 品牌推荐师
  • Ultimate Vocal Remover GUI:5分钟掌握专业级音频分离技巧
  • 创龙T113-i开发板:从SDK解压到镜像打包,一个完整Linux系统构建实录(含80分钟编译避坑)
  • RAG技术优化:Vector+KG、Self-RAG与多模态集成
  • Windows Defender Remover终极指南:四步彻底解决系统防护干扰的完整解决方案
  • AI复制到word格式
  • 3个必学的Videomass视频编辑技巧:精准裁剪、智能缩放与灵活旋转
  • SDXL-Turbo多场景落地教程:覆盖电商、游戏、教育、自媒体的6大用法
  • LAV Filters:解码Windows媒体播放困境的开源解决方案
  • 5分钟掌握:跨平台资源嗅探工具res-downloader终极指南
  • 告别卡顿!为树莓派4B选择与烧录最佳系统镜像的实战指南(含桌面版对比与性能调优)
  • 百度网盘Mac版终极提速指南:三步解锁SVIP特权,免费享受70倍下载加速
  • 智能部署新范式:四阶段零代码AI应用上线实战指南
  • AudioLDM-S从入门到精通:一套完整的音效生成、管理与应用方案
  • 别再死磕理论了!用Comsol 6.1实战芯片散热拓扑优化,从模型到结果全流程拆解
  • 别再只盯着日志了!利用RDP的.bmc缓存文件做Windows终端服务器取证(附Python工具链)