问题1:使用操作系统rt-thread,基于lwip1.4.0 ,网络芯片为enc28j60,使用send函数发送数据,只要频繁(其实也不频繁)的操作该函数,就会出现:tcpip_thread: invalid message Assertion: 155 in ..\lwip\src\api\tcpip.c, thread tcpip (0) assert failed at sys_arch_assert:596
a.首先,出现这种问题,是很头疼的,因为有三个方面的因素混杂,一个是系统的因素,一个是lwip的bug,但是不会特别多,或者是配置参数有一些问题。最后一个就是enc28j60的bug有一些多(并不能确定)。像这种方案的选择,最好是选模块,因为问题的排查有可能是在进行着填坑的行为。
b.解决问题思路:
- 定位该问题出现的地方,在tcpip.c的155行,有该内容。对应的有7项:TCPIP_MSG_CALLBACK_STATIC、TCPIP_MSG_CALLBACK、TCPIP_MSG_UNTIMEOUT、TCPIP_MSG_TIMEOUT、TCPIP_MSG_NETIFAPI、TCPIP_MSG_INPKT、TCPIP_MSG_API。这些内容都是在在其他地方被设置成的类型。现在的问题是,它处于第八种可能。
先简单看一下这几个类型的含义:
枚举类型 | 含义 |
---|---|
TCPIP_MSG_API | API消息,例如bind等 |
TCPIP_MSG_INPKT | IP层递交的数据包 |
TCPIP_MSG_NETIFAPI | netif API消息 |
TCPIP_MSG_TIMEOUT | 超时消息 |
TCPIP_MSG_UNTIMEOUT | 超时消息 |
TCPIP_MSG_CALLBACK | 回调 |
TCPIP_MSG_CALLBACK_STATIC | 未知含义 |
c.其实从上面这些方向来看,最终发现接收和发送数据的函数放在一个线程中执行就不会报错了,从这个方向来看,还是属于lwip并没有设计好。
网友评论