C 嵌入式系统设计模式 18:临界区模式

本书的原著为:《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》,讲解的是嵌入式系统设计模式,是一本不可多得的好书。

本系列描述我对书中内容的理解。本文章描述嵌入式并发和资源管理模式之四:临界区模式

临界区模式 (Critical Region Pattern) 是一种 任务协作模式。在软件设计中,任务协作模式是用于协调不同任务之间通讯和同步的策略。它旨在确保任务能够高效、有序地执行,并处理任务之间的依赖关系、优先级冲突和资源共享等问题。

临界区模式是任务协作中最简单的模式之一。其核心思想是在执行关键代码段时禁止任务切换,从而确保当前任务在执行这些敏感或不可中断的操作时不会被其他任务抢占。这种模式的使用场景通常涉及对共享资源的 独占访问 ,或者需要确保任务在特定时间内 无中断地执行 以保证系统的稳定性和正确性。

在临界区模式中,当一个任务进入临界区时,它会关闭或禁用任务切换机制,以防止其他任务打断当前任务的执行。这样做可以消除与资源共享相关的并发问题,如数据竞争和条件竞争,因为在这个时间段内只有当前任务能够访问相关资源。一旦任务完成了临界区内的操作,它会重新启用任务切换,允许其他任务继续执行。

摘要

在抢占式多任务环境中,可能存在某些时间段,其中任务不能被中断或抢占。临界区模式通过禁用任务切换或甚至禁用中断来处理这些关键的时间间隔。这确保了当前任务能够不受干扰地执行。一旦退出临界区,任务必须重新启用任务切换(或中断),否则系统将无法正常运行。

问题

在两种情况下,任务不能被中断或抢占:

  1. 资源访问的互斥性:当任务正在访问共享资源,如全局变量或硬件设备时,如果这些资源不能同时被多个任务安全地访问,那么中断或抢占当前任务可能会导致数据竞争或资源状态的不一致。
  2. 操作的原子性和顺序性:有些操作必须在无中断的情况下完成,以确保其原子性(即操作要么完全执行,要么完全不执行)或特定的执行顺序。

效果

临界区模式通过禁止任务切换或中断来确保活动任务在执行关键代码段时不会受到其他任务的干扰。这使得任务能够在没有潜在干扰的情况下完成其工作,从而保证了系统的稳定性和可靠性。

需要小心的是,在退出临界区后必须重新启用任务切换或中断。

此外,因为要关闭中断或者禁用任务切换,所以临界区模式可能会影响其他任务的执行时间。出于这个原因,临界区的持续时间通常很短。

由于在临界区期间禁用了所有任务切换,因此不存在不受控制的优先级反转问题。

嵌套使用临界区可能会带来问题(通常是软件编写缺陷造成的),我们在实现 进入临界区函数退出临界区函数 时要能支持嵌套。我来举一个不支持嵌套的例子来说明这种隐含缺陷。

CMSIS 也提供了使能中断和禁止中断的函数:

void __enable_irq(void);		//使能中断
void __disable_irq(void);		//禁止中断

查看反汇编,这两个函数分别对应着汇编代码:

CPSIE  I		;使能中断
CPSID  I		;禁止中断

这种禁止中断的方法是不支持嵌套使用的。比如一个这样的例子:

...				
__disable_irq();			//进入临界区
...
	//调用一个函数,在这个函数中也出现了开关中断操作(嵌套)
	__disable_irq();		//再次进入临界区,这一步无错误
	...
	__enable_irq();			//退出临界区,开中断,这步提前打开了中断
	//函数调用完毕
...
__enable_irq();				//期望在这里打开中断
...

注意看代码的第 7 行,这里退出临界区,开中断,从而提前打开了中断。根据代码逻辑,正确的打开中断应在代码的第 10 行。

RT-Thread 提供的使能全局中断或者禁止全局中断函数就具备嵌套使用的能力,具体例子可以参考我的博文 使能中断与禁止中断策略比较。

实现策略

