LwIP以太网在初始化过程中卡死整个程序的问题排查解决

news2025/1/19 20:14:51

LwIP以太网在初始化过程中卡死整个程序

问题描述

当有以太网初始化的时候整个程序就有可能卡死,去掉以太网初始化整个程序没有卡死

以太网PHY初始化过程会有自协商过程,时间比较长,所以创建一个线程在线程中初始化。

有时候LwIP初始化不会导致整个系统程序卡死,有时候会卡死,这只是表象,可能是网卡初始化有问题,也不一定是网卡初始化的问题。

有时候提示LwIP以太网等初始化一切正常,程序也没有卡死,TCP等无法连接,实际网络是没有初始化成功的

特别是在调试模式下程序很容易出现这些问题

定位与排查

程序是设置了优化的,先将程序优化等级改为不优化

不优化的程序才是最原始的程序才容易暴露存在的问题

使用JLink调试,全速运行程序卡死,程序直接hardfault,打印了backtrace信息
请添加图片描述
通过LR找到hardfault前的一条语句,发现是LwIP memp.c如下函数

static void
memp_overflow_init_element(struct memp *p, const struct memp_desc *desc)
{
 	mem_overflow_init_raw((u8_t *)p + MEMP_SIZE, desc->size);
}

该函数在LwIP初始化内存池的时候调用的,通过LR还无法判断hardfault问题的真正原因。

继续调试。

再次调试全速运行程序,程序正常运行,但是连接程序创建的TCP服务器,发送一两次数据,程序就卡死,break跳到程序卡死的地方,发现是在了rt-thread栈检查函数** _rt_scheduler_stack_check ** 里面 while (level); 这条语句上,这就和卡死整个程序现象很相似了。

