我可以毫无问题地接收和发送 TCP 帧。但经过一段随机时间(从 1 分钟到 1 小时),程序失败,卡在 vListInsert 中的 for 循环中。
在 tcpip 线程中,代码等待一帧。这是用
sys_mbox_fetch(mbox, (void *)&msg);
这是在 sys_arch.c 中定义的。当被调用时,我得到一个异常。我检查了 mbox 是否已初始化,并且可以将故障追溯到 vListInsert 中的列表迭代(在 vTaskPlaceOnEventList 中调用)
for( pxIterator = ( xListItem * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext )
{
/* There is nothing to do here, we are just iterating to the
wanted insertion position. */
}
正如我所看到的,列表指针被弄乱了,因为这一点给出了异常。我还没有弄清楚为什么。
调用堆栈是
- tcpip_thread
- sys_mbox_fetch
- sys_arch_mbox_fetch
- xQueueGenericReceive
- vTaskPlaceOnEventList
我试图在 lwIP 中增加和减少 TCPIP_THREAD_STACKSIZE(从 600 到 4k)和 MEM_SIZE 到 12k,但没有运气。
使用的优先级是以下 3 个;tskIDLE_PRIORITY+1 tskIDLE_PRIORITY+2 和 5(这里没有 tskIDLE_PRIORITY)
使用在 FRDM-K64F 板上运行的 Cortex M4。
使用 Netconn API 和非抢占式。
知道该怎么做以及下一步要尝试什么的解释吗?在这里卡了5天...
编辑:发送最多 50 个数据包,224 字节数据包并等待来自服务器的应答,这是在发送下一个数据包之前的 191 字节。每 1.5 秒执行一次(最多输出)