当前位置: 首页 > article >正文

网卡驱动死机调试经验案例

一、现象执行iperf打流后不管是udp打流还是tcp打流命令行没有响应无法敲入任何字符也没有回显但一段时间后串口有打印查看代码后发现是EMAC的DMA中断里打印的打印的内容如下[13:39:23:743]37.4320Mbps![13:39:46:157]37.4490Mbps![13:40:08:589]37.4490Mbps![14:26:59:361]intr0x86980c0[14:27:02:590]intr0x8688080[14:27:03:390]intr0x8688080[14:27:11:837]intr0x8688080[14:27:15:579]intr0x8688080[14:27:16:331]intr0x8688080[14:27:28:217]intr0x8688080[14:27:30:680]intr0x8688080[14:27:35:575]intr0x8688080[14:27:42:598]intr0x8688080[14:27:45:103]intr0x8688080………二、问题排查首先找到打印对应的中断函数如下所示irqreturn_tvmc_interrupt(intirqno,void*param){structemac_device*edev(structemac_device*)param;structeth_device*ethedev-parent;intintsemac_read_reg((u32*)(edev-dma_base),DmaStatus);intenemac_read_reg((u32*)(edev-dma_base),DmaInterrupt);emac_write_reg((u32*)(edev-dma_base),DmaStatus,ints);emac_write_reg((u32*)(edev-dma_base),DmaInterrupt,0);if(intsDmaIntTxCompleted){rt_event_send(emac_event,EMAC_EVENT_TX_COMPLETE);}if(intsDmaIntRxCompleted){eth_device_ready(eth);}if(intsDmaIntAbnormal){EMAC_PRINTF(VIM_EMAC_DEBUG,intr 0x%x\n,ints);}emac_write_reg((u32*)(edev-dma_base),DmaInterrupt,en);return0;}可以看到是发生了异常的DMA中断打印的第一个异常的DmaStatus寄存器值是0x86980c0对照寄存器手册发现网卡接收DMA块被用完了如下所示。在注意到死机时的串口打印时间异常日志与正常iperf打流的最后一条日志相差了46分钟因此可以推测是这段时间内网卡的接收函数没有执行导致网卡DMA接收buffer消耗殆尽从串口不能输入也侧面印证了这一点因此可以推测程序可能是死在某个循环里了可能是比网卡接收线程、shell线程优先级更高的线程或是卡在某个中断里出不来了。为了验证是否卡在线程里有很多种办法例如在rtt线程调度器里加打印看是从哪个线程切到哪个线程最后卡住了但是这样打印会非常多所以简单的办法就是提高shell线程的优先级去验证实测把shell现场优先级提高最高仍然会死机因此可以推测大概率是卡死在中断里了。这里直接用JlinkGDB调试的方式去验证结果每次全速运行暂停时程序总停在中断里中断入口函数如下所示其中cnt是调试加的当一直卡在中断里出不来时会打印对应的中断号果然这个中断号和EMAC的中断号是一致的。voidgic_handle_irq(irq_regs_t*regs){uint32_tirqstat,irqnr;staticuint32_tcnt0;do{irqstatreadl(GIC_CPU_AIAR_REG);irqnrirqstatGICC_IAR_INT_ID_MASK;if(likely(irqnr15irqnr1020)){writel(irqstat,GIC_CPU_AEOI_REG);isb();handle_domain_irq(NULL,irqnr,regs);if(cnt1000){cnt0;__log(int %d,irqnr);}continue;}if(irqnr16){writel(irqstat,GIC_CPU_AEOI_REG);writel(irqstat,GIC_CPU_DEACTIVATE);#ifdefRT_USING_SMP/* ¦* Ensure any shared data written by the CPU sending ¦* the IPI is read after weve read the ACK register ¦* on the GIC. ¦* ¦* Pairs with the write barrier in gic_raise_softirq ¦*/smp_rmb();handle_IPI(irqnr,regs);#endifcontinue;}cnt0;break;}while(1);}因此可以推测是EMAC的某个中断没清除导致反复进入EMAC的中断细查发现正常DmaStatus寄存器的bit27是0每次卡住时这个位都是1这个bit位的描述如下查看代码和寄存器手册发现EMAC不止DmaStatus这个状态寄存器还有个GmacInterruptStatus于是异常时将这个寄存器的值也打印出来发现是0x50对应的寄存器描述如下好吧这个寄存器描述讲了个寂寞于是看linux sdk的代码发现有个函数叫vmc_emac_disable_mmc_tx_interrupt好像和这个有点关系再看这个函数操作的寄存器实际是屏蔽了和发送统计相关的功能这个寄存器有25个bit位刚好对应25种发送数据统计。在linux sdk里所有的mask都置1了相当于关闭了所有的发送统计。虽然没有功能说明什么时候会产生中断但翻过头看串口日志发现每次都是打印了19次iperf结果后卡住怀疑应该是发送的数据量达到了某个数比如超过32位的数据量时会产生对应的中断而这个中断没有去清除。三、问题修复参考linux sdk的做法将发送和接收的统计功能关闭问题不再复现。

相关文章:

网卡驱动死机调试经验案例

一、现象 执行iperf打流后,不管是udp打流还是tcp打流,命令行没有响应,无法敲入任何字符,也没有回显,但一段时间后,串口有打印,查看代码后,发现是EMAC的DMA中断里打印的,打…...

“水莲花数”

#include<stdio.h>main(){int a,b,c,d;for(a100;a<999;a){ba/100;ca/10%10;d%10if(b*b*bc*c*cd*d*da)printf(“对了 %d %d %d %d\n”,a,b,c,d);}}...

探索响应式编程的瑰宝:RxJava

探索响应式编程的瑰宝&#xff1a;RxJava 【免费下载链接】RxJava ReactiveX/RxJava 是一个用于实现响应式编程的 Java 库。适合在 Java 应用开发中使用&#xff0c;提高代码的简洁性和可维护性。特点是提供了强大的响应式编程功能、易于使用的 API 和多种数据源的支持。 项目…...

探索System Design Primer:系统设计学习的宝藏库

探索System Design Primer&#xff1a;系统设计学习的宝藏库 【免费下载链接】system-design-primer 学习如何设计大型系统。为系统设计面试做准备。包含Anki记忆卡片。 项目地址: https://gitcode.com/GitHub_Trending/sy/system-design-primer 项目简介 是一个开源项…...

Slackin终极指南:2025年功能路线图与社区发展预测

Slackin终极指南&#xff1a;2025年功能路线图与社区发展预测 【免费下载链接】slackin Public Slack organizations made easy 项目地址: https://gitcode.com/gh_mirrors/sl/slackin Slackin是一款让公共Slack组织创建和管理变得简单的工具&#xff0c;它提供了从用户…...

PyMuPDF: Python接口的高效PDF处理库

PyMuPDF: Python接口的高效PDF处理库 【免费下载链接】PyMuPDF PyMuPDF is a high performance Python library for data extraction, analysis, conversion & manipulation of PDF (and other) documents. 项目地址: https://gitcode.com/gh_mirrors/py/PyMuPDF 是…...

PyPDF2: Python PDF库简介

PyPDF2: Python PDF库简介 【免费下载链接】pypdf A pure-python PDF library capable of splitting, merging, cropping, and transforming the pages of PDF files 项目地址: https://gitcode.com/gh_mirrors/py/pypdf 是一个开源的Python库&#xff0c;用于处理PDF文…...

Symfony Translation 性能优化终极指南:使用 Blackfire 分析翻译瓶颈的 5 个关键步骤

Symfony Translation 性能优化终极指南&#xff1a;使用 Blackfire 分析翻译瓶颈的 5 个关键步骤 【免费下载链接】translation symfony/translation: 是一个用于 PHP 的翻译库&#xff0c;支持多种消息源和翻译格式&#xff0c;可以用于构建多语言的 Web 应用程序和 API。 项…...

终极Symfony Translation测试指南:从单元测试到集成测试的完整策略

终极Symfony Translation测试指南&#xff1a;从单元测试到集成测试的完整策略 【免费下载链接】translation symfony/translation: 是一个用于 PHP 的翻译库&#xff0c;支持多种消息源和翻译格式&#xff0c;可以用于构建多语言的 Web 应用程序和 API。 项目地址: https://…...

微调Llama3模型记录

为了评估llama3模型微调的效果&#xff0c;尝试使用一些特定风格的语料数据微调llama3模型&#xff0c;这里做一下简单记录。 一、模型及数据准备 原生的Meta-Llama-3-8B-Instruct模型对中文效果并不是很好&#xff0c;我这里直接去huggingface上下载的llama3的中文微调版作为…...

表情捕捉 表情同步 2026

目录 表情同步PersonaLive&#xff1a; 表情同步hyperreenact&#xff1a; speedupvideocap 基于MobileNetV3的人脸表情捕捉-加速 加速库 onnx/tensorRT 说明 表情同步PersonaLive&#xff1a; https://www.bilibili.com/video/BV1XkBhBBEP7 表情同步hyperreenact&#xf…...

如何贡献代码?GitHub Profilinator开发者贡献指南

如何贡献代码&#xff1f;GitHub Profilinator开发者贡献指南 【免费下载链接】github-profilinator &#x1f680; This tool contains mini GUI components that you can hook together to automatically generate markdown code for a perfect readme. 项目地址: https://…...

Awesome-LLMOps 项目使用教程

Awesome-LLMOps 项目使用教程 【免费下载链接】Awesome-LLMOps An awesome & curated list of best LLMOps tools for developers 项目地址: https://gitcode.com/gh_mirrors/aw/Awesome-LLMOps 1. 项目的目录结构及介绍 Awesome-LLMOps/ ├── README.md ├── …...

Cuckoo Filter核心原理:从哈希表到指纹存储的巧妙设计

Cuckoo Filter核心原理&#xff1a;从哈希表到指纹存储的巧妙设计 【免费下载链接】cuckoofilter Cuckoo Filter: Practically Better Than Bloom 项目地址: https://gitcode.com/gh_mirrors/cu/cuckoofilter Cuckoo Filter是一种高效的近似集合成员查询数据结构&#x…...

Mariana Trench高级应用:多规则联合检测与误报排除策略

Mariana Trench高级应用&#xff1a;多规则联合检测与误报排除策略 【免费下载链接】mariana-trench A security focused static analysis tool for Android and Java applications. 项目地址: https://gitcode.com/gh_mirrors/ma/mariana-trench Mariana Trench是一款专…...

IPED插件开发测试:编写单元测试与集成测试的完整指南

IPED插件开发测试&#xff1a;编写单元测试与集成测试的完整指南 【免费下载链接】IPED IPED Digital Forensic Tool. It is an open source software that can be used to process and analyze digital evidence, often seized at crime scenes by law enforcement or in a co…...

终极指南:YTKNetwork请求生命周期全解析——从发起请求到完成的完整流程

终极指南&#xff1a;YTKNetwork请求生命周期全解析——从发起请求到完成的完整流程 【免费下载链接】YTKNetwork 项目地址: https://gitcode.com/gh_mirrors/ytk/YTKNetwork YTKNetwork是一个功能强大的iOS网络请求库&#xff0c;它基于AFNetworking构建&#xff0c;提…...

CCV 开源项目使用教程

CCV 开源项目使用教程 【免费下载链接】ccv C-based/Cached/Core Computer Vision Library, A Modern Computer Vision Library 项目地址: https://gitcode.com/gh_mirrors/cc/ccv 1. 项目的目录结构及介绍 CCV&#xff08;C-based/Cached/Core Computer Vision Librar…...

基于QT对UR3进行开发

将 Qt 与 UR3&#xff08;Universal Robots 3 协作机器人&#xff09;结合使用&#xff0c;可以开发功能丰富且用户友好的图形用户界面&#xff08;GUI&#xff09;&#xff0c;用于控制和监控机器人。以下是关于如何使用 Qt 开发与 UR3 机器人集成的详细指南。 前提条件 在开…...

老三网址读取

老三版本四【内存_ecx&#xff1a;21692E0/内存_call&#xff1a;1300560/内存地址_模式&#xff1a;21692E8/内存地址_发包&#xff1a;21692F0/内存_qq&#xff1a;123/全局_Network&#xff1a;5B9948/内存_位置&#xff1a;2400DA1/全局_房间人数&#xff1a;2187628/内存地…...

零基础Java第二期:数据类型与变量

目录 一、字面变量 二、数据类型 三、变量 3.1. 语法格式 3.2. 整型变量 &#xff08;1&#xff09;定义的方式 ​编辑&#xff08;2&#xff09;长整型变量和短整型变量 &#xff08;3&#xff09;字节型变量 3.3. 浮点型变量 &#xff08;1&#xff09;双精度浮点型…...

【Java实战】Java集成AD域账号登录

目的&#xff1a; JAVA集成域账号登录的实现方案&#xff0c;通过LDAPUtil类实现对AD域的身份验证。系统采用双域服务器配置&#xff0c;支持主备切换。 关键点包括&#xff1a; 1) LDAP连接参数配置&#xff1b; 2) 区分管理员账号和普通域账号的双重验证机制&#xff0c;…...

数据的存储(原反补码/大小端存储/截断溢出/隐式类型转换/浮点数存储)

目录 原码、反码、补码 大端存储和小端存储 截断 溢出 隐式类型转换&#xff08;整形提升&#xff09; 数据的输出 浮点数在内存中的存储 原码、反码、补码 计算机中的有符号整数有三种二进制表示方法 , 即原码、反码和补码。 三种表示方法均有符号位和数值位两部分,符号…...

记录错误笔记

25.0105现场用一个类来保存sncode和一个code列表public class MesClass{public string SnCode "";public List<string> MesCodeList new List<string>();}再放在一个mesclass类的列表里发现new一个新mesclass 后列表里之前的mesclass类元素的mescodeli…...

TrollRestore开发者指南:如何贡献代码与扩展功能

TrollRestore开发者指南&#xff1a;如何贡献代码与扩展功能 【免费下载链接】TrollRestore TrollStore installer for iOS 17.0 项目地址: https://gitcode.com/gh_mirrors/tr/TrollRestore TrollRestore是一款针对iOS 17.0的TrollStore安装工具&#xff0c;它利用系统…...

赫蹏JavaScript增强脚本终极解析:自动化中西文混排的实现原理与实战指南

赫蹏JavaScript增强脚本终极解析&#xff1a;自动化中西文混排的实现原理与实战指南 【免费下载链接】heti 赫蹏&#xff08;ht&#xff09;是专为中文内容展示设计的排版样式增强。它基于通行的中文排版规范而来&#xff0c;可以为网站的读者带来更好的文章阅读体验。 项目地…...

Rickshaw数据可视化终极指南:避免10个常见陷阱的完整解决方案

Rickshaw数据可视化终极指南&#xff1a;避免10个常见陷阱的完整解决方案 【免费下载链接】rickshaw JavaScript toolkit for creating interactive real-time graphs 项目地址: https://gitcode.com/gh_mirrors/ri/rickshaw Rickshaw是一款功能强大的JavaScript工具包…...

EOPL3 项目概览:探索 9 大章节的编程语言理论与实践

EOPL3 项目概览&#xff1a;探索 9 大章节的编程语言理论与实践 【免费下载链接】eopl3 Code from the book "Essentials of Programming Languages", 3rd ed. by Friedman and Wand 项目地址: https://gitcode.com/gh_mirrors/eo/eopl3 EOPL3&#xff08;Ess…...

Symfony/Translation错误监控终极指南:Sentry+Slack告警完整配置教程

Symfony/Translation错误监控终极指南&#xff1a;SentrySlack告警完整配置教程 【免费下载链接】translation symfony/translation: 是一个用于 PHP 的翻译库&#xff0c;支持多种消息源和翻译格式&#xff0c;可以用于构建多语言的 Web 应用程序和 API。 项目地址: https:/…...

RT-Thread嵌入式操作系统代码风格指南

RT-Thread嵌入式操作系统代码风格指南 【免费下载链接】rt-thread RT-Thread is an open source IoT real-time operating system (RTOS). 项目地址: https://gitcode.com/gh_mirrors/rt/rt-thread 前言 在嵌入式系统开发中&#xff0c;良好的代码风格对于项目的可维护…...