临界区管理

临界区管理1 临界区临界区是指必须以互斥的方式执行的代码段 也就是说临界区范围内只能由一个活动的线程 例如 修改共享变量的过程中其他的执行线程可能会访问共享变量 那么修改共享变量的代码就被看成是临界区的一部分 临界区问题指用安全 公平和对称的方式来执行临界区代码的问题 2 管理临界区的三种方法第一种方法 ifOS CRITICAL METHOD 1 defineOS ENTE

1.临界区

临界区是指必须以互斥的方式执行的代码段,也就是说临界区范围内只能由一个活动的线程。例如:修改共享变量的过程中其他的执行线程可能会访问共享变量,那么修改共享变量的代码就被看成是临界区的一部分。临界区问题指用安全、公平和对称的方式来执行临界区代码的问题

2.管理临界区的三种方法

第一种方法 
#if OS_CRITICAL_METHOD == 1  #define OS_ENTER_CRITICAL() __asm__("cli")  #define OS_EXIT_CRITICAL() __asm__("sti")  #endif 

第二种方法

#if OS_CRITICAL_METHOD == 2  #define OS_ENTER_CRITICAL() __asm__("pushf \n\t cli")  #define OS_EXIT_CRITICAL() __asm__("popf")  #endif 

第三种方法

#if OS_CRITICAL_METHOD == 3  #define OS_ENTER_CRITICAL() (cpu_sr = OSCPUSaveSR())  #define OS_EXIT_CRITICAL() (OSCPURestoreSR(cpu_sr))  #endif 
#if OS_CRITICAL_METHOD != 3u #error "OS_CPU.H, OS_CRITICAL_METHOD must be type 3 for safety-critical release code" #endif

3、M3第三种临界管理方式及使用。

3.1 函数包装

#define OS_CRITICAL_METHOD 3u #if OS_CRITICAL_METHOD == 3u #define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save();} //进入临界段 #define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);} //退出临界段 #endif

3.2 OS_CPU_SR_Save和OS_CPU_SR_Restore

OS_CPU_SR_Save MRS R0, PRIMASK ;Set prio int mask to mask all (except faults) CPSID I ; PRIMASK =1 ,关中断 BX LR OS_CPU_SR_Restore MSR PRIMASK, R0 ;把R0的值加载到PRIMASK,R0为调用 ;OS_CPU_SR_Restore的函数的参数 BX LR

其中PRIMASK是M3除能所有中断寄存器。CPSID是M3为了快速地关中断而专门设置的一指令。

void Task (void *p_arg) { #if OS_CRITICAL_METHOD == 3 /* Allocate storage for*/  /*CPU status register */ OS_CPU_SR cpu_sr; #endif OS_ENTER_CRITICAL(); /*cpu_sr = OS_CPU_SaveSR()*/ 。。。 。。。 OS_EXIT_CRITICAL(); /*OS_CPU_RestoreSR(cpu_sr) */ }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222301.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午4:06
下一篇 2026年3月17日 下午4:06


相关推荐

  • Lamp架构_lamp服务器

    Lamp架构_lamp服务器LAMP架构搭建1.LAMP架构简介所谓lamp,其实就是由Linux+Apache+Mysql/MariaDB+Php/Perl/Python的一组动态网站或者服务器的开源软件,除Linux外其它各部件本身都是各自独立的程序,但是因为经常被放在一起使用,拥有了越来越高的兼容度,共同组成了一个强大的Web应用程序平台。LAMP指的是Linux(操作系统)、Apache(HTTP服务器)、MySQL(也指MariaDB,数据库软件)和PHP(有时也是指Perl或Python)的第一个字母,一般用来建

    2022年10月17日
    4
  • java软件开发工程师面试题_软件开发工程师面试题

    java软件开发工程师面试题_软件开发工程师面试题Java软件高级工程师笔试题【智力部分】(30分)1.烧一根不均匀的绳要用一个小时,如何用它来判断半个小时?(5分)两头同时烧2.4,4,10,10,加减乘除,怎么出24点?四个数字分别

    2022年8月5日
    9
  • OneDNS助力高校行业网络安全

    OneDNS助力高校行业网络安全助力高校行业网络安全

    2026年3月17日
    2
  • 2021版idea激活码99年【2021.8最新】

    (2021版idea激活码99年)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~S…

    2022年3月26日
    68
  • kubernetes入门到精通(二):k8s部署Tomcat集群,基于NTFS协议的文件集群共享,Service提供负载均衡,端口转发工具Rinetd配置外部访问

    配置Docker阿里云镜像加速服务登录阿里云账号,进入控制台->容器镜像服务(不需要有阿里云的服务器,只要注册账号即可)在两台node节点上配置好阿里云的镜像加速。重启一下dockersudosystemctlrestartdocker重启一下k8ssystemctlstartkubelet部署Tomcat集群方法1:使用可视化界面部署tomcat集群dashboard->工作负载->创建->创建应用稍等几分钟之后,

    2022年4月7日
    43
  • 字符串如何比较大小

    字符串如何比较大小字符比较 charactercom 是指按照字典次序对单个字符或字符串进行比较大小的操作 一般都是以 ASCII 码值的大小作为字符比较的标准 比较方式 可以使用 String 类的 compareTo 方法来实现 该方法用于判断一个字符串是大于 等于还是小于另一个字符串 返回 int 类型的差值 判断字符串大小的依据是它们在字典中的顺序 实现 Comparable 接口实现 Comparator 接口 Strings1 abc Strings2 efg System o

    2026年3月20日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号