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.

[参考译文] TM4C1294NCPDT:有关 NDK 中 malloc ()错误的帮助

Guru**** 2538930 points
Other Parts Discussed in Thread: TM4C1294NCPDT, SYSBIOS

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1203457/tm4c1294ncpdt-help-with-malloc-error-from-the-ndk

器件型号:TM4C1294NCPDT
Thread: SYSBIOS 中讨论的其他器件

我正在使用以下工具:

CCS 6.1.2  
TIRTOS 2.16.0.08、
编译器5.2.7  
XDC 3.31.1333
TM4C1294NCPDT
NDK_2_25_00_09

我有一个项目、具有我在 Tiva 上创建的3个 TCP/IP 套接字。   套接字一直工作得很好、我在其他项目中对套接字使用了相同的代码、因此我对它有一些信心。  我在最新项目中注意到的是、偶尔会出现一个错误、网络堆栈似乎停止工作、但板上闪烁的 LED 表示 CPU 仍在执行代码。  收到错误后、ping 会失败、套接字将无法正常工作、直到我重新启动或重新启动为止。

最近、当我打开调试器(CCS 在探针上运行)时出现了问题、我注意到一个错误、我在 CCS 的控制台窗口中从未看到过、通过以下方式进行滚动:

54323.174 NodeNew: om
54323.174错误查找:克隆创建失败!
54323.175注释新:oom
54323.175错误查找:克隆创建失败!
54323.175注释新:oom
54323.175错误查找:克隆创建失败!

在查看源代码时、看起来像一个 malloc ()在 tirtos\products\NDK_2_25) 00_09\packages\ti\ndk\stack\node.c 中失败

代码使用的资源如下:

* CCS 内存分配 (Window-show view-memory 分配)显示闪存的使用量为18%、RAM 的使用量为52%。

* CCS ROV(运行时对象查看器) 显示任务的堆栈看起来是正常的,因为 stackPeak 全部低于 STACKSIZE。

