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.

[参考译文] TMS320F28386D-Q1:IPC 中断设置和清除标志

Guru**** 2694585 points

Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1578219/tms320f28386d-q1-ipc-interrupts-set-and-clear-flags

器件型号: TMS320F28386D-Q1
主题: C2000WARE 中讨论的其他器件

您好!

我正在根据 SDK 使用自己的 IPC 消息队列库(唯一的区别是,为了实现消息队列数据,内核会交换放置的地址并获取缓冲区,这样才更安全)。

然后、当我开始对我的应用程序施加一些压力时、CPU1 开始在一段时间后停止接收中断。 我设法重现错误并读取 CPU1 上的寄存器:  

这些寄存器 (IPCSTS.IPC1 = 1、PIEIFR.INTx10 = 0) 指示 CPU1 缺少 Acknolegge 操作、其他配置在正常工作时几乎相同。

我的中断代码:

我每次中断都会确认标志、因此我想知道这个问题是同时设置 SET(在 CM 侧)和 ACK(在 CPU1 侧)寄存器交互的结果吗? 我已经测试过在设置发送消息到队列函数之前清除标志、这非常有效、但在 SDK 的库中、该函数只设置标志。 是否有任何关于这些 Resgisters 行为的文档?

此致、

Ramon。

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

    尊敬的 Ramon:

    您的图像在论坛帖子上不可见。 请重新上传它们。

    您能否提供有关应用程序中添加的应力的更多信息。 您如何向系统增加应力? 您能否确认您正确确认并清除了标记。

    此致、

    Ozino

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

    尊敬的 Ozino:

    我已重新发布图片、请查看。

    我提到的“压力“类似于每秒 200 条消息、但这条消息会出现、因此时间间隔不会相同。

    我相信我正在正确清除标志、因为系统可以正常工作一段时间、但在一段时间后 CPU1 停止接收消息、对我来说似乎与设置这些寄存器 ack 和 set 的时序有关。 如果您有任何有关 ACK 和 SET 寄存器行为的文档非常有用、例如 ACK(CPU1 内核)和 SET(CM 内核)同时设置外设的行为方式?

    感谢您的指导。

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

    尊敬的 Ramon:

    感谢您的更新。

    我建议查看 https://software-dl.ti.com/C2000/docs/C2000_Multicore_Development_User_Guide ccup/ipc_communication.html# 、具体而言是第 4.3、4.4 节、以确保您正确地确认中断。  

    您能否根据 IPC C2000Ware 中提供的示例确认是否构建了应用?

    查看上述文档后、请告诉我。

    此致、

    Ozino

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

    尊敬的 Ozino:

    感谢您的文档,我认为我发现问题 4.3 步骤 3 指出:

    确保 IPCFLG 寄存器中的相应位尚未设置。 Driverlib 函数:ipc_isFlagBusyLtoR。

    因此很可能是这样、我会将此步骤添加到我的库中、但唯一的疑问是、driverlib 库一旦没有执行同样的步骤、就不会出现此问题?

    SDK 代码:


    bool IPC_sendMessageToQueue(IPC_Type_t ipcType,
                               volatile IPC_MessageQueue_t *msgQueue,
                               bool addrCorrEnable, IPC_Message_t *msg, bool block)
    {
        //
        // Check for arguments
        //
        ASSERT(msgQueue != NULL);
        ASSERT(msg != NULL);

        uint16_t writeIndex;
        uint16_t readIndex;
        bool ret = true;

        writeIndex = *(msgQueue->PutWriteIndex);
        readIndex  = *(msgQueue->PutReadIndex);

        //
        // Wait until Put Buffer slot is free
        //
        while(((writeIndex + 1U) & IPC_MAX_BUFFER_INDEX) == readIndex)
        {
            //
            // If designated as a "Blocking" function, and Put buffer is full,
            // return immediately with fail status.
            //
            if(!block)
            {
                ret = false;
                break;
            }

            readIndex = *(msgQueue->PutReadIndex);
        }

        if(ret != false)
        {
            //
            // When slot is free, Write Message to PutBuffer, update PutWriteIndex,
            // and set the CPU IPC INT Flag
            //
            msgQueue->PutBuffer[writeIndex] = *msg;

            if(addrCorrEnable)
            {
                msgQueue->PutBuffer[writeIndex].address -=
                    IPC_Instance[ipcType].IPC_MsgRam_LtoR;
            }

            writeIndex = (writeIndex + 1U) & IPC_MAX_BUFFER_INDEX;
            *(msgQueue->PutWriteIndex) = writeIndex;

            IPC_setFlagLtoR(ipcType, msgQueue->PutFlag);
        }

        return(ret);
    }


    感谢您的指导、

    Ramon。

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

    尊敬的 Ramon:

    我将这篇文章转发给 driverlib 团队以进行进一步评论。

    此致、

    Ozino

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

    尊敬的 Ramon:
    很抱歉、延迟的回复。
    我来测试 driverlib 示例并恢复。

    此致、
    Samritha

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

    尊敬的 Ramon:

    很抱歉、您稍后的回复、您是否仍需要支持?

    此致、

    Aj Favela.  

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

    尊敬的 AJ Favela:

    这是一个错误报告。 由于必须同时对两个寄存器执行写入操作、因此很难重现该问题。 正如我提到的、我已经在自己的库中解决了这个问题、但我担心 DriverLib 中可能存在一个错误、或者我可能会误解某些内容。

    能否请您澄清当 ACK 和 SET 标志同时设置为 1 时 IPC 的预期行为? 根据我的观察、当 IPC 标志为高电平并且 ACK 和 SET 标志均已设置时、IPC 标志保持有效。 但是、由于中断中清除了标志、因此中断不会再次触发。 文档指出在再次设置 IPC 标志之前应检查该标志、但此检查似乎在 DriverLib 中不存在。

    非常感谢您提供的任何澄清。

    此致、
    Ramon