首页/新闻资讯/正文详情

QNX开发之ECAT专用网卡驱动ecpkt · 01-背景

发布时间:2026/9/24 22:26:05 来源:云帆数科 栏目:资讯中心
QNX开发之ECAT专用网卡驱动ecpkt · 01-背景
QNX开发之ECAT专用网卡驱动ecpkt · 01-背景QNX上使用网络通信框架iopkt来统一管理网络通信应用程序通过通用socket接口向iopkt发起通信请求网卡驱动则由系统预先注册到iopkt框架中iopkt再通过这些注册进来的驱动控制网卡硬件进行报文收发从而完成网络通信。这是iopkt的框架图EtherCAT本质上还是网络通信所以按照传统方法在QNX上运行ECAT主站报文管理还是要交给iopkt。主站这里以SOEM为例在上图中扮演的就是Application的角色SOEM调用socket接口发起通信请求被转交给iopkt微内核体系下它同样是一个进程iopkt再通过Drivers控制网卡硬件完成报文收发最后数据仍经由socket接口回到SOEM。使用这种方法实现主站是最快捷的开发人员直接使用socket接口完全不用关心协议栈和硬件控制很快就能实现一个可用的主站。但这种方法有几个问题-iopkt原生不支持RAW SOCKET通信EtherCAT通信本质上是链路层通信通信报文的组包和解包完全由主站自己完成不需要TCP/IP协议栈介入所以主站在socket层面一般直接使用RAW SOCKET进行通信。但iopkt不支持RAW SOCKET要在iopkt框架下进行链路层的RAW SOCKET通信需要使用BPF接口。直接使用BPF原始接口进行网络报文收发开发门槛极高调试也非常困难好在QNX自带基于BPF的pcap支持可以使用pcap封装的API来代替。下面是我使用pcap进行链路层通信的代码作为示例供参考pcap 链路层socket的创建和配置*psock pcap_create(ifname, errbuf); if (*psock NULL) { fprintf(stderr, failed to create pcap handler: %s\n, errbuf); return -1; } if (pcap_set_buffer_size(*psock, 65536) ! 0) { fprintf(stderr, failed to set pcap buffer size: %s\n,pcap_geterr(*psock)); pcap_close(*psock); return -1; } if (pcap_set_timeout(*psock, ECAT_TICK_PERIOD) ! 0) { fprintf(stderr, failed to set pcap timeout: %s\n, pcap_geterr(*psock)); pcap_close(*psock); return -1; } // Optional // - PCAP_OPENFLAG_PROMISCUOUSpcap_set_promisc(handle, 1); 1on0off // - filter pcap_set_promisc(*psock, 1); pcap_set_immediate_mode(*psock, 1); if (pcap_activate(*psock) ! 0) { fprintf(stderr, failed to active pcap handler: %s\n, pcap_geterr(*psock)); pcap_close(*psock); return -1; } if (pcap_lookupnet(ifname, net, mask, errbuf) -1) { perror(lookup net);} if (pcap_compile(*psock, fp, filter_exp, 0, net) -1) { perror(compile);} if (pcap_setfilter(*psock, fp) -1) { perror(set filter);} if (NULL *psock) { printf(interface %s could not open with pcap\n, ifname); return 0; }pcap 链路层socket的收发rval pcap_sendpacket(*stack-sock, (*stack-txbuf)[idx], lp); res pcap_next_ex(*stack-sock, header, pkt_data);-iopkt处理报文的路径过长会给实时通信引入抖动EtherCAT报文的收发路径是应用程序 → socket → iopkt 进程 → 协议栈 → mbuf → devnp 驱动 → GEM 硬件对普通TCP/IP流量这条路径毫无问题但对EtherCAT这种周期性硬实时报文毫秒级周期、抖动敏感它引入了三类不可控延迟mbuf管理——每帧都要经过mbuf池的分配、链式组织、释放协议栈穿行——裸L2帧也要在栈的输入/输出队列里排队work thread调度——iopkt用多线程处理驱动事件报文何时被处理取决于线程调度而不是硬件何时到达。-EtherCAT和Ethernet报文混杂在一起由iopkt处理Ethernet报文吞吐量大时会严重影响EtherCAT实时性这才是最致命的问题。在iopkt框架下所有的socket通信都会统一交给iopkt管理。虽然iopkt内部会通过多线程并行来降低报文阻塞的风险但它的多线程模型无法进行精细管理。比如我们可以在应用层通过提高EtherCAT进程优先级、指定进程CPU亲和性等方式保证EtherCAT报文优先提交给iopkt但iopkt内部的报文处理线程无法绑定到应用程序上也就无法在iopkt内部保证接收到的EtherCAT报文被优先处理。这样一来Ethernet报文吞吐量大时EtherCAT的实时性必然会受到影响。其实QNX对这个问题有一个折中方案运行多个iopkt实例分别管理指定的网卡不同实例可以使用不同的进程优先级以此处理不同优先级的通信。但这种做法有个限制多个iopkt实例之间有点类似于用户组的概念同一个用户进程只能使用一个用户组下的资源。简单来说EtherCAT应用只能使用管理EtherCAT网卡的iopkt实例的网络资源Ethernet应用只能使用管理Ethernet网卡的实例的网络资源这就要求系统必须将EtherCAT功能和Ethernet功能拆分为独立进程两者通过IPC进行数据交互。这样一来一是IPC的效率低于进程内线程间的数据交互二是给用户系统额外增加了一层限制所以并不是一种最优的方案。总结一下上面这些问题的根源是把为TCP/IP设计的iopkt框架强行套在了EtherCAT身上而EtherCAT本质是链路层通信对通信框架的依赖非常低——它完全不需要TCP/IP协议栈的参与。所以我们考虑将EtherCAT通信从iopkt中分离出来通过专用的网卡驱动框架ecpkt直接驱动硬件彻底绕开iopkt框架。使用ecpkt后通信链路会变成下面这样应用程序 → write/read → ecpkt → GEM 硬件系统层面上的混合通信使用iopkt时是这样使用ecpkt之后会是这样ecpkt将作为一个Resource Manager独立运行在系统里。改造也有现成的起点iopkt本身已经包含了一个适配自己框架的可用网卡驱动具备完整的初始化、数据收发管理、中断管理等功能。我们将会基于这个驱动改造出一个满足我们需求的功能完备的专用驱动——这也是本系列后续章节的主线。

