RT-Thread临界段的保护

2023-05-16

临界段的保护

什么是临界段

临界段,用一句话概括就是一段在执行时不能被中断的代码段。在RT-Thread中,临界段最常出现的场景就是对全局变量的操作,全局变量就好像是一个靶子,谁都可以对其开枪,但是有一人开枪,其他人就不能开枪,否则就不知道是谁命中了靶子。
那么什么情况下临界段会被打断?一个是系统调度,还有一个就是外部中断。在RT-Thread中,系统调度最终也是产生PendSV中断,在PendSV Handler中实现线程的切换,所以还是可以归结为中断。既然这样,RT-Thread对临界段的保护就处理得很干脆了,直接把中断关闭,但NMI FAULT和硬FAULT除外。

Cortex-M内核快速关中断指令
为了快速地开关中断,Cortex-M内核专门设置了一条CPS指令,有4种用法。
代码清单CPS指令用法

CPSID I ;PRIMASK=1   ;关中断
CPSIE I ;PRIMASK=0   ;开中断
CPSID F ;FAULTMASK=1  ;关异常
CPSIE F ;FAULTMASK=0  ;开异常

代码清单中PRIMASK和FAULTMAST是Cortex-M内核中3个中断屏蔽寄存器中的2个,还有一个是BASEPRI,有关这3个寄存器的详细用法如表所示。

在这里插入图片描述

关中断

RT-Thread关中断的函数在contex_rvds.s中定义,在rthw.h中声明,具体实现参见代码清单4-2。
关中断

/*
; * rt_base_t rt_hw_interrupt_disable();
; */
rt_hw_interrupt_disable  PROC          
  EXPORT rt_hw_interrupt_disable        
  MRS   r0, PRIMASK              
  CPSID  I                   
  BX   LR                  
  ENDP    

1):关键字PROC表示汇编子程序开始。
2):使用EXPORT关键字导出标号rt_hw_interrupt_disable,使其具有全局属性,在外部头文件声明后(在rthw.h中声明),就可以在C文件中调用。
3):通过MRS指令将特殊寄存器PRIMASK寄存器的值存储到通用寄存器r0。当在C中调用汇编的子程序返回时,会将r0作为函数的返回值。所以在C中调用rt_hw_interrupt_disable()时,需要事先声明一个变量用来存储rt_hw_interrupt_disable()的返回值,即r0寄存器的值,也就是PRIMASK的值。
4):关闭中断,即使用CPS指令将PRIMASK寄存器的值置1。
5):子程序返回。
6):ENDP表示汇编子程序结束,与PROC成对使用。

开中断

RT-Thread开中断的函数在contex_rvds.s中定义,在rthw.h中声明。
开中断

/*
* void rt_hw_interrupt_enable(rt_base_t level);
*/
rt_hw_interrupt_enable  PROC            
  EXPORT rt_hw_interrupt_enable          
  MSR   PRIMASK, r0               
  BX   LR                    
  ENDP       

1):关键字PROC表示汇编子程序开始。
2):使用EXPORT关键字导出标号rt_hw_interrupt_enable,使其具有全局属性,在外部头文件声明后(在rthw.h中声明),就可以在C文件中调用。
3):通过MSR指令将通用寄存器r0的值存储到特殊寄存器PRIMASK。
4):子程序返回。
5):ENDP表示汇编子程序结束,与PROC成对使用。

临界段代码的应用

在进入临界段之前,我们会先把中断关闭,退出临界段时再把中断打开,而且Cortex-M内核中设置了快速关中断的CPS指令,开关中断的函数的实现和临界段代码的保护。

开关中断的函数的实现和临界段代码的保护
开关中断的函数的实现
/*
* void rt_hw_interrupt_disable();
*/
rt_hw_interrupt_disable  PROC
 EXPORT rt_hw_interrupt_disable
  CPSID  I    
  BX   LR
  ENDP

;/*
; * void rt_hw_interrupt_enable(void);
; */
rt_hw_interrupt_enable  PROC
  EXPORT rt_hw_interrupt_enable
  CPSIE  I    
  BX   LR
  ENDP
PRIMASK = 0;           /* PRIMASK初始值为0,表示没有关中断 */    

