杨为民 发表于 2024-5-4 12:54:34

华山论剑(1): 科普“零中断延迟”的临界区保护方法

本帖最后由 杨为民 于 2024-5-24 16:05 编辑

一、什么是“零中断延迟”(1)任何单片机RTOS系统在运行的时候都有一些程序段需要不被外界打断地完整执行,这些程序段被称为“临界区”。为了确保不被外界打断的方法被称为“临界区保护方法”。(2)“临界区保护方法”按照是否采用“关闭总中断”分为两类:常规的关闭总中断方法和不关闭总中断的方法。后者在本论坛中被称为“零中断延迟”方法。(3)常规方法的缺点是当系统进入临界区保护的时候,由于总中断被关闭,这期间发生的任何用户中断都会被延迟。(4)不关闭总中断的方法的优点是当系统进入临界区保护的时候,由于总中断没有关闭,这期间发生的任何用户中断都不会被延迟,故称“零中断延迟”方法。 二、“不关闭总中断”的风险(5)一朋友是常规“T台秀游乐园”的建筑商。“T台秀游乐园”(单片机RTOS)的核心是时装模特T台表演(执行任务),其余还包括一些吃喝玩乐项目。(6)T台秀的模特在两轮表演(两个任务)之间需要更换服装(进行任务调度)。更换过程包括脱下本轮演出服(保存当前任务现场),换上下轮演出服(恢复新任务现场)。(7)出于竞争和保护隐私的目的,更换服装的过程(临界区)需要严格保密和连续进行,常规的保护方法(常规的临界区保护方法)是在模特换衣之前发出“禁止令”(关闭总中断),停止“T台秀游乐园”内所有的动物的运动,哪怕吃饭的也停下来。然后在模特换衣之后撤销“禁止令”(重新打开总中断),恢复“T台秀游乐园”内所有的动物的运动。(8)可以看出常规的保护方法有一个重要的缺陷:在禁止令发布区间,也禁止了本来与T台表演无关的其他游客的行动,比如让餐厅中吃饭的客人也不能正常吃饭了。(9)由于行业内卷太厉害,这位朋友新使用了一种新的保护方法“非全面禁止令”(不关闭总中断),只是禁止了“T台表演厅”内的动物的活动,对其他区域的游客实现了“零限制活动”(零延迟中断)。(10)显然新方法有益于游客,朋友的“零限制活动”的“T台秀游乐园”打开了新的局面。(11)不过这位朋友告诉我他每天都提心吊胆。由于对其他区域的游客实行的是“零限制活动”(零延迟中断),如果在换衣服的时间(临界保护区内)有其他地方的游客跑来看热闹,吃瓜拍照,导致换服装过程不能正常进行,演出崩溃怎么办?三、解决的方法(12)我建议朋友向我学习(我移植uC/OS-II时移植了两个版本,一个是关闭总中断的“微山x51”系列,一个是不关闭总中断的“挑战者x51”系列),建两个游乐园,一个是常规的,一个是“零限制活动”。(13)朋友说建两个不行,时间一长,“零限制活动”的游乐园就不会有“T台秀”了。因为演出团和演员很少会冒换衣服被围观的风险的。(14)我问他的建议,他认为对于想要看“T台秀”的游客专门建一个采用常规保护方法的“T台秀剧场”(关闭总中断的RTOS),对于真正需要艺术的人不会在乎被“限制行动”几分钟。而对于爱好自由的吃货和玩家,专门建一个不需要任何限制的“游乐园”(就是不进行任何临界区保护的“前后台操作系统”),游客任何时候想做什么都没有限制(对任何中断都是真正“零延时”)。 注:文中朋友是虚构的注:本论坛的《任务调度方法,【无错,至简】!“多任务分时调度”》(https://www.stcaimcu.com/forum.php?mod=viewthread&tid=7611&extra=page%3D1)是一个不进行任何临界区保护的“前后台操作系统”,是一个真正意义上的“零中断延时”操作系统

fjstcmcu 发表于 2024-7-5 20:38:19

初学的,我的理解就是一个是时间保护,一个是空间保护,这样理解对?{:4_165:}

13918210822 发表于 2024-7-19 15:31:24

任务调度方法,【无错,至简】!“多任务分时调度” -- 几乎不是一个多任务, 而是一个前后台轮询例程

如果一个任务在一次执行中要多次等待, 这个“多任务分时调度”就要把这个任务分成多个阶段并加上状态机进行处理
其实,还是传统的前后台加标志状态的模式, 状态一多 就谈不上 至简, 也自然容易引入逻辑错误和设计实现的误差.

因此, 多任务还是需要一个真正的平台而不是一个单纯的多轮询.

bkeuqoaq 发表于 2024-11-8 10:59:43

不明白,如果不关总中断,中断来了,调用OS API,中断返回时进行任务切换怎么办

杨为民 发表于 2024-11-8 11:31:31

bkeuqoaq 发表于 2024-11-8 10:59
不明白,如果不关总中断,中断来了,调用OS API,中断返回时进行任务切换怎么办

谁见过Windows和Linux关闭过总中断?采用其他操作系统技术就行了。

bkeuqoaq 发表于 2024-11-8 11:35:31

杨为民 发表于 2024-11-8 11:31
谁见过Windows和Linux关闭过总中断?采用其他操作系统技术就行了。

这我就真不懂了

angmall 发表于 2024-11-8 13:06:20



我问AI。



在实时操作系统(RTOS)中,为了在临界区实现“零中断延迟”的保护,需要选用既能保证数据一致性、又不会延长中断响应时间的方法。以下是一些常见的“零中断延迟”临界区保护方法:

### 1. **原子操作(Atomic Operations)**
   - **方法描述**:使用硬件支持的原子操作,比如对共享数据的原子增减、位操作等,这类操作在硬件层面上是不可分割的。因为单一的指令周期内完成,无需加锁或禁用中断,保证了数据的一致性。
   - **优点**:不会影响中断响应时间,可以实现对简单变量或标志位的快速保护。
   - **限制**:原子操作通常只能处理单次读-改-写的操作,复杂的逻辑(如多个变量的操作)无法实现。

### 2. **无锁数据结构和算法(Lock-Free Data Structures and Algorithms)**
   - **方法描述**:采用无锁数据结构(如无锁队列、环形缓冲区)和无锁算法(如双缓冲),使得共享资源的操作无需进入临界区。例如,通过“比较并交换”(CAS,Compare-And-Swap)来进行指针切换。
   - **优点**:完全避免了加锁或禁用中断带来的开销,不会影响中断延迟。
   - **限制**:设计和实现复杂,适用于特定的场景,如数据队列、缓冲区。

### 3. **任务调度锁(Task-Level Scheduler Locking)**
   - **方法描述**:通过临时锁住调度器来保护临界区,防止任务切换,但不禁用硬件中断。这样,当前任务在执行临界区代码时不会被其他任务打断,保证临界区的原子性。
   - **优点**:不会禁用中断,硬件中断可以正常响应,因此不会延迟中断处理。
   - **限制**:只适用于任务之间的数据保护,对于中断服务程序(ISR)访问的资源无保护作用。

### 4. **优先级反转处理(Priority Inheritance / Priority Ceiling)**
   - **方法描述**:使用优先级反转保护机制,让临界区内的任务获得更高的优先级,从而尽快完成执行,避免被其他任务打断。这样无需禁用中断,也可以有效防止任务间的资源竞争。
   - **优点**:保持系统的实时性,在不影响中断延迟的情况下确保关键任务快速完成临界区操作。
   - **限制**:仅适用于需要保护的资源在任务间共享的情况,且需要RTOS支持优先级反转机制。

### 5. **优先级屏蔽(Interrupt Prioritization / Masking)**
   - **方法描述**:如果RTOS和硬件支持优先级化的中断,可以在进入临界区时仅屏蔽较低优先级的中断,高优先级的中断依然可以响应。这样既保证了临界区的完整性,又允许关键中断不中断。
   - **优点**:保持了高优先级中断的响应能力,同时保证了临界区操作的完整性。
   - **限制**:优先级屏蔽机制需要硬件支持,且需要合理分配中断优先级,避免关键中断被错误屏蔽。

### 6. **硬件支持的互斥机制(Hardware Mutexes or Semaphores)**
   - **方法描述**:一些现代MCU支持硬件互斥机制(如硬件信号量或MPU),可以通过硬件直接实现临界区保护,无需禁用中断。例如,某些硬件具有内建的信号量或排他性访问功能,专门用来管理资源访问。
   - **优点**:利用硬件加速保护资源访问,不会影响中断延迟。
   - **限制**:依赖硬件支持,适用范围有限,移植性差。

### 选择合适的保护方法

选择保护方法时,需要考虑以下几个因素:
- **实时性要求**:如果系统对中断延迟极为敏感,可以优先考虑原子操作和无锁数据结构。
- **临界区的复杂性**:如果临界区操作复杂且包含多个变量,调度锁、优先级反转、优先级屏蔽等方法可能更适用。
- **硬件支持**:根据硬件是否支持信号量、优先级屏蔽或原子操作来选择合适的方法。

在大多数情况下,可以通过组合使用这些方法,既能实现高效的临界区保护,又能保持系统的实时性和中断响应能力。




angmall 发表于 2024-11-8 13:16:21

这段描述生动地比喻了RTOS中的“零中断延迟”临界区保护方法及其风险。以下是对内容的分析和总结:

一、什么是“零中断延迟”
在RTOS中,临界区是需要不被打断地完成的代码段。传统的做法是关闭总中断(即“禁止令”),确保执行期间不会有外部中断打断,以保护临界区的完整性。然而,关闭总中断会影响整个系统,使得与当前任务无关的中断也被延迟,增加了响应时间。

“零中断延迟”方法则通过不关闭总中断来保护临界区,避免了对其他无关中断的干扰。这使得在进入临界区时系统的其他中断不会受到影响,从而实现“零中断延迟”。这种方法的优点是提高了系统的响应性,不会延迟与当前任务无关的中断。

二、不关闭总中断的风险
比喻中的“游乐园”和“T台秀”表演展示了不关闭总中断方法的潜在风险。在“零限制活动”的游乐园中,不关闭总中断意味着其他任务和外部事件(比如其他区域的游客)可以随时“打断”临界区的操作(模特换衣)。如果在保护临界区时其他任务进入干扰,可能导致当前操作失败或数据不一致,甚至引发系统崩溃。因此,不关闭总中断的保护方法虽能提供更好的实时性,但也增加了数据一致性和任务调度出错的风险。

三、应对策略
为解决这个问题,可以采取以下策略:

1.区分两种保护场景:对于不同类型的任务需求,采用不同的RTOS版本。例如,对于需要严格保护的任务(如“T台秀”),可以用关闭总中断的方法(传统的RTOS),确保任务不会被任何中断打断。对于其他对实时性要求较高但无严格保护需求的任务(如吃喝玩乐的游客),则采用不关闭总中断的方法,实现真正的“零中断延迟”。

2.任务隔离:在实际系统设计中,采用硬件隔离或优先级管理的方式,确保关键任务能获得独立的执行空间,而不影响其他任务。比如可以为关键任务分配单独的中断优先级,或在硬件上实现“屏蔽”机制,只允许特定优先级的任务访问临界区。

3.基于需求设计:针对不同需求提供不同的系统架构,比如在高实时性要求的系统中选择“零中断延迟”的保护方案,而在数据一致性要求高的场景中则使用传统方法,通过关闭总中断来保护关键操作的完整性。

通过这些方法,RTOS可以根据实际需求提供更灵活的临界区保护,实现“零中断延迟”与数据一致性的平衡。




bkeuqoaq 发表于 2024-11-8 13:31:05

一般情况下,临界代码短小,中断延迟影响不大
页: [1]
查看完整版本: 华山论剑(1): 科普“零中断延迟”的临界区保护方法