ZHCAAA2A April 2019 – May 2021 AM5706 , AM5708 , AM5716 , AM5718 , AM5726 , AM5728 , AM5729 , AM5746 , AM5748 , AM5749 , TIOL111 , TIOL1113 , TIOL1115 , TPS2660
如前文所述,在 Linux 上實現 O-Link 或任何其他實時協議存在多種可能性。用戶空間或內核空間都可以直接用在運行 Linux 的 Arm Cortex-A15 內核上。此外,也可以在獨立于 Linux 的單獨內核上實現。但是,IO-Link 有嚴格的計時要求,必須定期處理,其容差為周期時間的 -0% +10%。為了解哪種實現方式可以達到計時要求,在實現 IO-Link 之前需要先進行一些測試。
圖 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 窗口范圍之內。這樣的表現不符合規范要求。
圖 3-2 采用用戶空間實現方式時的計時抖動為了在內核空間中進行測試,需要創建一個模塊來實例化一個高分辨率計時器,并將這個計時器設置為 100μs,并在每次觸發時重新開始計時。使用 hrtimer_init 和 hrtimer_start,則易于進行循環函數調用。如圖 3-3 所示,該計時器現在直接在內核中接受處理,它的優先級比在用戶空間實現方式中高得多,并且計時沖突更少。
圖 3-3 內核空間中的計時器圖 3-4 所示為生成的直方圖。計時比在用戶空間實現方式中要好得多。平均值為 100μs,標準偏差小于 1μs。但是,80μs 和 122μs 的極值仍然過高(雖然小于所捕獲的全部樣本的 1%)。
圖 3-4 采用內核空間實現方式時的計時抖動如圖 3-5 所示,使用 SoC 內部具有相同功能的 Cortex M4 之一進行了第三項測試。此處運行 TI RTOS,并可使用 Timer_create 函數來啟動計時器。此計時器配置為定期調用某個函數。由于它在單獨的內核上運行,因此不會受到 Arm Cortex-A15 正在進行的操作的干擾。
圖 3-5 Arm Cortex M4 上的計時器圖 3-6 所示為生成的直方圖。該圖選用 0.01μs 的分辨率來展示計時器的精度,分辨率為 1μs 的直方圖只會有一個區間 (bin)。101μs 的最小值和 102μs 的最大值為實現 IO-Link 提供了精確的計時基礎。
圖 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,返回數據和字段長度。
圖 3-7 與 TIDA-01437 塔燈之間的 IO-link 通信通過將 IPU 內核用于有嚴格計時要求的協議,則可輕松將有嚴格計時要求的協議(例如 IO-Link)集成到 Linux 應用中。在執行與 Linux 應用或內核模塊相同的實現方式時,通過移至單獨的內核可實現更精確的計時。使用 IPC 框架,無需修改 Linux 內核即可輕松進行軟件開發。Sitara 處理器提供集成的 Arm Cortex-M4 內核,這些內核易于使用并且可以很好地滿足實時要求。
這種方法使得將 IO-Link 主站和器件集成到 Linux 成為可能,例如可以通過這種方式使得在 Linux 上運行 HALCON 視覺庫的視覺傳感器具有 IO-Link 接口。