問題なく 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 秒ごとに行われます (最大出力)。