这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 行业应用 » 汽车电子 » 【S32K3XX】RTD 驱动的临界区保护实现方式

共1条 1/1 1 跳转至

【S32K3XX】RTD 驱动的临界区保护实现方式

高工
2026-01-30 15:38:21     打赏

【简介】

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

image.png

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

image.png

对应进入临界区保护的代码如下:

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() 接口挂起中断。

image.png

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时恢复之前被挂起的中断状态。


           


共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]