0

我可以毫无问题地接收和发送 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 秒执行一次(最多输出)

4

1 回答 1

0

此问题通常是无效中断优先级破坏 FreeRTOS 使用的完整中断嵌套模型的症状。这是支持请求的常见原因,因此有一个专门的网页,并且较新版本的 FreeRTOS 包含许多断言点,这些断言点专门用于立即捕捉这种类型的错误配置,并准确显示它在哪里。

于 2016-04-05T13:34:15.023 回答