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/66AK2L06:EDMA 在开始对事件做出反应之前休眠30毫秒

Guru**** 2605015 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/583195/rtos-66ak2l06-edma-sleeps-for-30-msec-before-it-starts-to-react-on-events

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

工具/软件:TI-RTOS

您好!

我使用定制的 K2L 板通过 EMIF-16通过 EDMA3将16位数据从 CPLD 传输到 DDR3存储器、我的问题是 EDMA 或 DMA 完成中断需要一些"唤醒"、直到它开始全速工作。

除了传输开始时 EDMA 休眠30毫秒外、一切看起来都很好。 请参阅下面的示波器图:

黄色信号显示了从 CPLD 到 C66 DSP CPU 的事件(GPIO 10)。

蓝色信号(GPIO 9)显示何时执行 DMA 完成中断。

紫色信号是 EMIF 读取信号。

绿色信号用于激活 CPLD 以执行其任务、进而导致黄色信号从 CPLD 中发出。

图中显示、当 C66 DSP CPU 启用绿色信号时、CPLD 会立即唤醒、EDMA 会从 EMIF-16读取一个信号。 然后它停止工作30毫秒。 为什么??? 唤醒后、它不再睡眠。 它可以继续工作几个小时。

在启用绿色信号之前、已配置 EDMA 及其中断、之后不再对其进行修改。 启用绿色信号后没有什么特别的发生、相同的传输应一直持续到 CPU 最终禁用绿色信号为止。

DMA 参数

OPT:0x80112004

SRC:0x34000080

AB-CNT:0x000C0002

DST:0xA0000180

BIDX: 0x00200040

链接重新加载:0xFFFFFF0000

CIDX:0x00020000

C-CNT:0x00000010

DMA 完成会触发一个中断、该中断会更新目标地址并重新启用传输。 每个事件进行12个16位数据传输、每个绿色信号脉冲重复16次。 在上面的示波器图中看不到这种情况(脉冲在屏幕上彼此太近)、但我更仔细地看了一下、就证明了这种情况是正常的。

我已经尝试调整 HWI 中断优先级和 SYS/BIOS 任务优先级、但它们没有帮助。 没有其它可取代 EDMA 完成 ISR 的有效中断。 我还尝试删除 EDMA 事件丢失中断和 CC 错误中断。 没有影响。

我尝试在不同频率下提供事件:100Hz、300Hz、1kHz、10kHz 和40kHz。 睡眠时间始终相同:30毫秒。

我在代码中设置如下任务和中断:

进行 EDMA (使用 EDMA3 LLD、TI 的驱动程序)、GPIO、CPLD 和 EDMA3中断(完成、事件丢失、cc 错误)所有设置的主任务。

STACKSIZE = 0x2000;
优先级= 0;//最初为5

运行所有非时间关键型功能的空闲循环。 目前、它是空的、什么也不做。 最初、它作为永无休止的 while 循环包含在主任务中。
idleFxns[0]="&mainTask";

EDMA 完成中断是一个自动具有最高优先级的 HWI 任务、对吧? 我像这样设置中断:

   CpIntc_dispatchPlug (40、ISR_handler、0、true);
   CpIntc_mapSysIntToHostInt (0、40、68);
   CpIntc_enableHostInt (0、68);
   EventCombiner_dispatchPlug (26、(ti_SYSBIOS_family_c64p_EventCombiner_FuncPtr) CpIntc_Dispatch、68、true);
   EventCombiner_enableEvent (26);

40 = CIC0 EMDMACC_0_TC_2_INT、EDMA 事件 18 (GPIO 10)在 EDMA3 LLD 封装中包含的"ccXferCompInt"数组中分配给该事件。

26 = C66 CorePac 主中断 CIC_OUT68_PL_10_MUL_N

"ISR_handler"函数(伪语言):

ISR_handler (const EDMA3_RM_Obj * rmObj)

 将 GPIO 9设置为"1"、这在示波器中可见(蓝色信号)
   while (IPR &(1 << 18)){
        ICR =(1 << 18);
   }
   ESR =(1 << 18);
   更新 DMA 目标
   为未来事件做好 EDMA 准备

 将 GPIO 9设置为"0"、这在示波器中可见(蓝色信号)


所用工具的版本

编译器:TI v7.4.16

CCS:v6.1.1

XDCtools:3.30.00.60

SYS/BIOS:6.45.1.29 [6.42.2.29]   <-- 这是否意味着该项目最初是使用较新版本构建的,但该 PC 上只安装了6.42.2.2.29? 这是否会有这样的效果?

IPC:3.35.01.07

PDK:3.01.03.06

EDMA3 LLD:02.11.13.17

这是我所做配置中的错误、还是 SYS/BIOS 或 EDMA 控制器本身中的错误?

此致、

