EtherCAT主站实时性分析

转载自:https://blog.csdn.net/ethercat_i7/article/details/54018036


一、实时性的意义

   在主从DC同步模式下,主站需要以非常精准的时间发送过程数据,如下图所示:



二、实时性的关键

    如下图所示,影响实时性的关键因素是操作系统和网卡驱动,前者需要将过程数据准时送出,后者需要优化网卡驱动,即"准时出发,路上不能耽误"。

操作系统的实时性体现在需要非常准时地调用EtherCAT主站协议栈的发送函数,例如SOEM的发送函数是ecx_send_processdata()

Etherlab的发送函数为ecrt_master_send()。

采用Linux系统时,需要打上实时补丁,如Xenomai、RTAI、OSADL等。

标准Linux下的网卡驱动是为通用的网络通信设计的,网络数据穿过TCP/IP协议栈是一个非常漫长的过程,其中包括各种安全性检查、路由、出入队列、分片和重组等等,这其中有很多的不确定性,所以在EtherCAT主站开发中需要优化网卡驱动,使EtherCAT数据

绕过TCP/IP协议栈。


三、移植网卡驱动

在Etherlab的说明文档中给出了改造标准网卡驱动的三个基本点,如下:

(1)禁用netif_*()

(2)禁用中断

(3)重复利用socket buffer

接下来以EtherLAB源码中移植好的网卡驱动RealTek RTL-8139为例进行说明。

1、禁用netif_*()

在网卡驱动程序中的接收函数rtl8139_rx()中,netif_receive_skb (skb)负责将数据包传递给TCP/IP协议栈,

将其改成由EtherCAT主站直接处理。

改造前:

//8139too-3.4-orig.c

static int rtl8139_rx(struct net_device *dev, struct rtl8139_private *tp,
        int budget)
{

    ......

    netif_receive_skb (skb);//将数据包提交给TCP/IP协议栈处理

   ......

}


改造后:

//8139too-3.4-ethercat.c

static int rtl8139_rx(struct net_device *dev, struct rtl8139_private *tp,
        int budget)
{

   ......

  if (tp->ecdev) {                                         //作为EtherCAT使用时直接交给EtherCAT协议栈处理,绕过TCP/IP协议栈
   ecdev_receive(tp->ecdev,
     &rx_ring[ring_offset + 4], pkt_size);
     dev->last_rx = jiffies;
     dev->stats.rx_bytes += pkt_size;
     dev->stats.rx_packets++;
   }

  else

  {

    ......

    netif_receive_skb (skb);

    ......

  }

}

2. 禁用中断

  Linux标准网卡驱动中,采用中断方式收发网络数据包,较新的网卡驱动中采用NAPI(中断和轮询相结合),而EtherCAT通信中,EtherCAT主站发出过程数据包后,主站非常清楚数据包什么时候返回主站,因此不需要采用中断的方式,而由主站直接查询和处理返回的过程数据包。

改造前:

//8139too-3.4-orig.c

static int rtl8139_open (struct net_device *dev)

{

     ......

    retval = request_irq (dev->irq, rtl8139_interrupt, IRQF_SHARED, dev->name, dev); //向内核注册中断

    ......

}


改造后:

//8139too-3.4-ethercat.c

static int rtl8139_open (struct net_device *dev)
{

   ......

 if (!tp->ecdev) {
  retval = request_irq(dev->irq, rtl8139_interrupt,        //作为普通网卡时才注册中断
   IRQF_SHARED, dev->name, dev);
  if (retval)
   return retval;
 }

  ......

}

void ec_poll(struct net_device *dev)
{
 rtl8139_interrupt(0, dev);
}

函数调用关系为:ec_poll()->rtl8139_interrupt()->rtl8139_rx()->ecdev_receive();


3. 重复利用Socket buffer

   Linux标准网卡驱动中,将数据包发送后将释放数据包所占用的内存,或者放回预先分配的内存池中,

而EtherCAT通信中,只需重复使用其中的一两个缓存即可,这样可以节省为数据包分配和释放内存的时间。

改造前:

//8139too-3.4-orig.c

static netdev_tx_t rtl8139_start_xmit (struct sk_buff *skb,
          struct net_device *dev)
{

  ......

  dev_kfree_skb(skb);//释放Socket buffer所占内存或将其放回内存池

