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.

[参考译文] RTOS/MSP432E411Y:socket()调用失败,内存不足

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/664635/rtos-msp432e411y-socket-call-failing-with-out-of-memory-condition

部件号:MSP432E411Y

工具/软件:TI-RTOS

我正在尝试跟踪socket()调用失败的原因。  在NDK_Socket() SockNew()中调用失败,重新进入12 (ENOME),我假定这是由于内存耗尽。  

如何增加用于呼叫的内存?  我已通过XDCTools/RTSC映射NDK配置,但在设置 数据包/内存管理器缓冲区的NDK.Global PBM/Mmoeyr管理器缓冲区大小时看不到任何差异。  ROV显示(假设我正确地解释了)至少有一个0x3e58大小的对象,但我假设此处的NDK不能使用该对象?  (我假设还有堆,可以在链接程序.cmd文件中设置,但这里没有使用,还是?)

DHCP客户端工作正常,因此至少某些功能正常。

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

    以下是 从《NDK内存管理器指南 》(章节:"如何降低RAM使用率/减小插槽大小")中获得的一些建议:

    • 减少任务堆栈大小
      • 减少动态堆中使用的内存的最常见方法是减少堆栈大小。 在CCS调试模式下,您可以使用RTOS对象视图(ROV)工具查看任务模块的“详细”视图。 此视图允许您确定是否可以减小任务大小。  
        有关详细信息,请参阅上面的指南
    • 减小套筒尺寸
      • 根据最坏情况的套接字使用情况,可以使用tcp.sedBufSize,tcp.receiveBufSize和udp.receiveBufSize属性减小缓冲区大小。

    下面是 另一个NDK RAM大小的链接。 此示例来自另一个处理器,但该技术的工作方式应该相同。

    其他参考资料:

    希望这些参考资料有所帮助。

    此致,

     Bob L.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    问题是,我认为(假设我正在正确读取ROV输出)剩余了100 K堆。但是,NDK似乎无法使用此内存。 实际上,后来我在FAT文件系统代码上使用MSP432 SDK链接到预编译库时遇到了同样的问题。 我在了解内核/NDK / SDK库如何分配动态内存以及如何使用RTSC/XDC工具正确定义动态内存时遇到一些困难。 只是C堆(和C++动态存储)。 现在,由于“某些动态分配存储”已耗尽,呼叫似乎失败了,我无法真正跟踪如何增加。 在这里,我真的很难了解一些基本知识,在我看来,我非常希望能以配置文件和/或链接程序脚本的形式获得一些帮助。 我很确定链接器.cmd是正确的,但.cfg文件对我来说是一个很黑的魔法。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Jaakko您好!

    很抱歉回复延迟! 您是否仍在处理此问题? 请告诉我们您的位置,以便我可以尽力提供帮助。

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

    您好Sai!

    谢谢,非常感谢您的帮助。  我担心这个问题仍然存在。  但是,现在已将大部分注意力转移到另一个(基于CC3220)项目上(实际上,我们希望在两种设计上运行相同的应用程序,只需稍做修改,这两种设计在外部非常相似,物理网络介质除外)。  因此,在过去一周里,我们并没有真正投入到解决这个问题上。

    我以前成功地调用了socket,但在这里添加了位之后,我到达了似乎看到意外内存耗尽的地方(在我看来,在某个地方不是主堆?)  我不能排除堆栈耗尽(?),但对我来说,主堆本身似乎是完整的(至少ROV报告它是正常的,据我所能知道的。)

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

    Jaakko您好!

    如果您需要CC3220 SDK的可移植性,我建议使用SL_NetSock API,而不是NDK API。 请参阅MSP432E4 SDK的./examples/RTOS/MSP_EXP432E401Y/ns/文件夹中的"tcpecho"和"udpecho"。

    如果您在使用 SL_NetSock API之后仍然存在问题,请告诉我。

    谢谢!

    SAI