中断抢占和任务抢占的区别

作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习

擅长领域:驱动开发,嵌入式软件开发,BSP开发

作者主页:一个平凡而乐于分享的小比特的个人主页

文章收录专栏:UCOS-III,本专栏为UCOS-III学习记录

欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖

中断抢占和任务抢占的区别

任务抢占 (Task Preemption)

定义:

  • 任务之间的抢占
  • 发生在任务调度层面
  • 由RTOS调度器管理

触发条件:

复制代码
// 例子:任务A正在运行,此时...
任务B从阻塞态变为就绪态,且 优先级(B) > 优先级(A)
  • 更高优先级任务变为就绪态
  • 当前任务降低了自身优先级
  • 其他任务提高了优先级

发生时机:

  • 在调度点发生 :
    • 任务调用 OSTimeDly()
    • 任务调用 OSSemPend()(信号量不可用时)
    • 任务调用 OSFlagPend() 等
    • 任务主动调用 OSTaskSuspend()

中断抢占 (Interrupt Preemption)

定义:

  • 中断对任务的抢占
  • 发生在硬件中断层面
  • 由CPU硬件管理

触发条件:

复制代码
// 任何硬件中断发生:
SysTick中断、定时器中断、串口中断、GPIO中断等

发生时机:

  • 任何时刻,即使任务正在运行关键代码
  • 与任务状态无关(运行态、就绪态都会被中断)

关键区别对比

特性 任务抢占 中断抢占
触发源 任务状态变化 硬件中断
管理者 RTOS调度器 CPU硬件
发生时机 只在调度点 任何时刻
可预测性 相对可预测 完全异步
优先级依据 任务优先级 中断优先级
对任务状态要求 只能抢占运行态任务 可中断任何状态的任务

eg:

任务抢占的例子:

c 复制代码
void middle_task(void *p_arg) 
{
    while(1)
    {
        printf("middle_task正在运行!!!\r\n");
        OSTimeDly(1000, OS_OPT_TIME_DLY, &err);  // ← 调度点!
        // 在这里可能发生任务抢占
    }
}

当 middle_task 调用 OSTimeDly() 时,调度器选择就绪队列中最高优先级的任务运行。

中断抢占的例子:

c 复制代码
void low_task(void *p_arg) 
{
    while(1)
    {
        printf("low_task正在运行!!\r\n");
        delay_ms(3000);  // ← 任何时刻都可能被中断抢占!
        // 即使在delay_ms循环中,也会被SysTick中断
    }
}

实际运行中的交互

中断抢占 → 任务抢占的连锁反应:

复制代码
low_task 运行 delay_ms(3000)
    ↓
SysTick中断发生(中断抢占)
    ↓
在ISR中检查到 middle_task 的 OSTimeDly 到期
    ↓
ISR标记 middle_task 为就绪态
    ↓
中断返回前,调度器进行任务调度
    ↓
由于 middle_task 优先级 > low_task 优先级
    ↓
发生任务抢占,切换到 middle_task

简单来说:

  • 中断抢占:硬件中断"打断"当前任务(无论它在做什么)
  • 任务抢占:调度器在合适时机"换人"(只在调度点发生)

在你的优先级翻转场景中:

  1. 首先 发生中断抢占(SysTick中断)
  2. 然后 在中断服务程序中触发任务抢占(调度器选择更高优先级任务)
  3. 两者配合才使得 middle_task 能在 low_task 的 delay_ms(3000) 期间运行
相关推荐
youcans_10 小时前
【STM32C5教程】(3)GPIO 按键输入实验
stm32·单片机·嵌入式硬件
滕州市燕猫虎计算机科技工作室个体工商户11 小时前
《Rust程序设计》学习笔记八:结构体
笔记·学习·rust·rust程序设计
北京盛世宏博12 小时前
通信异常深度排查:以太网温湿度设备 TCP 粘包、UDP 丢包根治方案
单片机·网络协议·tcp/ip·udp·以太网·传感器·温湿度
志尊宝12 小时前
Vue3 零基础每日笔记(082):文件上传实战——el-upload 校验、自定义上传、头像预览
前端·javascript·vue.js·笔记·#javascript·#vue.js
蓝天居士12 小时前
PY32F系列MCU在串口接收时跑飞的根因分析(2)
单片机·嵌入式硬件
后季暖13 小时前
电商问数笔记(2)
笔记
xier_ran13 小时前
【infra之路】AI 编译器学习笔记(二):重拾 C++——移动语义与 LLVM 风格的类型转换
人工智能·笔记·学习
wuyk55515 小时前
嵌入式驱动开发:量产级工程化实战(第9篇)——低功耗下的通信可靠性
c语言·驱动开发·stm32·单片机·嵌入式硬件
星恒随风15 小时前
Linux库的底层原理:ELF文件格式、静态链接、程序加载、虚拟地址空间与GOT/PLT详解
linux·运维·笔记·学习·状态模式
罗西的思考15 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 — (7)— 混合机制
笔记·学习