Part Number:AM2634-Q1
你好:
我们这边在调试 am263x ipc_notify功能时候出现以下问题,想请教一下怎么去解决:
问题描述:
1、在操作到第二步时候,看到核0的IPC寄存器READ_REQ对应的位被置1,但核0并没有进入中断;(补充:使用函数 vimTriggerSoftInt 测试过中断配置,可以触发进入,即中断配置是对的)
2、在进入中断后,需要清理中断标志位,具体是清哪一个寄存器?
参考SDK的例程,清标志位是清 write done
但实际上,被置位的是 read req ?
具体代码:
中断配置:
Vim_IntCfg intCfg;
intCfg.map = VIM_INTTYPE_IRQ;
intCfg.type = VIM_INTTRIGTYPE_LEVEL;
intCfg.intNum = MSS_CR5A_MBOX_RD_REQ;
intCfg.handler = IPC_CoreReqHandle;
intCfg.priority = VIM_PRIORITY_3;
vimRegisterInterrupt(&intCfg);
vimEnableInterrupt(MSS_CR5A_MBOX_RD_REQ);
intCfg.map = VIM_INTTYPE_IRQ;
intCfg.type = VIM_INTTRIGTYPE_LEVEL;
intCfg.intNum = MSS_CR5A_MBOX_RD_REQ;
intCfg.handler = IPC_CoreReqHandle;
intCfg.priority = VIM_PRIORITY_3;
vimRegisterInterrupt(&intCfg);
vimEnableInterrupt(MSS_CR5A_MBOX_RD_REQ);
intCfg.map = VIM_INTTYPE_IRQ;
intCfg.type = VIM_INTTRIGTYPE_PULSE;
intCfg.intNum = MSS_CR5A_MBOX_RD_ACK;
intCfg.handler = IPC_CoreReqHandle;
intCfg.priority = VIM_PRIORITY_3;
vimRegisterInterrupt(&intCfg);
vimEnableInterrupt(MSS_CR5A_MBOX_RD_ACK);
触发代码:(省略了写共享内存部分,本函数是写完共享内存后通知目标核读取数据)
void IPC_NotifyCoreWriteDown( uint32_t TarCore)
{
uint32_t mailboxBaseAddr, intrBitPos;
IpcNotify_SwQueue *swQ;
IPC_GetNotifyMailboxAddr(&TarCore, &mailboxBaseAddr, &intrBitPos, &swQ);
{
uint32_t mailboxBaseAddr, intrBitPos;
IpcNotify_SwQueue *swQ;
IPC_GetNotifyMailboxAddr(&TarCore, &mailboxBaseAddr, &intrBitPos, &swQ);
volatile uint32_t *addr = (uint32_t *)mailboxBaseAddr;
*addr = (1<<intrBitPos);
}
Cherry Zhou:
您好,我们已收到您的问题并升级到英文论坛寻求帮助,如有答复将尽快回复您。谢谢!
,
Cherry Zhou:
您好,
?? ? 说:1、在操作到第二步时候,看到核0的IPC寄存器READ_REQ对应的位被置1,但核0并没有进入中断;(补充:使用函数 vimTriggerSoftInt 测试过中断配置,可以触发进入,即中断配置是对的)
-请问是哪个内核正在写入write down寄存器? 请确保发送方内核正在写入内核专用的write down寄存器。 然后,接收器内核可以读取 REQ 寄存器,来了解是哪个内核触发了中断。
?? ? 说:2、在进入中断后,需要清理中断标志位,具体是清哪一个寄存器?
参考SDK的例程,清标志位是清 write done
但实际上,被置位的是 read req ?-中断标志位可通过写 REQ 寄存器来清零。 SDK 还会写入读取 REQ 寄存器以清除中断。