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:EtherCAT Sync0抖动

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

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/584594/rtos-ethercat-sync0-jitter

Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

大家好、

我最近发现了 EtherCAT 同步上的不良行为。
我的配置如下:

Sitara ARM3359
- Code Composer Studio 版本 CCS 6.1.2.00015
-SYS/BIOS 6.45.01.29实时操作系统
- XDC 工具3.32.00.06
-编译器 GNU v4.4.8 (Linaro)
NDK 2.24.3.35
-SYSBIOS SDK 2.1.3.2
-德州仪器 ecat_appl应用 软件、带 beckoff path v5.11

我的 EtherCAT 帧的周期时间配置为500us。
我已启用具有次级周期的直流同步机:Sync0周期时间为62.5us/ Sync1周期时间为500us。

我已经对 Sync0抖动进行了多次测试,在这种配置中,这种测试应该非常少,而且重复结果很糟糕: 我的抖动是+- 10us,这对我们来说是可怕的!

有人能解释一下这种抖动,以及如何大幅减少抖动吗?
感谢你的帮助。

Laurence

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

    在您的电路板上、您连接到 OSC0 (XTALIN/XTALOUT 引脚)的晶体频率是多少?

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

    您好、Melissa、

    XTALOut (V11)/XTalIn (V10)上的频率为24MHz。

    我们在 RTC_XTALOUT (A4)上具有32.768kHz 的频率。

    是否有任何需要处理的问题?

    谢谢

    Laurence

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

    您好 Laurence、我在 以直流模式 运行 AM335x EtherCAT 应用的末尾找到了一张介绍如何测量抖动的 sketch。 我想知道这是不是您测量它的方法。 如果没有、请告诉我们您的抖动测试是如何工作的?

    谢谢、

    Paula

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

    实际上、我在自己的板上工作、它与 ICE v2板非常相似。
    遗憾的是、电路板上没有 synct0引脚、因此无法测量抖动、如 TI 文档中所述。
    因此、我们在 synct0 ISR 开始时激活了 Sitara 输出、并使用示波器进行了配置、以实现最大和最小的周期(假设为62.5us)。
    使用这种方法、我们将捕获节拍设置为54us、然后是70us (始终有一个小节拍和一个大节拍)。
    您能解释一下原因吗?
    非常感谢
    Laurence
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Laurence、

    您似乎主要测量此处的 SW ISR 抖动。 您将为处理器生成高 ISR 负载、仅用于测量。 但也应该有一些其他 ISR。。。 因此、您的同步 ISR 可能需要等待其他 ISR 完成。
    要测量硬件 Sync0时钟抖动、您实际上需要一个硬件引脚、因为结果预计为10s 或100s 的 ns、而不是10us。 您需要一个示波器来比较参考时钟和从器件时钟。

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

    你好,弗兰克!

    是的、我同意我只以这种方式测量 SW ISR 抖动。

    但是、出于我的项目兴趣、我希望该抖动尽可能小(在62.5us 的 Sync0周期时间上不是10us)。

    因此、我认为我已将最高优先级置于 Sync0 ISR 上:其他 ISR 无法中断它、并且软件抖动不能由中断引起。

    我创建了6个具有不同优先级的任务和1个 ISR (topZIsr)。

       Task_Params_init (&taskParams);
       taskParams.priority = 4;
       tsk1 = Task_create (Task1、&taskParams、NULL);

       Task_Params_init (&taskParams);
       taskParams.priority = 6;
       taskParams.STACKSIZE = 1512;
       taskParams.arg0 =(UArg) pruIcss1Handle;
       pdiTask = Task_create (PDItask、&taskParams、NULL);

       Task_Params_init (&taskParams);
       taskParams.priority = 8;
       taskParams.STACKSIZE = 1512;
       taskParams.arg0 =(UArg) pruIcss1Handle;
       sync0Task = Task_create (Sync0task、&taskParams、NULL);

       Task_Params_init (&taskParams);
       taskParams.priority = 8;
       taskParams.STACKSIZE = 1512;
       taskParams.arg0 =(UArg) pruIcss1Handle;
       syncta1Task = Task_create (Sync1task、&taskParams、NULL);
     
       Task_Params_init (&taskParams);
       taskParams.priority = 4;
       taskParams.STACKSIZE = 1512;
       ledTaskHnle= Task_create (LEDtask、&taskParams、NULL);

       Task_Params_init (&taskParams);
       taskParams.priority = 4;
       taskParams.STACKSIZE = 1512;
       axisMainTaskHalfn = Task_create (AxisMainTask、&taskParams、NULL);

       Hwi_Params_init (hwiParams);
       hwiFuncPointer =(Hwi_FuncPtr) TopZIsr
       hwiParams.priority = 9;
       hwiParams.enableInt = false;
       hwiTopZhnle= hwi_create (96、hwiFuncPointer、&hwiParams、NULL);// 96 est le numerro d'it
       Hwi_enableInterrupt (96);

    SYNC0优先级为8、这是最高优先级(实际上不能发生 TopZIsr)。

    因此、我认为没有其他 ISR 可以中断我的 SYNC0 ISR、并且抖动一点也不好!

    我忘记了吗? 是否有中断 SYNC0 ISR 的 ISR?

    谢谢、

    Laurence

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

    首先、所有任务和 HWI 优先级都不相关。 Hwi 是一个真正的 ISR、优先级取决于硬件、但可以进行配置。
    任务由 SW 调度。 任务不能中断 HWI。
    我假设您的系统中有更多 HWI、但无法看到它们。 您可以再次使用 ROV 获取更多详细信息。 同样、我建议 UIA 查看您的处理器随时间推移所做的工作。

    除此之外、根据经验、我们知道 RTOS 中的任务抖动已经在几个月的范围内。 这取决于高速缓存性能/设置。
    要尝试的一件事是将所有关键 ISR 和 OS 函数都集成到一个部分中。 希望这是一个小的(<32k)、可以锁定到 L2高速缓存的一个块中。 这会对抖动产生影响、因为现在、较慢的 DDR 访问不会影响调用时间。 由于其余的二级高速缓存仍有7个块、因此不应对整体性能产生太大的影响。
    类似地、您可以尝试将一些原本未使用的代码放入内部 SRAM 中。
    所有这些都是取决于具体情况的系统优化的一部分。 因此、我们只能尝试帮助...

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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉 Frank,我做了一次糟糕的操纵!
    所以,在我之前的消息(你没有)中,我告诉你:
    我已经了解了缓存的工作原理:事实上,我的缓存已经启用,似乎使用得很好! 我的计时已经得到改善。
    -我用 UIA 和 ROV 进行了测量,我看到有3个 HWI ISR 可以中断我的 synct0 ISR;特别是红色 ISR。
    -我看到这个 HWI 的优先级非常高(63)
    您能解释一下这些 HWI 中断是什么、我是否可以禁用它们或更改它们的优先级?
    -我在 UIA 中测量 sync0周期时间,找到89us!!!! 我认为这一巨大的周期时间是由于 UIA 分析造成的、对吗?

    可以帮帮我吗?
    非常感谢、
    Laurence
    PS:我已关闭缓存上的开机自检
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Laurence、

    实际上、在 AM335x 中、INTC "0"是最高的 IRQ 优先级。 但是、它还需要对嵌套 IRQ 进行特殊设置。 我不确定您的系统中是否已启用该功能。 在您提供的视图中、HWI 没有问题、因为它们看起来很短。

    需要很长时间的是 Sync0Task()。 这似乎需要很多 CPU 时间直到被挤占。 也许这有一个 while ()并且没有 task_yield ()或 task_sleep()?

    我也不理解您在这里进行的测量。 应将 xn 标记设置为任务的开始和结束。 在这里、看起来您正在测量一个周期。

    UIA 肯定不是这里的问题、因为它非常高效、只需在任务或 HIW 的开始和结束上花费很短的时间戳。 这些计算在调试 PC 上完成。 否则、您的所有任务看起来都需要很长时间。 当然、调试会产生一些影响、但这是无法避免的。 您可以稍后删除所有调试和 UIA 代码、然后仅使用硬件信号进行测量、以最终验证时序。

    但是,首先应该解决 Sync0Task()的问题。 它需要太多的计算能力(增加 CPU 时钟...) 或者在不释放 CPU 的情况下循环。 只要它真的是这里最低优先级任务、这可能是可以的。

    此致、

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

    您好 Frank、

    首先,我要感谢你的帮助。

    我曾与 UIA 合作过一些、我取得了一些成果:

    1. 在 timingsimple.jpg 文件中,我放置了一个使用简单程序生成的图,其中 Sync0_ISR()中没有调用用于计算的函数。

    在该图中、我们可以看到 synct0任务非常小(从2到6us):还有足够的时间来执行其他操作。

    我们还看到、正如我在 EtherCAT 配置中所要求的、我的 synct0的周期时间接近62us (62,5us)、我的 synct1 500us 和我的 PDI 500us。 但我们也可以看到 synct1被称为:71us 之前和53us 之后时 synct0上的大抖动!

    您能解释一下为什么会发生这种抖动吗?

    2.在 timingcomplet.jpg 文件中,我放置了一个使用复杂程序生成的图,其中,控制电机的实际函数在 Sync0_ISR()中被调用。

    在这张图上,我们可以看到 synct0任务非常大(从35到42 us):剩余时间是一个大问题...

    当我使用振荡器和测试点来可视化时序时、我发现同样的结果。

    当然、我已经在调试模式下生成了这些图形。 在释放模式下,synct0任务较小:最大16uS 但对我们来说,这仍然是一个令人烦恼的问题。

    我想将 CPU 负载可视化以确认这一点、但我有一个问题:使用时没有绘制图(cpuLoad.jpg 文件)

    您能告诉我如何使用 CPU 负载吗?

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

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

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

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

    您好 Laurence、

    是的、我正在努力提供帮助、但我们的目标是让我无法再提供更多帮助的领域。 这是一个典型的系统优化方案。 这需要完全访问系统、并且几乎不可能根据几个屏幕截图提供良好的建议。 我认为,这也超出了我们的支持范围。

    您似乎处于处理器能够执行的功能的边缘(至少使用当前时钟并处于调试模式)。 因此、您可能会在非确定性处理内核中表现出正常的 SW 抖动。 这里有高速缓存等动态特性。

    通常、电机控制算法会消耗大量的计算能力、但我想、如果您以完全优化的方式编译该部件、您的系统时序将会得到改善。 在发布配置的某个点、您可能会失去 UIA 调试功能、但我们将假定这一点。

    关于 UIA 加载函数、我认为这是有文件记录的、否则您需要在 CCS 论坛中提问。 我没有使用过很多。

    此致。

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

    您好!

      测试时间时、我遇到了有关 UIA 的问题。 但时间是错误的。 我在 TwinCAT 中设置周期时间62us。 对于 sys0task 周期时间应该是62us、但在我的 UIA 中、下面的图片显示了125us。 它看起来像双精度型。 因为当我在 TwinCAT 中设置50us 时,UIA 会显示100us (x1-x2) 。  你有什么想法吗?

      

    感谢你的帮助