找回密码
 立即注册
查看: 77|回复: 2

RTOS原理(1)单片机RTOS不关闭总中断而实现临界区保护的方法总结

[复制链接]
  • 打卡等级:偶尔看看II
  • 打卡总天数:24
  • 最近打卡:2025-06-13 00:05:49

115

主题

1223

回帖

1万

积分

荣誉版主

积分
13002
发表于 4 天前 | 显示全部楼层 |阅读模式
引言:
- 通常对于CODE代码规模大于32KB的单片机,都应该用单片机RTOS的方法来编程。即使项目对实时性要求不高,RTOS仍然具有任务管理简单,运行可靠和编程简单的优点。
- 学会和学好RTOS编程,除了按照框架学习之外,还应该系统地了解RTOS一些深层的知识。
- 临界区保护是RTOS(也是含有中断的程序)的基本需求,单片机RTOS实现临界区保护的最基本方法是关闭总中断。但是主流的RTOS均提供了很多不关闭总中断而实现临界区保护的方法
以下是向DeepSeek提问“有哪些单片机RTOS可以不关闭总中断而实现临界区保护”后根据它的回答生成的文章。
Fig_01_查询.jpg
Fig_02_结果.jpg
DeepSeek的思索:
嗯,用户想了解在单片机RTOS中,有哪些方法可以不关闭总中断而实现临界区保护。这是一个嵌入式系统领域比较专业的问题。
我看到了很多相关的资料。在1中提到了"任务切换加锁/解锁"的方法,这种方法不是关闭中断,而是通过锁住任务切换来保护临界区。具体实现是调用OSSchedLock()和OSSchedUnlock()函数,这样在临界区内任务不会切换,但中断依然可以响应。
2讨论了关闭总中断的优缺点。它指出关闭总中断虽然简单但会导致中断响应延迟增加。文中提到,如果RTOS只允许在系统中断内进行任务调度,可能无法满足某些实时任务的要求。文章还提出未来大资源的单片机可以采用类似DOS的操作系统,这种系统不允许用户程序关闭中断,而是通过权限管理实现保护。
4介绍了三种裸机环境下实现临界区保护的方法,其中终极做法是使用PRIMASK寄存器,在进入临界区前保存PRIMASK状态然后关闭中断,退出时恢复原状态。这种方法支持嵌套。
5详细说明了FreeRTOS的临界区保护实现。它使用BASEPRI寄存器选择性关闭中断,只屏蔽优先级低于某个阈值的中断,而不关闭高优先级中断。这种方法在保护临界区的同时保留了高优先级中断的响应能力。
另外378讨论了RTOS中任务间同步机制,其中提到pend-post机制用于任务间通信和同步,这也可以作为一种保护共享资源的软方法。
基于这些资料,我会整理几种不关闭总中断的临界区保护方法:任务调度锁、选择性中断屏蔽、基于PRIMASK/BASEPRI的嵌套保护、pend-post机制等。我会按实现原理、特点、适用场景等方面组织内容,并给出具体RTOS实现的例子。准备用表格比较不同方法的优缺点,并在关键概念处加粗突出。还会提及这些方法在实际RTOS如FreeRTOS、uC/OS中的具体实现方式。
DeepSeek的结果:
在单片机RTOS中,实现临界区保护而不关闭总中断(全局中断)是提升系统实时性的关键技术。以下是几种主流方法及其实现原理,结合了多篇技术文献的分析:
1. 任务调度锁(Scheduler Locking)
原理:通过锁定任务调度器(如OSSchedLock()/OSSchedUnlock()),禁止任务切换,但不影响中断响应。临界区内当前任务独占CPU,中断仍可触发ISR,但ISR返回后不会切换到更高优先级任务13。
特点:
- 零中断延迟:中断服务程序(ISR)仍能实时响应。
- 适用场景:临界区较长且需保证中断响应的场景(如电机控制、ADC采样)1。
- RTOS持:uC/OS-II(通过OS_CFG_SCHED_LOCK_EN配置启用)、FreeRTOS(vTaskSuspendAll())15。
2. 选择性中断屏蔽(BASEPRI寄存器)
- 原理:利用Cortex-M内核的BASEPRI寄存器,仅屏蔽优先级低于设定阈值的中断(如系统节拍中断),保留高优先级中断(如紧急硬件事件)的响应能力45。
- 例如:设置 BASEPRI=0x50 时,优先级≥0x50的中断被屏蔽,更高优先级中断仍可触发。
- 实现:
// FreeRTOS 示例
uint32_t ulReturn =portSET_INTERRUPT_MASK_FROM_ISR();
// 临界区代码
portCLEAR_INTERRUPT_MASK_FROM_ISR(ulReturn);
- 优势:兼顾临界区保护与高实时性要求,适用于混合关键性系统5。
3. PRIMASK嵌套保护(裸机/RTOS通用)
- 原理:通过保存/恢复PRIMASK寄存器状态实现嵌套式临界区保护。进入临界区时保存当前中断状态并关中断,退出时恢复原状态4。
- 代码示例:
uint32_t primask =__get_PRIMASK();  // 保存状态
__disable_irq();                     // 关中断
// 临界区代码
__set_PRIMASK(primask);              // 恢复状态
- 适用性:裸机或轻量级RTOS,支持任意嵌套深度4。
4. Pend-Post机制(任务同步原语)
- 原理:通过信号量/互斥锁等同步机制,让任务在访问共享资源时阻塞(Pend),资源释放时唤醒(Post)。此过程不依赖中断开关,而是通过任务调度器管理阻塞队列78。
- 关键实现
任务按优先级挂载到资源的等待队列。
资源释放时,唤醒队列中最高优先级任务。
- 优势:避免中断开关开销,适用于资源争用频繁的场景(如串口、I²C外设互斥访问)7。
5. 类DOS系统(高级RTOS)
- 原理:仿效Unix/Linux的权限分级模型,将任务分为用户级和系统级。用户任务无权开关中断,临界区保护由操作系统通过硬件陷阱(Trap)自动处理2。
- 案例系统:Linux-based RTOS(如RTLinux、VxWorks)或单片机上的微内核(如树莓派OS)2。
- 优势:彻底消除用户误关中断风险,适合高可靠性应用。