#ifdef RT_USING_OVERFLOW_CHECK
static void _rt_scheduler_stack_check(struct rt_thread *thread)
{
    RT_ASSERT(thread != RT_NULL);

#if defined(ARCH_CPU_STACK_GROWS_UPWARD)
    if (*((rt_uint8_t *)((rt_ubase_t)thread->stack_addr + thread->stack_size - 1)) != '#' ||
#else
    if (*((rt_uint8_t *)thread->stack_addr) != '#' ||
#endif
        (rt_ubase_t)thread->sp <= (rt_ubase_t)thread->stack_addr ||
        (rt_ubase_t)thread->sp >
        (rt_ubase_t)thread->stack_addr + (rt_ubase_t)thread->stack_size)
    {
        rt_ubase_t level;

        rt_kprintf("thread:%s stack overflow\n", thread->name);
#ifdef RT_USING_FINSH
        {
            extern long list_thread(void);
            list_thread();
        }
#endif
        level = rt_hw_interrupt_disable();
        while (level);
    }
#if defined(ARCH_CPU_STACK_GROWS_UPWARD)
    else if ((rt_ubase_t)thread->sp > ((rt_ubase_t)thread->stack_addr + thread->stack_size))
    {
        rt_kprintf("warning: %s stack is close to the top of stack address.\n",
                   thread->name);
    }
#else
    else if ((rt_ubase_t)thread->sp <= ((rt_ubase_t)thread->stack_addr + 32))
    {
        rt_kprintf("warning: %s stack is close to end of stack address.\n",
                   thread->name);
    }
#endif
}

至此我极度怀疑整个程序卡死问题就是因为这个hardfault问题导致的。

但是没有打印出是哪个线程栈溢出了,可以发现是没有实现rt-thread的rt_kprintf函数所以没能打印出栈溢出的线程。

将rt_kprintf暂时改为printf,再次调试hardfault后打印出了栈溢出的线程。
在这里插入图片描述
该线程是LwIP网卡底层数据接收线程。

将该线程的栈增大,再次测试不再出现hardfault的问题,此时还不能确保导致整个程序卡死的问题已经解决

还需要继续测试。

用原来的程序测试其他板子出现卡死程序现象,再增大EthRx这个线程的栈,再进行测试发现程序没有卡死,以太网也正常了。

到此该问题应该是解决了,后续继续测试一段时间,没有再出现过程序卡死问题。

总结

在将程序优化等级改为不优化才很容易测出来hardfault问题,而在有优化的时候的,编译器可能优化了代码不容易出现问题,所以调试程序问题最好还是将优化等改为不优化,才更容易发现问题。

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

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

相关文章

【LeetCode】226.翻转二叉树

题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[2,3,1]示例 3…

qq录屏怎么操作?还有什么好用的录屏方法?

在现在这个信息时代&#xff0c;我们经常需要用到录屏这个功能。比如&#xff0c;我们需要制作教学视频、演示文稿或其他一些需要展示屏幕操作的场合。那么&#xff0c;QQ录屏是一个不错的选择&#xff0c;它可以帮助我们轻松地完成这些任务。 QQ录屏的操作方法 首先&#xff…

C++如何用OpenCV中实现图像的边缘检测和轮廓提取?

最近有个项目需要做细孔定位和孔距测量&#xff0c;需要做边缘检测和轮廓提取&#xff0c;先看初步效果图&#xff1a; 主要实现代码&#xff1a; int MainWindow::Test() {// 2.9 单个像素长度um 5倍double dbUnit 2.9/(1000*5);// 定义显示窗口namedWindow("src"…

控件旋转90度,并跟随大小缩放

控件旋转角度&#xff0c;并跟随缩放改变大小 背景使用控件结果 背景 一个项目需求&#xff0c;需要旋转某个控件90使用&#xff0c;在网上找了很多资料&#xff0c;没有特别合适的&#xff0c;自己试水试了一天半&#xff0c;终于弄了个大概其&#xff0c;特此记录 使用控件…

机器学习笔记之优化算法(七)线搜索方法(步长角度;非精确搜索;Wolfe Condition)

机器学习笔记之优化算法——线搜索方法[步长角度&#xff0c;非精确搜索&#xff0c;Wolfe Condition] 引言回顾&#xff1a; Armijo \text{Armijo} Armijo准则及其弊端 Glodstein \text{Glodstein} Glodstein准则及其弊端 Wolfe Condition \text{Wolfe Condition} Wolfe Condi…

CDH基于Kerberos开启身份验证实践总结

CDH基于Kerberos开启身份验证实践总结 前言简介Kerberos是什么Kerberos解决什么问题 Kerberos基本概念Kerberos认证流程Kerberos基本配置principalkeytabkrb5.confkdc.confkadm5.aclkerberos数据库 访问示例数据库访问信息 其他kerberos常用命令[Git Bash支持make命令](https:/…

在线餐饮油烟实时监测系统的设计与实现

安科瑞 华楠 摘 要&#xff1a;为了解决传统油烟检测方法中成本高、效率低、实时性差等问题&#xff0c;设计开发了一种在线油烟实时监测系统&#xff1b;系统由采集、通讯、服务器和用户交互四个模块组成&#xff1b;采集模块采集油烟数据&#xff0c;通过GPRS通讯技术将数据发…

13.元素尺寸与位置

原理&#xff1a;通过js的方式&#xff0c;得到元素在页面中的位置 13.1 元素尺寸与位置-尺寸 1.获取宽高: ●获取元素的自身宽高、包含元素自身设置的宽高、padding、border ● offsetWidth和offsetHeight ●获取出来的是数值&#xff0c;方便计算 ●注意&#xff1a;获取的…

基于DCT变换和huffman编码的语音压缩算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 多通道滤波 4.2 DCT变换 4.3 量化 4.3 哈夫曼编码 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ................................…

HTTP杂谈之Referer和Origin请求头再探

一 关于Referer和Origin的汇总 1) 知识是凌乱的,各位看官看个热闹即可2) 内容不断更新1、理解有盲区,需要及时纠正2、内容交叉有重复,需要适当删减3、扩展视野3) 以下内容都与Referer和Origin请求头有关联 nginx防盗链 HTTP杂谈之Referrer-Policy响应头 iframe标签referre…