  ......

}


改造后:

//8139too-3.4-ethercat.c

static netdev_tx_t rtl8139_start_xmit (struct sk_buff *skb,
          struct net_device *dev)
{

   ......

     if (!tp->ecdev) {      //只有作为普通网卡时才释放Socket buffer
   dev_kfree_skb(skb);
  }

   ......

}





本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422866.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VNC实现原理

VNC实现的控制原理1.屏幕控制原理VNC是把被控制端的屏幕做成图像&#xff0c;经过压缩后传送到控制端控制端的控制信息&#xff08;如鼠标信息&#xff09;传送到被控制端后进入消息队列客户端X服务器应用程序vnc viewer<-------------------------->Xvnc(vnc server)<…

VNC源码研究(一)

VNC采用RFB通信协议。RFB ("remote 帧缓存 ") 是一个远程图形用户的简单协议&#xff0c;因为它工作在帧缓存级别上&#xff0c;所以它可以应用于所有的窗口系统&#xff0c;例如&#xff1a;X 11,Windows 和 Mac 系统。 独特的计算环境。 RFB 协议可进行可靠的传输…

枚举的一些常用操作

本章将介绍以下几点&#xff1a; 1、如何把其它类型转换为枚举类型&#xff1f; 2、如何把枚举中的值添加到下拉菜单中&#xff1f; 一、如何把其它类型转换为枚举类型&#xff1f; 我们回顾一下有关字符串与数字之间的转换&#xff0c;如&#xff1a; string strValue&quo…

【Git、GitHub、GitLab】四 Git文件重命名的简单方法以及使用git log查看版本演变历史

上一篇文章学会了使用GIT四次提交建立一个有模有样的仓库。点击链接查看&#xff1a;【Git、GitHub、GitLab】三 Git基本命令之创建仓库并向仓库中添加文件. 本片文章记录git的文件重命名的简单方法&#xff0c;以及使用git log系列命令查看git仓库的版本演变历史的用法的。 文…

10个开源免费的电子商务平台(转自伯乐在线)

如今&#xff0c;人们几乎可以在网络上购买到绝大部分东西&#xff0c;从电子产品、衣服&#xff0c;到机票预订和订餐。购物已转移到互联网&#xff0c;你所做的&#xff0c;只是需要付钱。当然&#xff0c;消费者会 非常注重网站的用户体验。所以&#xff0c;一个整洁安全的平…

「电影」黑洞表面

很老的片子&#xff0c;《黑洞表面》&#xff0c;某次在电视上碰见了&#xff0c;可惜看了五分钟不到&#xff0c;就不得不做别的事情去了&#xff0c;于是乎接着在优酷上翻出来看。估计此片太老了&#xff0c;而且貌似还有点经典&#xff0c;所以优酷还设置了所谓「付费观看」…

【Git、GitHub、GitLab】五 git中裸仓库.git下的内容

上一篇文章学习了git的文件重命名与git -log 的系列命令的使用方法。点击链接查看上一篇文章&#xff1a;【Git、GitHub、GitLab】四 Git文件重命名的简单方法以及使用git log查看版本演变历史 本篇文章学习git中&#xff0c;在没有远端服务器的情况下&#xff0c;裸仓库.git中…

金和oa:自定义表单函数计算一段时期内的工作日

今天介绍一下在自定义表单时如何去计算两个日期之间的工作日。这是很常用的一个js函数&#xff0c;比如在加班中&#xff0c;比如在请假中。。。1&#xff0e; 计算两个日期之间的工作日&#xff0c;写附加元素页面<script language"vbscript"> ...Copyrigh…

【Git、GitHub、GitLab】六 GIT中commit、tree和blob三个对象之间的关系

上一篇文章学习了git裸仓库.git中的内容&#xff0c;点击查看上一篇文章&#xff1a;【Git、GitHub、GitLab】五 git中裸仓库.git下的内容 本篇文章记录学习git中commit、tree和blob三个对象之间的关系。 首先需要会使用下面的命令&#xff1a; cat 命令&#xff0c; 功能&am…

POJ 1006

