AWR1843 硬件中断优先级如何设定?

Other Parts Discussed in Thread: AWR1843

我在使用AWR1843 EVM过程中,开启了Can口中断接收功,有时通信频繁会造成板卡意外死机,仿真中发现Can口中断影响了chirp的正常计数,造成frame启动时计数不为0。有没有设置中断优先级的资料,使chirp计数优先级更高?

  • 你好,

    请问你使用的软件是基于那个demo? can中断影响的应该是mss上运行的代码,一般RF处理是在DSP/HWA侧完成的。你代码里的chirp计数是在mss的task里面完成的么?如果是,task的优先级是比HWI要低的。
    在TRM里面有介绍中断的相关章节。
  • 我使用的是MRR工程,在DSS和MSS代码中都有chirp和frame的监听中断,在MSS代码中我使用了CAN口做了部分交互协议,现在CAN口的接收中断和chirp的监听中断有竞争,frame启动时,有时chirp计数不为0,总是报错。
  • 你好,

    我看了一下代码,目前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
    }

  • 非常感谢,但是,有没有指令可以在现有工程内设置优先级,保证CAN口的优先级低于Frame的优先级?