【原創】EtherCAT主站IgH解析(二)-- 如何將Igh移植到Linux/Windows/RTOS等多作業系統移植指南

沐多發表於2024-06-20

版權宣告:本文為本文為博主原創文章,轉載請註明出處。如有問題,歡迎指正。部落格地址:https://www.cnblogs.com/wsg1100/

本文簡單介紹如何將 igh 移植到 zephyr、freertos、rtems、rtthread等RTOS ,甚至 windows 上。

前言

目前,EtherCAT商用主站有:Acontis、TwinCAT3、KPA、Codesys等,開源EtherCAT主站則主要有兩大方案:igh與SOEM,兩者設計天差地別,SOEM開源於2008年底1.1.2版本,具備良好的可移植性,能夠輕鬆適配各類作業系統乃至裸機環境,然而,在功能豐富度與實時效能表現上(除裸機外)遠不如IgH,應用層面想要應對複雜的EtherCAT應用場景會非常困難,SOEM的協議棧運作依託於應用層介面的驅動,其內部並無獨立任務(執行緒)。

相比之下,IgH誕生較早,IgH功能全面,同時注重實時效能,為了在linux上獲得良好的實時效能和低CPU利用率,同時方便多主站使用時程序間隔離等原因,IgH設計之初就基於linux核心態,今天看來可移植性較差;

igh的高實時效能得益於linux核心態可直接操作網路卡收發,功能全面得益於其內部採用的多工狀態機架構,這些任務驅動機制透過系統呼叫向使用者空間的EtherCAT應用提供服務,極大簡化了應用層面的介面互動,使得EtherCAT應用操作介面變得極為簡單。

那麼IgH能移植到linux使用者態,或者其他zephyr、freertos、rtems、rtthread等RTOS嗎?答案是當然能。

IgH整體框架及執行原理本詳見部落格文章 【原創】EtherCAT主站IgH解析(一)--主站初始化、狀態機與EtherCAT報文

那麼IgH能移植到裸機嗎?理論上可以,但比較麻煩,但是IgH整體設計就是多工的,關鍵點是沒有任務排程,幾個狀態機如何驅動?不考慮權衡投入產出、可複用性,你可以自行嘗試。

IgH依賴作業系統服務

IgH雖然執行在linux核心態,但並不與Linux核心的耦合,整個協議棧只用到了linux的基本服務。

作業系統服務 描述
任務(執行緒)排程 每個主站,內部狀態機執行需要2個任務,EoE 1個(可選)、應用層週期任務
睡眠(定時服務) 任務睡眠,讓出CPU;應用層通訊週期控制,如果RTOS沒有高精度定時介面,可啟一個硬體timer回撥更加精確。
讀取時間戳 EtherCAT子報文物件維護需要收發時間戳
動態記憶體分配 master、slave、datagram、eoe、eeprom等物件需要動態記憶體分配
event(非必須) 應用呼叫主站服務時阻塞到事件等待,主站完成服務後透過事件喚醒應用
Semaphore/mutex 同步互斥
TCP/IP網路協議棧 主站已支援二層網路包轉發,若裝置本身需要TCP/IP網路遠端除錯工具需要TCP支援;可選實現主站EOE

關於RTOS 的高精度定時器詳見部落格文章不同RTOS中POSIX介面的實現差異 ,相關章節。

其他適配

其他一些資料結構以及網路介面相關:

  • 網路卡驅動,主要實現輪詢式無中斷方式的二層網路包收發介面,原Linux ethernet裝置的抽象及skb的替代實現;
  • EtherCAT主站初始化流程調整;
  • 連結串列、列印輸出;
  • Linux相關特性刪減修改:GNU C、unlikely、likely、prefetch,編譯器特性等。

相關文章