This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:Code Composer Studio
我尝试将消息队列从 CM 发送到 CPU1。 CM 看起来已成功发送消息队列。 但 CPU1中的中断不会触发。 以下 是两个内核的伪代码。 您能建议缺少什么吗? 谢谢。
在 CM main()中:
IPC_clearFlagLtoR (IPC_CM_L_CPU1_R、IPC_FLAG_ALL);
IPC_initMessageQueue (IPC_CM_L_CPU1_R、&messageQueue、IPC_INT0、IPC_INT0);
IPC_SYNC (IPC_CM_L_CPU1_R、IPC_FLAG31);
IPC_sendMessageToQueue (IPC_CM_L_CPU1_R、&messageQueue、IPC_ADDR_correction_enable、&TxMsg、IPC_Blocking_call);
while (1);
在 CPU1 main()中:
IPC_clearFlagLtoR (IPC_CPU1_L_CM_R、IPC_FLAG_ALL);
IPC_initMessageQueue (IPC_CPU1_L_CM_R、&messageQueue、IPC_INT0、IPC_INT0);
IPC_registerInterrupt (IPC_CPU1_L_CM_R、IPC_INT0、IPC_ISR1);
IPC_SYNC (IPC_CPU1_L_CM_R、IPC_FLAG31);
while (1);
在 CPU1中、
void IPC_ISR1()
{
IPC_readMessageFromQueue (IPC_CPU1_L_CM_R、&messageQueue、IPC_ADDR_correction_enable、&RxMsg、IPC_NonBlocking_call);
IPC_ackFlagRtoL (IPC_CPU1_L_CM_R、IPC_FLAG0);
}
我在调试模式下运行了两个内核。 我在 CM 中的 IPC_ISR1()内设置一个断点。 进入无限 while 循环后、CPU1中的标志 PIEIFR11.INTx9为0。 在 CM 中运行行 IPC_sendMessageToQueue()后,我检查了 PIEIFR.INTx9并发现该标志已设置。 但是、ISR 内的断点没有停止。 PIEIFR11.INTx9是 CMTOCPUxIPCINTR0中断的标志寄存 器、我认为该 IFR 标志对应于 IPC_FLAG0。 你能提供什么建议吗?
谢谢。
Andy、
您是否在 CPU1 (C28x)代码中启用 PIE 中断(INT1.INT13)和全局中断?
此致、
Vivek Singh
必须单独启用全局中断。 以为 Interrupt_enable()函数将启用全局中断,但它不启用。 如果已启用 INT、它将重新启用 INT。
现在、我能够通过从 CM 发送队列消息来触发 CPU1中的 INT。
在 ISR 例程中运行 IPC_readMessageFromQueue()时遇到另一个问题。 在进入函数之前、传递到函数的参数看起来不错、例如 IPC_CPU1_L_CM_R 和 messageQueue2.GetBuffer。 GetBuffer 的地址位于 IPC 消息缓冲区 CMTOCPURAM 0x038000的正确地址。 请参阅随附的图片:
一旦我进入 IPC_readMessageFromQueue(),参数的值/地址就会变得混乱。 例如 IPC_CPU1_L_CM_R 变为-22004、messageQueue2.GetBuffer 的地址变为0x00。
您是否知道导致这种情况的原因? 谢谢。
Andy、
您已将上一个帖子标记为已解决。 这是否意味着您能够找到问题并解决问题?
此致、
Vivek Singh
是的。 注意到 C28内核需要 __interrupt void 关键字,但 Cortex 内核不需要。