go练习 day01

DTO: note_dto.go package dtoimport "king/model"type NoteAddDTO struct {ID uintTitle string json:"title" form:"title" binding:"required" message:"标题不能为空"Content string json:"conten…

青少年软件编程(Python六级)等级考试试卷(2022年9月)

青少年软件编程&#xff08;Python六级&#xff09;等级考试试卷&#xff08;2022年9月&#xff09; 第 1 题 单选题 以下关于Python二维数据的描述中&#xff0c;错误的是&#xff1f;&#xff08; &#xff09; A. 表格数据属于二维数据&#xff0c;由整数索引的数据构成 …

[自学记录05|百人计划]Early-Z和Z-Prepass

其实这篇我是不想写的&#xff0c;因为网上资料真的非常非常多很多人都写过&#xff0c;但是我后来想了想&#xff0c;做笔记不就是这样吗&#xff0c;所以就写吧~。前置知识&#xff1a;深度测试Z-Buffer[计算机图形学]可见性与遮挡,Z-Buffer(前瞻预习/复习回顾)__Yhisken的博…

Vue 自定义事件绑定与解绑

绑定自定义事件 说到 Vue 自定义事件&#xff0c;那就需要搞清楚一个问题&#xff0c;为啥有这个玩意。 说到自定义事件之前&#xff0c;需要理解 组件基础的概念。理解了基础概念之后&#xff0c;我们就知道 Vue 的父子之间的通信&#xff0c; 一是 父组件通过 Prop 向子组件…

CK_Label_V1 CK_Label_V9 CK_Label_V11 System Developer‘s Manual

一、Register PTL You should register the PTL to our Management System first&#xff1b; 1、Register CK_Label_V1 Quickly press the side button three times Register ok&#xff1a;The led will turn off after flashing red light and the buzzer will beep once…

一个3年Android的找工作记录

作者&#xff1a;Petterp 这是我最近 1个月 的找工作记录&#xff0c;希望这些经历对你会有所帮助。 有时机会就像一阵风&#xff0c;如果没有握住&#xff0c;那下一阵风什么时候吹来&#xff0c;往往是个运气问题。 写在开始 先说背景: 自考本&#xff0c;3年经验&#xff0…

【JVM】(二)深入理解Java类加载机制与双亲委派模型

文章目录 前言一、类加载过程1.1 加载&#xff08;Loading&#xff09;1.2 验证&#xff08;Verification&#xff09;1.3 准备&#xff08;Preparation&#xff09;1.4 解析&#xff08;Resolution&#xff09;1.5 初始化&#xff08;Initialization&#xff09; 二、双亲委派…

在线/开源GNSS处理软件/平台介绍

当前&#xff0c;存在较多的GNSS开源/免费软件&#xff0c;可用于质量检核、RTK解算和PPP解算等&#xff0c;本文总结了部分常用的处理软件&#xff0c;其详细信息如表1和表2所示。 表1 常用GNSS预处理&#xff08;格式转换、质量检核&#xff09;软件&#xff1a; 软件名称 …

RunnerGo五种压测模式你会配置吗

我们在做性能测试时需要根据性能需求配置不同的压测模式如&#xff1a;阶梯模式。使用jmeter时我们需要安装插件来配置测试模式&#xff0c;为了方便用户使用&#xff0c;RunnerGo内嵌了压测模式这一选项&#xff0c;今天给大家介绍一下RunnerGo的几种压测模式和怎么根据性能需…

基于各种方式划分 vlan

划分VLAN的方式有&#xff1a;基于接口、基于MAC地址、基于IP子网、基于协议、基于策略&#xff08;MAC地址、IP地址、接口&#xff09;。 VLAN&#xff08;虚拟局域网&#xff09;可以按照以下几种方式进行划分&#xff1a; 端口划分方式 将交换机端口按照需要划分成不同的…