天天看點

将Ethercat主站IGH移植到Linux應用層

設計目的:

    IGH平台是完完全全的Linux核心層代碼,這樣設計的目的是為了保證Ethercat主站的實時性。但是Linux即使加了實時更新檔也隻能實作軟實時效果。是以有很多需求要将IGH移植到硬實時作業系統,要實作IGH跨平台的功能。先将IGH移植到Linux應用層,然後根據對應的作業系統API,做對應的修改封裝。(SOEM的确實作了跨平台的功能,但是整個軟體架構實在是太太糟糕,協定棧的健壯性太差,最主要的是設計時根本沒有考慮過實時性的問題,不建議高實時要求ethercat鍊路中用SOEM做主站)

設計思路:

    1.先解決頭檔案包含耦合的問題

             IGH為了代碼整潔性,将各個子產品的接口分成了對應子產品的.h頭檔案,但是各個子產品又有依賴關系,導緻頭檔案之前互相包涵,在移植到應用層會導緻各種報錯,解決方案是将各個頭檔案中的結構體定義全部提取到一個公共的.h檔案中

将Ethercat主站IGH移植到Linux應用層
将Ethercat主站IGH移植到Linux應用層

    2.借鑒SOEM封裝硬體層的思路,構造osal層

          将鎖,信号量,time時間函數擷取,睡眠函數,ethercat幀的收發這些跟系統驅動相關的API,在修改IGH的驅動函數發送層,将主站跟系統隔離開來。

int osal_nsleep (uint32 nsec);

int osal_mutex_init(osal_mutex_t *mutex);

int osal_mutex_lock(osal_mutex_t *mutex);

int osal_mutex_unlock(osal_mutex_t *mutex);

int osal_mutex_destory(osal_mutex_t *mutex);

int osal_sem_init(osal_sem_t *sem);

int osal_sem_wait(osal_sem_t *sem, int cond);

int osal_sem_wait_timeout(osal_sem_t *sem, int timeout);

int osal_sem_post(osal_sem_t *sem);

int osal_sem_post_all(osal_sem_t *sem);

int osal_sem_destory(osal_sem_t *sem);

int osal_socket_int(struct ec_device *dev);

int osal_socket_read(struct ec_device *dev, char *buf, size_t len);

int osal_socket_send(struct ec_device *dev, char *buf, int len);

int osal_socket_destory(struct ec_device *dev);

int osal_socket_link(struct ec_device *dev);

void osal_timer_start(osal_timert * self, uint32 timeout_us);

boolean osal_timer_is_expired(osal_timert * self);

int osal_usleep(uint32 usec);

ec_timet osal_current_time(void);

void osal_time_diff(ec_timet *start, ec_timet *end, ec_timet *diff);

int osal_thread_create(void *thandle, int stacksize, void *func, void *param);

int osal_thread_create_rt(void *thandle, int stacksize, void *func, void *param);

void *osal_malloc(size_t size);

void osal_free(void *ptr);

int osal_thread_stop(void *thandle);

unsigned long osal_gettimeofday(struct timeval *tv, struct timezone *tz);

比如IGH以太網接收層的接口函數變成了

将Ethercat主站IGH移植到Linux應用層

    3.解決核心層和應用層差異化的API接口和頭檔案

設計結果:

linux應用層的實時性不好,抖動太大了,在運作時容易出現收發幀逾時的warn資訊

繼續閱讀