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

<FreeRTOS>

状态核心含义触发方式恢复方式是否参与调度
运行态正在占用 CPU 执行调度器选择就绪任务时间片到 / 被抢占是(占用 CPU)
就绪态等待 CPU 分配任务创建 / 阻塞到期 / 被恢复调度器选中是(等待调度)
阻塞态等待事件(主动放弃 CPU)调用 vTaskDelay / 等信号量事件触发 / 延迟到期(自动)
挂起态被强制暂停调用 vTaskSuspend调用 vTaskResume(手动)
删除态已删除,等待内存回收调用 vTaskDelete空闲任务回收内存

状态

1. 就绪态 ↔ 运行态

  • 就绪态 → 运行态:由调度器触发,选择 “就绪态中优先级最高” 的任务,将其切换为运行态(独占 CPU 执行)。
  • 运行态 → 就绪态:满足以下任一条件时触发:
    • 时间片结束(同优先级任务轮转调度);
    • 被更高优先级的就绪任务 “抢占”;
    • 任务主动放弃 CPU(如进入阻塞态、挂起态)。

2. 运行态 ↔ 阻塞态

  • 运行态 → 阻塞态:任务因 “等待事件” 主动放弃 CPU,触发条件包括:
    • 调用 vTaskDelay()/vTaskDelayUntil() 等待时间延迟;
    • 调用 xSemaphoreTake()/xQueueReceive() 等待信号量、队列数据等同步 / 通信事件。
  • 阻塞态 → 就绪态:当 “等待的事件满足” 时自动触发,如:
    • 延迟时间到期;
    • 信号量被释放、队列有新数据等事件到达。

3. 就绪态 / 运行态 / 阻塞态 ↔ 挂起态

  • 就绪态 / 运行态 / 阻塞态 → 挂起态:通过 API vTaskSuspend() 触发,无论任务当前处于就绪、运行还是阻塞态,均可被强制挂起(暂停执行,不参与调度)。
  • 挂起态 → 就绪态:仅通过 API vTaskResume()(任务上下文)或 vTaskResumeFromISR()(中断上下文)手动唤醒,才能从挂起态回到就绪态,重新参与调度。

4. 运行态 → 僵尸态(删除态)

  • 运行态 → 僵尸态:当任务 “正常结束” 或被 vTaskDelete() 显式删除时,进入僵尸态(即 “删除态”)。
  • 僵尸态 → 内存释放:由 FreeRTOS 的空闲任务(Idle Task) 自动回收该任务的 TCB 和栈内存,完成最终清理。

核心区分总结

  • 阻塞态:因 “等事件” 被动阻塞,事件满足后自动恢复为就绪态;
  • 挂起态:因 vTaskSuspend() 强制暂停,需手动调用 vTaskResume() 才能恢复;
  • 僵尸态:任务已逻辑删除,仅等待空闲任务回收物理内存。

延时

一、核心计时逻辑与起点

  • vTaskDelay(相对延时):计时起点是 **“调用函数并进入阻塞态的瞬间”**(即任务加入等待队列的时刻),延时时长为相对当前时刻的 xTicksToDelay 个系统节拍(如 1000 节拍 = 1000ms)。例如:任务执行到 vTaskDelay(1000) 时,从 “此时” 开始等待 1000ms 后解除阻塞,与任务 “何时开始执行” 无关。

  • vTaskDelayUntil(绝对延时):计时起点是 **“上次被唤醒的绝对时间点”**(通过 xLastWakeTime 记录),下次唤醒时间严格为 xLastWakeTime + 固定周期(xPeriod)。例如:首次唤醒时间为 t0,则下次唤醒时间必为 t0 + 1000ms,无论任务执行耗时或中断占用多久,周期间隔始终固定。

二、周期稳定性对比

  • vTaskDelay:周期不稳定。实际周期 = 任务执行时间 + 延时节拍时间 + 中断占用时间(若中断发生在任务执行阶段),会随执行耗时、中断等因素漂移。

  • vTaskDelayUntil:周期绝对稳定。两次唤醒的时间间隔严格等于 xPeriod(如 1000ms),不受任务执行耗时、中断的影响(仅压缩任务可执行时间,不改变周期)。

三、适用场景

  • vTaskDelay:适合非周期性任务(如单次延时后执行、对周期精度无要求的场景),例如初始化后延时启动传感器、临时等待某个条件。

  • vTaskDelayUntil:必须用于周期性任务(如定时采样、周期性控制指令),需严格保证固定频率,避免因执行耗时或中断导致的周期偏差。

四、选择原则

  • 若只需 “延时一段时间后执行一次”,用 vTaskDelay(简单直观);
  • 若需 “按固定周期重复执行”,必须用 vTaskDelayUntil(确保周期稳定,是高精度周期任务的唯一选择)。
http://www.dtcms.com/a/549383.html

相关文章:

  • Kubernetes Namespace 详解:资源隔离与多租户管理
  • Cursor 发布 2.0 与 全新 Composer
  • Rust + WASM + Svelte 深度实战:内存管理、性能权衡与图像处理进阶
  • 做个电商网站需要怎么做免费的个人简历模板文档
  • 【叩富网 -注册安全分析报告-无验证方式导致安全隐患】
  • 【.net framework】WINDOWS服务和控制台程序简单介绍
  • PDFelement 万兴PDF,简单好用的PDF阅读编辑批注器
  • 建设商城网站的书籍钱广东网站开发软件
  • android studio开发UniComponent<SurfaceView>组件
  • android studio 签名打包教程
  • 做网站之前的前期徐州市网站开发
  • opencv 获取图像中物体的坐标值
  • 乐鑫推出的第三颗RISC-V物联网芯片ESP32-H2,融合蓝牙与Thread技术!
  • 08_集成学习
  • 建设平台型网站多少钱微商网站模板
  • 温州网站建设方案维护软件服务外包
  • 分享几个开源的系统,包括小程序、商城系统、二手交易等常见的系统、很容易进行二次开发 【可以参考学习】
  • Linux 环境适应 Day 1 全面笔记
  • Git 中的 MERGE_HEAD 和 HEAD 的区别?
  • TDengine 数学函数 TRUNCATE 用户手册
  • 成都外贸网站建设费用wordpress is front
  • 【Rust】异步处理器(Handler)实现:从 Future 本质到 axum 实战
  • SpringBoot + iTextPDF + Acrobat 构建动态PDF表单的完整实践
  • 如何使用Python编辑PDF文档:修改文本、添加图片、更新元数据等
  • 苹果ios系统ipa文件企业签名是什么?优势是什么?什么场合需要应用到?
  • 石家庄商城网站制作微信网站小游戏
  • Postman接口测试教程(完整版)
  • 优秀网页界面设计郑州百度搜索优化
  • 一个可本地运行的实时字幕翻译 Demo(Whisper + GPT + Streamlit),可以边说边出中英文字幕
  • 网站开发建设总结wordpress ftp存储