This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM2634:缓冲区大小和 lwip_write

Guru**** 2614265 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1453486/am2634-buffer-size-and-lwip_write

器件型号:AM2634

工具与软件:

您好!  

我将利用 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 寄存器中读取、以查看是否报告了任何错误-我看到没有错误  
  • 试图回溯以找出内核故障的路由原因-但问题似乎是由堆栈损坏引起的、我无法路由导致特定指令

如果您对问题有任何疑问、请告诉我。  

谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Rivrat:

    1.您能告诉我您传递到 aligned ()属性的参数是什么吗? 它是32B 对齐的、64B 还是128B?

    2.在 syscfg 存储器配置器中、您要为应用程序分配的栈大小是多少? 只需确保您声明的缓冲区、如果它们被分配到.stack 存储器中、您应该有足够的存储器。 您还可以通过查看.map 文件来确认此情况。

    此致、
    Shaunak

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Shaunak:  

    1.我将32传递到 aligned ()属性(我也尝试了64 )
    2.分配给 TCMA 区域存储缓冲区的内存量为32KB。 函数运行的任务的堆栈大小为2048B。 .map 文件中的.stack 段似乎分配了128KB。 我做的另一个测试是增加缓冲区大小、只要它遵循不是相对于32的倍数的2字节偏移的规则、我就没有问题。  

    谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Rivrat:

    • 32b 对齐时应该起作用。 默认示例向主机发送长度为34B 的缓冲区。 我尝试了运行开箱即用示例、该示例按预期正常运行(34B 缓冲区)。 您是否介意共享您的 CCS 工程 zip 文件(或在工程为机密时至少共享.out 文件)、以便我可以在结束时尝试重现此问题? 当将缓冲区放置在 TCMA 区域时、也可能是存储器配置器的问题。

    此致、
    Shaunak

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Shaunak:  

    我将尝试为您获取.out 文件或其他解决方案、但我今天无法完成此内容。 我下星期会离开,但当我回来时会这样做。  

    谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Rivrat:

    感谢您的更新。 当然可以稍后共享。

    此致、

    Shaunak  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Shauank、  

    我目前不能共享项目代码或.out。 我想知道您是否可以分享一些有关内存配置器评论的信息或资源、或者您是否可以提供任何其他建议或支持。  

    谢谢!  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Rivrat:

    1.我只想将您的应用的 example.syscfg 文件与 SDK 中的标准示例进行比较(因为默认情况下它会发送34B 缓冲区)。 如果应用程序中缺少任何出现故障的配置、这可能有助于您注意到。

    2.在 example.syscfg 中、请比较 Enet (CPSW)模块和内存配置(特别是 pkt dma、cpi 数据包描述符部分)

    3.检查在缓冲区大小似乎不起作用的情况下,您看不到任何中止。

    如果不重现这些问题、就可能难以确定潜在的根本原因  

    此致、

    Shaunak