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

枚举的一些常用操作

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

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

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

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

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

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

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

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

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

java-XML

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

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

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

使用第三方Markdown编辑器编辑为知笔记

前言 为知笔记默认的编辑器并没有预览功能,而提供的MD编辑器插件也并不是很好用,但为知笔记提供了可以使用第三方编辑器的功能,Typora编辑器是目前最优秀的Markdown编辑器之一,可以很好作为第三方编辑器。 Typora介绍 Typora是…

【C语言进阶深度学习记录】二 有符号与无符号

今天学习C语言中的有符号与无符号 文章目录1 计算机中的符号位1.1 有符号数的表示法1.2 无符号数的表示法1.3 signed 和 unsigned2 实验-当有符号数与无符号数进行运算3 错误的使用了unsigned4 总结1 计算机中的符号位 C语言中,数据类型的最高位,用于标…

【C语言进阶深度学习记录】三 浮点数(float) 在内存中的表示方法

相信大多数人知道整形数在内存中的分布方式,而且也能很容易写出其二进制的形式,但是对于浮点数,估计知道的人并不是很多今天学习在C语言中浮点数在内存中的表示方法 文章目录1 浮点数在内存中的存储方式1.1 浮点数的转换步骤1.2 浮点数的转换…

【C语言进阶深度学习记录】四 C语言中的类型转换

今天学习C语言中的类型转换,包括隐式类型转换和显示类型转换 文章目录1 C语言中的数据类型转换1.1 强制类型转换1.11 强制类型转换代码分析1.2 隐式类型转换1.21 隐式类型转换代码分析2 总结1 C语言中的数据类型转换 C语言中,可以进行数据类…

【C语言进阶深度学习记录】五 C语言中变量的属性

上一篇文章学习了C语言中的类型转换,点击链接查看:【C语言进阶深度学习记录】四 C语言中的类型转换. 文章目录1 C语言的变量属性1.1 auto关键字1.2 register关键字1.3 static 关键字1.4 代码案例分析1.5 extern 关键字1.6 代码案例分析2 总结1 C语言的变…

【C语言进阶深度学习记录】六 C语言中的分支语句

文章目录1 if 语句的分析1.1 if 语句中零值比较的注意点2 switch 语句的分析3 if 与switch语句使用代码案例分析4 if语句与switch语句的互换5 总结1 if 语句的分析 if 语句根据条件选择执行语句else 不能独立存在,且总是与距离它最近的if匹配else 语句可以连接其他…

【C语言进阶深度学习记录】七 C语言中的循环语句

文章目录1 循环语句分析1.1 do...while循环1.2 while循环1.3 for循环1.4 三种循环语句使用对比2 break和continue的区别3 总结1 循环语句分析 C语言中的循环语句主要有for循环,while循环和do…while循环。 循环语句的基本工作方式: 通过条件表达式判断…

【C语言进阶深度学习记录】八 C语言中void的分析

文章目录1 void的意义1.1 不存在void变量1.2 C标准1.3 void指针的意义1.4 通过void* 实现memset函数2 总结1 void的意义 void修饰函数的参数和返回值的时候: 如果函数没有返回值应该将其返回值声明为void如果函数没有参数,应该将函数的参数声明为void如…

【C语言进阶深度学习记录】九 C语言中const的详细分析

文章目录1 const的分析2 const本质的分析实验2.1 代码案例分析3 const修饰函数参数和返回值时的情况3.1 代码案例分析4 总结1 const的分析 不管是C语言还是C语言,const都是一个非常重要的关键字。今天这篇文章着重学习记录C语言中的const。C语言中稍有不同。 在C语…

【C语言进阶深度学习记录】十 C语言中:struct的柔性数组和union分析

本文并不讲C语言的基础 文章目录1 空struct的大小2 结构体与柔性数组2.1 柔性数组的使用方法2.2 柔性数组使用代码案例分析3 C语言中的union分析3.1 使用union判断系统大小端4 总结1 空struct的大小 C语言中的struct可以看成是变量的集合 如果一个struct里面什么都没有&#…

【C语言进阶深度学习记录】十一 C语言中enum,sizeof,typedef分析

文章目录1 enum 枚举类型的使用方法1.1 enum枚举类型的特殊意义1.2 代码分析:enum的使用2 sizeof 关键字的用法2.1 代码案例分析:sizeof的本质3 typedef的意义3.1 代码案例:typedef 的使用案例4 总结1 enum 枚举类型的使用方法 enum是C语言中…