工具与软件:
您好!
我将利用 SDK (版本9.01.00.41)中集成的 LwIP 套接字库通过以太网发送和接收 UDP 数据包。 我的实现类似于 SDK 中的 netwroking/lwip/enet_cpsw_socket 示例。 我看到一个问题、即传递到 lwip_write 的数据的某些缓冲区大小会导致我的应用程序出现故障。
在发送数据包的函数中、我声明固定大小的静态缓冲区、使用我要发送的数据填充它(确保事先清除任何先前的数据)、然后将一个指针传递到缓冲区、并将我复制到其中的数据的实际大小传递给 lwip_write 函数。 这在大多数时间正常工作。 但是、我发现对于某些缓冲区大小、这会导致错误。 此错误的症状是芯片上的另一个内核崩溃。 我目前仅使用两个内核、而在以太网中没有涉及的内核会崩溃。 此外、UART 停止打印日志语句。 其他一切似乎正常工作。 我还注意到以下情况
- 我们正确地使用了 LWIP API -而不是在错误的上下文中使用原始或序列 API 调用
- 该缓冲区通过属性"section"声明。 结果是缓冲区存储在内核的 TCM 区域、因此不可高速缓存、不与其他内核靠近共享存储器。
- 导致问题的缓冲区大小遵循特定模式:该大小相对于32的倍数偏移了2个字节。 因此、如果{buffer_size}%32等于2或30、则会发生此故障。
- 在声明缓冲区时添加了一个"aligned"属性-我确认了这确实会对齐缓冲区、但这不会更改测试的结果
- 尝试从 EDMA ERRAGG 寄存器中读取、以查看是否报告了任何错误-我看到没有错误
- 试图回溯以找出内核故障的路由原因-但问题似乎是由堆栈损坏引起的、我无法路由导致特定指令
如果您对问题有任何疑问、请告诉我。
谢谢!