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

FreeRTOS 在任务中创建优先级更高的任务会立刻切换任务吗?

在 FreeRTOS 中,如果在某个任务中创建一个优先级更高的新任务,系统不会立即自动切换到该高优先级任务,但高优先级任务会被放入就绪队列,并在下一个调度点(scheduler tick 或显式调用调度函数)时被选中执行。具体行为如下:


关键点解析:

  1. 任务创建与调度分离

    • xTaskCreate()xTaskCreateStatic() 等任务创建函数只是将新任务添加到就绪列表(Ready List),不会直接触发上下文切换
    • 新任务的优先级会被记录,但当前正在运行的任务会继续执行,直到调度器决定切换。
  2. 调度器的行为

    • FreeRTOS 的调度器是协作式抢占式的(取决于配置):
      • 抢占式调度(默认启用):如果新任务的优先级高于当前运行任务,当前任务会在下一个调度点(如系统时钟滴答 tick 或中断返回时)被抢占,高优先级任务立即运行。
      • 协作式调度:即使新任务优先级更高,当前任务也不会被抢占,必须显式调用 taskYIELD() 或阻塞(如延时、等待信号量等)才会切换。
  3. 调度点的触发

    • 调度器会在以下情况下检查是否需要切换任务:
      • 系统时钟滴答中断(SysTick 或配置的定时器中断)。
      • 显式调用 taskYIELD()portYIELD()
      • 任务进入阻塞状态(如调用 vTaskDelay()、等待信号量等)。
  4. 立即切换的特殊情况

    • 如果在任务创建后显式调用 taskYIELD(),可以强制触发一次调度检查,此时如果高优先级任务就绪,会立即切换。
    • 某些中断服务程序(ISR)中创建高优先级任务后,可能通过 portYIELD_FROM_ISR() 触发上下文切换(需谨慎使用)。

示例场景:

假设当前有一个优先级为 2 的任务 A 正在运行,你在 A 中创建了一个优先级为 3 的任务 B:

  • 抢占式调度:任务 B 会被放入就绪队列,在下一个调度点(如 tick 中断)时,任务 B 会抢占任务 A
  • 协作式调度:任务 B 虽然就绪,但任务 A 会继续运行,直到它主动让出 CPU(如调用 taskYIELD() 或阻塞)。

验证方法:

  • 通过 FreeRTOS 的 uxTaskPriorityGet()vTaskList() 等调试函数可以观察任务优先级和状态。
  • 使用逻辑分析仪或调试器跟踪任务切换行为。

总结:

  • 默认情况下(抢占式调度):高优先级任务不会“立刻”切换,但会在下一个调度点抢占当前任务。
  • 协作式调度:必须显式让出 CPU 才会切换。
  • 如果需要强制立即切换,可以结合 taskYIELD() 或中断中的 portYIELD_FROM_ISR()(需谨慎)。

如果有特殊需求(如实时性要求极高),可能需要结合中断或更精细的调度控制。

http://www.dtcms.com/a/306330.html

相关文章:

  • 基于成像空间转录组技术的肿瘤亚克隆CNV原位推断方法
  • 如何将DICOM文件制作成在线云胶片
  • FPGA(或者数字电路)中组合逻辑和时序逻辑是怎么划分的
  • 2025年ESWA SCI1区TOP,强化学习多目标灰狼算法MOGWO-RL+分布式混合流水车间调度,深度解析+性能实测
  • 多个滑块的信号条的实现
  • 数据与个人信息在刑法中的界定:解析非法获取行为的两罪判定标准
  • C/C++内存管理与初阶模板
  • 力扣热题100-------74.搜索二维矩阵
  • Docker启动容器命令详解
  • VLLM离线推理本地Qwen3_32B大模型
  • Linux的应用层协议——http和https
  • SpringBoot 整合 自定义MongoDB
  • 大坝安全监测站:对大坝的坝体、坝基、两岸边坡及相关设施进行全方位、实时的安全监测
  • 分层解耦(Controller,Service,Dao)
  • RHCA - CL260 | Day03:配置 RHCS 集群
  • 城市内涝淹水体积估算工作流程(QGIS)
  • 开疆智能Mpdbus转Profinet网关连接电磁流量计配置案例
  • 20250730在荣品的PRO-RK3566开发板的Android13下调通敦泰的FT8206触控芯片【I2C的挂载】
  • IBM Watsonx BI:AI赋能的下一代商业智能平台
  • 八股文场景题
  • 企业微信API接口发消息实战:从0到1的技术突破之旅
  • MySQL 读写分离
  • 论文阅读|NeurIPS 2024|Mamba进一步研究|MSVMamba
  • 飞算科技:原创技术重塑 Java 开发,引领行业数智化新浪潮
  • 网络的学习 2 Socket
  • 面记 | android 应用开发(某半导体公司)
  • LoRaWAN协议,提升公用事业能源效率的“隐形引擎”
  • 动态规划Day5学习心得
  • windows本地使用conda部署Open-webui
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-48,(知识点:BUCK电路的损耗,开关损耗,导通损耗,电感损耗、驱动损耗)