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.

[参考译文] MSP432E401Y:调试 TCP/IP 堆栈和 LWIP 的内存问题

Guru**** 2028580 points
Other Parts Discussed in Thread: SYSCONFIG, MSP432E401Y
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1452725/msp432e401y-debugging-memory-issues-with-the-tcp-ip-stack-and-lwip

器件型号:MSP432E401Y
主题中讨论的其他器件:SysConfig

工具与软件:

对于我为 MSP432开发的应用、我遇到了一些与内存分配相关的问题。  我希望能够在 LWIP TCP/IP 堆栈内设置断点、并查看一些堆栈变量、如"lwipstats"。  我已经将 lwip 源代码添加到我的项目并启用了调试、但我仍然无法在 lwip 源中设置断点。   

设置工程以使用 LWIP 对应用进行全面调试的最佳方式是什么?  此应用基于其中一个 SimpleLink 示例 HTTP 客户端工程、并使用 TI-RTOS。

是否有办法在工程中包含所有源代码并同时编译所有内容而不依赖于外部工程?

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

    您好!

     抱歉、我目前正在度假一整周。 当我回来时、我会研究你的问题。 请预计我的回复会有延迟。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [quote userid="434385" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1452725/msp432e401y-debugging-memory-issues-with-the-tcp-ip-stack-and-lwip 我针对 MSP432开发的应用程序遇到了一些与内存分配相关的问题。  我希望能够在 LWIP TCP/IP 堆栈内设置断点、并查看一些堆栈变量、如"lwipstats"。  我已经将 lwip 源代码添加到我的项目并启用了调试、但我仍然无法在 lwip 源中设置断点。  [报价]

    如果要调试 lwIP 示例、则需要修改 lwipopts.h 文件。 请参阅以下示例。 请注意、MSP432E SDK 中的库存 lwIP 示例使用无 RTOS 的原始 API。  

    #define DEBUG
    //
    //
    //------- 调试选项-------------------------------------------------------
    //
    //
    #ifdef 调试
    #define U8_F"c"
    #define S8_F"c"
    #define X8_F"02x"
    #define U16_F "u"
    #define S16_F"d"
    #define X16_F "x"
    #define U32_F "u"
    #define S32_F"d"
    #define x32_F"x"
    extern void UARTprintf (const char * pcString、...);
    #define LWIP_PLATION_DIAG (msg) UARTprintf msg
    #define LWIP_PLATFORM_ASSERT (msg) UARTprintf ("在%s 的%d 行中断言失败:%s\n"、__行_、_文件_、msg)
    #define LWIP_DEBUG 1.
    #endif

    //#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_OFF
    #define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_OFF
    //#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_WARNING
    //#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_STRUIARY
    //#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_SEVERE

    //#define LWIP_DBG_TYPE_ON LWIP_DBG_ON
    //#define LWIP_DBG_TYPE_ON (LWIP_DBG_ON|LWIP_DBG_TRACE|LWIP_DBG_STATE|LWIP_DBG_FRESH)

    //#define ETHARP_DEBUG LWIP_DBG_ON //默认为 OFF
    #define NETIF_DEBUG LWIP_DBG_OFF
    //#define PBUF_DEBUG LWIP_DBG_OFF
    //#define API_LIB_DEBUG LWIP_DBG_OFF
    //#define API_MSG_DEBUG LWIP_DBG_OFF
    //#define SOCKETS_DEBUG LWIP_DBG_OFF
    #define HTTPD_DEBUG LWIP_DBG_OFF
    //#define ICMP_DEBUG LWIP_DBG_OFF
    //#define IGMP_DEBUG LWIP_DBG_OFF
    //#define INET_DEBUG LWIP_DBG_OFF
    //#define IP_DEBUG LWIP_DBG_ON
    //#define IP_REASS_DEBUG LWIP_DBG_OFF
    #define RAW_DEBUG LWIP_DBG_OFF
    //#define MEM_DEBUG LWIP_DBG_OFF
    //#define MEMP_DEBUG LWIP_DBG_OFF
    //#define SYS_DEBUG LWIP_DBG_OFF
    //#define tcp_debug LWIP_DBG_on
    #define tcp_input_debug LWIP_DBG_off
    //#define TCP_FR_DEBUG LWIP_DBG_OFF
    //#define tcp_rto_debug LWIP_DBG_off
    //#define TCP_CWND_DEBUG LWIP_DBG_OFF
    //#define TCP_WND_DEBUG LWIP_DBG_OFF
    #define tcp_output_debug LWIP_DBG_off
    //#define TCP_RST_DEBUG LWIP_DBG_OFF
    //#define TCP_QLEN_DEBUG LWIP_DBG_OFF
    //#define UDP_DEBUG LWIP_DBG_ON //默认设置为 OFF
    //#define TCPIP_DEBUG LWIP_DBG_ON
    //#define PPP_DEBUG LWIP_DBG_OFF
    //#define SLIP_DEBUG LWIP_DBG_OFF
    //#define DHCP_debug LWIP_DBG_ON //默认设置为 OFF
    //#define AUTOIP_DEBUG LWIP_DBG_OFF
    //#define SNMP_MSG_DEBUG LWIP_DBG_OFF
    //#define SNMP_MIB_DEBUG LWIP_DBG_OFF
    //#define DNS_DEBUG LWIP_DBG_OFF

    #endif /*__LWIPOPTS_H__*/

    [报价 userid="434385" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1452725/msp432e401y-debugging-memory-issues-with-the-tcp-ip-stack-and-lwip ]设置项目以使用 LWIP 全面调试应用程序的最佳方法是什么?  此应用基于其中一个 SimpleLink 示例 HTTP 客户端项目、并使用 TI-RTOS。[/QUOT]

    SDK 中基于 TI-RTOS 的库存以太网示例使用 NDK 作为 TCP/IP 层。 虽然可以将 lwIP 协议栈与 TI-RTOS 一起用于顺序 API、但我没有这种组合的经验。 看起来你已经使它正常工作了、只需要了解一下调试。 不确定您是否使用过上述 lwipopts.h 文件。 这是我唯一知道的实现 lwIP 源代码调试的功能。 如果以上内容无法满足您的需求、我建议您联系 lwIP 论坛寻求其他建议。  

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

    尊敬的 Charles:

    感谢您的回复。  我想我应该以不同的方式回答我的问题。

    使用 HttpClient_connect()函数连接到安全的 Web 服务器时、出现内存分配问题。  据我所知、SimpleLink 框架使用 LWIP 作为 TCP/IP 堆栈。  SysConfig 中用于堆栈的所有参数均与 lwipopts.h 文件中的选项相匹配。  您能否解释 LWIP 如何融入该框架?  我的应用基于使用 TI-RTOS 的 HttpClient 示例。

    我看到的是 HttpClient_connect 调用失败、出现错误代码-2006、这是一个无效的参数错误。  我在传递给函数的 URL 的 DNS 解析中对此进行了深入的跟踪。  如果我将其更改为服务器的 IP 地址、则函数返回-105错误、其中包含"缺少缓冲区"错误。  我试图找出这些问题的根本原因、并认为查看 lwipstats 结构会很有用。

    该错误并不总是发生。  如果我多次重新启动程序、我会发现每件事情都偶尔起作用。  我还发现,在我的家庭网络上测试这一点,有较少的后台流量,呼叫是成功的更频繁。

    我试图增加堆栈大小、内存池缓冲区和堆空间、但在确定根本原因方面似乎没有取得任何进展。  搜索这些论坛将显示许多具有类似-2006错误的线程、但这通常是由于旧版 NDK 中存在错误。  我将使用为 MSP432E401Y 提供的最新库。  我也在调试期间通过 ROV 观察 NDK 存储器、看不到任何存储器问题。

    我需要关于如何查找此错误的建议。  您是否可以建议使用任何其他方法来隔离此问题?

    谢谢!

    Rob

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

    您好!

     您是否参考 C:\ti\simplelink_msp432e4_sdk_4_20_00_12\examples\rtos\MSP_EXP432E401Y\ns\HttpGet (使用 HttpClient_connect  调用连接到服务器)中的示例? 如果这是示例或类似情况、则如上所述、这是基于 TI 的 NDK TCP/IP (而不是 lwIP)构建的示例。 请参阅下面的.syscfg。 所有这些都是 NDK、而不是 lwIP。 我想您不会  在 lwIP 库中找到名为 HttpClient_connect 的 API。 您可以在 https://www.nongnu.org/lwip/2_1_x/group__api.html 中找到所有 lwIP API (RAW、顺序、套接字)

     请注意、明天和周三是 TI 的圣诞假期、预计会有延迟响应、   

     

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

    是的、我的应用程序使用的是 NDK、  我想我是对 LWIP 的误导。  我认为它是在 NDK 下用于实现堆栈的。  我现在知道我不使用 LWIP。  我仍然遇到我所描述的记忆问题。  您可以提供其他方法来帮助调试该问题吗?  -2006错误代码具有误导性。  我知道这些参数是正确的、因为有时调用会成功完成。  当使用 IP 地址而不是 URL 时、我还会收到一个不同的错误-105。  原因是什么?   ENOBUF (-105)错误指的是什么内存?  如何增加可用内存量以防止 ENOBUF 错误?   

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

    尊敬的 Robert:

     您可以查看此帖子吗?  https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1305907/msp-exp432e401y-pbm-buffer-memory-allocation?tisearch=e2e-sitesearch&keymatch=ENOBUF#

     海报似乎有一个类似的问题 ENOBUF 错误与你的。 他似乎自己解决了这个问题。  

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

    是的、我已经看到过该线程。  我曾尝试减小 PBM 帧的大小、堆栈停止工作。  我无法通过 DHCP 接收 IP 地址。  我还没有对其进行详细调试、但低于1536的任何参数都会导致出现故障。  我还尝试了其他尺寸、并发现 SNTP 也存在问题。  当我返回到原始值时,DHCP 和 SNTP 可以正常工作,我的应用偶尔仍能正常工作,但大多数都失败了。  我同意、我认为这个问题与 PBM 缓冲器有关。   

    该人问了几个关于 PBUF 功能的问题。  您能回答这些问题吗?  我强迫 mmAllocs 和他一样,但我这样做时什么也不起作用。  有什么区别?  为什么堆栈无法使用较小的 PBM 缓冲器运行?

    我想尝试对 PBM.c 文件进行一些更改。  我怎么能做到这一点?  我可以将源代码复制到我的项目中然后进行编辑吗?  链接器将如何解析为我修改过的函数、而不是库中的函数?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    该人询问了一些有关 PBUF 函数的问题。  您能回答这些问题吗?  [报价]

    尊敬的 Robert:

     虽然我想回答这些问题,但我自己不是一个在 NDK 层如何工作方面有足够知识的专家。 我将寻找类似的帖子是否可以提供一些线索。  

    我想知道您是否在 整个运行时多次断开客户端连接并将其连接到服务器、并导致失败并出现错误? 如果您的客户端只调用 HttpClient_connect 一次以连接到服务器、会不会失败?  

    我想尝试对 PBM.c 文件进行一些更改。  我怎么能做到这一点?  我可以将源代码复制到我的项目中然后进行编辑吗?  链接器将如何解析为我修改过的函数而不是库中的函数?[/QUOT]

    通常情况下、您应该能够简单地将 PBM.c 或其他文件复制到当前项目中。 您可能需要解析一些头文件路径。 链接器将从源代码而不是库中选择函数。 至少这是我之前针对另一个器件所做的、而不是修改库中的源代码并重新构建库。  

    [/quote]