ZHCAAA2A April 2019 – May 2021 AM5706 , AM5708 , AM5716 , AM5718 , AM5726 , AM5728 , AM5729 , AM5746 , AM5748 , AM5749 , TIOL111 , TIOL1113 , TIOL1115 , TPS2660
如前文所述,在 Linux 上實(shí)現(xiàn) O-Link 或任何其他實(shí)時(shí)協(xié)議存在多種可能性。用戶空間或內(nèi)核空間都可以直接用在運(yùn)行 Linux 的 Arm Cortex-A15 內(nèi)核上。此外,也可以在獨(dú)立于 Linux 的單獨(dú)內(nèi)核上實(shí)現(xiàn)。但是,IO-Link 有嚴(yán)格的計(jì)時(shí)要求,必須定期處理,其容差為周期時(shí)間的 -0% +10%。為了解哪種實(shí)現(xiàn)方式可以達(dá)到計(jì)時(shí)要求,在實(shí)現(xiàn) IO-Link 之前需要先進(jìn)行一些測(cè)試。
圖 3-1 用戶空間中的計(jì)時(shí)器為了實(shí)現(xiàn) IO-Link,必須配置一個(gè)計(jì)時(shí)器并由計(jì)時(shí)器觸發(fā)通信。為了評(píng)估計(jì)時(shí)精度,需要設(shè)置計(jì)時(shí)器,并且處理程序會(huì)切換 GPIO 以查看對(duì)外設(shè)的訪問(wèn)精度??赏ㄟ^(guò)邏輯分析儀觀察計(jì)時(shí)抖動(dòng)。
如圖 3-1 所示,在應(yīng)用所包含的用戶空間環(huán)境中,使用 timer_create 和 timer_settime 創(chuàng)建了一個(gè) 100μs 計(jì)時(shí)器。此計(jì)時(shí)器在到期時(shí)會(huì)觸發(fā)一個(gè) SIGALRM 事件。此事件會(huì)記錄至一個(gè)觸發(fā) GPIO 的處理函數(shù)。圖 3-2 所示為實(shí)際計(jì)時(shí)的直方圖。此計(jì)時(shí)器的平均值 101μs 是令人滿意的,但標(biāo)準(zhǔn)偏差 59μs、極端最小值 58μs 以及最大值 4.9ms 則過(guò)高,超過(guò) 2% 的樣本不在圖中所示 90μs–110μs 窗口范圍之內(nèi)。這樣的表現(xiàn)不符合規(guī)范要求。
圖 3-2 采用用戶空間實(shí)現(xiàn)方式時(shí)的計(jì)時(shí)抖動(dòng)為了在內(nèi)核空間中進(jìn)行測(cè)試,需要?jiǎng)?chuàng)建一個(gè)模塊來(lái)實(shí)例化一個(gè)高分辨率計(jì)時(shí)器,并將這個(gè)計(jì)時(shí)器設(shè)置為 100μs,并在每次觸發(fā)時(shí)重新開(kāi)始計(jì)時(shí)。使用 hrtimer_init 和 hrtimer_start,則易于進(jìn)行循環(huán)函數(shù)調(diào)用。如圖 3-3 所示,該計(jì)時(shí)器現(xiàn)在直接在內(nèi)核中接受處理,它的優(yōu)先級(jí)比在用戶空間實(shí)現(xiàn)方式中高得多,并且計(jì)時(shí)沖突更少。
圖 3-3 內(nèi)核空間中的計(jì)時(shí)器圖 3-4 所示為生成的直方圖。計(jì)時(shí)比在用戶空間實(shí)現(xiàn)方式中要好得多。平均值為 100μs,標(biāo)準(zhǔn)偏差小于 1μs。但是,80μs 和 122μs 的極值仍然過(guò)高(雖然小于所捕獲的全部樣本的 1%)。
圖 3-4 采用內(nèi)核空間實(shí)現(xiàn)方式時(shí)的計(jì)時(shí)抖動(dòng)如圖 3-5 所示,使用 SoC 內(nèi)部具有相同功能的 Cortex M4 之一進(jìn)行了第三項(xiàng)測(cè)試。此處運(yùn)行 TI RTOS,并可使用 Timer_create 函數(shù)來(lái)啟動(dòng)計(jì)時(shí)器。此計(jì)時(shí)器配置為定期調(diào)用某個(gè)函數(shù)。由于它在單獨(dú)的內(nèi)核上運(yùn)行,因此不會(huì)受到 Arm Cortex-A15 正在進(jìn)行的操作的干擾。
圖 3-5 Arm Cortex M4 上的計(jì)時(shí)器圖 3-6 所示為生成的直方圖。該圖選用 0.01μs 的分辨率來(lái)展示計(jì)時(shí)器的精度,分辨率為 1μs 的直方圖只會(huì)有一個(gè)區(qū)間 (bin)。101μs 的最小值和 102μs 的最大值為實(shí)現(xiàn) IO-Link 提供了精確的計(jì)時(shí)基礎(chǔ)。
圖 3-6 在單獨(dú)的 Arm Cortex-M4 上實(shí)現(xiàn)時(shí)的計(jì)時(shí)抖動(dòng)根據(jù)這項(xiàng)計(jì)時(shí)研究的結(jié)果可以得出結(jié)論:為了結(jié)合 Linux 來(lái)實(shí)現(xiàn)實(shí)時(shí)協(xié)議,需要一個(gè)可獨(dú)立于 Linux 運(yùn)行的額外 CPU 內(nèi)核。否則,至少對(duì)于 IO-Link 而言,操作系統(tǒng)會(huì)導(dǎo)致計(jì)時(shí)抖動(dòng)超過(guò)規(guī)格值。Sitara 器件內(nèi)部的 IPU 包含兩個(gè) Arm Cortex-M4 子系統(tǒng),每個(gè)子系統(tǒng)都有兩個(gè)內(nèi)核,適合用于實(shí)現(xiàn)此類實(shí)時(shí)協(xié)議。
圖 3-7 中顯示了 Sitara AM5728 處理器與 IO-Link 器件之間活動(dòng)通信的 CQ 線路。此處使用的器件具有 COM3 數(shù)據(jù)速率(230400 波特率)和 1ms 的循環(huán)時(shí)間。屏幕截圖顯示了循環(huán)的過(guò)程數(shù)據(jù)交換,此處設(shè)置為零。通過(guò)測(cè)量,循環(huán)時(shí)間為 1.02ms,此值在允許的容差范圍內(nèi)?,F(xiàn)在可以從 Linux 系統(tǒng)讀取和寫入 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,返回?cái)?shù)據(jù)和字段長(zhǎng)度。
圖 3-7 與 TIDA-01437 塔燈之間的 IO-link 通信通過(guò)將 IPU 內(nèi)核用于有嚴(yán)格計(jì)時(shí)要求的協(xié)議,則可輕松將有嚴(yán)格計(jì)時(shí)要求的協(xié)議(例如 IO-Link)集成到 Linux 應(yīng)用中。在執(zhí)行與 Linux 應(yīng)用或內(nèi)核模塊相同的實(shí)現(xiàn)方式時(shí),通過(guò)移至單獨(dú)的內(nèi)核可實(shí)現(xiàn)更精確的計(jì)時(shí)。使用 IPC 框架,無(wú)需修改 Linux 內(nèi)核即可輕松進(jìn)行軟件開(kāi)發(fā)。Sitara 處理器提供集成的 Arm Cortex-M4 內(nèi)核,這些內(nèi)核易于使用并且可以很好地滿足實(shí)時(shí)要求。
這種方法使得將 IO-Link 主站和器件集成到 Linux 成為可能,例如可以通過(guò)這種方式使得在 Linux 上運(yùn)行 HALCON 視覺(jué)庫(kù)的視覺(jué)傳感器具有 IO-Link 接口。