我在使用AWR1843 EVM过程中,开启了Can口中断接收功,有时通信频繁会造成板卡意外死机,仿真中发现Can口中断影响了chirp的正常计数,造成frame启动时计数不为0。有没有设置中断优先级的资料,使chirp计数优先级更高?
Chris Meng:
你好,
请问你使用的软件是基于那个demo? can中断影响的应该是mss上运行的代码,一般RF处理是在DSP/HWA侧完成的。你代码里的chirp计数是在mss的task里面完成的么?如果是,task的优先级是比HWI要低的。
在TRM里面有介绍中断的相关章节。
user5146960:
回复 Chris Meng:
我使用的是MRR工程,在DSS和MSS代码中都有chirp和frame的监听中断,在MSS代码中我使用了CAN口做了部分交互协议,现在CAN口的接收中断和chirp的监听中断有竞争,frame启动时,有时chirp计数不为0,总是报错。
Chris Meng:
回复 user5146960:
你好,
我看了一下代码,目前canfd和chirp/frame event中断都是设置的优先级都是一样的。相关代码如下:
canfd的中断注册代码:
canfd.c
HwiP_Params_init(&hwiParams);
hwiParams.name = "CANFD_0";
hwiParams.arg = (uintptr_t)ptrCanFdMCB;
ptrCanFdMCB->hwiHandle0 = HwiP_create(ptrCanFdMCB->hwCfg.interruptNum0, CANFD_MCANInt0Isr, &hwiParams);
chirp中断:
dss_main.c
/* Register interrupts. */
SOC_SysIntListenerCfg listenerCfg;
/* Register Chirp Available Listener */
memset((void*) &listenerCfg, 0, sizeof(SOC_SysIntListenerCfg));
listenerCfg.systemInterrupt = SOC_XWR18XX_DSS_INTC_EVENT_CHIRP_AVAIL;
listenerCfg.listenerFxn = MRR_DSS_chirpIntCallback;
listenerCfg.arg = 0;
gMrrDSSMCB.chirpIntHandle = SOC_registerSysIntListener(gMrrDSSMCB.socHandle, &listenerCfg, &errCode);
soc_xwr18xx_dss.c
void SOC_deviceInit (SOC_DriverMCB* ptrSOCDriverMCB, int32_t* errCode){…
/*********************************************************************************** * Frame Start System Interrupt ***********************************************************************************/ HwiP_Params_init(&hwiParams); hwiParams.name = "FrameStartISR"; hwiParams.arg = (uintptr_t)&ptrSOCDriverMCB->sysIntTable[sysIntIndex]; ptrSOCDriverMCB->sysIntTable[sysIntIndex].intNum = SOC_XWR18XX_DSS_INTC_EVENT_FRAME_START; ptrSOCDriverMCB->sysIntTable[sysIntIndex].hwiHandle = HwiP_create(ptrSOCDriverMCB->sysIntTable[sysIntIndex].intNum, SOC_SystemISR, &hwiParams); HwiP_disableInterrupt (ptrSOCDriverMCB->sysIntTable[sysIntIndex].intNum); sysIntIndex++;
/*********************************************************************************** * Chirp System Interrupt ***********************************************************************************/ HwiP_Params_init(&hwiParams); hwiParams.name = "ChirpAvailableISR"; hwiParams.arg = (uintptr_t)&ptrSOCDriverMCB->sysIntTable[sysIntIndex]; ptrSOCDriverMCB->sysIntTable[sysIntIndex].intNum = SOC_XWR18XX_DSS_INTC_EVENT_CHIRP_AVAIL; ptrSOCDriverMCB->sysIntTable[sysIntIndex].hwiHandle = HwiP_create(ptrSOCDriverMCB->sysIntTable[sysIntIndex].intNum, SOC_SystemISR, &hwiParams); HwiP_disableInterrupt (ptrSOCDriverMCB->sysIntTable[sysIntIndex].intNum); sysIntIndex++;
…}
HwiP_tirtos.c
void HwiP_Params_init(HwiP_Params *params){ params->name = NULL; params->arg = 0; params->priority = ~0; params->enableInt = TRUE;#ifdef SUBSYS_MSS params->type = HwiP_Type_IRQ;#endif}
user5146960:
回复 Chris Meng:
非常感谢,但是,有没有指令可以在现有工程内设置优先级,保证CAN口的优先级低于Frame的优先级?