/* 临界段代码保护 */
{
  /* 临界段开始 */
  rt_hw_interrupt_disable();   /* 关中断,PRIMASK = 1 */    
  {
    /* 执行临界段代码,不可中断 */    
  }
  /* 临界段结束 */
    rt_hw_interrupt_enable();   /* 开中断,PRIMASK = 0 */   
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RT-Thread临界段的保护 的相关文章

  • RT-Thread nmealib库WH-GN100模块设置仅支持北斗

    RT Thread nmealib库主页 在nmea thread init函数的末尾 xff0c 添加以下代码块 xff0c 发送配置指令 xff0c 仅使用北斗卫星 xff0c 即可配置成仅GPS卫星工作模式 span class to
  • NoClassDefFoundError: com/google/common/collect/Maps

    Error Exception in thread main java lang NoClassDefFoundError com google common collect Maps I believe you are missing g
  • gdb多线程调试

    先介绍一下GDB多线程调试的基本命令 info threads 显示当前可调试的所有线程 每个线程会有一个GDB为其分配的ID 后面操作线程的时候会用到这个ID 前面有 的是当前调试的线程 thread ID 切换当前调试的线程为指定ID的
  • 用Java Socket开发小型服务器,支持上千个并发

    Java Socket 套接字 socket 为两台计算机之间的通信提供了一种机制 在James Gosling注意到Java 语言之前 套接字就早已赫赫有名 该语言只是让您不必了解底层操作系统的细节就能有效地使用套接字 1 客户机 服务器
  • 无线传感网WSN

    第一章 绪论 WSN定义 无线传感网络是由大量的静止或移动的传感器以自组织和多跳的方式构成的无线网络 WSN系统组成 传感器节点 汇聚节点和管理节点 WSN的三个基本要素 传感器 感知对象 用户 观测者 WSN特点 1 自组织性 2 以数据
  • java中的锁池和等待池

    在java中 每个对象都有两个池 锁 monitor 池和等待池 wait notifyAll notify 三个方法都是Object类中的方法 锁池 假设线程A已经拥有了某个对象 注意 不是类 的锁 而其它的线程想要调用这个对象的某个sy
  • Python使用threading.Timer实现执行可循环的定时任务

    前言 Python中使用threading Timer执行定时任务时 执行任务是一次性的 类似于JS中的setTimeout方法 我们对其在封装 改造成可循环的定时器 类似于JS中setInterval方法的效果 值得注意的是 thread
  • java之Thread类详细分析(全)

    目录 前言 1 属性值 1 1 线程属性方法 2 常用方法 3 使用方法 前言 Thread是程序中的执行线程 jvm并发地运行多个执行线程 1 属性值 通过查看Thread源码 是继承Runnable接口的实现类 无论使用Runnable
  • Java 多线程 -- 从入门到精通

    持续更新中 欢迎收藏 关注 以便查看后续 Java 多线程 从入门到精通 Java线程与线程的区别 多线程的实现方法 Thread中start和run方法的区别 Thread和Runnable的关系 使用Callable和Future创建线
  • 关于CoInitialize()

    在msdn中对于CoInitialize的解释如下 Initializes the COM library on the current apartment and identifies the concurrency model as s
  • Java--多线程(2)---yield

    yield yield 在Java的多线程中指的是礼让的意思 具体作用就是 停止当前正在执行的线程对象 去执行其他的线程 yield作用与相同优先级之间的线程 目的是让相同优先级的线程可以交替进行 yield有时也可能不会执行 举例 pub
  • 第十三章:QT多线程(QThread)

    回顾 第一章 Qt的概述 第二章 在Ubuntu编写第一个Qt程序 第三章 Qt的字符串和字符编码 第四章 Qt的信号和槽 第五章 Qt容器窗口 父窗口 第六章 面向对象的Qt编程 第七章 Qt设计师使用 designer 第八章 Qt创造
  • Qt中的线程详解

    概述 在多核时代 CPU 的主频已经进入瓶 颈 另辟蹊径地提高程序运行效率就是使用线程 充分利用多核的优势 线程可以看做是 轻量级进程 线程即可以由操作系统管理 也可以由应用程序管 1 为什么要使用线程 我们都知道 进程线程的概念是非常重要
  • 笔试题10:Runnable接口与Thread类的区别?

    1 线程类继承自Thread则不能继承自其它类 而Runnable接口可以 2 线程类继承自Thread相对于Runnable来说 使用线程的方法更方便一些 3 实现Runnable接口的线程类的多个线程 可以更方便的访问同一变量 而Thr
  • SuspendThread 造成程序死锁的一个例子

    msdn对SuspendThread 的说明 This function is primarily designed for use by debuggers It is not intended to be used for thread
  • pthread_attr_init线程属性

    1 线程属性 线程具有属性 用pthread attr t表示 在对该结构进行处理之前必须进行初始化 在使用后需要对其去除初始化 我们用pthread attr init函数对其初始化 用pthread attr destroy对其去除初始
  • python 图片、文件 通过 request header 多线程下载

    写爬虫过程中发现图片下载比较慢 遂使用多线程下载来提速 import threading import requests class MulThreadDownload threading Thread def init self url
  • 多线程的异步调用(一)

    最近手头做的项目中 用到了多线程的异步调用 在控制线程中实时的检测硬件的变化 如果硬件发生了某些变化 那么需要通知别的模块做一些相应的操作 为了让这些操作不会影响控制线程的继续运行 就在多线程中使用了异步调用的方法 using System
  • 一、使用interrupt()中断线程

    当一个线程运行时 另一个线程可以调用对应的Thread对象的interrupt 方法来中断它 该方法只是在目标线程中设置一个标志 表示它已经被中断 并立即返回 这里需要注意的是 如果只是单纯的调用interrupt 方法 线程并没有实际被中
  • 多线程之创建工作者线程和用户界面线程区别

    转帖 部分原创 1 工作者线程倾向于琐碎的处理 与它不同的是 用户界面线程具有自己的界面而且实际上类似于运行其他应用程序 创建线程而不是其他应用程序的好处是线程可与应用程序共享程序空间 这样可以简化线程与应用程序共享数据的功能 2 典型情况

随机推荐

  • MYSQL数据库自动备份

    1 创建备份脚本 xff1b 将以下代码复制到文本文件中 xff0c 另存文件文件名 txt xff0c 改为 bat 64 echo off start 以时间为维度作为备份文件名的后缀 set dt 61 time 0 2 if dt
  • MySQL定时备份数据库(全库备份)

    一 MySQL数据备份 1 1 mysqldump命令备份数据 在MySQL中提供了命令行导出数据库数据以及文件的一种方便的工具mysqldump 我们可以通过命令行直接实现数据库内容的导出dump 首先我们简单了解一下mysqldump命
  • H3C交换机SSH配置

    H3C交换机SSH配置 1 使用SSH 43 密码认证 基本SSH配置方法 注 xff1a 在用户使用SSH登录交换机时 xff0c 交换机对所要登录的用户使用密码对其进行身份验证 生成RSA和DSA密钥对 H3C public key l
  • 2022年下半年网络规划设计师考试论文真题

    试题 一 论5G与校园网络融合的规划与设计 近年来 xff0c 教育部等部门印发了 教育信息化2 0行动计划 关于推进教育新型基础设施建 设构建高质量教育支撑体系的指导意见 等文件 xff0c 引导高等学校以信息化为主导 xff0c 面向高
  • 2022年下半年网络规划设计师考试下午真题

    试题一 案例一 某单位网站受到攻击 首页被非法篡改 经安全专业机构调查 该网站有一个两年前被人非法上传的后门程序 本次攻击就是因为其他攻击者发现该后门程序并利用其实施非法篡改 nbsp 案例二 网站管理员某天打开本单位门户网站首页后 发现自
  • 2022年信息安全工程师上午真题及答案解析

    2022年信息安全工程师上午真题及答案解析 1 中华人民共和国网络安全法 第五十八条明确规定 因维护安全和社会公共秩序 处置重大突发社会安全事件的需要 经 nbsp 决定或者批准 可以在特定区域对网络通信采取限制等临时措施 A 国务院 B
  • 2022年信息安全工程师下午真题及答案解析

    2022年信息安全工程师下午真题及答案解析 阅读下列说明 xff0c 回答问题1至问题3 将解答填入答题纸的对应栏内 说明 访问控制是保障信息系统安全的主要策略之一 xff0c 其主要任务是保证系统资源不被非法使用和非常规访问 访问控制规定
  • 华为交换机Console密码重置、设备初始化、默认密码

    1 华为交换机Console密码重置 1 通过Console口连接交换机 xff0c 并重启交换机 2 当界面出现以下打印信息时 xff0c 及时按下快捷键 Ctrl 43 B 并输入BootROM BootLoad密码 xff0c 进入B
  • 华为S7700交换机如何清除console密码

    问题描述 s7700设备如何清除console密码 解决方案 S7703设备清除console密码过程 重新启动设备 xff08 设备单主控启动 xff0c 双主控请拔下一张主控卡 xff09 当设备上电后 xff0c 操作终端屏幕上显示如
  • 华为交换机配置ssh登录远程管理交换机

    配置华为交换机ssh远程登录 xff0c 先配置交换机的管理地址和vlan xff0c 此处为vlan10 xff0c 把接口GE0 0 1划入vlan10 xff0c 管理地址为192 168 10 100 241 创建本地密钥对 配置接
  • Oracle用户被解锁解决方案(1)

    xfeff xfeff 查看被锁的用户 select LOCK DATE username from dba users where username 61 39 USERNAME 39 LOCK DATE为空说明没有锁定 xff0c 非空
  • 华为S5700交换机初始化和配置telnet,ssh用户方法

    华为S5700交换机初始化和配置telnet xff0c ssh用户方法 通过串口线配置S5700 的管理IP地址和网关 xff0c 串口线接在交换机的console口 xff0c ip设置完成后网线接在ETH口 xff1a lt Quid
  • 华为交换机恢复出厂设置

    华为交换机恢复出厂设置 方法一 xff1a 已知用户名和密码场景 lt SW gt reset saved configuration Warning The action will delete the saved configurati
  • 常用网络工具5:网络抓包工具wireshark

    Wireshark xff08 前称Ethereal xff09 是一个网络数据包分析软件 网络数据包分析软件的功能是截取网络数据包 xff0c 并尽可能显示出最为详细的网络数据包数据 Wireshark使用WinPCAP作为接口 xff0
  • OpenHarmony 3.0 虚拟机开发环境

    本文介绍一种简单的OpenHarmony环境搭建方法 首先我们要知道环境搭建包括哪些内容 xff0c 这样我们才好知道如何去搭建 通常来说 xff0c 环境搭建包括这3大部分 xff1a 代码编写 代码编译 代码下载 烧录程序 在OpenH
  • 程序员如何更好的提升自己

    首先你得明白 xff0c 一个人的能力就像一个池塘 xff0c 不断的输入又不断地输出 xff0c 水池的容量以及水的质量决定了输出的高效与否 xff0c 输入大于输出 xff0c 你的池塘就会不断扩大 xff0c 换句话说你会的技能就越来
  • error:D8016 “/ZI”和“/Gy-”命令行选项不兼容 ”问题解决

    VS调试中出现上述问题 进入 项目 gt 属性 gt C C 43 43 xff08 1 xff09 gt 常规 gt 调试信息格式 gt 选择 程序数据库 Zi 或 无 xff08 2 xff09 gt 代码生成 gt 启用函数集链接 g
  • Linux驱动程序开发用户态和内核态 模块机制

    Linux驱动程序开发 用户态和内核态 Linux操作系统分为用户态和内核态 用户态处理上层的软件工作 内核态用来管理用户态的程序 xff0c 完成用户态请求的工作 驱动程序与底层的硬件交互 xff0c 所以工作在内核态 Linux操作系统
  • QT学习第一步 QT下载及安装详细步骤

    下载地址 xff1a QT官方网站 QT下载安装地址 选择的这个 xff1a QT下载安装地址 文件名称选择 xff0c 图中红色箭头详解 xff1a 选择archive QT开发工具安装包文件夹 xff1a 进入之后显示的文件夹 xff1
  • RT-Thread临界段的保护

    临界段的保护 什么是临界段 临界段 xff0c 用一句话概括就是一段在执行时不能被中断的代码段 在RT Thread中 xff0c 临界段最常出现的场景就是对全局变量的操作 xff0c 全局变量就好像是一个靶子 xff0c 谁都可以对其开枪