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.

[参考译文] TDA2x:EDMA LLD requestChannel()问题/同一信道上的后续传输问题

Guru**** 2553450 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/609006/tda2x-edma-lld-requestchannel-problem-subsequent-transfers-on-the-same-channel-problem

我使用的是 Windows 7 x64、CCS 7.2.0.00013和 SYS/BIOS 6.50.1.12、XDCTools 3.50.0.10_core、EDMA LLD 2.12.0。 通过 XDS 调试探针连接到 TDA2xx 板。

在过去、我编写了一个简单的 memcpy 示例、该示例工作正常。 现在、我正在使用 EDMA 测试双缓冲、我有2个问题。

1) 1) EDMA3_DRV_requestChannel()调用出现问题,导致程序经常中止。 在测试中、我尝试请求两个通道、但即使第一个请求也失败。 这非常令人困惑、因为我有一个有效的 memcpy 测试、其中我只请求一个通道、并且它成功。 错误时刻的堆栈状态可在下面找到:

2) 2)有时我设法获取请求的通道时、在我的测试中、每个通道都有一个参数集、其中一个链接到另一个。 在两次传输之间、我只更改参数集中与 src 和 dst 地址相关的字段。 问题在于、如果不先删除该通道并再次请求、就无法在同一通道上开始后续传输。 如果我不这么做并再次开始传输、我的缓冲区会被打乱、执行会卡在 HWI_int0中。 我不知道为什么会发生这种情况。

提前感谢您。

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

    我已邀请一位专家发表评论。

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

    您好、Nik、

    您能否查看随软件包提供的示例、其中包含链接、链接等示例

    1.在 DSP 内核上运行时、您是否可以将 A15保持在自由运行模式、并测试您是否仍然看到崩溃?

    2.通过链接、您将能够在第二个通道上触发传输、传输将根据为第二个通道配置的参数进行。

    我不知道如何更改参数中的 src 和 dst 地址。

    您能否发布两个通道的参数值并说明您计划如何传输数据?

    此致、
    Prasad

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

    Prasad、您好!

    我已经检查了随该封装提供的样片、它工作正常。 但是、我正在使用我在 此处获得的 API 编写我自己的示例:gforge.ti.com/.../。 我是这个领域的初学者、这个 API 非常干净、简洁且易于使用。

    在上述链接的每个示例中都有一个"edma.c"、其中包含 EDMA 配置的函数、启用传输、等待传输完成、释放资源等、具体针对每个示例实施。

    我尝试实现一个乒乓缓冲示例,与此处介绍的示例类似(从第41页) www.ti.com/.../spra636a.pdf 。 我的示例和这个示例之间的区别在于、我有一个2-D 数组填充了输入数据、另一个用作输出、因此每次传输前都需要修改源地址 (我知道这本可以做得更好、但这是我当前的实施方案)。 我有2个 ping (输入和输出)和2个 pong (输入和输出)缓冲器以及2个连接到另一个(一个用于输入、另一个用于输出)的 EDMA 通道、因此只需一个 CPU 触发器即可完成下一行的输入和上一个的输出。 在每次迭代中、每行与乒缓冲器的处理并行传输到乒(乓)缓冲器。 传输一行后、参数集耗尽、需要重新加载和修改、以便源是下一个输入行、目标是开关输入缓冲器(对于输入参数集)、与输出参数集类似。

    重新加载意味着使用上述附加修改将参数集链接到自己。 为此,我使用 了 EDMA3_DRV_setPaRAMField()函数,在该函数中,我设置2个参数集中的链接字段以指向自己。 这是我最初发布的第二个问题。 但是,当我使用 EDMA3_DRV_linkChannel()将与参数集关联的逻辑通道链接到自己时,一切都可以正常运行,而不会删除和再次请求通道,只需触发输入输出链中第一个通道的传输即可。 这是为什么?

    关于通道请求的第一个问题、我在 BIOS 配置中以非静态方式实例化信标、如下所示:

    void* semHandle;
    Semaphore_Params semParams;
    Semaphore_Params_init (&semParams);
    edma3OsSemCreate (1、&semParams、 信标(semHandle); 

    到目前为止、问题还没有再次出现。 我也不知道为什么会这样。

    我现在有另一个问题、我的实施中的下一步是将缓冲区放置在 L2 RAM 中、这是我通过在 BIOS cfg 中创建一个段、将其放置到 L2 RAM 中并将#pragma DATA_SECTION 用于我的缓冲区而完成的。 但是、EDMA3现在似乎根本没有接触到缓冲区(在缓冲区位于外部存储器之前)。 我已经检查了 CPU 是否可以访问缓冲区。 这是否与 EDMA 无法看到的 L2缓存中的地址有关? 我希望在这一问题上得到帮助。

    很抱歉这个长帖子、我只是想澄清我的示例、并提前感谢您。