Ari

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

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

    是否有人调查此问题? 我们根本找不到任何解决方案...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    为什么这个问题完全被忽略????? 请回复!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    很抱歉,我错过了这个。 我们将对此进行研究。 反馈将发布在此处。

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

    我要问的第一个问题是造成拖延的原因是什么。 我怀疑这是外部器件和 EMIF 之间的通信、但只有30毫秒(这是毫秒的意思吗?) 太多、因此我建议如下:

    尝试从内部中断驱动 EDMA -例如、将 GPIO 连接为 EDMA 触发、并验证 GPIO 与 EDMA 启动之间几乎没有延迟(您可能需要使用两个 GPIO)。

    如果问题确实是界面的问题,我需要进一步了解 CPLD,即使由于某种原因,我们也可以考虑解决问题。

    我建议您查看 www.ti.com/.../sprabk5b.pdf -它提供了有关其他接口(而不是 EMIF)的信息、但您可以看到期望的值类型

    此致

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

    我们正与阿里合作处理这一问题,让我澄清几点。

    睡眠问题不是来自 CPLD。 同一版本的 CPLD 已在达芬奇处理器上使用4年、并已证明其功能齐全。

    原理是、我们有一个来自外部源(频率范围为0Hz 至40kHz)的'CLK_IN'信号。 这个'CLK_IN'输入被接至 GPIO 0。 此外、这个'CLK_IN'被配置为一个中断源。 在'CLK_IN'的 ISR 中、CPLD 被赋予一个'开始'、这使得 CPLD 启动 AD 转换周期并将16个'INT'脉冲输出到 GPIO 10。 然后将 GPIO 10配置为从 EMIFA 启动 EDMA3传输12个数据字(因此、使用一个"INT"、DMA 从 CPLD 读取12个字)。 然后重复此周期16次、CPLD 开始等待下一个"开始"。

    今天、我们再次使用几张卡进行测试、发现睡眠时间有时远超过30毫秒。
    问题出在 CLK_IN 的 ISR 中。 在配置所有内容后的启动中、周期正确启动–CLK_IN 的 ISR 处理正常、数据由 DMA 读取。 这里没有问题。 但是、经过几个成功的周期后、ISR 将完全停止运行、处理器进入睡眠状态30毫秒。 在此期间、处理器完全忽略进入 GPIO 0的所有 CLK_IN 脉冲。 然后、在休眠30ms 后、它再次唤醒、有时它会一直正常运行、而不会出现任何问题。 今天、我们发现处理器可能有几个30ms 的休眠时间、这意味着在休眠后、它会提供几个 ISR、但再次进入休眠状态达30ms。 此睡眠30ms–几个正常 ISR–睡眠30ms–正常 ISR 可以持续很长时间、我们记录的最长时间是标准化操作之前的180ms。

    很明显、问题出在 GPIO 0的 ISR 中。 在将该周期踢活后、会有很长的时间、直到处理器开始注意到 GPIO 0脉冲。 由于我们始终使用示波器监视此信号、因此我们对脉冲将进入 DSP 的情况有110%的把握。
    我们怀疑 RTOS 是问题的主要原因。 有关 DSP 中使用的软件版本、请参阅 Ari 的第一封邮件。

    此致、

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

    这种系统现在就像一辆旧车、车辆的灯光会变得很难阻挡、但最终在获得足够的速度后、就像一辆火车一样拉动。 我需要为此处理器调整新的插头和点火正时:-)

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

    我们进行了更多测试、并尝试了另一个 GPIO 输入(0和11)、但没有任何效果、问题是相同的。 还尝试了中断矢量 ID 4、5、6、7、15 -仍然保持相同的30ms 睡眠。 不同的中断优先级、相同的30毫秒睡眠。 有时、延迟是30ms 的倍数。

    删除了 SYS/BIOS 并使用 CSL 函数进行了测试-结果完全相同。 在这种情况下、SYS/BIOS 未启动。

    无论我们尝试什么、每次我们重新启动以收集数据时、始终会有30ms 的睡眠时间。

    让他人研究这个问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    为什么没有人回复此主题? GPIO 中断在 DSP 中启动后最初实际上不起作用-延迟可以是30ms、也可以是这些中断正常运行之前的倍数。

    看到您忽略支持请求的方式令人失望。 我将尝试寻找其他方法来获得帮助、此支持渠道不起作用。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Zeb

    我对这一帖子感到困惑、由于我没有您的系统、我无法重复该实验。  因此、我将帖子转发给我们的系统团队、看看他们的想法。

    个人而言、如果我能想到会导致30毫秒延迟(并最终完成)的事情、我会想到 CCS 本身等外部播放器。 众所周知、CCS 与硬件的响应时间很长、尤其是对于 printf。  但我认为您的代码中没有 printf (我希望它能解决问题)或断点 (这就是为什么我永远不相信从断点开始的循环中第一次有时间量度- CCS 需要很长时间才能发送消息)

    请稍等片刻。    我们希望找到合适的答案

    此致

    已运行

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

    感谢您的回复! 我们快速检查了一下是否有 printf,结果是... 我们进行了一个非常快速的测试、它看起来完全不同、没有任何延迟。 我必须承认,我们在这方面感到“有点”愚蠢——在一个愚蠢的错误上制造了一个大的混乱。 明天我们将更仔细地进行测试、并在此处报告结果。 无论如何、printf 完全是代码执行部分中的其他部分。

    因此、最初看起来不错、但我们明天会报告、只是为了确认 printf 是问题所在。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我很开心(除非明天测试后仍有问题、否则我会很高兴)

    已运行