当前位置:首页 > 技术学院 > 技术前线
[导读]EtherCAT主站实时性分析

一、实时性的意义

在主从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);

}

......

}

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

学好电子技术基础知识,如电路基础、模拟电路、数字电路和微机原理。这几门课程都是弱电类专业的必修课程,学会这些后能保证你看懂单片机电路、知道电路的设计思路和工作原理;

关键字: 单片机 编程 电路设计

单片机编程需要使用专门的软件工具,这些工具能够帮助程序员编写、调试和烧录程序到单片机中。以下是一些常用的单片机编程软件:

关键字: 单片机 编程 软件工具

Java语言和C语言是两种不同的编程语言,它们在语法、特性和应用领域上有许多差别。下面将详细介绍Java语言和C语言之间的差异以及它们各自的技术特点。

关键字: Java语言 C语言 编程

嵌入式系统是现代生活中无处不在的一部分。它们包括了我们的家电、汽车、智能手机、医疗设备等等。这些系统的工作必须高效、可靠,因为它们往往控制着生活中的关键方面。而C语言作为一种广泛用于嵌入式系统开发的编程语言,其质量和稳定...

关键字: 嵌入式系统 C语言 编程

在嵌入式系统开发领域中,C语言是使用最广泛的编程语言之一。它具有高效、灵活和可移植的特点,成为嵌入式系统设计师的首选语言。本文将介绍C语言编程的基本概念、特点以及在嵌入式系统开发中的应用。

关键字: 嵌入式系统 C语言 编程

在编程和计算中,运算符优先级是解释和计算表达式的一个关键因素。本文旨在阐述运算符优先级的概念、规则及其在表达式中的应用,以帮助读者更好地理解和运用运算符优先级。

关键字: 表达式 运算符 编程

泰克科技组合软件总经理Rick Khulman:“激发孩子们——尤其是女孩们对STEM的兴趣,对我本人乃至广大工程界都至关重要。”

关键字: 编程 机器人 示波器

PIC单片机采用精简指令集,例如对于PIC16F716单片机,只有35条单字节指令。要用这么少的指令实现复杂的控制或计算,显然要在程序设计上多做文章,以下就程序设计需要注意的问题谈一些看法。 美国微芯公司开发的CMOS工...

关键字: 单片机 控制 编程

随着社会经济的不断发展进步,科技的不断飞升,在新时代的背景下网络通信已经成了人们最为常 用的科学技术产品之一,由于生活水平得到了提高人们在日常的追求上也发生着变化,而对于通信 的产品可以说是有着日新月异的变化,人们在网络...

关键字: 通信 协议 控制

PLC编程是一种数字运算操作的电子系统,专为在工业环境下应用而设计。它采用可编程序的存储器,用来在其内部存储执行逻辑运算、顺序控制、定时、计数和算术运算等操作的指令,并通过数字式、模拟式的输入和输出,控制各种类型的机械或...

关键字: plc 编程 plc编程
关闭
关闭