代码临界区保护 开关中断

LOCAL_INLINE void OsIf_SuspendAllInterrupts(void)

{

#if defined(USING_AUTOSAR_OS)

SuspendAllInterrupts(); // AUTOSAR 环境直接调用标准接口

#else

uint32 PriMask = __get_PRIMASK(); // 1. 保存当前中断状态

__disable_irq(); // 2. 全局禁用所有可屏蔽中断

if (OsIf_CriticalNesting == 0) // 3. 首次进入临界区时保存原始状态

{

OsIf_PriMaskValue = PriMask;

}

OsIf_CriticalNesting += 1; // 4. 嵌套计数+1

#endif

}

LOCAL_INLINE void OsIf_ResumeAllInterrupts(void)

{

#if defined(USING_AUTOSAR_OS)

ResumeAllInterrupts(); // AUTOSAR 环境直接调用标准接口

#else

OsIf_CriticalNesting -= 1; // 1. 嵌套计数减 1

if (OsIf_CriticalNesting <= 0) // 2. 判断是否为最外层退出

{

__set_PRIMASK(OsIf_PriMaskValue); // 3. 恢复原始中断状态

}

#endif

}

相关推荐
@yanyu66612 小时前
C编译器安装与第一个C程序
c语言·开发语言
山下梅子酒22512 小时前
洛谷-入门-B2070
c语言
Logic10112 小时前
C语言/数据结构位运算题解:异或XOR找出多任务下载器中的“独特下载速度“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
MI_farmer14 小时前
Anaconda 安装在 D 盘但虚拟环境跑到 C 盘,以及 Conda PermissionError: WinError 5 的解决方法
c语言·开发语言·conda
心中有你021416 小时前
C语言 二叉搜索树(BST)超详细完整实现(插入+查找+删除+三种遍历+内存释放)
c语言
神仙别闹16 小时前
基于C语言实现 TINY+ 编译器
c语言·开发语言·数据库
共享家952717 小时前
C语言-408
c语言·开发语言
ACP广源盛1392462567320 小时前
接口适配方案选型|GSV6125@ACP HDMI2.0 转 Type‑C/DP1.4 桥接芯片工程评估
大数据·c语言·开发语言·硬件架构·硬件工程·国产芯片
芯祥联1 天前
STM32 上跑 MQTT 怎么选?嵌入式 MQTT 客户端 C 语言实现对比
c语言·stm32·单片机·嵌入式硬件·网络协议·开源·broker
Escalating_xu1 天前
【C 语言】深入理解指针(1·下):指针运算、野指针、assert 与传址实战
java·c语言·开发语言