IgH调试注意事项

1,不要在虚拟机测试,否则IgH无法收发数据包

现象:虚拟机中运行IgH master并绑定网卡后,主站由ORPHANED状态转换成IDLE状态,但无法收发数据报。

这是因为虚拟机用的是虚拟网卡,需通过iptables将数据包到转发到真实的网卡上,实现收发数据的目的。但IgH替换了网卡驱动程序,收到数据包后,处理流程没有走内核的网络协议栈,所以工作中tcp/ip层的iptables就不起作用,导致IgH无法正常收发报文。

虚拟机网络原理参考:ubuntu20.04 搭建kernel调试环境第六篇(下)-网络原理-CSDN博客  

解决:物理机安装ubuntu用来测试IgH。

2,获取IgH的INFO、WARNING、ERR信息

root@ubuntu:/home/gsf# echo 7 7 7 7 > /proc/sys/kernel/printk

#define EC_MASTER_INFO(master, fmt, args...) \printk(KERN_INFO "EtherCAT %u: " fmt, master->index, ##args)#define EC_MASTER_WARN(master, fmt, args...) \printk(KERN_WARNING "EtherCAT WARNING %u: " fmt, master->index, ##args)#define EC_MASTER_ERR(master, fmt, args...) \printk(KERN_ERR "EtherCAT ERROR %u: " fmt, master->index, ##args)

3,获取IgH的DEBUG信息

root@ubuntu:/home/gsf# vim /etc/init.d/ethercat

#MASTER_ARGS= 改成下面MASTER_ARGS="debug_level=2"

务必注意:注意,make modules_install install后,需要重新修改

DEBUG主要是输出一些收发报文的数据,比如:

[73996.353863] EtherCAT DEBUG 0: ec_master_send_datagrams(device_index = 0)
[73996.353863] EtherCAT DEBUG 0: Adding datagram 0x2E
[73996.353864] EtherCAT DEBUG 0: frame size: 46
[73996.353864] EtherCAT DEBUG 0: Sending frame:
[73996.353864] EtherCAT DEBUG: FF FF FF FF FF FF 6C 24 08 29 52 19 88 A4 0E 10 
[73996.353867] EtherCAT DEBUG: 05 2E 01 00 20 01 02 00 00 00 02 00 00 00 00 00 
[73996.353869] EtherCAT DEBUG: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
[73996.353871] EtherCAT DEBUG: 00 00 00 00 00 00 00 00 00 00 00 00 

4,dmesg日志不全

现象:IgH源码中加了很多打印,连接从站后,发现dmesg会失了部分日志。

下面的下图显示的是ec_master_idle_thread --> ecrt_master_send --> ec_master_send_datagrams发送数据报文时,增加的printk打印。

datagram->index用的是master->datagram_index++,初始化是master->datagram_index为0,所以所有主站发送的数据报文的index应该是从0递增的,最大值255(master->datagram_index是uint8_t类型),到最大值后又从0开始计数。

原因:主站初始化时,ec_master_idle_thread线程循环执行,循环时间比较短,见下面代码:

ec_master_idle_thread函数:if (ec_fsm_master_idle(&master->fsm)) {set_current_state(TASK_INTERRUPTIBLE);schedule_timeout(1);   --------------- 1个jiffies} else {schedule();  ---------切换到其他线程执行,如果系统空闲,会继续执行该线程}

不接从站,printk信息比较少,可以完整输出。接上从站,代码流程复杂,自己加了很多printk,由于循环时间短,每轮循环都有大量的信息,来不及输出,就丢失了部分log。

解决:

方法一:直接修改主站的循环周期

