这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 行业应用 » 汽车电子 » 【S32K3XX】Core-to-Core 中断使用

共1条 1/1 1 跳转至

【S32K3XX】Core-to-Core 中断使用

高工
2026-06-15 13:34:23     打赏

【简介】

S32K3 支持多核的配置,核间通信的方式也有多种之前我们介绍过MU的通信方式,今天我们继续介绍另一种方式核间中断的方式。以下是芯片手册中对Core-to-Core 中断的功能描述。

image.png

以下是core-to-core 的框图说明。

image.png

根据上面的描述可知,Core-to-Core 中断的使用配置还是比较简单的通过IRCP_nIGRx 来触发Target核的中断,对应的寄存器 说明如下:

image.png

K3 芯片为Core-to-Core 中断 设置了对应的中断信号,我们在 IntCtrl_Ip 中使能对应的中断并配置中断服务函数。

image.png

同时使能Core-to-Core 中断配置

image.png

S32K3 的 RTD 驱动中已经封装了core-to-core 的中断触发接口,对应的实现如下:

void IntCtrl_Ip_GenerateDirectedCpuInterruptPrivileged(IRQn_Type eIrqNumber,
                                                       IntCtrl_Ip_IrqTargetType eCpuTarget)
{
#if (INT_CTRL_IP_DEV_ERROR_DETECT == STD_ON)
    /* Check IRQ number */
    DevAssert(INT_CTRL_IP_DIRECTED_CPU_INT_MIN <= eIrqNumber);
    DevAssert(eIrqNumber <= INT_CTRL_IP_DIRECTED_CPU_INT_MAX);
#endif

    uint32 u32Core;
    uint32 u32Target;
    uint32 u32IrqId;

    u32IrqId = (uint32)eIrqNumber - (uint32)INT_CTRL_IP_DIRECTED_CPU_INT_MIN;

    if (eCpuTarget == INTCTRL_IP_TARGET_OTHERS)
    {
        /* Add Fault Injection point for processor number */
        MCAL_FAULT_INJECTION_POINT(PLATFORM_CPN_ERROR_CPUINTERRUPT);
        for (u32Core = 0U; u32Core < INT_CTRL_IP_MSI_CORE_CNT; u32Core++)
        {
            /* Generate a Directed CPU Interrupt to every other core */
            if (u32Core != (MSCM_CPXNUM_CPN_MASK & (IP_MSCM->CPXNUM)))
            {
                MSCM_IRCPnIRx->IRCPnIRx[u32Core][u32IrqId].IGR = 0x1U;
            }
        }
    }
    else
    {
        if (INTCTRL_IP_TARGET_SELF == eCpuTarget)
        {
            u32Target = MSCM_CPXNUM_CPN_MASK & (IP_MSCM->CPXNUM);
        }
        else
        {
            u32Target = (uint32)eCpuTarget;
        }

        /* Generate Directed CPU Interrupt to target core */
        MSCM_IRCPnIRx->IRCPnIRx[u32Target][u32IrqId].IGR = 0x1U;
    }
}


上述代码触发core-to-core 的中断是通过上述的IRCP_nIGRx  来触发的中断信号。

本地添加如下的isr 中断入口函数,及触发代码来验证core-to-core isr 的功能。

void Mscm_Int0_Isr(void)
{
    /* clear MSCM INT0 flag for core 0 */
    if(IP_MSCM->CPXNUM == 0)
    {
        IP_MSCM->IRCP0ISR0 = MSCM_IRCP0ISR0_CP0_INT_MASK+MSCM_IRCP0ISR0_CP1_INT_MASK;
    }
    else if(IP_MSCM->CPXNUM == 1)
    {
        IP_MSCM->IRCP1ISR0 = MSCM_IRCP0ISR0_CP0_INT_MASK+MSCM_IRCP0ISR0_CP1_INT_MASK;
    }
    PRINTF("Core0 received interrupt from Core1\n");
}

/********************************************************
 *  core-to-core interrupt 1 ISR
 *  In this example, core1 respond to core0 in this ISR
 *******************************************************/
void Mscm_Int1_Isr(void)
{
    if(IP_MSCM->CPXNUM == 0)
    {
        IP_MSCM->IRCP0ISR1 = MSCM_IRCP0ISR0_CP0_INT_MASK+MSCM_IRCP0ISR0_CP1_INT_MASK;
    }
    else if(IP_MSCM->CPXNUM == 1)
    {
        IP_MSCM->IRCP1ISR1 = MSCM_IRCP0ISR0_CP0_INT_MASK+MSCM_IRCP0ISR0_CP1_INT_MASK;
    }
    PRINTF("Core1 received interrupt from Core0\n");
}

unsigned int c2cisr(char argc, char **argv)
{
    (void)argc;
    (void)argv;

    if(IP_MSCM->CPXNUM == 0)
    {
        IntCtrl_Ip_GenerateDirectedCpuInterrupt(INT1_IRQn,INTCTRL_IP_TARGET_CP1);
    }
    else if(IP_MSCM->CPXNUM == 1)
    {
        IntCtrl_Ip_GenerateDirectedCpuInterrupt(INT0_IRQn,INTCTRL_IP_TARGET_CP0);
    }

    return 0;
}


本地验证通过core0 和core1 触发核间中断 中断入口函数的打印已经按照预期的配置进行打印输出了。


image.png


   


           


共1条 1/1 1 跳转至

回复

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