这种模式通常通过使用调度器提供的服务来实现,例如OS_disable_task_switching()OS_enable_task_switching()(或类似的函数),或者通过引入汇编语言指令来在硬件级别禁用或启用中断处理。

无论使用哪种方法,都需要谨慎处理临界区的 进入退出 ,以确保不会意外地启用或禁用中断处理。此外,还需要注意临界区的长度和频率,以避免对系统性能产生过大的影响。如果临界区过长或频繁出现,可能会导致任务延迟、优先级反转或其他并发问题。

相关模式

这种模式仅在多个任务访问相同资源或服务,或者其他任务可能中断当前任务的时间关键处理时才适用。因此,它与 循环执行模式(Cyclic Executive Pattern)并不适用,但经常与 静态优先级模式(Static Priority Pattern)一起使用。

实例

见原书。






读后有收获,资助博主养娃 - 千金难买知识,但可以买好多奶粉 (〃‘▽’〃)
千金难买知识,但可以买好多奶粉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/423242.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java读取文件

读取文件为String 、访问链接直接跳转html 环境:SpringMVC 、前端jsp InputStreamReader FileInputStream fileInputStream new FileInputStream(formatFile.getHtmlpath());InputStreamReader reader new InputStreamReader(fileInputStream, StandardCharsets…

5GC SBA架构

协议标准:Directory Listing /ftp/Specs/archive/23_series/23.501/ (3gpp.org) NF描述说明NSSFNetwork Slice Selection Function网络切片选择,根据UE的切片选择辅助信息、签约信息等确定UE允许接入的网络切片实例。NEF Network Exposure Function网络开…

gif闪图如何在线生成?仅需三步在线制作gif闪图

Gif动态图片是一种通过连续播放的一系列图片来展示的。Gif动图的优势是体积小、传播速度快且不受限制。当我们想要将多张图片变成带有闪动效果的gif动图时应该怎么操作呢?这时候,只需要使用在线闪图制作(https://www.gif.cn/)网站…

查找算法——java

顺序查找(顺序表查找) 顺序查找也称为线形查找,属于无序查找算法。从数据结构线形表的一端开始,顺序扫描,依次将扫描到的结 点关键字与给定值k相比较,若相等则表示查找成功;若扫描结束仍没…

web自动化笔记十:UnitTest基本使用

一、UnitTest框架 ①、什么是框架? 1、框架英文单词framework 2、为解决一类事情的功能集合 ②、为什么使用UnitTest框架 1、批量执行用例 2、提供丰富的断言知识 3、可以…

应用稳定性优化2:Crash/Tombstone问题分析及定位

1. Crash/Tombstone问题原因分析 2. Tombstone问题定位方法 本节主要讲解Tombstone问题的分析定位方法。 2.1 信号量分析法 信号机制是进程之间相互传递消息的一种方法,下表展示的是一些常见的信号种类。 SIGBUS与SIGSEGV的区别 SIGBUS(Bus error)意味着指针所…

Javaweb之SpringBootWeb案例之自动配置的两种常见方案的详细解析

3.2.2.2 方案一 ComponentScan组件扫描 SpringBootApplication ComponentScan({"com.itheima","com.example"}) //指定要扫描的包 public class SpringbootWebConfig2Application {public static void main(String[] args) {SpringApplication.run(Sprin…

【贪心算法】121. 买卖股票的最佳时机 I Leetcode 122. 买卖股票的最佳时机 II

【贪心算法】121. 买卖股票的最佳时机 I Leetcode 122. 买卖股票的最佳时机 II 121. 买卖股票的最佳时机 I贪心算法:遍历每一天卖出金额,一边计算卖出金额减之前的最小值,一边更新该卖出day前的最小金额 122. 买卖股票的最佳时机 II贪心算法…

Springboot+vue的商业辅助决策系统的设计与实现(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频: Springbootvue的商业辅助决策系统的设计与实现(有报告)。Javaee项目,springboot vue前后端分离项目 项目介绍: 本文设计了一个基于Springbootvue的前后端分离的商业辅助决策系统的设计与实现,采…

C++ //练习 10.17 重写10.3.1节练习10.12(第345页)的程序,在对sort的调用中使用lambda来代替函数compareIsbn。

C Primer(第5版) 练习 10.17 练习 10.17 重写10.3.1节练习10.12(第345页)的程序,在对sort的调用中使用lambda来代替函数compareIsbn。 环境:Linux Ubuntu(云服务器) 工具&#xf…

数据库原理(一)

1、基本概念 学号姓名性别出生年月籍贯220101张三男2003江苏220102李四男2003山东220103王五女2003河北220104赵六女2003天津220105张四男2003北京220106李五女2003江苏220107王六女2003山东220108张七男2003河北220109张九男2003天津220110李十女2003北京 1.1数据&#xff0…

《系统架构设计师教程(第2版)》第5章-软件工程基础知识-05-净室软件工程(CSE)

文章目录 1. 概述2. 理论基础2.1 函数理论2.2 抽样理论 3. 技术手段3.1 增量式开发3.2 基于函数的规范与设计3.3 正确性验证3.4 统计测试 (Statistically Based Testing) 和软件认证 4. 应用与缺点1)太理论化2)缺少传统模块测试3)带有传统软件…