* 我在 CCS 中检查了项目配置(右键点击 project->properties->build->Arm Linker->Basic Options: 我把堆栈大小设置为 st 到1024。

我假设 malloc ()失败,因为内存被碎片化,但这只是一个猜测。

关于如何解决此问题或如何解决此问题的任何建议?

谢谢。

道格

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

    尊敬的 Doug:

     我不确定您是否遇到了内存管理问题。 您能不能看一下该主题、了解如何在 NDK 中管理存储器? 希望它能为您的问题提供一些提示。  https://e2e.ti.com/support/processors-group/processors/f/processors-forum/947313/faq-how-is-memory-managed-in-the-ndk

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

    我以前没见过这些文件,所以感谢链接!  我通过 TCP/IP 套接字发送和接收的消息是较小的 固定长度消息(256字节)、每条消息的发送和接收间隔约为每5秒1次。  错误发生通常需要很长时间、就像我隔夜运行一样、通常早上堆栈会出现问题。   

    我看了设置,我的设置是默认设置,但"时间设置"是 TI-RTOS -> Products->NDK->TransportLayer-TCP-Module 设置。  我的"保持活动"设置变得更激进、因此套接字超时更快。

    当我再次查看 ROV 工具以根据第3页(共4页)中的文档 NDK 动态内存管理器查看堆栈调整器时、 我没有看到 ROV 显示任务"tcpHandler"、但我看到了其他两个任务、可以确认 ti_sysbios_KNL_idle_loop__E 和 ti_ndk_config_Global_stackThread 在堆栈大小方面都可以。  

    我要问的问题是 malloc ()从堆中获取内存,而不是栈,所以我没有看到在任何文档中调整堆内存的位置,除非它意味着使堆栈更小????  

    道格

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

    尊敬的 Doug:

     你可以尝试如下方式将堆增加到22528、看看它是否有区别吗?

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

    对不起、我意外点击了"这个问题解决了"按钮、您能否修复它、以便它不会被标记为解决?   

    当我在我的项目中检查这些设置时、系统(Hwi 和 Swi)堆栈大小增加到4096、堆大小为22528。  我看到22528是22*1024=22528,所以 我把堆增加到30*1024=30720,并将进行尝试。  如果没有失败、我可能需要几天的时间来确定、因为它从未立即失败过。

    谢谢。

    道格

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

    我不知道如何撤消它。 只需回复该主题、它将自动重新打开、我将收到通知。  

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

    我想提供最新情况并说明它到目前为止的工作情况。  我会多给几天时间来看看是否确实已修复。   

    谢谢。

    道格

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

    很高兴听到它目前正在工作。 如果您有一些更新、请再次告知我们。  

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

    由于各种原因、我有一段时间没能进行测试、但昨晚我能够在夜间运行该系统、而当我在今天早上进行摄像头测试时、 电路板在探针上运行、且检测信号 LED 闪烁、但电路板未执行 ping 操作、我在控制台窗口中看到以下错误。   

    43555.300 NodeNew: om
    43555.300 RtFind:克隆创建失败!
    43559.378 NodeNew: om
    43559.378 RtFind:克隆创建失败!
    43559.378 NodeNew: om
    43559.379 RtFind:克隆创建失败!
    43559.379 NodeNew: om
    43559.379 RtFind:克隆创建失败!
    43559.379 NodeNew: om
    43559.379 RtFind:克隆创建失败!
    43560.351 NodeNew: om

    需要注意的几点:

    *该错误通常仅在系统运行很长时间(隔夜)时发生。

    *我有两个 TCP/IP 套接字,在一个套接字每5秒主机请求一个消息从 Tiva 和 Tiva 有一个简单的回复,所以它不使用动态内存,它只是发送一个简单的回复消息。

    * ROV 显示堆栈在任务上都正常。

    *套接字使用启用的 keepalive、我注意到最低优先级的任务闪烁 LED 会在系统执行 keepalive 检查时短暂停止闪烁。  ROV 显示 NDK 堆栈的优先级为2、而 LED 任务的优先级为0、因此它预计 LED 将短暂停止闪烁、但我不会预计保持活动成本足够高而无法注意到。

    10954.500 TcpTimeoutKeep:保留超时

    还有什么想法吗?

    谢谢。

    道格

    我不确定接下来该怎么做来解决这个问题。

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

    尊敬的 Doug:

     这是在你增加堆大小后发生的吗? 我认为随着堆的增加、需要一点时间才能继续运行更长的时间吗? 但是,你似乎再次遇到同样的问题与你原来的帖子类似的持续时间。 或者它的运行时间比原始代码长、但最终仍然失败。  

     我发现这两个已知错误、想知道如果您使用建议的解决方法、它是否会对您的问题产生影响。  

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

    我无法在一段时间内让系统通宵运行、因此我直到现在都无法进行测试、但您的问题是、这个错误是在我增加了内存大小后发生的。  

    你认为我看到的错误:   43559.379 RtFind:克隆创建失败! 和  43559.379 NodeNew: oom 将被 你的链接中的更改修复?   我看到的错误 对我来说仍然是内存问题。

    道格

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

    您好!

    除了我认为可能会影响您的两个已知问题外、我还找到以下与您的错误相同的文章。 建议增加 Global.memRawPageCount 来解决该问题。 您当前的 Global. memRawPageCount 是什么? 您是否可以再增加几页、看看是否有区别?

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/568131/rtos-tm4c1294ncpdt-udp-sendto-32-severs-failed

    本说明讨论如何增加  memRawPageCount 和使用它的后果。  

    /cfs-file/__key/communityserver-discussions-components-files/908/NDK-Static-Internal-Memory-Manager-_2D00_-Texas-Instruments-Wiki.pdf

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

    这是我的设置,顺便说一下,它运行了所有的晚上。

    道格

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

    这是我的设置,顺便说一下,它运行了所有的晚上。

    [/报价]

    堆容量增加、它整晚都在运行? 与您之前的报告相比、它有什么不同?您说在增加堆容量后第二天仍然会出现同样的错误。 这次和最后一次的代码和设置是否相同?

    我最后的答复是建议增加  memRawPageCount。 您在.cfg 中显示了8。 根据我引用的 POST、您可以将 memRawPageCount 从8增加到更高的值吗? 或许试一下10或12、这会产生不同效果。 我引用的帖子显示的错误与您的帖子相同。  

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

    对于你的问题有什么不同,我的理解是问题并不总是一蹴而就,所以它不容易重现。  我们有两种设置可以重现此问题、我有一种设置、一位同事正在处理 Linux 方面的问题。

    另一端的客户端是 Linux、它应该打开一个套接字并执行周期性状态消息、每5秒执行一次。  我发现主机(Linux 系统)每半小时重启一次、直到最近才修复。   我不知道这是否会导致 NDK 产生问题、但我假设 Tiva 应该能够处理这种情况、因为我使用的是 TCP/IP 和保持管理工具。  昨晚,主机 每1/3小时修复一次重新启动,今天上午它正在运行。  我将尝试将  memRawPageCount 从8更改为12、看看会发生什么情况。  我觉得要花一段时间才能找到实际的解决方法。  我怀疑 Linux 端重启可能会以某种方式导致我看到的问题,但这只是一个猜测。

    我已经有了  

    谢谢。

    道格

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

    您好!

     请看一下这两个可能有用的帖子。

    在下面的帖子中、海报使用 SO_LINGER 处理连接关闭时的情况。 在您的情况下、可能是由于主机重新引导所致。  

    https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1019830/ek-tm4c1294xl-tcp-client-sockets-creation-fails-after-10-times-socket-calls/3770705#3770705

    在帖子中、海报增加了保持活动时间。 与你的保持时间相比,这张海报有一个大得多的时间。 也许它在某种程度上会有所帮助。  

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/513818/so_keepalive-usage?tisearch=e2e-sitesearch&keymatch=SO_KEEPALIVE#

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

    这些链接看起来似乎他们有很好的信息,我将在下周尝试一些这些想法,让你知道,但可能要等一段时间,我才能得到结果.

    谢谢。

    道格

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

    好的、尝试一下建议后告诉我们结果。  

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

    我已经运行该系统将近3天了、没有出现任何问题。   到目前为止、我所做的唯一实际更改是:

    1) Linux 系统不再每半小时重启一次。  (仅供参考、在使用 Windows 工具进行测试时、我从未遇到过此问题)

    2)我更改了"堆栈缓冲区大小和放置"中的内存,将  页数从8增加到10。  我已经将以字节为单位的页大小更改为3072。

    我已经看了你分享的其他链接,我已经准备好调整保持活动超时,如果我继续有问题的机会也停留在徘徊的选项。  我怀疑这个问题与 Linux 系统重启有关、但实际上我不确定。  需要一些时间来进行一些试错、这样我就可以在有更新时发布。

    感谢您的帮助。

    道格

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

    我不想让自己的金克斯那么好。  我说过我会定期提供更新、因此我想让您知道它的运行情况良好。

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

    尊敬的 Doug:

     希望您的问题在您的持续测试中得到完全解决。