ZHCAAA2A April   2019  – May 2021 AM5706 , AM5708 , AM5716 , AM5718 , AM5726 , AM5728 , AM5729 , AM5746 , AM5748 , AM5749 , TIOL111 , TIOL1113 , TIOL1115 , TPS2660

 

  1.   商标
  2. 1引言
  3. 2实现
  4. 3测试结果
  5. 4备选器件建议
  6.   参考文献
  7. 5修订历史记录

测试结果

如前文所述,在 Linux 上实现 O-Link 或任何其他实时协议存在多种可能性。用户空间或内核空间都可以直接用在运行 Linux 的 Arm Cortex-A15 内核上。此外,也可以在独立于 Linux 的单独内核上实现。但是,IO-Link 有严格的计时要求,必须定期处理,其容差为周期时间的 -0% +10%。为了解哪种实现方式可以达到计时要求,在实现 IO-Link 之前需要先进行一些测试。

GUID-A7EFE5EA-04BF-4599-9C2E-E3879F277423-low.gif图 3-1 用户空间中的计时器

为了实现 IO-Link,必须配置一个计时器并由计时器触发通信。为了评估计时精度,需要设置计时器,并且处理程序会切换 GPIO 以查看对外设的访问精度。可通过逻辑分析仪观察计时抖动。

图 3-1 所示,在应用所包含的用户空间环境中,使用 timer_create 和 timer_settime 创建了一个 100µs 计时器。此计时器在到期时会触发一个 SIGALRM 事件。此事件会记录至一个触发 GPIO 的处理函数。图 3-2 所示为实际计时的直方图。此计时器的平均值 101µs 是令人满意的,但标准偏差 59µs、极端最小值 58µs 以及最大值 4.9ms 则过高,超过 2% 的样本不在图中所示 90µs–110µs 窗口范围之内。这样的表现不符合规范要求。

GUID-0B738870-B7C9-4977-91FF-C17C2220885C-low.png图 3-2 采用用户空间实现方式时的计时抖动

为了在内核空间中进行测试,需要创建一个模块来实例化一个高分辨率计时器,并将这个计时器设置为 100µs,并在每次触发时重新开始计时。使用 hrtimer_init 和 hrtimer_start,则易于进行循环函数调用。如图 3-3 所示,该计时器现在直接在内核中接受处理,它的优先级比在用户空间实现方式中高得多,并且计时冲突更少。

GUID-DDE69799-9C9D-4AC3-AE0D-C9464C54445B-low.gif图 3-3 内核空间中的计时器

图 3-4 所示为生成的直方图。计时比在用户空间实现方式中要好得多。平均值为 100µs,标准偏差小于 1µs。但是,80µs 和 122µs 的极值仍然过高(虽然小于所捕获的全部样本的 1%)。

GUID-38780ADF-552A-4C22-8628-10270892AC42-low.png图 3-4 采用内核空间实现方式时的计时抖动

图 3-5 所示,使用 SoC 内部具有相同功能的 Cortex M4 之一进行了第三项测试。此处运行 TI RTOS,并可使用 Timer_create 函数来启动计时器。此计时器配置为定期调用某个函数。由于它在单独的内核上运行,因此不会受到 Arm Cortex-A15 正在进行的操作的干扰。

GUID-3C993E5E-1C5A-42D5-9535-AFE1A5E943D2-low.gif图 3-5 Arm Cortex M4 上的计时器

图 3-6 所示为生成的直方图。该图选用 0.01µs 的分辨率来展示计时器的精度,分辨率为 1µs 的直方图只会有一个区间 (bin)。101µs 的最小值和 102µs 的最大值为实现 IO-Link 提供了精确的计时基础。

GUID-47B50193-BDD9-4CE0-834B-02B9574CA4B2-low.png图 3-6 在单独的 Arm Cortex-M4 上实现时的计时抖动

根据这项计时研究的结果可以得出结论:为了结合 Linux 来实现实时协议,需要一个可独立于 Linux 运行的额外 CPU 内核。否则,至少对于 IO-Link 而言,操作系统会导致计时抖动超过规格值。Sitara 器件内部的 IPU 包含两个 Arm Cortex-M4 子系统,每个子系统都有两个内核,适合用于实现此类实时协议。

图 3-7 中显示了 Sitara AM5728 处理器与 IO-Link 器件之间活动通信的 CQ 线路。此处使用的器件具有 COM3 数据速率(230400 波特率)和 1ms 的循环时间。屏幕截图显示了循环的过程数据交换,此处设置为零。通过测量,循环时间为 1.02ms,此值在允许的容差范围内。现在可以从 Linux 系统读取和写入 ISDU,如下所示:

a@BeagleBoard-X15:~$ sudo ./app_host IPU2
ISDU 16 18 bytes: Texas Instruments
ISDU 17 11 bytes: www.ti.com
ISDU 18 41 bytes: TIDA-01437 RGB Signal Light with IO Link
ISDU 19 2 bytes: 1
ISDU 20 11 bytes: TIDA-01437
ISDU 21 9 bytes: 00000000
ISDU 22 7 bytes: HW-V1.0
ISDU 23 20 bytes: FW-V1.0 - COM3 - 1ms
ISDU 24 32 bytes: ********************************

此示例读取 ISDU 16 至 24,返回数据和字段长度。

GUID-525A1DD1-79CC-41E2-B58E-87C746EE49A9-low.png图 3-7 与 TIDA-01437 塔灯之间的 IO-link 通信

通过将 IPU 内核用于有严格计时要求的协议,则可轻松将有严格计时要求的协议(例如 IO-Link)集成到 Linux 应用中。在执行与 Linux 应用或内核模块相同的实现方式时,通过移至单独的内核可实现更精确的计时。使用 IPC 框架,无需修改 Linux 内核即可轻松进行软件开发。Sitara 处理器提供集成的 Arm Cortex-M4 内核,这些内核易于使用并且可以很好地满足实时要求。

这种方法使得将 IO-Link 主站和器件集成到 Linux 成为可能,例如可以通过这种方式使得在 Linux 上运行 HALCON 视觉库的视觉传感器具有 IO-Link 接口。