RT-Thread临界段之rt_hw_interrupt_enable和rt_hw_interrupt_disable

2023-05-16

一、PRIMASK

PRIMSK=1 ;关闭中断

PRIMSK=10;打开中断

二、void  rt_hw_interrupt_enable(rt_base_t  level);有参数,无返回值

该功能将设置指定的中断状态,该状态应由rt_hw_intterrupt_disable函数返回值(入参level)决定。 如果入参的值是0,该函数将打开系统中断状态。

rt_hw_interrupt_enable的主要功能是:当入参为0时,打开中断;而当入参为1时,无作用。

三、rt_base_t  rt_hw_interrupt_disable(void);有返回值,无参数

此功能将返回当前系统中断状态并禁用系统中断。即:先返回“当前系统中断状态” 然后“禁用系统中断”

rt_hw_interrupt_disable的主要功能是:关闭中断并且赋值给level。

系统默认中断打开状态(PRIMASK = 0),因此level1 = rt_hw_interrupt_disable(),先返回系统当前中断状态则返回level1 = 0;

而当再次调用level2 = rt_hw_interrupt_disable()时,由于中断已经被禁用,因此返回的是level2 = 1;

四、代码示例一:双重临界段嵌套

1 代码示例一:临界段嵌套
2   rt_base_t rt_hw_interrupt_disable();//有返回值,但无参数!!!!
3  
4 rt_hw_interrupt_disable PROC
5     EXPORT rt_hw_interrupt_disable
6     MRS r0, PRIMASK
7     CPSID I
8     BX LR
9     ENDP
10 
11 
12   void rt_hw_interrupt_enable(rt_base_t level);//无返回值,但有参数!!!!
13  
14 rt_hw_interrupt_enable PROC
15     EXPORT rt_hw_interrupt_enable
16     MSR PRIMASK, r0
17     BX LR
18     ENDP
1 PRIMASK = 0; /* PRIMASK 初始值为 0,表示没有关中断 */ (1)
2 rt_base_t level1; (2)
3 rt_base_t level2;
4 
5 /* 临界段代码 */
6 {
7 /* 临界段 1 开始 */
8 level1 = rt_hw_interrupt_disable(); /* 关中断,level1=0,PRIMASK=1 */  (3)
9 {
10 /* 临界段 2 */
11 level2 = rt_hw_interrupt_disable();  /* 关中断,level2=1,PRIMASK=1 */  (4)
12 {
13 
14 }
15 rt_hw_interrupt_enable(level2); /* 开中断,level2=1,PRIMASK=1 */  (5)
16 }
17 /* 临界段 1 结束 */
18 rt_hw_interrupt_enable(level1); /* 开中断,level1=0,PRIMASK=0 */ (6)
19 }

 

五、代码示例二:单一临界段

