【原创】EtherCAT主站IgH解析(二)-- Linux/Windows/RTOS等多操作系统IgH EtherCAT主站移植指南
版权声明:本文为本文为博主原创文章,转载请注明出处。如有问题,欢迎指正。博客地址:https://www.cnblogs.com/wsg1100/
前言
目前,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用户态,或者其他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,编译器特性等。
【原创】EtherCAT主站IgH解析(二)-- Linux/Windows/RTOS等多操作系统IgH EtherCAT主站移植指南的更多相关文章
- 【原创】EtherCAT主站IgH解析(一)--主站初始化、状态机与EtherCAT报文
目录 1 启动脚本 1.1 start 1.2 stop 2 主站实例创建 2.1 Master Phases 2.2 数据报与状态机 数据报 状态机 2.3 master状态机及数据报初始化 2.4 ...
- 【原创】解BUG-xenomai内核与linux内核时间子系统之间存在漂移
版权声明:本文为本文为博主原创文章,转载请注明出处.如有问题,欢迎指正.博客地址:https://www.cnblogs.com/wsg1100/ 一.问题起源 何为漂移?举个例子两颗32.768kH ...
- Linux 与 Linux Windows 文件共享 小知识
Linux 与 Linux Windows 文件共享 前提说明:windows主机信息:192.168.1.100 帐号:abc 密码:123 共享文件夹:sharelinux主机信息:192.1 ...
- mouse scrollings and zooming operations in linux & windows are opposite
mouse scrollings and zooming operations in linux & windows are opposite. windows中, 鼠标滚动的方向是: 查看页 ...
- 在Mac/Linux/Windows上编译corefx遇到的问题及解决方法
这两天尝试在Mac/Linux/Windows三大平台上编译.NET跨平台三驾马车(coreclr/corefx/dnx)之一的corefx(.NET Core Framework),结果三个平台的编 ...
- linux/windows系统oracle数据库简单冷备同步
linux/windows系统oracle数据库简单冷备同步 我们有一个财务系统比较看重财务数据的安全性,同时我们拥有两套系统,一个生产环境(linux),一个应急备份环境(windows).备份环境 ...
- 汉高澳大利亚sinox为什么不能下载源代码,因为sinox执行unix/linux/windows规划
中国用户下载真正的澳大利亚sinox说完后sinox没有下载源代码. 这意味着,类似linux如下载linux 开源安装. 要知道.sinox并非linux. 首先,sinox是商业操作系统,就像 w ...
- 【原创】只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(四)
全系列Index: [原创]只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(一) [原创]只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(二) [原创]只学到二维数组和结构体,不用链表也能 ...
- Linux & Windows 环境下 Redis 安装与基本配置
索引: 目录索引 参看代码 GitHub: redis.txt 一.Linux (DeepinOS) 环境 .安装Redis服务 sudo apt-get install redis-server . ...
- Linux & Windows 环境下 RabbitMQ 安装与基本配置
索引: 目录索引 参看代码 GitHub: rabbitmq.txt 一.Linux (DeepinOS) 环境 .安装: sudo apt install rabbitmq-server .进入目录 ...
随机推荐
- [LLM] 开源 AI 大语言模型的本地化定制实践
LLM(Large Language Model,大型语言模型)是一种基于深度学习的自然语言处理模型,旨在理解和生成人类语言. 它们在大量的文本数据上进行训练,可以执行广泛的任务,包括文本总结.翻 ...
- UWP WinRT 使用系统自带的分词库对字符串文本进行分词
本文将和大家介绍在 UWP 应用,或其他能接入 WinRT 的应用里,使用系统自带的分词库,对中文.英文等等自然语言的字符串文本进行分词 开始之前需要说明的是,现在不仅仅 UWP 应用,其他的 UI ...
- WPF 多线程下跨线程处理 ObservableCollection 数据
本文告诉大家几个不同的方法在 WPF 里,使用多线程修改或创建 ObservableCollection 列表的数据 需要明确的是 WPF 框架下,非 UI 线程直接或间接访问 UI 是不合法的,设计 ...
- 2019-2-21-PowerShell-通过-WMI-获取补丁
title author date CreateTime categories PowerShell 通过 WMI 获取补丁 lindexi 2019-02-21 20:39:51 +0800 201 ...
- python实现打扑克方法
# 游戏规则:# 一付扑克牌,去掉大小王,每个玩家发3张牌,最后比大小,看谁赢.## 有以下几种牌:# 豹子:三张一样的牌,如3张6.# 同花顺:即3张同样花色的顺子, 如红桃 5.6.7# 顺子:又 ...
- RT-Thread 运行时常见错误
一.空线程栈较小 现象: 现象一: 现象二: 原因: 从RT-Thread文章中心可知,空闲线程是不能被挂起的,官方文档说明如下图所示: 注意:必须保证空闲线程的栈空间足够,否则空闲线程内存溢出后,也 ...
- 坐标轴调控大揭秘:Matplotlib坐标轴设置全攻略+顺口溜,一文掌握!
在数据可视化的世界里,Matplotlib是那把魔法棒,让枯燥的数据跃然纸上,而掌控这把魔法棒的核心,就是对坐标轴的精妙操作.今天,就让我们一起揭开Matplotlib坐标轴设置的神秘面纱,配上易记的 ...
- java.lang.NoSuchMethodException: tk.mybatis.mapper.provider.base.BaseSelectProvider
解决错误: java.lang.NoSuchMethodException: tk.mybatis.mapper.provider.base.BaseSelectProvider 整合一遍通用mapp ...
- C/C++如何写调试宏
1. 调试宏以及测试 在写代码时,不可避免需要打印提示.警告.错误等信息,且要灵活控制打印信息的级别.另外,还有可能需要使用宏来控制代码段(主要是调试代码段)是否执行.为此,本文提供一种调试宏定义方案 ...
- linux 下jq的使用
安装: yum install jq -y 文档: https://stedolan.github.io/jq/manual/ 更多: https://blog.csdn.net/Cheat11730 ...