• 在rt-thread中使用iperf触发断言卡死


    问题触发

    最近在适配sdio device驱动,CP芯片与AP芯片对接(RK3399),准备使用iperf测试下能否AP与CP能否正常通信。CP芯片跑的是rt-thread系统,在使用sdio_eth_dev_init命令初始化后,使用iperf -c 192.168.1.3测试。AP那边做服务端,先执行了iperf -s。

    然后触发了rt_timer_stop函数的断言,系统卡住。

    断言(assert)及其作用

    断言是一种除错机制,用于验证代码是否符合编码人员的预期。编码人员在开发期间应该对函数的参数、代码中间执行结果合理地使用断言机制,确保程序的缺陷尽量在测试阶段被发现。

    问题分析

    首先知道卡在了547行,于是将rt_object_get_type(&timer->parent)打印出来,值是0x0,而正常要等于RT_Object_Class_Timer(0xa),所以要知道为什么这里rt_object_get_type(&timer->parent)变成了0x0,而且从打印中可以看到这个值之前一直都是0xa。

    由于我是在FPGA上使用TRACE32+劳德巴赫工具调试的,所以打算直接监控ddr上的地址什么时候被写成0了。

    监控的地址是object->type。正常时这个值为0x8A,经过583行运算得到0xa。出问题之前这个值被改成了0,所以返回0。

    断点设置好后,把程序跑起来,然后触发到了,发现是在我的device驱动里调用的一个打印函数
    rt_printf(“[zrc] <%s %d>\n”, func, LINE);的调用该到了这个值,俗称“踩内存”了。然后尝试注释掉这行代码,重复之前步骤测试不会卡死。

    那为什么这行打印函数会踩内存?

    怀疑线程栈越界导致的,于是将tcpip的栈大小从1024改成4096,重复之前测试步骤不会卡死。问题解决。

  • 相关阅读:
    DOM中的node节点属性详解
    在 Python 中跨多个文件使用全局变量
    第二篇:mybatis核心接口
    1110 Complete Binary Tree
    DBSCAN聚类算法实用案例
    [数据集][目标检测]狗狗表情识别VOC+YOLO格式3971张4类别
    学习笔记丨Shell
    低代码平台 Power Platform 又上新,让你“事半功倍”
    排序算法图解(一):冒泡排序与冒泡排序的优化
    【框架整合】Redis限流方案
  • 原文地址:https://blog.csdn.net/qq_41922569/article/details/134452170