相关推荐

基于MindSpore复现MTCNN:人脸检测训练与端侧推理全流程解析
基于MindSpore复现MTCNN:人脸检测训练与端侧推理全流程解析

简介:基于华为MindSpore框架实现的人脸识别与关键点检测MTCNN课程大作业完整工程包,覆盖数据生成、模型训练、MindSpore Lite转换与摄像头实时推理全链路,面向计算机视觉、人工智能方向的学生及端侧AI部署初学者,适合课程设计、毕… · 2026/9/24 22:26:05

Spring Boot+Vue构建国外摇滚乐队交流与周边售卖系统
Spring Boot+Vue构建国外摇滚乐队交流与周边售卖系统

1. 项目定位与核心需求拆解拿到"m251国外摇滚乐队交流和周边售卖系统"这个题目的时候,我第一反应是这不像一个普通的课程设计项目——它把社区和电商揉在了一起,而且目标用户非常明确:国外摇滚乐队的乐迷群体。说实话,这… · 2026/9/24 22:26:05

中职网络安全赛AB模块解析:Nmap扫描与iptables加固实战
中职网络安全赛AB模块解析:Nmap扫描与iptables加固实战

简介:这份资源是2022年全国职业院校技能大赛(中职组)网络安全竞赛试题1套的A、B模块答案解析,面向备战全国职业院校技能大赛的中职选手、指导教师以及需要系统梳理网络安全实操要点的学习者。内容围绕基础设施设置与安全加固、网络… · 2026/9/24 22:26:05

Modbus转MQTT工业数据采集方案:老旧设备上云实战与避坑指南
Modbus转MQTT工业数据采集方案:老旧设备上云实战与避坑指南

老工厂里这种事太常见了:设备还是十几年前那套,PLC、仪表、变频器,通讯口就是RS485,走Modbus RTU。但现在的MES、SCADA、云平台都在问你要数据,接口标准基本都是MQTT。直接换设备不现实,成本高,… · 2026/9/24 23:01:06

不装Python,用Node.js实现量化回测与ECharts可视化
不装Python,用Node.js实现量化回测与ECharts可视化

1. 不装 Python 也能玩量化:Node.js 技术选型的真实考量1.1 量化学习路径的另一种打开方式这两年量化交易的热度一直没降过,打开任何技术社区都能看到 Python 写策略、跑回测的教程。但对于很多前端转全栈、或者以 Node.js 为主要技术栈的开发者来说&… · 2026/9/24 23:01:00

MFC五子棋人机对战源码解析:从工程结构到AI评分与悔棋实现
MFC五子棋人机对战源码解析:从工程结构到AI评分与悔棋实现

简介:这是一份面向C初学者与课程设计需求者的MFC实战项目源码,围绕Windows平台下的人机对战五子棋展开,适合想通过完整案例理解图形界面开发、事件处理与基础AI算法的学习者。压缩包共41个文件,约1.94MB,以h头文件与cp… · 2026/9/24 23:01:00

农产品自主供销小程序毕业设计:微信小程序+Java后端全链路实战
农产品自主供销小程序毕业设计:微信小程序+Java后端全链路实战

简介:这份资源是面向计算机专业毕业生与课程设计学习者的农产品自主供销小程序完整项目包,采用微信开发者工具搭配Java、SSM框架与MySQL数据库实现,适合作为毕业设计、课程设计或项目实战参考。系统按管理员、用户、农户三类角色划分权限&… · 2026/9/24 23:01:00

AI代码评审如何把token降到九分之一?阿里开源工具的工程实践解析
AI代码评审如何把token降到九分之一?阿里开源工具的工程实践解析

用过AI代码评审工具的同学,大概率都有过这种体验:辛辛苦苦把一个PR的改动喂给大模型,等它分析完,账单上的token数字也跟着蹭蹭往上涨。尤其是改动稍微大一点的PR,光一次评审吃掉几万token都是常事,一个月下… · 2026/9/24 23:01:00

Modbus Studio实战:从报文解析到主从模拟的调试指南
Modbus Studio实战:从报文解析到主从模拟的调试指南

干工控和嵌入式这些年,Modbus协议几乎是绕不开的一道坎。温控器、变频器、电表、传感器、PLC、上位机,但凡是工业现场的设备,十有八九都带一个Modbus RTU或者Modbus TCP接口。调试的时候最痛苦的不是设备不工作,而是报文发过去了、… · 2026/9/24 23:01:00

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码