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.

[参考译文] TMDSECATCNCD379D:CPU 中断(例如 PWM、外部)是否会损坏 EMIF r/w 运行?

Guru**** 2587365 points
Other Parts Discussed in Thread: CONTROLSUITE, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/875174/tmdsecatcncd379d-can-cpu-interrupt-e-g-pwm-external-corrupt-emif-r-w-operation

器件型号:TMDSECATCNCD379D
Thread 中讨论的其他器件:controlSUITEC2000WARE

你(们)好。

我们仍在努力将 EtherCAT 从站堆栈代码(SSC)与我们的电机伺服控制相集成。

SSC 有2个部分:
(1)接收来自 EtherCAT 从站控制器(ESC)的中断以进行循环数据交换
(2)主代码中用于一次数据传输的无限循环函数。
这两个器件都将通过 EMIF 与 ESC 进行通信。

我们担心以下情况。 假设用于异步 RAM 的16位 EMIF、如果(2)是 r/w 操作的一半(例如、使用读取 int 数组以进行循环)、并且有来自(1)的中断。

我的问题是:
(a)(2)的 r/w 是否会被暂停或损坏? (腐败意味着、当必须具有原子访问或操作的 SPI r/w 将失去意义时)
(b)将优先处理(1)或(2)中的哪个 R/W 操作?

我的猜测:
(猜 a)不会损坏、CPU 将完成当前的16位 r/w、挂起(2)、运行(1)的 ISR、然后使用(2)中的内容恢复
(b 的猜测)根据(a 的猜测)、CPU 将优先(1)的操作
我猜是基于 TMS320F2837xD 参考手册和这篇文章 e2e.ti.com/.../685593。 我在这篇帖子中提出了一些非常类似的问题、但它位于同步 RAM 上。 我想知道异步 RAM 的工作方式是相同的吗?

我们还担心、因为在 SSC 的硬件抽象层中、针对(1)和(2)至 ESC 的 r/w 函数是分开的。 (2)的所有 R/w 函数将在实际操作之前首先禁用中断。 这对于 SPI 来说是合理的、但如果(a 的猜测)和(b 的猜测)是正确的、那么为什么相同的处理 EMIF 呢?

此外、我还考虑使用 CLA 或 DMA。 但我感到有以下困难、如果我错了、请纠正我的问题:
(CLA) CLA 的程序需要占用整个 LSx RAM、但数据可以与其他 LSx RAM 中的 CPU 程序/数据混合。 但我们已经在 LSx RAM 上运行低电平。
(DMA) DMA 只能访问 GSx RAM、但 CPU 的程序和数据驻留在 LSx RAM 中。 因此、即使 DMA 执行 EMIF r/w、也需要在 GSx RAM 上有一个缓冲器。 CPU 需要执行另一个 r/w 本身来将结果复制到 LSx RAM 中/从 LSx RAM 中复制

基于我对(CLA)和(DMA)的关注、我还考虑通过以下方式将链接 cmd 文件中的某些部分移动到 GSx RAM:
(CLA 的 consq)可以为 CLA 的程序备份 LSx RAM
(用于 DMA 的 consq) DMA 可以直接访问 CPU 程序的数据吗?
这是可行的吗? 即使如此、是否会产生任何不利影响(例如、较慢的性能)? 由于在 controlSUITE 中、任何一个链接命令文件都不使用 GSx RAM (除了 DMA 示例)、这似乎浪费了这么大的存储块。 另外、我还在对链接 cmd 文件中不同段的含义进行硬解密、在哪里可以查找相关信息?

