news 2026/7/9 18:18:46

【计算机基础】-11-RT Thread:哪些临界资源需要通过关闭中断进行保护?举例说明

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【计算机基础】-11-RT Thread:哪些临界资源需要通过关闭中断进行保护?举例说明

RT-Thread 实时操作系统(RTOS)中,临界资源(Critical Resources)是指那些在多任务或中断环境下不能被并发访问的共享资源。若多个线程或中断同时修改这些资源,会导致数据不一致、系统崩溃等严重问题。

为了保护这些资源,RT-Thread 提供了多种同步机制(如信号量、互斥量、关中断等)。其中,关闭中断(Disable Interrupt)是最底层、最高效的保护手段,但仅适用于非常短的代码段,且通常用于内核内部或驱动开发


一、为什么需要“关中断”?

在 RT-Thread 中:

  • 线程切换可能由调度器中断(如 SysTick)触发;
  • 如果某段代码(包括内核代码)正在修改一个全局数据结构(如就绪队列),此时发生中断并触发调度,另一个线程可能访问该未完成修改的数据竞态条件(Race Condition)。

关中断 = 禁止所有可屏蔽中断 + 禁止线程切换,确保临界区原子执行。

备注:

内核中,有大量不同线程可以共享的全局数据结构,这些数据结构都不是线程安全的,线程切换或创建或删除线程时,需要操作这些数据结构!!!


二、哪些临界资源需要通过“关中断”保护?(典型例子)

✅ 1.线程就绪队列rt_thread_priority_table

  • 作用:按优先级组织所有就绪线程
  • 为什么需要关中断
    • 当一个线程被唤醒(如延时结束),需将其插入就绪队列;
    • 若此时发生中断并触发调度调度器可能读取到不完整或损坏的链表
  • 保护方式
    rt_base_t level = rt_hw_interrupt_disable(); rt_list_insert_after(&rt_thread_priority_table[prio], &thread->tlist); rt_hw_interrupt_enable(level);

✅ 2.系统节拍(OS Tick)相关变量

  • 变量示例rt_tick(系统时钟计数器)
  • 为什么需要关中断
    • rt_tickSysTick 中断中递增;
    • 用户线程也可能读取rt_tick(如rt_tick_get());
    • 读取过程中被中断打断,可能读到中间状态的值(尤其在32 位系统读 64 位变量时)。
  • 保护方式
    rt_base_t level = rt_hw_interrupt_disable(); tick = rt_tick; rt_hw_interrupt_enable(level);

✅ 3.内核对象链表(如设备列表、定时器列表)

  • 例子rt_object_information中的对象链表
  • 场景:注册/注销设备、创建/删除定时器时,需修改全局链表。
  • 风险:若在链表操作中途被中断打断,链表指针可能断裂。
  • 保护:关中断后操作链表。

✅ 4.调度器状态与当前线程指针rt_current_thread

  • 作用:指向当前正在运行的线程。
  • 为什么保护
    • 线程切换时会修改rt_current_thread
    • 若在修改过程中被更高优先级中断打断,可能导致调度混乱。
  • 实际实现:RT-Thread 的rt_schedule()内部会关中断。

✅ 5.硬件寄存器(在驱动中)

  • 场景:某些外设寄存器必须原子地写入多个寄存器的多个位,以保障硬件时序(如配置 UART 波特率 + 数据位 + 停止位)。
  • 风险若写入中途被中断打断,寄存器处于非法状态。
  • 保护
    rt_base_t level = rt_hw_interrupt_disable(); UART->CR1 = config1; UART->CR2 = config2; // 必须连续写入 rt_hw_interrupt_enable(level);

✅ 6.内核标志位或状态机

  • 例子rt_interrupt_nest中断嵌套计数)、rt_scheduler_lock_nest(调度器锁计数)
  • 特点:频繁被中断和线程访问,必须原子操作。
  • 保护:关中断。

三、关中断的 API(RT-Thread)

// 关闭中断,返回当前中断状态 rt_base_t rt_hw_interrupt_disable(void); // 恢复中断(传入之前保存的状态) void rt_hw_interrupt_enable(rt_base_t level);

⚠️注意

  • 关中断时间必须极短(通常 < 几微秒),否则影响实时性;
  • 不能用于用户应用层,仅限内核或驱动;
  • 用户应优先使用信号量rt_sem_take)或互斥量rt_mutex_take)。

