当前位置: 首页 > article >正文

ARM Cortex-M用于控制中断和异常处理的寄存器:BASEPRI、PRIMASK 和 FAULTMASK

在ARM Cortex-M处理器中,BASEPRIPRIMASKFAULTMASK 是用于控制中断和异常处理的系统级寄存器。它们的主要区别在于作用范围和灵活性,以下是详细说明:


1. PRIMASK

功能
禁用除以下情况的异常和所有中断(Maskable Interrupts,即IRQ):
• NMI(不可屏蔽中断)
• Hard Fault(硬件故障)
作用机制
设置 PRIMASK(通过 MSR PRIMASK, #1)会把当前优先级提为0,来屏蔽除NMI和Hard Fault之外的所有异常和中断。即所有可更改优先级的异常和中断会被屏蔽。
典型用途
快速进入临界区,保护关键代码段不被中断打断。 如RTOS任务切换或共享资源访问等应用。
特点
• 简单易用,对系统实时性影响较大,长时间开启可能导致高优先级中断无法响应。


2. FAULTMASK

功能
类似 PRIMASK,但额外禁用Hard Fault(硬件故障),并允许更高优先级的异常(如NMI)继续运行。
作用机制
设置 FAULTMASK(通过 MSR FAULTMASK, #1)会把当前优先级提升到 - 1,会禁用所有中断和大部分异常,仅允许NMI。
典型用途
在异常处理程序中临时屏蔽可能引发嵌套故障的操作(如内存访问)。
特点
• 比 PRIMASK 更严格,可能影响系统稳定性。
• 仅在特权模式(Privileged Mode)下可修改。


3. BASEPRI

功能
基于优先级的动态中断屏蔽,仅屏蔽优先级低于阈值的中断。
作用机制
设置 BASEPRI(通过 MSR BASEPRI, #priority)允许优先级高于阈值的中断继续执行,低于阈值的被屏蔽。例如,若 BASEPRI=0x40,则优先级数值 ≥ 0x40 的中断不会被屏蔽。
典型用途
灵活控制中断优先级,允许高优先级任务/中断优先执行,同时屏蔽低优先级中断。
特点
• 更精细的控制,避免完全禁用所有中断。
• 需要合理设置优先级阈值,否则可能导致意外屏蔽。


对比总结

寄存器屏蔽范围影响异常灵活性典型场景
PRIMASK(除NMI和硬故障外)所有异常和中断简单临界区保护
FAULTMASK(除NMI外的)所有异常和中断异常处理中的嵌套防护
BASEPRI按中断的优先级阈值屏蔽中断动态调整中断优先级

使用建议

优先使用 BASEPRI
在需要平衡实时性和中断响应时,通过设置合理的优先级阈值来屏蔽低优先级中断。
谨慎使用 PRIMASK/FAULTMASK
仅在需要完全禁用中断时使用(如临界区保护),并尽快恢复以避免系统不稳定。
注意特权模式
FAULTMASKBASEPRI 的修改通常需在特权模式下进行(如通过 SVC 或系统服务调用)。


示例代码(CMSIS风格)

// 屏蔽所有IRQ(使用PRIMASK)
void DisableInterrupts(void) {__set_PRIMASK(1);
}// 恢复中断(使用PRIMASK)
void EnableInterrupts(void) {__set_PRIMASK(0);
}// 动态设置BASEPRI(屏蔽优先级<0x40的中断)
void SetPriorityThreshold(uint32_t threshold) {__set_BASEPRI(threshold);
}

理解这三个寄存器的差异有助于优化实时系统的中断管理,避免因不当屏蔽导致的性能问题或系统故障。

相关文章:

ARM Cortex-M用于控制中断和异常处理的寄存器:BASEPRI、PRIMASK 和 FAULTMASK

在ARM Cortex-M处理器中&#xff0c;BASEPRI、PRIMASK 和 FAULTMASK 是用于控制中断和异常处理的系统级寄存器。它们的主要区别在于作用范围和灵活性&#xff0c;以下是详细说明&#xff1a; 1. PRIMASK • 功能&#xff1a; 禁用除以下情况的异常和所有中断&#xff08;Maska…...

Kafka 中的生产者分区策略

Kafka 中的 生产者分区策略 是决定消息如何分配到不同分区的机制。这个策略对 Kafka 的性能、负载均衡、消息顺序性等有重要影响。了解它对于高效地使用 Kafka 进行消息生产和消费至关重要。 让我们一起来看 Kafka 中 生产者的分区策略&#xff0c;它如何工作&#xff0c;以及…...

【Django】教程-11-ajax弹窗实现增删改查

【Django】教程-1-安装创建项目目录结构介绍 【Django】教程-2-前端-目录结构介绍 【Django】教程-3-数据库相关介绍 【Django】教程-4-一个增删改查的Demo 【Django】教程-5-ModelForm增删改查规则校验【正则钩子函数】 【Django】教程-6-搜索框-条件查询前后端 【Django】教程…...

结构化需求分析:专业方法论与实践

结构化需求分析是一种用于软件开发或其他项目中的系统分析方法&#xff0c;旨在全面、准确地理解和描述用户对系统的需求。以下是关于结构化需求分析的详细介绍&#xff1a; 一、概念 结构化需求分析是采用自顶向下、逐步分解的方式&#xff0c;将复杂的系统需求分解为若干个…...

R语言:气象水文领域的数据分析与绘图利器

R 语言是一门由统计学家开发的用于统计计算和作图的语言&#xff08;a Statistic Language developed for Statistic by Statistician&#xff09;&#xff0c;由 S 语言发展而来&#xff0c;以统计分析功能见长。R 软件是一款集成 了数据操作、统计和可视化功能的优秀的开源软…...

Kotlin与HttpClient编写视频爬虫

想用Apache HttpClient库和Kotlin语言写一个视频爬虫。首先&#xff0c;我需要确定用户的具体需求。视频爬虫通常涉及发送HTTP请求&#xff0c;解析网页内容&#xff0c;提取视频链接&#xff0c;然后下载视频。可能需要处理不同的网站结构&#xff0c;甚至可能需要处理动态加载…...

图形化编程语言:低代码赛道的技术革命与范式突破

在 2024 年 Gartner 低代码平台魔力象限报告中&#xff0c;传统低代码厂商市场份额增速放缓至 12%&#xff0c;而图形化编程语言赛道融资额同比激增 370%。本文深度剖析低代码平台的技术瓶颈&#xff0c;系统阐释图形化编程语言的核心优势&#xff0c;揭示其如何重构软件开发范…...

蓝桥杯每日刷题c++

目录 P9240 [蓝桥杯 2023 省 B] 冶炼金属 - 洛谷 (luogu.com.cn) P8748 [蓝桥杯 2021 省 B] 时间显示 - 洛谷 (luogu.com.cn) P10900 [蓝桥杯 2024 省 C] 数字诗意 - 洛谷 (luogu.com.cn) P10424 [蓝桥杯 2024 省 B] 好数 - 洛谷 (luogu.com.cn) P8754 [蓝桥杯 2021 省 AB2…...

快速上手示例(以BEVFormer为例)

快速上手示例&#xff08;以BEVFormer为例&#xff09;‌ ‌安装依赖‌&#xff1a; bash git clone https://github.com/fundamentalvision/BEVFormer.git cd BEVFormer pip install -r requirements.txt‌下载预训练模型‌&#xff1a; wget https://github.com/fundament…...

GitHub 上开源一个小项目的完整指南

GitHub 上开源一个小项目的完整指南 &#x1f680; 第一步&#xff1a;准备你的项目 在开源之前&#xff0c;确保项目是可用且有一定结构的&#xff1a; ✅ 最低要求 项目文件清晰、结构合理&#xff08;比如&#xff1a;src/、README.md、LICENSE&#xff09;项目能在本地正…...

当实体类中的属性名和表中的字段名不一样 ,怎么办

在不同的持久化框架中&#xff0c;当实体类中的属性名和表中的字段名不一致时&#xff0c;有不同的解决办法&#xff0c;下面为你详细介绍&#xff1a; 1. MyBatis MyBatis 是一个流行的持久层框架&#xff0c;有两种主要方式来处理属性名和字段名不一致的情况。 方式一&…...

arthas之dump/classloader命令的使用

文章目录 1. dump2. classloader 1. dump 作用&#xff1a;将已加载类的字节码文件保存到特定目录&#xff1a;logs/arthas/classdump/ 参数 数名称参数说明class-pattern类名表达式匹配[c:]类所属 ClassLoader 的 hashcode[E]开启正则表达式匹配&#xff0c;默认为通配符匹…...

linux 使用 usermod 授权 普通用户 属组权限

之前写过这篇文章 linux 普通用户 使用 docker 只不过是使用 root 用户编辑 /etc/group用户所属组文件的方式 今天带来一种 usermod 命令行方式 以下3步&#xff0c;在root用户下操作 第一步&#xff0c;先创建一个普通用户测试使用 useradd miniuser第二步&#xff0c;授权到…...

大文件上传之断点续传实现方案与原理详解

一、实现原理 文件分块&#xff1a;将大文件切割为固定大小的块&#xff08;如5MB&#xff09; 进度记录&#xff1a;持久化存储已上传分块信息 续传能力&#xff1a;上传中断后根据记录继续上传未完成块 块校验机制&#xff1a;通过哈希值验证块完整性 合并策略&#xff1a;所…...

第一次3D打印,一个简单的小方块(Rhino)

一、建模 打开犀牛&#xff0c;我们选择立方体 我们点击上册的中心点 输入0&#xff0c;然后回车0 而后我们输长度&#xff1a;10&#xff0c;回车确认 同样的&#xff0c;宽度10 高度同样是10 回车确认后&#xff0c;我们得到一个正方形 二、导出模型 我们选择文件—>保存…...

java基础使用- 泛型

泛型 泛型作用泛型语法(1) 泛型类/接口(2) 泛型方法 类型参数命名习惯类型通配符&#xff08;Wildcards&#xff09;(1) 无界通配符 <?>表示“未知类型”(2) 上界通配符 <? extends T>表示“T 或 T 的子类”。(3) 下界通配符 <? super T>表示“T 或 T 的父…...

VMware-workstation-full-12.5.2 install OS X 10.11.1(15B42).cdr

手把手虚拟机安装苹果操作系统 VMware_workstation_full_12.5.2 unlocker208 Apple Max OS X(M&#xff09;-CSDN博客 vcpu-0:VERIFY vmcore/vmm/main/physMem_monitor.c:1180 FILE: FileCreateDirectoryRetry: Non-retriable error encountered (C:\ProgramData\VMware): Cann…...

5分钟上手GitHub Copilot:AI编程助手实战指南

引言 近年来&#xff0c;AI编程工具逐渐成为开发者提升效率的利器。GitHub Copilot作为由GitHub和OpenAI联合推出的智能代码补全工具&#xff0c;能够根据上下文自动生成代码片段。本文将手把手教你如何快速安装、配置Copilot&#xff0c;并通过实际案例展示其强大功能。 一、…...

deepseek使用记录26——从体力异化到脑力异化

我们的一切发现和进步&#xff0c;似乎结果是使物质力量具有理智生命&#xff0c;而人的生命则化为愚钝的物质力量。AI快速发展的现实中&#xff0c;人面临着比工业革命更深刻的异化。在工业革命中&#xff0c;人的身躯沦为了机器的一部分&#xff0c;而现在人的脑袋沦为了AI的…...

数字身份DID协议:如何用Solidity编写去中心化身份合约

本文提出基于以太坊的自主主权身份&#xff08;SSI&#xff09;实现方案&#xff0c;通过扩展ERC-734/ERC-735标准构建链上身份核心合约&#xff0c;支持可验证声明、多密钥轮换、属性隐私保护等特性。设计的三层架构体系将身份控制逻辑与数据存储分离&#xff0c;在测试网环境…...

【Git “ls-tree“ 命令详解】

本章目录: 1. 命令简介2. 命令的基本语法和用法基本语法常见使用场景示例 1&#xff1a;查看当前提交的文件树示例 2&#xff1a;查看某个分支的文件树示例 3&#xff1a;查看特定路径下的文件树 3. 命令的常用选项及参数常用选项&#xff1a; 4. 命令的执行示例示例 1&#xf…...

[ctfshow web入门] web16

信息收集 提示&#xff1a;对于测试用的探针&#xff0c;使用完毕后要及时删除&#xff0c;可能会造成信息泄露 试试url/phpinfo.php url/phpsysinfo.php url/tz.php tz.php能用 点击phpinfo&#xff0c;查看phpinfo信息&#xff0c;搜索flag&#xff0c;发现flag被保存为变量…...

全面支持MCP协议,开启便捷连接之旅,MaxKB知识库问答系统v1.10.3 LTS版本发布

2025年4月7日&#xff0c;MaxKB开源知识库问答系统正式发布v1.10.3 LTS版本。 在MaxKB v1.10.3 LTS版本中&#xff0c;应用方面&#xff0c;MaxKB新增支持MCP调用节点&#xff0c;AI对话节点新增MCP工具调用功能&#xff0c;支持设置MCP服务配置&#xff1b;函数库方面&#x…...

ES:geoip_databases

目录 如何查看 .geoip_databases 的内容1. 查看 .geoip_databases 的内容2. 查看GeoIP数据库的统计信息3. 使用GeoIP处理器4. 管理GeoIP数据库更新 如何查看 .geoip_databases 的内容 在Elasticsearch中&#xff0c;.geoip_databases 是一个特殊的索引&#xff0c;用于存储Geo…...

VTK知识学习(51)- 交互与Widget(二)

1、交互器样式 前面所讲的观察者/命令模式是 VTK实现交互的方式之一。在前面示例 所示的窗口中可以使用鼠标与柱体进行交互&#xff0c;比如用鼠标滚轮可以对柱体放大、缩小;按下鼠标左键不放&#xff0c;然后移动鼠标&#xff0c;可以转动柱体;按下鼠标左键&#xff0c;同时按…...

底盘---麦克纳姆轮(Mecanum Wheel)

一、基本定义与起源 定义&#xff1a;麦克纳姆轮是一种实现全向移动的特殊轮式结构&#xff0c;通过在主轮周边安装多个倾斜的辊子&#xff08;小轮&#xff09;&#xff0c;使设备能够在平面上向任意方向移动&#xff08;包括横向、斜向、旋转等&#xff09;&#xff0c;无需…...

深入源码级别看spring bean创建过程

我们通常聊到spring bean的生命周期&#xff0c;大多是从网上找帖子背些基本概念&#xff0c;这样我们学到的东西是不够直观清晰的&#xff0c;这篇文章我就试着从源码级别来讲清楚bean的创建过程。 一、准备demo代码 我们既然要深入源码来看bean的创建过程&#xff0c;那么就…...

I/O进程1

day1 一、标准IO 1.概念 在C库中定义的一组用于输入输出的函数 2.特点 (1).通过缓冲机制减少系统调用&#xff0c;提高效率 (2.)围绕流进行操作&#xff0c;流用FILE *来描述(3).标准IO默认打开了三个流&#xff0c;stdin&#xff08;标准输入&#xff09;、stdout&#xff08;…...

int 与 Integer 的区别详解

1. 本质区别 特性intInteger类型基本数据类型&#xff08;Primitive&#xff09;包装类&#xff08;Wrapper Class&#xff09;存储位置栈&#xff08;或作为对象成员在堆中&#xff09;堆&#xff08;对象实例&#xff09;默认值0null&#xff08;可能导致 NullPointerExcept…...

Java面试黄金宝典39

1. SNMP、SMTP 协议 SNMP(简单网络管理协议) 定义:SNMP 是一种应用层协议,用于在 IP 网络中管理网络节点(如服务器、路由器、交换机等)。它允许网络管理员监控网络设备的状态、收集性能数据、进行故障诊断等操作。SNMP 基于 UDP 协议,采用轮询和事件驱动相结合的方式来收…...