1 ;/*
2 ; * rt_base_t rt_hw_interrupt_disable();
3 ; */
4 rt_hw_interrupt_disable PROC
5 EXPORT rt_hw_interrupt_disable
6 MRS r0, PRIMASK
7 CPSID I
8 BX LR
9 ENDP
10 
11 ;/*
12 ; * void rt_hw_interrupt_enable(rt_base_t level);
13 ; */
14 rt_hw_interrupt_enable PROC
15 EXPORT rt_hw_interrupt_enable
16 MSR PRIMASK, r0
17 BX LR
18 ENDP
1 PRIMASK = 0; /* PRIMASK 初始值为 0,表示没有关中断 */
2 rt_base_t level1;
3 
4 /* 临界段代码 */
5 {
6 /* 临界段开始 */
7 level1 = rt_hw_interrupt_disable();/* 关中断,level1=0,PRIMASK=1 */
8 {
9 
10 }
11 /* 临界段结束 */
12 rt_hw_interrupt_enable(level1); /* 开中断,level1=0,PRIMASK=0 */( 注意点)

 

 

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

RT-Thread临界段之rt_hw_interrupt_enable和rt_hw_interrupt_disable 的相关文章

  • 如何中断 Scanner.nextline() 调用

    SO 上有很多关于中断读取 system in 的线程 但我在这里寻找的是一些关于如何最好地编码我想要实现的目标的建议 我有一个getlogin 需要执行以下操作的方法 要求用户输入所需的登录环境详细信息 如果 6 秒后用户没有输入有效值
  • SCI - 系统控制中断向量是如何定义的?

    根据 ACPI 规范 FADT 固定 ACPI 描述表 表包含一个字段 用于报告SCI中断操作系统的编号 该字段定义如下 我在 Intel x86 平台上转储了 FADT 表 看到 SCI 中断与编号相关联9 但根据英特尔手册 0 31是
  • 在 MCU 内部 FLASH 中从一个固件跳转到另一个固件

    我目前正在开发针对 STM32F030C8 的引导加载程序固件应用程序 我在分散文件中指定引导加载程序应用程序将占用主内存位置 0x08000000 到 0x08002FFF 扇区 0 到扇区 2 我还编写了一个主固件应用程序 存储在0x0
  • mpirun 的自定义中断处理程序

    显然 mpirun使用 SIGINT 处理程序将 SIGINT 信号 转发 到它生成的每个进程 这意味着您可以为启用 mpi 的代码编写一个中断处理程序 执行mpirun np 3 my mpi enabled executable然后将为
  • CPU 如何从 RAM 访问应用程序和数据

    在应用程序加载到 RAM 并打开文件后 因此文件的数据也存储在 RAM 中 我在理解 CPU 如何从 RAM 访问应用程序和数据时遇到了一些困难 根据我的理解 CPU 只是在程序计数器滴答时从 RAM 获取指令或在中断后执行任务 那么它如何
  • 线程是否需要处于 RUNNABLE 状态才能被中断?

    java中的线程在被中断方法中断之前是否必须处于就绪状态 我尝试通过在下面输入上面给出的代码来检查这一点 class MyThread extends Thread public void run try for int i 0 i lt
  • 中断 0x15 函数 0x86(BIOS WAIT)在真实硬件上的运行速度比在虚拟机上慢得多?

    我一直在汇编 游戏 中编写引导加载程序 引导加载程序使用 BIOS WAIT 函数 int 0x15 ah 0x86 来实现帧之间的延迟 我正在使用 BOCHS 进行调试 一切都运行良好 时机非常完美 我还制作了一个可启动的isoisoge
  • IRQ 合并之前 NAPI 有哪些优点?

    众所周知 有两种方法可以避免高负载网络中硬件中断的一些开销 当硬件中断太多时 切换到它们会花费太多时间 这对于性能和程序风格的选择非常重要 NAPI 新API http en wikipedia org wiki New API 不使用硬件
  • Intel x86 - 中断服务例程责任

    我没有真正意义上的问题 但我会尽力澄清内容问题 假设我们有一个微内核 PC Intel x86 32 位保护模式 中断描述符表 IDT and 中断服务程序 ISR 对于每个CPU异常 ISR 被成功调用 例如Division by Zer
  • 我的中断处理程序应该禁用中断还是 ARM 处理器自动执行此操作?

    我们的小组使用定制驱动程序在共享 I2C 总线上连接四个 MAX3107 UART 四个 MAX3107 的中断连接 即通过逻辑或运算共享中断 到 ARM9 处理器 LPC3180 模块 上的 GPIO 引脚 当这些设备中的一个或多个中断时
  • 为什么我在 raw_input 期间无法捕获 KeyboardInterrupt?

    这是一个测试用例 try targ raw input Please enter target except KeyboardInterrupt print Cancelled print targ 当我按 ctrl c 时 我的输出如下
  • Java 硬件中断处理

    我想知道当硬件中断发生时是否可以自动调用Java方法 可能还有其他选择 我正在做类似的事情 在一个应用程序中 我监视 4 只鼠标的点击情况 这些点击会产生中断 但我很高兴不直接从 Java 处理它们 在Linux下 原来有设备文件 dev
  • 修复发送信号中断系统调用时的竞争条件

    我有一个线程read 来自套接字 我希望能够异步停止线程 线程伪代码如下所示 int needs quit 0 void thread read void arg while 1 if needs quit close sock fd re
  • 无滴答内核、isolcpus、nohz_full 和 rcu_nocbs

    我在 grub conf 中添加了 isolcpus 3 nohz full 3 rcu nocbs 3 RedHat 7 1 内核 linux 3 10 0 229 内核并根据http www breakage org 2013 11 1
  • 为什么清除中断标志会导致C中的分段错误?

    我正在学习一些有关汇编和 C 的基础知识 出于学习目的 我决定编写一个禁用中断的简单程序 当用户想要在控制台中输入某些内容时 他 她不能 include
  • 多核ARM cpu上的中断如何工作

    这个问题已经针对 x86 得到了解答 但是 我找不到太多关于 ARM MP cpu 如 Cortex A9 Cortex A15 等 的信息 更重要的是我想知道是否可以在非主CPU上引发中断而无需任何配置等 我正在开发一款仅处理主 cpu
  • 如何使用内联汇编在 C/C++ 程序中调用 DOS 中断?

    我需要从 C C 程序调用一些 DOS 中断 服务 我尝试了以下内联 asm 代码 读一个字符 int main asm movb 0x01 ah int 0x21 system PAUSE 但这没有用 我想知道我在这里做错了什么 另外如果
  • 从信号处理程序返回而不进入内核+用户空间中断

    这是我的旧问题的后续 通过 setcontext 从信号处理程序返回 https stackoverflow com questions 69237910 returning from a signal handler via setcon
  • C# 是否可以中断 ThreadPool 内的特定线程?

    假设我已将一个工作项排入队列ThreadPool 但是如果没有要处理的数据 从BlockingQueue 如果队列为空并且队列中不再有工作 那么我必须调用Thread Interrupt方法 如果我想中断阻塞任务 但是如何用 a 做同样的事
  • STM32F4 板上的 SPI 从机设置

    我正在尝试通过主从配置中的 SPI 在两个 STM32F4 发现板之间进行通信 我已经有了主设备的代码 但我对需要对从设备的 SPI 初始化进行的更改感到有点困惑 我还想在主机发送数据时实现中断 而不是让从机一直轮询 RXNE 寄存器 但是

随机推荐

  • 软件工程导论期末复习(五)

    本文用书 xff1a 软件工程导论 第六版 清华大学出版社 1 在设计过程中 xff0c 总体设计一般有哪两个主要阶段组成 xff1f 2 什么模块化 xff1f 模块独立性包含哪些内容 xff1f 度量准则是什么 xff1f 3 启发规则
  • 软件工程导论期末复习(六)

    本文用书 xff1a 软件工程导论 第六版 清华大学出版社 1 结构程序设计中有哪几种基本控制结构 xff1f 2 了解人机界面的设计 3 掌握过程设计的工具 xff08 程序流程图 盒图 PAD图 xff0c 判定树 xff09 4 面向
  • 技术人在互联网如何变现

    1 免费 xff08 引流的过程 xff09 免费的东西为什能够写到这里来 xff0c 天下哪有免费的午餐 xff0c 免费是实现流量聚集的手段 互联网无时无刻不体现免费的模式 xff0c 博客 各家文章平台 微博 公众号 短视频等等 xf
  • 软件工程导论期末复习(七)

    本文用书 xff1a 软件工程导论 第六版 清华大学出版社 1 编码 2 测试技术 3 调试的途径有哪些 xff1f 4 软件可靠性和可用性的基本概念 第七章 实现 7 1 编码 1 编码 xff1a 软件设计结果翻译成用某种程序语言书写的
  • 软件工程导论期末复习(八)

    本文用书 xff1a 软件工程导论 第六版 清华大学出版社 1 软件维护的定义 2 了解软件维护的特点 3 软件维护过程中维护组织包括哪些人员 xff1f 4 决定软件的可维护性的因素有哪些 xff1f 5 软件再工程过程 第八章 维护 8
  • 软件工程导论期末考试考后知识点总结

    感受 xff1a 大题多去做几道就可以 xff0c 难在记忆概念 xff0c 概念占篇幅近八成 xff0c 难受死了 第一章 1 软件危机的定义以及原因 2 软件工程的定义 3 软件工程方法学三要素 第二章 1 可行性研究的目的 2 数据流
  • linux操作--远程桌面RDP

    远程桌面RDP https www linuxidc com Linux 2018 10 155073 htm 相同的操作 xff1a https blog csdn net jgw2008 article details 80420180
  • Python工厂方法介绍及应用优化

    文章目录 前言一 工厂方法简单介绍1 统计信息2 简单实现 二 进一步优化具体实现1 抽象类及具体类部分2 工厂方法的封装3 用户调用接口 总结 前言 本文简单介绍设计模式中的工厂方法的实现方式及应用 文中所引用的模块及需要注意的事项 xf
  • Anaconda3 手动配置环境变量

    问题描述 Win 43 r 键打开系统运行对话框 xff0c 输入 cmd 回车 输入conda xff0c 显示 xff1a conda 不是内部或外部命令 xff0c 也不是可运行的程序或批处理文件 主要是因为安装 anaconda 时
  • xrdp_mm_process_login_response:login failed

    题外话 xff1a 被这个问题困扰了一个多钟 xff0c 百度搜索真的真的不如谷歌搜索 xff0c 最后是使用谷歌搜索一下子就找到适合自己的right answer xff01 问题描述 xff1a win10下远程桌面连接ubuntu服务
  • 使用SQl创建表单。查询,增加,修改删除,数据。

    使用SQl创建表单 查询 xff0c 增加 xff0c 修改删除 xff0c 数据 打开SQl数据库 右键数据库新建数据库 弹出新建数据库 xff0c 给数据库命名 左侧可以找到刚刚创建的数据库 选择刚刚创建滴数据库 xff0c 右键 表
  • Linux远程控制之VNC (server ,viewer)安装教程 || chkconfig

    VNC 可以实现对另外的计算机的操作 xff1a A xff1a 可以访问另一个计算机 xff0c 采用命令终端 或者窗口界面 B xff1a 可以远程控制另一个计算机 xff0c 两台同步显示操作 首先 xff0c 没有readme所说的
  • POJ 滑动窗口(优先队列的应用)

    数据结构与算法A 第三章 栈与队列 练习题 滑动窗口 思路 对于最大最小值分别维护一个优先队列 xff08 保存元素下标 xff09 以最小值为例 每次遇到一个新元素 xff0c 从队尾插入 插入时删去队列中比该值大的元素 xff08 因为
  • 数据结构:单链表头插法、尾插法、按值查找、按位查找、按位插入、删除、表长函数实现

    这里写目录标题 数据结构定义初始化头结点判断链表是否为空带头结点的按位序插入头插法尾插法按值查找 xff0c 返回节点按位查找 xff0c 返回节点将新节点插入到第i个位置删除第i个节点遍历输出求链表长度主函数测试各个功能完整代码 数据结构
  • Debian操作系统安装

    xff08 本文描述操作系统为debian 8 2 0 64位操作系统 以下使用debian代替debian 8 2 0 64位操作系统 xff09 下载 首先需要下载ubuntu操作系统iso映像文件 ubuntu kylin官网 下载W
  • linux文件属性、文件权限管理和stat函数

    1 linux中各种文件类型 1 1 普通文件 xff08 xff09 regular file 文本文件 xff1a 文件中的内容都是由文本构成的 xff0c 文本指的是ASCII码 xff0c Unicode码 xff0c utf8码等
  • argc和argv,参数个数和参数值

    argc xff1a argument count 参数个数 argv xff1a argument value 参数值 C C 43 43 语言中的main函数 xff0c 经常带有参数argc xff0c argv xff0c 如下 x
  • short转换为char,提取单字节

    本文描述 xff1a 将两个字节长度的wdVersion xff0c 分别提取出低字节和高字节的值 xff0c 此方法可以用于不同类型不同长度的单字节提取 xff01 xff08 注释种的位操作的方法也可以 xff0c 先 移位 后 位与
  • 常用内存操作函数

    常用内存操作函数 常用内存操作函数1 设置内存数据2 复制内存数据3 移动内存数据4 比较内存数据5 对齐分配内存6 释放对齐分配的内存 总结 常用内存操作函数 内存操作是C语言的基础 xff0c 常用的内存操作函数大致可以分成如下6类 1
  • RT-Thread临界段之rt_hw_interrupt_enable和rt_hw_interrupt_disable

    一 PRIMASK PRIMSK 61 1 关闭中断 PRIMSK 61 10 打开中断 二 void rt hw interrupt enable rt base t level 有参数 xff0c 无返回值 该功能将设置指定的中断状态