ec_master_idle_thread函数://ec_master_set_send_interval(master, 1000000 / HZ);
ec_master_set_send_interval(master, 5000000); -------改动1,主站周期从4ms改成5sif (ec_fsm_master_idle(&master->fsm)) {// set_current_state(TASK_INTERRUPTIBLE);// schedule_timeout(1); msleep(100); ----------改动2,注掉上面2行} else {//schedule(); msleep(100); ----------改动2,注掉上面1行}

方法二:间接修改主站的循环周期

因为ec_master_idle_thread 每个周期都会执行ecrt_master_send --> ec_master_send_datagrams发送数据报文,所以可以在发送报文时加个延时:

ec_master_idle_thread函数://ec_master_set_send_interval(master, 1000000 / HZ);
ec_master_set_send_interval(master, 5000000); -------改动1,主站周期从4ms改成5s-----------------------------------------------------------------------------void ec_master_send_datagrams(ec_master_t *master, /**< EtherCAT master */ec_device_index_t device_index /**< Device index. */)
{do {frame_data = NULL;follows_word = NULL;more_datagrams_waiting = 0;// fill current frame with datagramslist_for_each_entry(datagram, &master->datagram_queue, queue) {if (datagram->state != EC_DATAGRAM_QUEUED ||datagram->device_index != device_index) {continue;}……list_add_tail(&datagram->sent, &sent_datagrams);datagram->index = master->datagram_index++;EC_MASTER_DBG(master, 2, "Adding datagram 0x%02X\n",datagram->index);msleep(100); ------------在这里加个延时

修改后,log是全的。报文从0开始,发送、接收是一一对应的:

5,过滤掉IgH主站插网线之前的log

IgH主站网卡没有插网线,意味着网卡的link_state处于down状态,ec_master_idle_thread周期性执行ecrt_master_send发送数据报文,在ecrt_master_send中如果网卡处于link down状态,则会设置报文为EC_DATAGRAM_ERROR,在这里加个printk(见下代码),log中过滤关键字EC_DATAGRAM_ERROR就可以了。

void ecrt_master_send(ec_master_t *master)
{ec_datagram_t *datagram, *n;ec_device_index_t dev_idx;if (master->injection_seq_rt != master->injection_seq_fsm) {// inject datagram produced by master FSMec_master_queue_datagram(master, &master->fsm_datagram);master->injection_seq_rt = master->injection_seq_fsm;}ec_master_inject_external_datagrams(master);for (dev_idx = EC_DEVICE_MAIN; dev_idx < ec_master_num_devices(master);dev_idx++) {if (unlikely(!master->devices[dev_idx].link_state)) {// link is down, no datagram can be sentlist_for_each_entry_safe(datagram, n,&master->datagram_queue, queue) {if (datagram->device_index == dev_idx) {//在这里加行logprintk(KERN_ERR "geshifei %s %d:  set datagram->state = EC_DATAGRAM_ERROR\n",__func__, __LINE__);datagram->state = EC_DATAGRAM_ERROR;list_del_init(&datagram->queue);}}

6,IgH发送、接收的报文怎么看

以IgH读从站状态的广播报文0x0130为例,打开DEBUG后,demsg看到的报文:

发送报文:

[18773.590655] geshifei ec_master_send_datagrams 1059:  Adding datagram datagram->index=0
[18773.590656] EtherCAT DEBUG 0: frame size: 46
[18773.590656] EtherCAT DEBUG 0: Sending frame:
[18773.590658] EtherCAT DEBUG: FF FF FF FF FF FF 6C 24 08 29 52 19 88 A4 0E 10 
[18773.590664] EtherCAT DEBUG: 07 00 00 00 30 01 02 00 00 00 00 00 00 00 00 00 
[18773.590669] EtherCAT DEBUG: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
[18773.590674] EtherCAT DEBUG: 00 00 00 00 00 00 00 00 00 00 00 00 

响应报文:

[18773.710617] EtherCAT DEBUG 0: Received frame:
[18773.710618] EtherCAT DEBUG: FF FF FF FF FF FF 6E 24 08 29 52 19 88 A4 0E 10 
[18773.710624] EtherCAT DEBUG: 07 00 01 00 30 01 02 00 00 00 02 00 01 00 00 00 
[18773.710628] EtherCAT DEBUG: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
[18773.710633] EtherCAT DEBUG: 00 00 00 00 00 00 00 00 00 00 00 00 
[18773.710636] geshifei ec_master_receive_datagrams 1224:  datagram->index=0

7,wireshark报文怎么看

1)注意source mac被从站改动过,为什么改,不清楚,感觉没必要。

2)正常情况下,发送的报文WC = 0,响应报文的WC不为0(存在从站的情况下)

所以可通过上面两个特征来判断哪个是发送报文,哪个是接收报文。

datagram->index用的是master->datagram_index++,初始化是master->datagram_index为0,所以所有主站发送的数据报文的index应该是从0递增的,最大值255(master->datagram_index是uint8_t类型),到最大值后又从0开始计数。

响应的报文,不会(也不能)修改Index值,因为IgH主站程序收到响应报文后,需要根据报文的index去匹配对应的发送报文,然后将发送报文从内部的发送队列中删除。

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

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

相关文章

【前端基础】script引入资源脚本加载失败解决方案(重新加载获取备用资源)

问题描述 现在假设有一个script资源加载失败&#xff0c;代码如下 <!DOCTYPE html> <html> <head><title>script 资源加载失败</title> </head> <body><script src"http:hdh.sdas.asdas/1.js"></script> &l…

openGuass:极简版安装

目录 一、openGauss简介 二、初始化安装环境 1.创建安装用户 2.修改文件句柄设置 ​3.修改SEM内核参数 4.关闭防火墙 6.禁用SELINUX 7.安装依赖软件 8.重启服务器 三、安装数据库 1.下载安装包 2.创建安装目录 3.解压安装包 4.执行安装 5.验证安装 四、gsql工具…

【大数据存储与处理】第一次作业

hbase 启动步骤 1、启动 hadoop&#xff0c;master 虚拟机&#xff0c;切换 root 用户&#xff0c;输入终端命令&#xff1a;start-all.sh 2、启动 zookeeper&#xff0c;分别在 master、slave1、slave2 虚拟机终端命令执行&#xff1a;zkServer.sh start 3、启动 hbase&#x…

Tomcat报404问题解决方案大全(包括tomcat可以正常运行但是报404)

文章目录 Tomcat报404问题解决方案大全(包括tomcat可以正常运行但是报404)1、正确的运行页面2、报错404问题分类解决2.1、Tomcat未配置环境变量2.2、IIs访问权限问题2.3、端口占用问题2.4、文件缺少问题解决办法&#xff1a; Tomcat报404问题解决方案大全(包括tomcat可以正常运…

04-JVM字节码文件结构深度剖析

一、源代码 package com.tuling.jvm;public class TulingByteCode {private String userName;public String getUserName() {return userName;}public void setUserName(String userName) {this.userName userName;} }二、通过javap -verbose TulingByteCode .class反编译 //…

【Spring Security】打造安全无忧的Web应用--进阶篇

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Spring Security的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.导入相关配置 1.pom 2.ym…

【sgDragUploadFolder】自定义组件:自定义拖拽文件夹上传组件,支持上传单个或多个文件/文件夹,右下角上传托盘出现(后续更新...)

特性&#xff1a; 支持在拖拽上传单个文件、多个文件、单个文件夹、多个文件夹可自定义headers可自定义过滤上传格式可自定义上传API接口支持显示/隐藏右下角上传队列托盘 sgDragUploadFolder源码 <template><div :class"$options.name" :dragenter"i…

.Net Core webapi RestFul 统一接口数据返回格式

在RestFul风格盛行的年代&#xff0c;大部分接口都需要一套统一的数据返回格式&#xff0c;那么我们怎么才能保证使用统一的json数据格式返回呢&#xff0c;下面给大家简单介绍一下&#xff1a; 假如我们需要接口统一返回一下数据格式&#xff1a; {"statusCode": …

智能图像编辑软件Luminar Neo mac提供多种调整和滤镜选项

Luminar Neo mac是一款由Skylum公司开发的AI技术图像编辑软件&#xff0c;旨在为摄影师和视觉艺术家提供创意图像编辑解决方案。Luminar Neo拥有强大的AI技术和丰富的后期处理工具&#xff0c;可帮助用户快速轻松地实现从基本到高级的图像编辑需求。 Luminar Neo提供了多种调整…

同步与互斥(二)

一、谁上锁就由谁解锁&#xff1f; 互斥量、互斥锁&#xff0c;本来的概念确实是&#xff1a;谁上锁就得由谁解锁。 但是FreeRTOS并没有实现这点&#xff0c;只是要求程序员按照这样的惯例写代码。 main函数创建了2个任务&#xff1a; 任务1&#xff1…

先进制造身份治理现状洞察:从手动运维迈向自动化身份治理时代

在新一轮科技革命和产业变革的推动下&#xff0c;制造业正面临绿色化、智能化、服务化和定制化发展趋势。为顺应新技术革命及工业发展模式变化趋势&#xff0c;传统工业化理论需要进行修正和创新。其中&#xff0c;对工业化水平的判断标准从以三次产业比重标准为主回归到工业技…

Kubernetes 容器编排(7)

离线业务编排详解 在线业务和离线业务 在线业务 Deployment、StatefulSet以及 DaemonSet 这三个编排概念的共同之处是&#xff1a;它们主要编排的对象&#xff0c;都是"在线业务"&#xff0c;即&#xff1a;Long Running Task&#xff08;长作业&#xff09;。比如…

尚硅谷 java 2023(基础语法)笔记

一、变量与运算符 1、HelloWorld的编写和执行 class HelloChina{public static void main(String[] args){System.out.println("hello,world!!你好&#xff0c;中国&#xff01;");} } 总结&#xff1a; 1. Java程序编写和执行的过程&#xff1a; 步骤1&#xff1…

HackTheBox - Medium - Linux - Sandworm (我的创作纪念日

Sandworm Sandworm 是一台中等难度的 Linux 机器&#xff0c;它托管了一个具有“PGP”验证服务的 Web 应用程序&#xff0c;该服务容易受到服务器端模板注入 &#xff08;SSTI&#xff09; 的攻击&#xff0c;导致“Firejail”监狱内的远程代码执行 &#xff08;RCE&#xff0…

12、Qt:用QProcess类启动外部程序:简单使用

一、说明 简单使用&#xff1a;在一个函数中&#xff0c;使用QProcess类的临时对象调用可执行文件exe&#xff0c;只有这个exe执行完了&#xff0c;这个函数才往下执行&#xff0c;一次性打印出exe所有输出信息&#xff1b;复杂使用&#xff1a;创建QProcess类的全局对象&…

STM32F4的DHT11初始化与实例分析

STM32—— DHT11 本文主要涉及STM32F4 的DHT11的使用以及相关时序的介绍&#xff0c;最后有工程下载地址。 文章目录 STM32—— DHT11一、 DHT11的介绍1.1 DHT11的经典电路 二、DHT11的通信2.1 DHT11的传输数据格式2.2 DHT11 通信分步解析 三、 DHT11 代码3.1 引脚图3.2 电路图…

阿里云林立翔:基于阿里云 GPU 的 AIGC 小规模训练优化方案

云布道师 本篇文章围绕生成式 AI 技术栈、生成式 AI 微调训练和性能分析、ECS GPU 实例为生成式 AI 提供算力保障、应用场景案例等相关话题展开。 生成式 AI 技术栈介绍 1、生成式 AI 爆发的历程 在 2022 年的下半年&#xff0c;业界迎来了生成式 AI 的全面爆发&#xff0c…

【接口测试】HTTP接口详细验证清单

概述 当我们在构建、测试、发布一套新的HTTP API时&#xff0c;包括我在内的大多数人都不知道他们所构建的每一个组件的复杂性和细微差别。 即使你对每一个组件都有深刻的理解&#xff0c;也可能会有太多的信息在你的脑海中出现。 以至于我们不可能一下把所有的信息进行梳理…

pycharm下执行conda命令提示无法识别解决方案

1 问题描述 win10环境命令行执行conda命令&#xff0c;报命令无法识别&#xff0c;错误信息如下&#xff1a; PS D:\code\cv> conda activate pt conda : 无法将“conda”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&a…

python基础语法总结

基础是深入必不可少的&#xff0c;如果没有基础的支持&#xff0c;后面都是浮云&#xff0c;就像情侣之间&#xff0c;没有感情基础是不会有好结果的&#xff0c;物资基础是靠两个人打拼的&#xff0c;所以学习就像谈恋爱&#xff0c;两个人要学会沟通&#xff0c;才能修成正果…