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.

[参考译文] TMS320F28377D:当 IPCSET 和 IPCACK 设置为近距离间隔时、似乎没有发生 IPC 中断。

Guru**** 2873750 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1633475/tms320f28377d-it-seems-ipc-interruption-do-not-occur-when-ipcset-and-ipcack-are-set-at-close-intervals

器件型号: TMS320F28377D

你好

我会遇到这样一个情况:在几乎同时设置 IPCSET 和 IPCACK 后、IPC 中断不会生成。 发生这种情况时、IPCFLG 为高电平、但未发生中断。 下面是我的程序的顺序。

CPU1 将 IPCSET 设置为高电平、并且 IPCFLG 变为高电平。

一段时间后、CPU1 再次将 IPCSET 设置为高电平、同时 CPU2 在 IPC 的 ISR 中将 IPCACK 设置为高电平。

然后、IPCFLG 保持高电平、未发生 IPC 中断。

会发生什么情况? 我是否需要采取任何措施来避免这种情况?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Hi Toshi San,

    您遇到了竞争条件。 IPC 中断机制如所示 下降沿触发 、这意味着仅在上生成中断 0→1(低电平到高电平)转换 位的最小值。 当 CPU1 在 CPU2 在其 ISR 中写入 IPCACK 的确切时间写入 IPCSET 时,标志在再次被驱动为高电平之前永远不会干净地转换为低电平 — 因此不会发生上升沿,不会触发中断,并且 IPCFLG 保持在高电平。

    以下是精确的故障序列:

    步骤
    CPU1
    CPU2
    IPCFLG 状态
    中断?
    1.
    设置 IPCSET
    0→ 1.
    是(干净的上升沿)
    2.
    再次设置 IPCSET
    同时设置 IPCACK
    保持 1. (无低电平转换)
    否(无上升沿)

    同时写入意味着确认和新设置冲突—标志永远不会变为低电平、因此边沿检测器永远不会看到新的触发。

    修复了 CPU1 必须在 Re 设置之前轮询 IPCFLG

    解决方案很简单: CPU1 必须等待 IPCFLG 变为低电平、然后再发出新的 IPCSET 。 低电平的 IPCFLG 确认 CPU2 已通过 IPCACK 确认先前的事件、同时清除 IPCFLG(CPU1 的视图)和 IPCSTS(CPU2 的视图)。 只有这样、下一个 IPCSET 才会产生干净的 0→1 转换并触发中断。

    建议的协议:
    // CPU1 端—发送新的 IPC 命令之前
    while (IPC_isFlagBusyLtoR (IPC_CPU1_L_CPU2_R、IPC_FLAG0));//轮询、直到 IPCFLG 变为低电平
    IPC_setFlagLtoR (IPC_CPU1_L_CPU2_R、IPC_FLAG0);//现在可以安全设置
    您能否在系统中实现这种轮询并尝试一下?
    谢谢、
    IRA
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好 Ira

    感谢您的回答。 我理解为什么会发生这种情况、我在设置之前实施我的程序以轮询 IPCFLG。 正常生成 IPC 中断。  

    此致

    Toshi