嵌入式中锁机制杂谈

2023-11-16

        在之前的文章中有提到操作系统中锁机制一般依赖于硬件CPU提供的原子数据操作指令,如SWP, TEST AND SET等原子原语实现。基于此,才能真正保证锁机制的有效实现。

        通过上面原子操作,我们比较容易实现所谓的自旋操作(原子性的原地循环判断条件,直到条件满足才能继续执行后面指令。这里没有直接使用自旋锁表述,为了区分具体的锁机制命名,如自旋锁,互斥锁,信号量,及读写锁)。通过这种自旋操作(被称为基于条件的操作),可以定义延伸出不少锁的概念,或者至少在实现锁时多少都会使用自旋操作语义来实现。如,互斥锁和信号量都是基于任务(线程或者进程)级别使用的,在条件不满足时sleep等待,直到被wakeup,但是判断条件是否满足时也要保证原子自旋操作。

       一般操作系统中普遍的分为任务上下文和中断上下文。嵌入式系统现在一般也可划分为UP(单CPU)和MP(多CPU,此处特指SMP,多CPU存在共享资源。下同)系统。每个CPU上面执行的任务都会存在任务上下文和中断上下文的概念,由操作系统统一进行资源调度和分配。下面针对UP和MP各自存在的任务上下文和中断上下文在实现自旋操作方面进行分析。

       不管UP和MP,只要程序运行路径存在多条时,都会产生竞态(race condition)。竞态可能直接导致了对相同数据的不一致访问,需要对竞态进行约束,从而产生了基于原子操作的锁机制,对某一临界区资源进行保护。

       任何事物处于发展变化当中,都有其两面性,就像阴和阳。使用锁会带来系统性能下降的同时但也保证了逻辑运行的正确性。不能正确分析使用锁的情形,有可能会发生死锁,导致系统崩溃。

       基于自旋操作的自旋锁及其延伸锁机制比较有代表性,我们来看下几种情形下使用自旋锁和中断交互的情况:

       自旋锁:spin_lock()和spin_unlock()

       中断使能和关闭:enable_irq()和disable_irq()

       中断状态保存和恢复:irq_flag_save()和irq_flag_restore()


       在UP和任务上下文中,访问相同资源不涉及中断上下文,每个任务各自运行,任务间共享资源,这种情形不会发生死锁现象,直接使用自旋锁即可(自旋的任务需要等待本任务时间片退出后,再调度其他拥有锁的任务执行释放锁后)。

       任务中:spin_lock();临界区 spin_unlock();

       在UP中,任务和中断上下文时,各任务和中断中访问相同资源时,由于中断响应抢占执行,加锁不当会发生死锁现象。死锁产生为:任务中临界区加锁后,在中断运行中锁无法获得不能退出发生死锁。如何解决:可以在任务加锁时禁止中断,释放锁时使能中断来完成。在中断中使用锁时,应该禁止中断抢占(关中断),但是何时开启中断呢?拿ARM讲,进入中断模式时,自动关闭中断,退出中断模式时自动开启中断,也就是在中断模式使用锁时,不能提前使能中断,否则由于提早使能了中断会导致中断嵌套(如果不支持中断嵌套,程序就会出错)。

      但是发生的锁嵌套需要我们记录下进入锁之前的中断状态flag,锁退出时还原之前的中断状态flag,而不是简单的使能中断enable_irq()所能做到的,如下:

     任务中:flag = irq_flag_save(); disable_irq();spin_lock();临界区..  spin_unlock(); irq_flag_restore(flag );

     中断中:  flag = irq_flag_save(); disable_irq();spin_lock();临界区..  spin_unlock(); irq_flag_restore(flag );


     在MP中和任务上下文中,访问相同资源不涉及中断上下文,每个任务各自运行,任务间及多CPU共享资源,这种情形不会发生死锁现象,直接使用自旋锁即可。自旋锁也是最初基于解决SMP同步机制时提出的。如下:

     任务中:spin_lock();临界区 spin_unlock();

     在MP中,任务和中断上下文时,由于对资源的使用涉及本CPU,其他CPU,一个CPU内的中断上下文和任务上下文等。因此CPU间使用自旋锁保护,本CPU内不同上下文采用自旋锁和开关中断方式来保护。如下:

     多CPU任务中:flag = irq_flag_save(); disable_irq();spin_lock();临界区..  spin_unlock(); irq_flag_restore(flag );

     多CPU中断中:  flag = irq_flag_save(); disable_irq();spin_lock();临界区..  spin_unlock(); irq_flag_restore(flag );

      

  


       



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式中锁机制杂谈 的相关文章

