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.

[参考译文] AM2434:EtherCAT PDI_ISR 和 SYNC0_ISR 调度

Guru**** 2455560 points
Other Parts Discussed in Thread: AM2434

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1493865/am2434-ethercat-pdi_isr-and-sync0_isr-scheduling

器件型号:AM2434

工具与软件:

您好!

我正在使用 Sitara AM2434上的完整 TI 协议栈开发 EtherCAT 从站应用程序。


我需要使用 DC 时钟来使应用程序与主设备和其它从设备同步、以便周期时间一直到250µs。
在每个周期中、我需要获取最新传入的数据包、进行一些处理、并准备输出数据包。

根据我的理解、我可以将该逻辑放入 ApplicationRun-function 中、当 Sync0触发时、它将在每个周期中被调用。
这应该独立于 EtherCAT 循环任务、在直流模式下仅处理非时间关键的非循环通信(SDO-Access 等)

因此、我想我可以为一些其他低优先级的东西(如终端等)设置一些其他 FreeRTOS 任务

但是、我现在偶然发现了该主题:
https://e2e.ti.com/support/processors-group/processors/f/processors-forum/511290/configuring-ethercat-distributed-clocks-using-hwi-instead-of-tasks-on-am335x

我是否正确理解这一点?在 TI Full Stack 中、有一些后台任务在 Sync0事件上繁忙等待? 另一个会等待 PDI 事件的器件是什么?
我 本来希望 Sync0事件能够触发一个中断、此中断或者直接处理、或者解锁一个任务来执行此操作。
或者对于新的 AM243X、这之后是否发生了改变?

如果这实际上是某些后台任务中的忙等待、调度程序会定期交换这种任务、则预计事件响应时间会显示较大的非确定性抖动。

我希望对这一主题作出一些澄清!

此致
Stefan Schlee

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

    您好、 Stefan、

    您使用哪个 SDK 版本以及哪个 EtherCAT 示例进行开发?

    此致、
    亚伦

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Unknown 说:
    ]它应该独立于 EtherCAT-Loop-Task、在直流模式下只处理非时间关键型非循环通信(SDO-Access 等)

    是的、情况就是这样。

    Unknown 说:
    ]在 Sync0-Event 上有一些后台任务处于繁忙等待状态?

    否、这是不正确的。 后台处理仅针对 EtherCAT 堆栈 MainLoop 完成。

    [quote userid="648235" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1493865/am2434-ethercat-pdi_isr-and-sync0_isr-scheduling Sync0-Event 触发中断、该中断可以直接处理处理

    是的、Beckhoff SSC 堆栈就是这种情况、因为我们在使用该堆栈。

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

    SDK 09.02.00和简单 EtherCAT 示例。

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

    感谢您的快速澄清!

    我看到该 PRUSS 等待函数在内部使用 DPL 的信号。

    我的问题是,我额外创建的任务具有较高的优先级作为 sync0-task ,这阻止 sync0任务确定性地执行。

    EtherCAT 协议栈中的一些文档有助于更快地了解调度行为。

    此外、如果可以配置优先级也很好、因为 在 osal.h 中定义了一些其他任务、这些任务的优先级高于 sync0/PDI 任务。
    从而在高性能应用中获得更确定的反应时间。

    我想、为此、必须重新构建 EtherCAT 库、这可能因堆栈源的许可证而无法实现。
    是否能够以某种方式授权完整的 EtherCAT 堆栈源?

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

    您好、Stefan、

    对于 版本2.00.02 、我们更改了函数 EC_API_SLV_prepareTasks() 从而使的任务优先级 PDI、LED、SYNC0 SYNC1 无需重新编译堆栈源即可对其进行调整。

    在相应的示例中、您将可以在 ethercat_ssc.c Slave_Simple 中看到第266行中的调用:

    EC_API_SLV_prepareTasks(KBECSLV_PRIO_PDI, KBECSLV_PRIO_LED, KBECSLV_PRIO_SYNC0, KBECSLV_PRIO_SYNC1,
                            KBECSLV_STACKSIZE_PDI, KBECSLV_STACKSIZE_LED, KBECSLV_STACKSIZE_SYNC0,
                            KBECSLV_STACKSIZE_SYNC1);

    project.h 中提供了相关定义、可根据您的需求进行更改:

    #define KBECSLV_PRIO_PDI                    OSAL_TASK_Prio_ECPDI
    #define KBECSLV_PRIO_SYNC0                  OSAL_TASK_Prio_ECSync
    #define KBECSLV_PRIO_SYNC1                  OSAL_TASK_Prio_ECSync
    #define KBECSLV_PRIO_LED                    OSAL_TASK_Prio_ECLED

    此致

    Andreas

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

    你好,安德烈亚斯,谢谢你,这正是我所需要的!