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

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

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

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

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

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 触发核间中断 中断入口函数的打印已经按照预期的配置进行打印输出了。

我要赚赏金