随机推荐

  • 机器学习之特征工程

    1 为什么做特征工程 我们学习编程语言时被告知程序 数据结构 算法 那么对于机器学习 我认为也可以类比为机器学习 大数据 机器学习算法 运行平台 面对一个机器学习问题 一般有两种解题思路 传统机器学习算法或者深度学习算法 一般而言 传统机器
  • Android.mk文件详解

    Android mk文件详解 Android mk 文件位于项目 jni 目录的子目录中 用于向构建系统描述源文件和共享库 它实际上是构建系统解析一次或多次的微小 GNU makefile 片段 Android mk 文件用于定义 Appl
  • 链表oj刷题——6道进阶题目

    目录 1 链表分割 题目 思路 2 链表的回文结构 题目 思路 3 输入两个链表 找出它们的第一个公共结点 题目 思路一 思路二 思路三 4 给定一个链表 判断链表中是否有环 题目 思路 5 给定一个链表 返回链表开始入环的第一个结点 如果
  • ConcurrentHashMap总结

    为什么80 的码农都做不了架构师 gt gt gt 并发编程实践中 ConcurrentHashMap是一个经常被使用的数据结构 相比于Hashtable以及Collections synchronizedMap ConcurrentHas
  • Struts2框架(一)

    Struts2框架 一 什么是框架 框架有什么用 1 框架 是 实现部分功能的代码 半成品 使用框架简化企业级软件开发 提高开发效率 2 学习框架 清楚的知道框架能做什么 还有哪些工作需要自己编码实现 二 什么是struts2框架 它有什么
  • 快速实现ML302 4G HTTP通信详解

    ML302作为HTTP Client和Server通信 一 本例程实现功能 二 Core提供的HTTP功能介绍 三 接线图 五 完整代码 代码运行结果 六 需注意事项 一 本例程实现功能 Core通过ML302 4G Cat1模块实现HTT
  • SpringBoot项目表格下载,上传和批量数据导入功能——小白级别,自己记录使用;

    应用场景 在后台管理项目中经常会需要批量导入的功能 这个时候我们就可以用Excel表格完成数据的下载 一 新建SpringBoot项目 并且配置数据库 1 pom xml 文件中导入依赖
  • 软件测试入门知识,jmeter系统基础课程———带你由浅入深学性能(完)

    软件测试知识持续更新中 性能测试常见问题 简述性能测试流程 如何确定系统最大负载 你们系统哪些地方 哪些功能 做了性能测试 你们的并发用户数是怎么确定的 你们性能测试什么时间执行 怎么分析性能测试结果 think time 的作用是什么 在
  • java复制的五种方法

    第一种 private static void methods1 throws FileNotFoundException IOException 字符流 一次读写一个字符 创建输入流对象 FileReader fr new FileRea
  • MySQL连表分组统计使用count查询出数据不准确问题解决方案

    先上两副图 这里有两张表 score表和year as表 要求统计出score表按年份分组的个数 且查询出来的内容需要包括year as表中的year as字段 使用正常连表并分组统计count得出的SQL和对应结果如下 SELECT b
  • 基于JDK1.8 的ArrayList源码分析

    基于JDK1 8 的ArrayList源码分析 代码注释 JDK版本 jdk1 8 0 181 package java util import java util function Consumer import java util fu
  • 信道编码知识点总结

    通信系统常用差错控制方法 自动重发请求法 ARQ 前向纠错法 FEC 信头差错校验法 HEC 自动重发法 接收端译码器判决收到的码序列有没有错误 通过反馈信道把判决结果告诉发送端 发送端根据判决信号重发接收端认为有错的信息 直到接收端认为正
  • 期货交易服务行业调研报告 - 市场现状分析与发展前景预测

    期货交易服务市场的企业竞争态势 该报告涉及的主要国际市场参与者有Daniels Trading Saxo Tradovate NinjaTrader AGT Futures CQG Gain Capital Group ABLWSYS Sm
  • MIPS系统网络的配置

    4 MIPS系统网络的配置 模拟MPIS系统 并配置MIPS系统网络 01 安装依赖文件 sudo apt get install uml utilities bridge utils 02 修改Ubuntu主机网络配置 将Ubuntu系统
  • 单目测距(yolo目标检测+标定+测距代码)

    单目测距 目标检测 标定 测距 实时感知本车周围物体的距离对高级驾驶辅助系统具有重要意义 当判定物体与本车距离小于安全距离时便采取主动刹车等安全辅助功能 这将进一步提升汽车的安全性能并减少碰撞的发生 上一章本文完成了目标检测任务 接下来需要
  • 一枚芯片的成本是多少?(2)芯片硬件成本

    芯片硬件成本 计算封装和测试的成本这个没有具体的公式 只是测试的价格大致和针脚数的二次方成正比 封装的成本大致和针脚乘功耗的三次方成正比 如果CPU X采用40nm低功耗工艺的自主芯片 其测试成本约为2美元 封装成本约为6美元 因40nm低
  • nodejs调用mongodb!!!

    Nodejs调用MongoDB 要在 MongoDB 中创建一个数据库 首先我们需要创建一个 MongoClient 对象 然后配置好指定的 URL 和 端口号 如果数据库不存在 MongoDB 将创建数据库并建立连接 导入MongoDB包
  • 华为VS谷歌:万物互联,谁主沉浮?

    一 一周两套操作系统发布 6月2日 华为通过直播形式举行了鸿蒙HarmonyOS 2及华为全场景新品发布会 关于该发布会的详细内容老猿在 鸿蒙最新功能及承载设备详解 HarmonyOS 2及华为全场景新品发布会全纪录 进行了详细介绍 在此不
  • 【科普】一文读懂以太网PHY芯片

    物理层器件PHY Physical Layer Interface Devices 是将各网元连接到物理介质上的关键部件 负责完成互连参考模型 OSI 第1层中的功能 即为链路层实体之间进行bit传输提供物理连接所需的机械 电气 光电转换和
  • 嵌入式中锁机制杂谈

    在之前的文章中有提到操作系统中锁机制一般依赖于硬件CPU提供的原子数据操作指令 如SWP TEST AND SET等原子原语实现 基于此 才能真正保证锁机制的有效实现 通过上面原子操作 我们比较容易实现所谓的自旋操作 原子性的原地循环判断条