RT-Thread论坛
直播中

笔画张

13年用户 1070经验值
私信 关注
[问答]

网络接收线程erxmb异常的原因?怎么解决?


两个不同的软件接收组播数据久了后均出现网络数据无法接收,网络发送是正常的。lpc54628芯片。邮箱有8个但erxmb线程已经无法运行了,这是什么原因导致


回帖(1)

风来吴山

2025-9-17 17:46:28

针对LPC54628芯片上运行的两个不同软件在长时间接收组播数据后出现的erxmb线程异常(无法接收数据,但发送正常),以及邮箱耗尽的问题,以下是可能的原因分析和解决方法:




核心问题分析




  1. 邮箱耗尽 (erxmb线程无法运行):



    • LPC54628的以太网控制器使用一组接收描述符(Rx descriptors)管理数据包接收。

    • 每个描述符指向一个内存缓冲区,形成一个“描述符环”。

    • 驱动程序/中断服务程序(ISR)通常会在数据包到达时将描述符状态标记为OWNED_BY_HARDWARE,硬件填充数据后再标记为OWNED_BY_CPU

    • erxmb线程负责处理OWNED_BY_CPU的描述符:

      • 将数据包传递给上层协议栈。

      • 回收描述符和缓冲区:重置状态并交还给硬件(OWNED_BY_HARDWARE),准备接收新数据包。





  2. 为什么邮箱会耗尽?



    • erxmb线程未及时处理/回收描述符:

      • 阻塞或优先级问题: erxmb线程可能被更高优先级任务长时间阻塞,无法及时处理到达的数据包和回收描述符。

      • 处理速度慢: 数据包到达速率超过erxmb线程的处理能力。

      • 死锁或临界区问题: 在访问描述符环或共享资源时发生死锁,或长时间持有锁导致线程阻塞。

      • 线程本身崩溃或挂起: 例如内存访问错误、堆栈溢出导致线程无法运行。


    • 中断丢失或未触发:

      • 中断风暴或屏蔽: 高频率中断导致后续中断丢失,或者中断被意外禁用。

      • 中断处理程序(ISR) 未正确清除中断标志,导致中断不再触发。


    • DMA描述符损坏:

      • 内存越界、硬件错误或电磁干扰导致描述符字段(如状态、指针)被破坏,硬件无法正确使用或识别描述符。


    • 内存池耗尽:

      • 分配给接收缓冲区的内存池耗尽,导致无法为回收的描述符分配新的缓冲区,使得描述符无法重新投入使用。


    • 硬件FIFO溢出:

      • 硬件接收FIFO在描述符未及时回收时溢出,可能导致后续数据丢失或硬件异常。


    • 组播过滤问题(次要可能):

      • 长时间运行后组播过滤表出现问题,导致组播数据包被错误过滤。但由于发送正常且两个软件表现一致,此概率较低。







解决方法


1. 确保erxmb线程及时运行回收描述符



  • 提高线程优先级:erxmb线程设置为足够高的优先级(高于大多数业务线程,但低于关键实时任务和ISR),确保其能及时抢占运行。

  • 优化处理逻辑:

    • 简化线程中的处理流程,减少单次处理耗时。

    • 避免在erxmb线程中进行复杂计算、阻塞操作(如等待信号量超时、文件I/O)或过长的临界区。

    • 将数据包交付给上层的工作(如协议栈处理)尽快传递(如使用队列),避免在erxmb线程中完成。


  • 检查线程堆栈: 确保erxmb线程堆栈足够大,避免溢出导致线程崩溃。使用调试器或添加堆栈检查代码。

  • 添加监控和日志:

    • 描述符使用计数: 记录当前OWNED_BY_CPU(待处理)的描述符数量。观察该数量是否随时间增长直至耗尽(接近描述符总数)。

    • 线程状态监控: 监控erxmb线程的实际运行状态(Running, Ready, Blocked, Suspended)。确定它是被阻塞、挂起还是根本不调度。

    • 线程执行时间戳:erxmb线程循环入口处记录时间戳,计算相邻两次进入的时间间隔。间隔过长表明线程未及时运行。



