MCU 使用的是freeRTOS+lwip实现网络功能。Lwip的版本是1.4.1。使用场景是pc做服务器,mcu做客服端。MCU连接到服务器后每隔20ms发送一包数据,数据长度70多byte,发送几分钟后就会死机。进入debug后发现是进入了handfault 中断。
打开lwip的调试信息,发现lwip有错误信息打出。调到打印处发现是do_write函数里的write_offset的值不对。于是全部找修改write_offset的地方。发现函数do_writemore里会把write_offset清0。于是去查找没有执行到清0的原因。并在函数do_writemore里加上打印。于是发现这个函数被重入了。继续往下追发现是网络中断处理接收到的数据包时,会调用do_writemore函数。中断里的调用会有概率打断网络任务里调用do_writemore,导致该函数重入。后来对接收部分进行修改。网络中断中只发出信号量,不处理数据,再建一个处理数据的任务,该任务的优先级和网络任务的优先极相同,从而避免了,do_writemore函数重入,该问题解决。