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

临界区保护

__STATIC_FORCEINLINE cortex_int_state_t cortex_int_get_and_disable(void) 是用于安全禁用中断并保存中断状态的内联函数,常见于嵌入式系统(如STM32)的临界区保护。以下是详细解析:


⚙️ ​一、函数功能与原理

  1. 核心作用

    • 保存当前中断状态​:通过 __get_PRIMASK() 读取 PRIMASK 寄存器的值(0表示中断使能,1表示中断禁用)。
    • 禁用所有可屏蔽中断​:调用 __disable_irq() 设置 PRIMASK=1,屏蔽除NMI和HardFault外的所有中断。
    • 返回原始中断状态​:将保存的状态返回,供后续恢复中断使用(如 cortex_int_restore(state))。
  2. 执行流程

    cortex_int_state_t state;      // 定义状态变量
    state = __get_PRIMASK();       // 保存当前PRIMASK值 
    __disable_irq();               // 设置PRIMASK=1(关中断)
    return state;                  // 返回原始中断状态

🔧 ​二、关键组件解析

1. ​__STATIC_FORCEINLINE 宏
  • __STATIC​:等效于 static,限制函数作用域为当前文件,避免符号冲突。
  • __FORCEINLINE:强制编译器内联展开函数(即使优化关闭),消除调用开销。
  • 适用场景​:高频调用的底层操作(如中断控制),确保零额外开销。
2. ​PRIMASK 寄存器
含义影响范围
0中断使能所有可屏蔽中断(IRQ)可响应
1中断禁用仅NMI和HardFault可响应
  • 操作指令​:
    • __disable_irq() → CPSID I(汇编指令)。
    • __get_PRIMASK() → 读取 PRIMASK 当前值。

⚠️ ​三、使用场景与注意事项

  1. 典型应用

    • 临界区保护​:在操作共享资源(如全局变量、外设寄存器)前禁用中断,操作完成后恢复原始状态。
    // 进入临界区
    cortex_int_state_t state = cortex_int_get_and_disable();
    // 操作共享资源...
    // 退出临界区
    cortex_int_restore(state);  // 根据state恢复PRIMASK
  2. 注意事项

    • 特权模式要求​:必须在特权模式下执行(用户模式无效)。
    • 临界区长度​:中断禁用时间应极短(通常 ​​<10μs),避免影响实时性。
    • 不可嵌套​:若已禁用中断,再次调用本函数会导致状态保存错误(需配套恢复函数)。

⚖️ ​四、与其他中断控制方式的对比

方法优势局限性
本函数安全保存/恢复状态,避免误开启中断需配套恢复函数
__disable_irq()简单直接可能误开启原本关闭的中断
BASEPRI 寄存器可屏蔽指定优先级以下的中断配置复杂,需优先级管理

💎 ​总结

  • 该函数是嵌入式临界区保护的黄金标准​:通过保存和恢复 PRIMASK 状态,确保中断控制的安全性。
  • 强制内联设计​:消除函数调用开销,适用于实时性要求高的场景。
  • 使用铁律​:临界区代码必须简短,且与状态恢复函数严格配对。
http://www.xdnf.cn/news/10434.html

相关文章:

  • 贴片SMT工艺优化实战指南
  • 【2025最新】Java图书借阅管理系统:从课程作业到实战应用的完整解决方案
  • 04.MySQL数据类型详解
  • 42. 自动化测试开发之浏览器启动属性与web并发测试实现
  • Day42 Python打卡训练营
  • 模块联邦:更快的微前端方式!
  • Linux发行版与其编译器依赖的猜测
  • Python Turtle实战:打造高精度图形化秒表
  • 生产系统中TongWeb故障应急处理办法
  • 蓝光过滤APP:护眼小助手,守护您的视力健康
  • Python基础:常量、变量、变量类型、表达式、注释、输入输入、运算符
  • Java网络编程基础:从阻塞式I/O到线程池模型
  • @Value,@ConfigurationProperties
  • 【CSS-1】CSS 语法规范与书写位置详解:提升代码可读性与维护性
  • 封闭内网安装配置VSCode Anconda3 并配置 PyQt5开发
  • 射频通信概述
  • 初学c语言22(编译和链接)
  • 基于谷歌ADK的智能客服系统简介
  • 家政维修平台实战11搭建服务规格
  • 力扣题解106:从中序与后序遍历序列构造二叉树
  • esp-idf ubuntu环境配置
  • C++多重继承详解与实战解析
  • C++ —— STL容器——string类
  • xdma 驱动测试与分析
  • Launcher3体系化之路
  • Spring Boot对一些技术框架进行了统一版本号管理
  • vue3常用组件有哪些
  • 【STM32F1标准库】理论——外部中断
  • YOLOv5 环境配置指南
  • 高速串行通信解惑说明