方法对比与选型建议
Fig_03_对比.jpg
  
方法
  
中断延迟
嵌套支持
适用场景
典型RTOS
任务调度锁
零延迟
长临界区+高实时中断
uC/OS-II, FreeRTOS
BASEPRI选择性屏蔽
可配置
混合关键性系统
FreeRTOS, Zephyr
PRIMASK嵌套保护
关中断期间延迟
裸机/轻量RTOS
裸机程序
Pend-Post同步机制
无影响
共享资源互斥
TencentOS-tiny, RT-Thread
类DOS系统
无影响
系统托管
高可靠性系统
RTLinux, VxWorks
总结
- 轻量级场景:任务调度锁或BASEPRI选择性屏蔽是平衡实时性与复杂性的首选15。
- 资源互斥:优先使用Pend-Post同步原语(如互斥锁),避免中断操作7。
- 高可靠系统:采用类DOS架构的RTOS(如VxWorks),从根本上规避用户误操作中断的风险2。

实际选型需结合临界区长度、中断响应要求及硬件资源综合评估。例如,电机控制需任务调度锁保证ADC采样实时性,而通信协议栈宜用信号量管理缓冲区访问。


回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:24
  • 最近打卡:2025-06-13 00:05:49

115

主题

1223

回帖

1万

积分

荣誉版主

积分
13002
发表于 4 天前 | 显示全部楼层
Fig_04_CosyOS.jpg

建议CosyOS作者先上网查查国内外研究水平,先了解一下主流单片机RTOS,然后再下结论!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:24
  • 最近打卡:2025-06-13 00:05:49

115

主题

1223

回帖

1万

积分

荣誉版主

积分
13002
发表于 4 天前 | 显示全部楼层
虚心使人进步,如果CosyOS作者先认真了解一下主流单片机RTOS,就不会狂妄自大到下面的程度了:
楼_57.jpg
楼_61.jpg
楼_62.jpg

也不会自大到连贴子1楼给出的实际例子都不去看
楼_136.jpg


单片机RTOS实时响应时间排行榜重大宣布:STC32G12K128单片机 全面碾压 STM32F103C
https://www.stcaimcu.com/thread-7724-1-1.html
(出处: 国芯技术交流网站)








楼_57.jpg
楼_61.jpg
楼_62.jpg
楼_136.jpg
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-16 06:03 , Processed in 0.115554 second(s), 58 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表