典型的中国余数定理的应用。设m1,m2,..,mk是k个两两互素的正整数&#xff0c;mm1*m2*...*mk&#xff0c;Mim/mi(i1,2,..,k)。则同余方程组x≡b1(mod m1)x≡b2(mod m2&#xff09;......x≡bk(mod mk)有唯一解。x≡M1M1b1&#xff0b;…&#xff0b;MkMkbk &#xff08;modm&…

【Git、GitHub、GitLab】七 git中分支的删除以及出现分离头指针的情况

上一篇文章学习了GIT中commit、tree和blob三个对象之间的关系&#xff0c;点击链接查看&#xff1a;【Git、GitHub、GitLab】六 GIT中commit、tree和blob三个对象之间的关系 文章目录1 git中如何删除分支2 分离头指针的情况需要注意什么1 git中如何删除分支 如何查看分支&#…

Windows 中自定义Error Codes

Windows 中自定义Error Codes的格式: Bits:31-30292827-1615-0ContentsSeverityMicrosoft/customerReservedFacility codeExceptioncodeMeaning0 Success1 Informational2 Warning3 Error0 Microsoft-defined code1 customer-defined codeMust be 0The first 256 values …

【Git、GitHub、GitLab】八 如何修改commit的message

上一篇文章记录了git中分支的删除以及出现分离头指针的情况&#xff0c;点击查看:【Git、GitHub、GitLab】七 git中分支的删除以及出现分离头指针的情况 文章目录1 如何修改最新的commit的message2 如何修改老旧的commit的message3 如何将连续的多个commit整理成一个4 如何将间…

What means the error-message 'java.lang.OutOfMemoryError: GC overhead limit exceeded' in Java?

转国内的&#xff1a; 一、异常如下&#xff1a;Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded 二、解释&#xff1a;JDK6新增错误类型。当GC为释放很小空间占用大量时间时抛出。一般是因为堆太小。导致异常的原因&#xff1…

【Git、GitHub、GitLab】九 工作中非常重要的一些git用法

上一篇文章学习了 如何修改commit的message&#xff0c;点击链接查看&#xff1a;【Git、GitHub、GitLab】八 如何修改commit的message 注意&#xff1b;下面的‘–’ 都是两个‘-’组成 本文介绍一些在使用git中非常常用的一些命令&#xff1a; 怎么比较暂存区与HEAD所指向的…

【Git、GitHub、GitLab】十 将git仓库备份到本地

上一篇文章学习记录了工作中常用的一些git命令&#xff0c;点击链接查看&#xff1a;【Git、GitHub、GitLab】九 工作中非常重要的一些git用法 文章目录1 git的传输协议2 如何将git仓库备份到本地2.1 使用哑协议备份2.2 使用智能协议备份1 git的传输协议 哑协议与智能协议的区别…

Ibatis XML 配置文件注释引起错误及解决方案

最近在使用Ibatis组件进行一个项目开发&#xff0c;在运行时发现提示如下错误信息&#xff1a; type 异常报告 消息 描述服务器遇到一个内部错误 (), 无法完成此请求。 异常 javax.servlet.ServletException: java.lang.ExceptionInInitializerError根本原因 java.lang.Excep…

java-XML

XML不再多说&#xff0c;XML 约束也不用说了&#xff0c;这里讲讲java如何对XML操作。 java中使用XML&#xff0c;目前常用的就是Jaxp(sun)和dom4j了&#xff0c;这里先讲讲java自带的Jaxp包 JAXP 开发包是J2SE的一部分&#xff0c;它由javax.xml、org.w3c.dom 、org.xml.sax 包…

7款开源ERP系统比较

现在有许多企业将ERP项目&#xff0c;在企 业中没有实施好&#xff0c;都归咎于软件产品不好。其实&#xff0c;这只是你们的借口。若想要将ERP软件真正与企业融合一体&#xff0c;首先得考虑企业的自身情况&#xff0c;再去选择适合的 ERP软件。 如果你的企业是高速发展的中小…

【C语言进阶深度学习记录】一 数据类型的本质与变量的本质

今天学习C语言中的数据类型的本质与变量的本质 文章目录1 什么是数据类型2 变量的本质3 数据类型与变量的关系4 自定义数据类型与创建变量5 总结1 什么是数据类型 数据类型可以理解为固定内存大小的别名数据类型是创建变量的模子 如同下面的图示&#xff0c;各个数据类型是代…