ZYNQ裸机跑LWIP,频繁收发,时间一长就会死机问题解决

问题描述:

前阵子已经调试好数据收发,在去老化跑硬件的时候,发现数据频繁收发久了会死机,当时第一反应就是lwip的内存泄漏,或者指针跑飞,但到底是哪个地方,重现概率又很小,着实头秃.网上查阅资料

但是也看到了说1.4版本以上这个bug被官方修复完毕,而我用的lwip版本是2.1.1,理论上不会再出现指针自己指向自己的问题,但我不甘心,跟着楼主操作一番

发现果然不是这个地方的问题,参考了一下大多数人都是开线程上轮询的办法来获取网口数据,而我是采取中断的方式获取数据,难道是中断的问题?后来静下心来满满定位问题,发现每次都是在发送数据的时候翻车的,有头绪了。

原因分析:

我是在裸机上跑的lwip,数据接收由回调函数处理,回调函数已经涉及到tcp_recved,而tcp_recved包含了tcp_output,同时,lwip的定时器里面在跑一个的tcp_slowtmr,tcp_slowtmr里面也有tcp_output,在我传输数据时,主程序中由于数据需要立即回复,所以我的每一个tcp_write后面都跟着一个tcp_output,这就造成了tcp_output很有可能在执行一半的时候被打断,也就是重入了,查看tcp_output
前面省略。。。。

后面省略。。。。
定位每次都是执行到tcp_output_segment之后就被打断重入了,下面一段代码

显然,重入之后,再执行回原点位置开始执行的话,指针数据会跑飞。

解决方案:

其实tcp_output这个函数就是把tcp_write写入缓存的内容立即发送出去,如果被重入了,那么先跳出来即可,后面定时器跑的tcp_slowtmr也会把需要发送的数据再发送出去,重入的数据并不会被丢弃,所以我在tcp_output函数开始的地方添加锁,结束的地方解锁,如果有重入数据进来,那么直接退出去就好了。

以上仅个人记录

ZYNQ裸机跑LWIP,频繁收发,时间一长就会死机问题解决相关推荐

  1. LWIP裸机跑网口一段时间后死机了

    项目场景: ZYNQ 7010运行LWIP网口,得到数据,进行处理 问题描述: lwip网口发送数据到主机处理之后,待机运行一段时间(几分钟不等,有时候立即死机,有时候隔一会儿),程序死机,中断也不能 ...

  2. putty连接centos/Ubuntu一段时间无操作无法输入 死机 断线解决办法

    解决办法比较简单: PuTTY设置,putty -> Connection -> Seconds between keepalives ( 0 to turn off ),默认为0,改为5 ...

  3. 在ZYNQ上裸机跑ARM程序的演示

    今天给大家演示如何在ZYNQ上,裸机跑ARM程序,本测试用的是米尔Z-turn Board单板,测试代码用的XILINX官方的C语言测试程序,用于测试挂接在ARM总线上的设备是否正常,并在串口终端打印 ...

  4. 在ZYNQ上裸机跑ARM程序演示

    今天给大家演示如何在ZYNQ上,裸机跑ARM程序,本测试用的是米尔Z-turn Board单板,测试代码用的XILINX官方的C语言测试程序,用于测试挂接在ARM总线上的设备是否正常,并在串口终端打印 ...

  5. ZYNQ裸机实现 USB MASS STORAGE (usb+sd卡 实现U盘功能)

    ZYNQ裸机实现 USB MASS STORAGE (usb+sd卡 实现U盘功能) 之所以写裸机,也就是没有操作系统的实现方法是因为linux系统下的实现方法网上已经有很多了,之前使用的STM32实 ...

  6. 频繁GC (Allocation Failure)及young gc时间过长分析

    序 本文主要分析一个频繁GC (Allocation Failure)及young gc时间过长的case. 症状 gc throughput percent逐步下降,从一般的99.96%逐步下降,跌 ...

  7. 【跑飞、死机】单片机 msp430程序跑飞原因和解决方式积累

    目录 单片机 msp430程序跑飞原因和解决方式积累 MSP430 数组填充越界引起的栈溢出 导致程序跑飞 [单片机重启]MSP430重启/频繁重启/跑飞 原因分析 单片机 msp430程序跑飞原因和 ...

  8. 第五人格每天服务器维护多长时间,第五人格:每天玩的时间并不长,大概一天1-5局...

    原标题:第五人格:每天玩的时间并不长,大概一天1-5局 我玩提琴,开门战,剩一个医生一个祭司,医生上挂,祭司倒地没自起.然后我就逛街赏景去了.走着走着发现,唉,祭司怎么起来了,医生也下来了,唉,传送还 ...

  9. spark SQL读取ORC文件从Driver启动到开始执行Task(或stage)间隔时间太长(计算Partition时间太长)且产出orc单个文件中stripe个数太多问题解决方案...

    1.背景: 控制上游文件个数每天7000个,每个文件大小小于256M,50亿条+,orc格式.查看每个文件的stripe个数,500个左右,查询命令:hdfs fsck viewfs://hadoop ...

最新文章

  1. 在EditText前面添加一个搜索的小图片
  2. android 添加安装权限白名单
  3. php in方法,PHP函数in_array()使用详解
  4. python 有效的括号
  5. ssd3 employee.java_SSD3Panswers icarnegie ssd3的所有答案~十分齐全 - 下载 - 搜珍网
  6. gdb的简单使用和gdb+gdbserver方式进行ARM程序调试
  7. VS2012 +OpenCv2.4.4配置
  8. LeetCode 1391. 检查网格中是否存在有效路径(BFS)
  9. SQL-必知必会-触发器
  10. Spring ROO初体验
  11. poj 1088(记忆化搜索)
  12. Windows 10 之修改登录背景(Win10BGChanger)
  13. 英国大概率退出欧盟!
  14. linux db2v9.7卸载,db2 卸载和安装
  15. 3.1_21 JavaSE入门 P20 【正则】Pattern模式类、Matcher匹配器、元字符、分组捕获、反向引用
  16. 离线地图瓦片下载工具
  17. POJ 3345 Bribing FIPA 树上背包
  18. Android NDK SO库隐藏内部符号表
  19. linux的htb队列,Linux流量控制中的HTB队列创建与过滤(2)
  20. win10出现“以太网没有有效的ip配置”的问题

热门文章

  1. Springboot社区疫情管理6gcg4计算机毕业设计
  2. 2021.1.9每日复习 75.颜色分类(复习快速排序)+ 77.组合(回溯算法)
  3. 小白概念构筑,java框架整合复习
  4. 压缩包需要计算机管理员权限,压缩文件删除不了要访问权限解决方法
  5. 一文看懂三极管在电路中的应用原理
  6. 切线和倒数_法线与切线的斜率关系
  7. Linux命令·touch
  8. 控制器Controller
  9. C语言数据类型 int、long int 最大值
  10. 基于Jabber协议的移动即时通讯系统研究与实现