谢谢阅读。 任何答覆均可:D

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

    您好!

    [引述]我的猜测:
    (猜 a)不会损坏、CPU 将完成当前的16位 r/w、挂起(2)、运行(1)的 ISR、然后使用(2)中的内容恢复
    (b 的猜测)根据(a 的猜测)、CPU 将优先(1)的操作[/引述]

    您的理解是正确的。

    [引用]我们也很担心、因为在 SSC 的硬件抽象层中、针对(1)和(2)至 ESC 的 R/W 函数是分开的。 (2)的所有 R/w 函数将在实际操作之前首先禁用中断。 这对于 SPI 来说是合理的、但如果(a 的猜测)和(b 的猜测)是正确的、那么为什么相同的处理 EMIF 呢? [/报价]

    我不理解这个问题。 您是否在问 EMIF 为什么不采用相同的处理?

    [引用](CLA) CLA 的程序需要占用整个 LSx RAM、但数据可以与其他 LSx RAM 中的 CPU 程序/数据混合。 但我们已经在 LSx RAM 上运行低电平。
    (DMA) DMA 只能访问 GSx RAM、但 CPU 的程序和数据驻留在 LSx RAM 中。 因此、即使 DMA 执行 EMIF r/w、也需要在 GSx RAM 上有一个缓冲器。 CPU 需要执行另一个 r/w 本身来将结果复制到 LSx RAM 中/从 LSx RAM 中复制[/引用]

    没错。

    [引用]基于我对(CLA)和(DMA)的关注、我还考虑将链接 cmd 文件中的某些部分移动到 GSx RAM、方法是:
    (CLA 的 consq)可以为 CLA 的程序备份 LSx RAM
    (用于 DMA 的 consq) DMA 可以直接访问 CPU 程序的数据吗?
    这是可行的吗? [/报价]

    是的、从器件架构的角度来看、这是可能的、但在给定的应用中、需要评估如何在 CPU/CLA 和 DMA 之间共享数据、并应使用适当的方法。

    [引述]即使是这样、也会有任何负面影响(例如、较慢的性能)? 由于在 controlSUITE 中、任何一个链接命令文件都不使用 GSx RAM (除了 DMA 示例)、这似乎浪费了这么大的存储块。 另外、我还在对链接 cmd 文件中不同段的含义进行硬解密、在哪里可以查找相关信息? [/报价]

    我看不到任何不利影响、但同样、需要由用户针对特定应用对其进行评估。 C2000Ware 中提供的链接器 cmd 文件仅供参考、用户需要根据自己的需要修改此文件。 您可以 在此链接中获取有关 C2000链接器 cmd 文件的更多信息

    此致、

    Vivek Singh

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

    您好、Vivek、

    非常感谢您的回复! 知道我的猜测是正确的真的让我很放松。

    关于第二个问题、代码片段可能有助于更清楚地解释它。

    例如、在 c 文件 etherCAT_slave_C28x_hal.c 中、对于(2)中使用的写入函数、SPI 版本如下所示:

    void esc_writeWordNonISR (uint16_t wrdata、 uint16_t offset_addr)
        Dint;
        esc_writeSPI (offset_addr、 wrdata、 0x02);
        EINT;

    EMIF 版本如下所示:

    void ESC_writeWordNonISR (uint16_t WordValue、 uint16_t Address)
        Dint;
        ((((volatile uint16_t *) PESC)[((Address)>>1]]) = (WordValue));  // EMIF 写入
        EINT;

    在操作开始前、两个都禁用中断(DINT;)。 这对 SPI 来说是有道理的、但为什么 EMIF 如此呢?  

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

    您好!

    在本例中、我们希望在特定时间内完成 EMIF 写入、因此不想中断此过程。 我认为、更适合可预测的行为。

    我正在邀请 EtherCAT 专家对此进行确认。

    此致、

    Vivek Singh

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

    你好

    Vivek 说的是正确的。 禁用中断的读取/写入 API 需要与 Beckhoff 从站堆栈代码兼容。 这些 API 用于读取对时间非常敏感的数据、不能中断(例如:读取 SYNC0周期时间偏移量)。

    此致

    Chris

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

    谢谢 Vivek!

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

    感谢 Chris 的回复!

    如果禁用中断是强制性的、那么如何避免在非 ISR r/w (我在最初的帖子中提到的情况)期间丢失中断? 因为除了来自 ESC 的中断之外、我们还使用 PWM 中断进行电机控制、这是不可错过的

    我找不到有关 SYNC0周期时间偏移的任何信息。 u 是指 ESC 系统时间偏移(ESC 寄存器0x0920:0x0927)还是对象字典(OD) 0x10F8时间戳(ESC 系统时间的副本)(ESC 寄存器0x0910:0x0917)? 从这个意义上讲、我可以理解时间敏感的性质。 但在本例中、我们不会使用这些寄存器。

    我将尝试使用以下命令来证明可以删除禁用中断、如果错误、请纠正我的错误:

    在 SSC 中、(2)中的大多数 r/w 仅为一个字(16位)、CPU 将优先完成该字、然后切换至运行 ISR、从而保证其 r/w 速度。

    我唯一能找到的 R/w 大于16位的地方是(在->之后有理由):
    *对于初始化->初始化不会出现问题、因为中断尚未启动
    *对于 OD 对象0x10F8时间戳-> 0x10F8在我们的用例中未使用、它不会更新
    *对于邮箱 r/w ->不确定、从我在程序中读取的内容中、邮箱 r/w 可以是中断、因为 ESC 仅在缓冲区已满或读取最后2个字时开始交换数据?

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

    您不会错过中断。 重新启用全局中断后、您将收到 PWM 中断。

    正确的做法是、主循环代码(而不是初始化代码)中的实际读取/写入是16位的原子操作。 您可能能够从 EMIF API (而不是读取/写入块 API)中删除禁用/启用中断、并且仍然能够正常运行。 不过、这与从器件实现规范不同。 我建议至少运行 Beckhoff 一致性测试工具、以重新确认功能是否正常。  

    此致

    Chris

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

    感谢 Chris 的回复! 这是很好的了解!

    我已经阅读了有关技术参考手册的更多信息。 我想我现在 已经了解了你的意思、中断 不会错过、它将在 PIE 模块中挂起、直到 CPU 的中断被重新启用。

    当我们使用 SPI 时、这个禁用/启用中断给我们带来了很大的问题、因此我们现在在切换到 EMIF 时非常小心。  

    再次感谢 Vivek 和 Chris 的帮助。