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.

[参考译文] RTOS/TMS320C6748:EDMA3事件组合器中断只触发一次

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/652993/rtos-tms320c6748-event-combiner-interrupt-firing-only-once-for-edma3

器件型号:TMS320C6748
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

代码生成工具7.4.23

SYSBIOS 6.46.2.47

EDMA3LLD 2.12.0

定制板

那么、这里是发生的情况。 我们将调用 hEdma[0]= edma3init (0、&result);以初始化 EDMA3、并由此提供带有事件组合器和中断的设置。 我刚刚开始使用 EDMA3来使用我们的 McBSP 设置。 我觉得一切都设置正确、因为 EDMA3会进行通道排序、并且会在乒乓缓冲器中正确连接、因此看起来就像这样。 它不间断运行、内存始终在移动。 我的问题是、我的回叫例程只会针对每个通道(Rx 和 TX)调用一次、然后再也不会调用。

我请求的主渠道如下:

uint32_t MemcpychId = EDMA3_DRV_HW_CHANGE_EVENT_5;
uint32_t TCC = EDMA3_DRV_TCC_ANY;

/*发送*/
结果= EDMA3_DRV_requestChannel (hEdma[0]、&MemcpychId、&TCC、(EDMA3_RM_EventQueue) 0、&EMDMAMCBSP1Txcallback、 null);

请求的链路通道如下所示:

uint32_t MemcpychIdtemp = EDMA3_DRV_LINK_CHANNEL;
TCC = EDMA3_DRV_TCC_ANY;

结果= EDMA3_DRV_requestChannel (hEdma[0]、&MemcpychIdtemp、&TCC、0、&EMDMAMCBSP1Txcallback、 null);

因此它们都具有相同的回调函数。 它们都为 TCINT 初始化

结果= EDMA3_DRV_setOptField (hEdma[0]、MemcpychId、EDMA3_DRV_OPT_FIELD_TCINTEN、EDMA3_DRV_TCINTEN);

结果= EDMA3_DRV_setOptField (hEdma[0]、McBSP1TxParamTable[count]、EDMA3_DRV_OPT_FIELD_TCINTEN、EDMA3_DRV_TCINTEN);//在链路通道的环路内

当我尝试将事件组合器直接用于 McBSP RRDY 和 XRDY 中断时、这是一个与事件组合器类似的问题。 它将触发一次中断、然后再也不会触发中断。 到目前为止、处理 McBSP 中断的唯一方法是直接在 HWI 模块中设置中断。  

我的系统 IER 显示已启用正确的中断、GIE 已启用、EER 显示已启用事件。 我的 IFR 没有显示任何内容。