四、为什么不总是用“关中断”?

方法优点缺点适用场景
关中断最快、最可靠阻塞所有中断,影响实时性内核关键路径、极短临界区
信号量/互斥量允许中断响应,支持优先级继承有调度开销用户线程间同步
调度器锁rt_enter_critical不关中断,只禁止调度不能防中断干扰仅需防线程切换的场景

📌 RT-Thread 内核大量使用“关中断” + “调度器锁”组合,实现高效安全的同步。


五、总结:需要关中断保护的临界资源

资源类型具体例子保护原因
调度相关就绪队列、rt_current_thread防止调度器看到不一致状态
时钟相关rt_tick防止读取/更新时被中断打断
内核对象设备列表、定时器链表链表操作非原子
硬件寄存器外设控制寄存器需原子写入多位
内核状态变量中断嵌套计数、调度锁计数高频并发访问

核心原则

凡是在“中断上下文”和“线程上下文”中都会被访问的全局变量或数据结构,且操作不可分割(非原子),就必须用关中断保护。

理解这一点,是编写稳定、可靠 RTOS 驱动和内核模块的关键!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/9 6:42:09

JAVA网页分片上传大文件有哪些步骤?

《一个Java老码农的20G文件夹上传历险记》 大家好&#xff0c;我是老王&#xff0c;一个在西安写了15年Java的老程序员。最近接了个外包项目&#xff0c;需求简单概括就是&#xff1a;“用IE9上传20G文件夹&#xff0c;预算100块还要724小时支持”——这感觉就像是让我用自行车…

作者头像 李华
网站建设 2026/7/4 5:34:55

分块上传大文件在JAVA网页中如何实现?

汽车设计图纸大文件上传&#xff08;WEB 集成&#xff09;方案 一、项目背景 在汽车制造行业&#xff0c;汽车设计图纸是核心资产&#xff0c;其文件体积通常较大&#xff0c;动辄达到 100G 左右。客户提出需求&#xff0c;希望能在我们开发的 WEB 系统中实现这类大文件的安全…

作者头像 李华
网站建设 2026/7/2 22:04:19

照着用就行:自考必备的降AI率平台,千笔·降AIGC助手 VS 灵感ai

在AI技术迅速发展的今天&#xff0c;越来越多的学生开始借助AI工具辅助论文写作&#xff0c;以提升效率和内容质量。然而&#xff0c;随着各大查重系统对AI生成内容的识别能力不断提升&#xff0c;AI率超标问题日益突出&#xff0c;成为许多学生毕业路上的“拦路虎”。无论是知…

作者头像 李华
网站建设 2026/6/29 23:32:40

Windows 11 终极性能优化指南

一、精简后台&#xff1a;关闭非必要的系统服务目标&#xff1a;禁用日常使用中无需的系统服务&#xff0c;以减少内存与磁盘资源的占用。操作步骤&#xff1a;打开服务管理器&#xff1a;按下 Win R 键&#xff0c;输入 services.msc 并回车。定位并禁用建议服务&#xff08;…

作者头像 李华
网站建设 2026/7/1 19:49:41

JAVA如何处理网页中的文件夹上传需求?

大文件传输系统解决方案 - 北京教育行业国企专项提案 作为北京教育行业国企项目负责人&#xff0c;我深刻理解贵司在大文件传输方面面临的挑战。基于贵司提出的详细需求&#xff0c;我司特别定制了以下解决方案。 一、核心功能实现方案 1. 百GB级文件传输技术实现 分块传输…

作者头像 李华
网站建设 2026/7/1 1:31:26

crypto-紧急需求-可远程需求:1、套利策略pm、qr;2、CTA 策略pm、qr;3、算法执行交易员;4、Defi 研究员;5、投资者关系(市场岗);6、数据库工程师;7、CTO

crypto-紧急需求-可远程 需求&#xff1a; 1、套利策略pm、qr&#xff1b; 2、CTA 策略pm、qr&#xff1b; 3、算法执行交易员&#xff1b; 4、Defi 研究员&#xff1b; 5、投资者关系&#xff08;市场岗&#xff09;&#xff1b; 6、数据库工程师&#xff1b; 7、CTO&#xff…

作者头像 李华