EtherCAT使用与解析-ethercat空闲阶段函数解析

经过ethercat系统加载完成需要的内核模块后,一个是ec_master主站模块,另外一个就是ec_generic驱动模块,加载完成后,主站进入空闲阶段,开始执行空闲阶段函数./master/master.c/ec_master_idle_thread()空闲阶段函数,这里有个参数,该参数是thread_run开启线程函数时传递的,他指向主站空间。

整个的线程函数的流程如下:

1.接收数据帧

2.执行主站状态机

3.执行从站状态机

4.进行数据帧排队

5.进行数据帧发送

下面依次进行说明:

1.接收数据帧函数ecrt_master_receive()函数:

该函数本质上调用了./devices/generic.c/ec_gen_poll()轮询函数;

另外还需要说明的是,ehtercat系统使用的网络设备结构体是基于原本的linux网络设备结构体之上又创建的一个结构体,就是ec_device结构体,该结构体中的一些信息是基于net_device获取得到的。这种情况下,一般上使用ec_device即可。

在接收数据帧过程中,首先刷新网络设备连接状态,然后对ec_device->link_state进行更新。

接下来就是对网络数据帧的接收工作,使用kernel_recvmsg进行数据帧接收(MSG_DONTWAIT类型,并不会阻塞),这里还有个点就是在接收过程中需要进行多次接收,这是由于发送数据的时候可能需要多个数据帧进行数据发送。接收到数据帧之后就需要进行数据帧解析,由于使用的是原始套接字进行数据帧发送。因此在解析过程中需要先将ethernet数据帧的头部去除掉,也就是前14Byte,然后将剩下的数据交给ec_master_receive_datagrams()函数,这里需要了解以下EtherCAT数据帧的构成:

ethernet数据帧头(14Byte) + ethercat头(2Byte) + 子报文0 + 子报文1 ...

子报文的数据帧结构如下:

子报文头 + 子报文数据 + WKC

子报文头的结构如下:

命令(8bit) + 索引(8bit) + 地址(32bit) + 长度(11bit) + R(4bit) + M(1bit) + 状态位(16bit)

ethercat一个数据帧中可以存储多个子报文,而每个子报文就是一个ec_datagram结构数据。下面继续了解子报文内容:

命令:也就是子报文类型,可以是APWR/FPWR...具体参考ec_datagram_type_t枚举数组,他们的意义在于寻址方式与权限,如果你看过一些其他文章的话,里面有三种寻址方式,分别是顺序寻址方式、配置寻址方式和逻辑寻址方式,以及三种方式WR写入,RD读取以及RW读写,他们进行分别组合就是ec_datagram_type_t枚举的不同类型,置于三种具体如何实现以及在数据帧中如何体现,在之后会进行分别介绍。

索引:这个索引是主站在进行数据帧排队的时候进行设置的。

地址:地址这部分单纯的看一些介绍也有些费解,他在不同的寻址方式中体现是不同的,在顺序寻址和配置寻址这两种方式中他可以拆分为两个部分,也就是APD和ADO,一个用来匹配从站地址,一个用来寻址从站内部寄存器地址,置于从站地址如何判定的,在之后内容进行介绍。另外一种就是逻辑寻址了,在这种寻址方式中,地址是作为一个整体表述一个逻辑地址,他是用于过程数据映射的,也就是PDO。逻辑地址的意义也比较庞大,之后涉及到继续介绍;

长度:长度就是子报文的数据长度。

M位:表示数据帧的该子报文之后还是否连接有子报文。

WKC:WKC相当于数据帧中的FCS,起到一个检测作用,他与子报文的命令类型极度相关。具体就是单纯的读写类型子报文,在从站操作完毕后,会对该值+1,读写操作,读成功+1 写成功+2 读写成功+3;这样,只要报文类型确定,那么WKC应该是个确定的值,可以用于检测。

这样的话,基本上一个子报文在数据帧中的体现形式就表述到这里,不明白的可以留言,大家互相探讨。

这样,只要是需要主站读取的信息的子报文,就将返回的子报文内容复制到原子报文数据位置即可。然后将完成操作的子报文从主站的子报文发送链表中删除。由于接收到就会进行删除,因此每次需要发送数据帧的时候,都要重新排队。

2.执行主站状态机

3.从站状态机执行

主站和从站状态机,这两个部分内容很多,因此放在下一个主题进行专门的讨论;

4.进行数据帧排队

排队使用的函数主要是./master/master.c/ec_master_queue_datagram()函数;主站的数据帧发送队列为master->datagram_queue,当某个数据帧需要进行发送的时候,需要先将相应子报文添加到发送队列,为之后的数据帧发送做准备。

5.进行数据帧发送

该部分主要使用的函数为./master/master.c/ec_master_send_datagram()函数,本质就是基于ec_datagram进行对数据报的组装以及发送过程,首先遍历主站发送数据帧链表,然后逐个添加子报文数据分别是子报文头,子报文数据和WKC,当数据可以填充完毕一个数据帧(数据帧一般最多传输1500Byte数据)后,就进行ethercat枕头的内容添加,也就是ethercat数据帧数据大小的赋值。

进行数据帧发送的时候还需要明确的是device->dev->netdev_ops->ndo_start_xmit回调函数指针指向的函数为./devices/generic.c/ec_gen_netdev_start_xmit()函数。该函数的初始化是基于net_device_ops结构函数进行回调函数的初始化的,也就是类似于字符设备驱动的file_operations()指针的使用。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值