频率域采样

1. 频率域采样 (1) 采样的过程:DFT的X(k)是对周期且连续的频谱X()在[0,2pi)上的等间隔采样,采N个点得到的,采样间隔是;频域采样要求时域有限,即假设x(n)的长度是有限值M,x(n)的SFT是X()。 (2) X(k) 做IDF…

YOLOv9有效提点|加入BiFormer、SEA、EMA、Efficient se等几十种注意力机制(三)

专栏介绍:YOLOv9改进系列 | 包含深度学习最新创新,主力高效涨点!!! 一、本文介绍 本文只有代码及注意力模块简介,YOLOv9中的添加教程:可以看这篇文章。 YOLOv9有效提点|加入SE、CBAM、ECA、SimA…

svn介绍 4.0

一、svn介绍(版本控制工具) 1、svn的定义: svn是一个开放源代码的版本控制系统,通过采用分支管理系统的高效管理,简而言之就是用于多个人共同开发同一个项目,实现共享资源,实现最终集中式个管…

全球十大正规伦敦金交易平台app软件最新排名(综合版)

伦敦金作为当前国际市场中较为成熟、灵活的投资产品自然备受青睐,但投资者在选择交易软件时,应该尽量选择在行业内排名较高,口碑较好的平台,这样才能获得可靠的投资服务。刚开始不太懂得如何选择伦敦金软件的时候,投资…

Carla自动驾驶仿真九:车辆变道路径规划

文章目录 前言一、关键函数二、完整代码效果 前言 本文介绍一种在carla中比较简单的变道路径规划方法,主要核心是调用carla的GlobalRoutePlanner模块和PID控制模块实现变道,大体的框架如下图所示。 一、关键函数 1、get_spawn_point(),该函数根据指定r…

如何查看docker容器里面运行的nginx的配置文件哪

要查看Docker容器内运行的Nginx配置文件的位置,你可以通过进入容器的shell环境来直接查看。Nginx的默认配置文件通常位于/etc/nginx/nginx.conf,而网站特定的配置文件通常位于/etc/nginx/conf.d/目录中。以下是步骤来查看这些配置文件: 步骤…

【嵌入式学习】网络编程day0229

一、思维导图 二、练习 TCP通信 服务器 #include <myhead.h> #define SER_IP "192.168.126.42" #define SER_PORT 8888 int main(int argc, const char *argv[]) {int wfd-1;//创建套接字if((wfdsocket(AF_INET,SOCK_STREAM,0))-1){perror("error"…

基于CNN-LSTM-Attention的时间序列回归预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1卷积神经网络&#xff08;CNN&#xff09;在时间序列中的应用 4.2 长短时记忆网络&#xff08;LSTM&#xff09;处理序列依赖关系 4.3 注意力机制&#xff08;Attention&#xff09; 5…