代码临界区保护 开关中断

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

}

相关推荐
沐晓时光8 小时前
C语言入门,内存函数知识讲解
c语言·开发语言
Zwawa11 小时前
C语言函数指针与宏实战:从回调、表驱动菜单到X-Macro,讲透嵌入式代码解耦
c语言·单片机·嵌入式
David猪大卫14 小时前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
HPtiger14 小时前
C++ 入门笔记:从 C 到 C++ 的核心过渡(命名空间、输入输出、缺省参数、重载、引用、内联)
c语言·c++·学习
安妮细水长流18 小时前
ad7124
c语言·单片机
Zwawa1 天前
用两个按键做一个OLED菜单:先把选择和执行分开
c语言·单片机·嵌入式
心仪久了会沦陷2 天前
C语言数据结构入门——树与二叉树详解:概念、堆实现与链式遍历
c语言·数据结构·算法
Severus_black2 天前
【C++初阶】list使用及相关实现,思路顺滑流畅!
c语言·数据结构·c++·stl·list
希和20272 天前
C语言程序设计题|有序数组插入数字冒泡排序
c语言·数据结构·算法
Zwawa3 天前
屏幕不止一种:OLED、LCD1602字符屏、TFT/IPS图形屏和串口屏怎么用,这与TTY和PTY又有什么关系
c语言·单片机·嵌入式