版權宣告:本文為本文為博主原創文章,轉載請註明出處。如有問題,歡迎指正。部落格地址: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,編譯器特性等。