事件组合器是否无法处理类似中断? 我知道它适用于基本的存储器副本、而 EDMA3没有问题、并且我已经将它用于其他不像 UART 和 LCD 控制器那样频繁触发的中断。

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

    我已通知 RTOS 团队。 他们将直接在此处发布反馈。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    因此、我在任何文档中都找不到任何相关内容(可能我在找错位置?) 但是、似乎一旦 EDMA 传输发生、中断就会被清除、并且看起来所有 EDMA3中断都只是单次触发。 对吗? 解决此问题的方法(通过试错)是通过以下命令在中断中重新加载 TCC:

    EDMA3_DRV_setOptField (hEdma[0]、TCC、EDMA3_DRV_OPT_FIELD_TCC、TCC);

    这是重新加载中断的正确方法吗? 我不需要这么做吗? 重新加载中断的正确方法是什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Cobsonchael、

    尽管我无法告诉您要使用的 API 确切位置或示例所在的位置、但我知道 EDMA3模块及其如何与 CPU 交互。

    过去、当您必须直接使用 HWI 模块设置 McBSP 中断时、您有一个 EDMA 调度程序例程、该例程将由您使用的 EDMA3模块的单个中断触发。 调度员必须决定需要服务哪些 IPR 位、并负责清除该 IPR 位并调用服务例程。

    现在、当您尝试使用事件组合器时、还需要考虑一个更高级别的逻辑。 同一个调度程序必须通过 IPR 位进行解析、以查找处于活动状态且需要服务的调度程序。 如果设置了一个或多个位0-3、则事件组合器起作用、必须通过额外级别的解析和清除来处理。 如果 ECM 位的清零操作不能正确且完全完成、那么它可能永远不会触发 DSP 的另一个中断。

    当您进入不再发生中断的状态时、您可以查看 ECM 中的位。 如果在 ECM 寄存器中为 DMA 事件设置了未屏蔽的位、但未发生中断、则很可能 ECM 未被正确清除。 EDMA3用户指南介绍了它的工作原理和需要执行的操作、我强烈认为 LLD 具有示例和 API 来处理 ECM 的使用、 但我更倾向于直接注册用户、而不是电源软件专业人士。 抱歉。

    或许 RTOS 团队中的一位非常了解 LLD 的人能够将您指向那里。 或者、这可能会让您对示例和文档中的查找位置或查找内容有一些想法。

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

    我已切换到 EDMA 的正常 HWI 模块(完全无事件组合器)、但仍然只有单次中断、除非我重置 TCC。 希望有人能很快过来、让我知道我做了些什么错。 我正在使用一个中断调用 lisrEdma3ComplHandler0 eventID 8。 我看了 McBSP EDMA 示例、它看起来不像回调函数执行任何针对 EDMA3的特殊操作、除了可能清除错误位
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    EDMA3_DRV_setOptField 函数调用不应影响中断、这是没有理由的。 它所做的只是对.opt 寄存器进行读/修改/写操作、在您的情况下、该寄存器将读写相同的读值。 这不会清除任何中断位。

    由于 McBSP 使用非 ECM 方法、您现在的表现与以前相比有哪些不同? 具体而言、查看哪个 ISR 函数直接分配给 HWI、并查找测试和清除 IPR 位的位置。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当中断发生时、TCC 会从通道中清除。 重新加载可能与中断标志无关、但在传输完成后、它确实会为通道提供一个 TCC 编号来处理。 我不理解的是、为何在完成传输后清除 TCC。

    我认为您理解不正确。 我们之前从未将 EDMA 用于 McBSP、我们直接将 HWI 模块用于 RRDY 和 XRDY 事件。 这是我们第一次使用针对 McBSP 的 EDMA

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我明白了。 当我请求通道时、我认为如果我将"TCC "变量设置为我请求的通道 TCC (4和5)、我认为它会自动将该 TCC 分配给该通道、并且在链接时、它会自动重新加载 TCC 字段。 这是错误的。 我必须在链路参数的选项中手动设置 TCC 以进行计数。 它现在每次都能正常工作
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你是对的、我完全误解了过去 McBSP 的使用。

    这也意味着您在我不是专家的领域、EDMA3 LLD 以及如何使用它。 我知道 EDMA3 LLD 包含一个资源管理器、该资源管理器还包含一个中断管理器。 当您通过 LLD 调用注册回调函数时、它会将该 TCC 和回调函数放入发生中断时使用的表中。 您必须单独(我认为)将中断管理器的调度函数分配给将要处理 EDMA3中断的 HWI。 该调度功能将(应该)负责清除您的 IPR 位。

    当然、我们在 Processor SDK 中有一个示例、展示了如何设置 McBSP 以将其与 EDMA3和中断配合使用。 您是否正在使用 Processor SDK?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴听到您解决了这个问题。 很棒的工作!

    我的上述答覆是在你说你已解决问题后才作出的,所以基本上是无用的。 您使用的所有部件都正确、很显然、因为您现在可以使用它。 感谢您告知我们并将您的帖子标记为答案!

    对于带有 McBSP 等流端口的 DMA 的大多数使用、EDMA3参数将设置为使用3个参数集:与 DMA 通道直接关联的主参数集、'ping'链接参数集和'pong'链接参数集。 通常、主和"ping" pset 将相同、其链接字段指向"pong" pset;"pong" pset 将其链接字段指向"ping" pset。

    此配置将使您永远不会与 EDMA3重新启动交互。 您只需响应完成中断、即可关闭并处理刚刚输入的数据。 有些用户希望 ping 和 pong 端具有不同的 TCC、以便他们确切知道使用的数据-该方法需要2个回调函数、这是完全相同的、但发送到处理算法的缓冲地址除外。

    您是在使用乒乓系统、还是从 ISR 内部重新启动 DMA? 提出要求的主要原因是某些 LLD 例程(如 EDMA3_DRV_setOptField)非常耗时、因为该函数内需要读取/写入寄存器。 如果有更多这样的情况、时间会非常快地累加、因此必须最大程度地减少 ISR 中的完成和使用时间。

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

    感谢 Randy 的跟进

    我正在使用一种带有链接参数集的乒乓方法。 我现在在设置中设置 TCC、而不是 ISR。 如果我只是执行 getParam->setParam 来复制通道,我可能不会有这个问题,但是由于这是我第一次尝试 EDMA 和 McBSP,我想先显式使其工作,然后在工作时进行优化。 我在 ISR 内部唯一要做的是 GetParam 来查看在 param 中加载了哪个缓冲区、因此我知道在发出 SWI 之前用哪种方法设置我的 pingpong 变量。 有没有更好的方法来算出乒乓模式?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们的大多数乒乓示例都使用全局/静态变量、该变量在每次调用 ISR 时被切换。 这种方法简单快捷、但它是开环、可以与 DMA 通道不同步。 但是、不同步意味着丢失中断或 EDMA3事件、无论软件在做什么、这都是一个巨大的问题。

    只要您读取一个诸如参数甚至 IPR 的外设寄存器、您就可以依赖它、它需要花费20多个 DSP 时钟周期。 因此、如果可能、最好避免使用其中的任何一种。 我可以想到的唯一闭环方法是上面提到的示例、在该示例中、ping 和 pong 侧会有不同的 TCC、这样 ISR 就可以准确地知道使用哪些数据。

    如果回调函数可以传递一个参数,则可以使回调函数为 SWI_POST(),并使该参数为 ping 或 pong SWI 名称。 或者、如果你想使用一个任务而不是一个 SWI、你也可以对信标执行同样的操作。