2. 确保接收中断正常触发和处理



  • 检查中断标志: 在ISR中必须正确清除以太网接收中断标志(如检查RXDESCRIPTOR或类似状态寄存器并清除相应位)。查阅芯片手册确认清除方法。

  • 避免中断风暴:

    • 确认中断处理程序高效简洁,仅做必要的最小操作(如标记事件、提交描述符到队列),大量工作在erxmb线程中完成。

    • 如果使用中断合并,检查配置是否合理。


  • 检查中断使能状态: 在问题出现时,检查以太网接收中断是否被意外禁用。

  • 监控中断计数: 在ISR中增加计数,与接收数据包量对比,判断是否丢中断。


3. 检查和修复描述符环



  • 添加描述符完整性检查:

    • erxmb线程处理每个描述符前,检查关键字段是否合法(如缓冲区指针、状态标志)。

    • 在回收描述符给硬件前,确保正确重置了状态(设置为OWNED_BY_HARDWARE)和必要的控制位。


  • 考虑增加描述符数量: 如果带宽较高或处理延迟可能较大,适当增加接收描述符环的大小(例如从8个增加到16、32或更多),提供更大的缓冲能力。

  • 实现描述符环复位机制: 在检测到描述符耗尽或损坏时,有能力复位整个描述符环和DMA引擎(根据手册操作)。


4. 确保接收缓冲区内存充足



  • 检查内存池状态: 确认分配接收缓冲区的内存池有足够空间。必要时增大内存池。

  • 避免内存泄漏: 确保上层协议栈或应用在消费完数据包后释放了缓冲区(返回给内存池供接收复用)。


5. 排查硬件/DMA问题



  • 检查硬件错误标志: 在中断或监控中检查以太网MAC的状态寄存器,看是否有报告接收错误(如FIFO溢出错误、DMA错误)。

  • 检查物理层(PHY)状态: 使用PHY寄存器读取工具,检查PHY的链路状态、错误计数器(如接收错误、CRC错误)在问题出现时是否异常。虽然发送正常,但不能完全排除PHY接收路径的偶发问题。

  • 考虑硬件复位: 在驱动中添加一种安全机制,当检测到接收通道长时间卡死且无法恢复时,尝试软复位以太网MAC模块(按手册操作)。


6. 组播过滤排查(次要)



  • 在驱动初始化或出现问题时,尝试重新编程组播哈希表或完美过滤表。

  • 临时禁用所有硬件组播过滤,设置为混杂模式,观察问题是否消失。




诊断步骤总结



  1. 优先监控描述符使用计数: 这是最直接的指标。如果计数持续增长至最大值,核心问题是描述符未被回收

  2. 检查erxmb线程状态: 使用RTOS调试工具,看线程是阻塞在哪个信号量/队列/互斥锁上,还是处于就绪态但未调度。

  3. 检查中断计数与触发: 确认接收中断是否还在触发。如果没有中断,问题在中断路径(使能、标志清除、中断控制器)。

  4. 检查描述符状态和内容: 在问题出现时,通过调试器或内存dump检查描述符环中每个描述符的OWNERSHIP标志和其他关键字段,是否有明显损坏或不一致。

  5. 检查内存池状态: 确认接收缓冲区的内存池是否有足够空闲块。


解决方案要点提炼



  • 保证erxmb线程高优先级及时运行。

  • 确保中断处理程序正确清除中断标志且高效。

  • 严格管理描述符生命周期(及时回收、正确重置状态)。

  • 监控描述符使用情况并设置阈值告警。

  • 必要时增加描述符数量。

  • 检查和保障接收缓冲区内存充足。

  • 添加描述符完整性和错误恢复机制。


通过上述方法,尤其是监控描述符使用计数和erxmb线程状态,通常能定位问题的根本原因(线程阻塞、中断丢失、描述符未回收)。优先优化线程优先级和执行逻辑,确保描述符能被及时回收是解决此类问题的关键。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分