【简介】
在S32K 的RTD驱动中经常会看到类似如下的代码段,在进入临界区调用如下的接口。

在推出临界区的时候调用对应的接口来退出临界区的保护

对应进入临界区保护的代码如下:
void SchM_Enter_Mem_43_INFLS_MEM_EXCLUSIVE_AREA_07(void)
{
uint32 msr;
uint32 u32CoreId = (uint32)Sys_GetCoreID();
if(0UL == reentry_guard_MEM_EXCLUSIVE_AREA_07[u32CoreId])
{
msr = Mem_43_INFLS_schm_read_msr();
if ((uint32)(((uint32)(msr) & (uint32)(((uint32)0x00000001UL))) == (uint32)0))
{
OsIf_Interrupts_SuspendAllInterrupts();
}
msr_MEM_EXCLUSIVE_AREA_07[u32CoreId] = msr;
}
reentry_guard_MEM_EXCLUSIVE_AREA_07[u32CoreId]++;
}上述进入临界区的代码流程如下:
step1:读取当前core id ,然后读取对应 core 的临界区域嵌套调用次数。
step2:当前临界区保护代码调用次数为0时,读取 primask 寄存器的数值保存到全局变量。
uint32 Mem_43_INFLS_schm_read_msr(void)
{
register uint32 reg_tmp;
__asm volatile( " mrs %0, primask " : "=r" (reg_tmp) );
return (uint32)reg_tmp;
}step3:如果对应的primask 为0(global interrupt enable)则调用 OsIf_SuspendAllInterrupts() 接口挂起中断。

step4:当前临界区嵌套+1
退出临界区代码如下:
void SchM_Exit_Mem_43_INFLS_MEM_EXCLUSIVE_AREA_07(void)
{
uint32 u32CoreId = (uint32)Sys_GetCoreID();
reentry_guard_MEM_EXCLUSIVE_AREA_07[u32CoreId]--;
if (((uint32)(((uint32)(msr_MEM_EXCLUSIVE_AREA_07[u32CoreId]) & (uint32)(((uint32)0x00000001UL))) == (uint32)0))&&(0UL == reentry_guard_MEM_EXCLUSIVE_AREA_07[u32CoreId]))
{
OsIf_Interrupts_ResumeAllInterrupts();
}
}
退出流程跟上述进入时正好相反:
step1:根据coreid 获取当前的嵌套深度,进行--,获取进入临界区之前的总中断状态如果为开启状态,并且嵌套计数器为0时恢复之前被挂起的中断状态。
我要赚赏金
