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/DK-TM4C129X:需要 NDK 内存、如 MakingHTTPServer 中所示:设置被 XGCONF 忽略

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/601850/rtos-dk-tm4c129x-need-memory-for-ndk-as-in-makinghttpserver-settings-ignored-by-xgconf

器件型号:DK-TM4C129X

工具/软件:TI-RTOS

我正在尝试从 MCU 流式传输到远程 UDP 套接字、但我获得 ENOBUFS。  我假设这意味着我需要更多内存用于流任务和并发 HTTP 服务器。  当我尝试增加 BIOS 堆大小时、如 TI HTTP 服务器文档 MakingHTTPServer.ppt 第18页所述、这些设置被 XGCONF 忽略。  保存文件并使用 XGCONF 重新加载后、设置仍为"空"。  我还尝试使用文本编辑器设置 BIOS.heap* ,如“堆大小配置”后的详细说明,但更改在 XGCONF 中不可见。

如何增加 NDK 堆的大小?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您使用的是 TI-RTOS 的哪个版本? 是否可以附加.cfg 文件(请附加而不是复制/粘贴)。

    供参考...下面是有关 NDK 存储器使用情况的说明: processors.wiki.ti.com/.../TI-RTOS_Networking_Stack_Memory_Usage

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

    我正在使用 C:\ti\tirtos_tivac_2_16_01_14。  下面随附了配置文件。  很抱歉图标大小。  似乎不是 adjustable.e2e.ti.com/.../ni.cfg

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

    该文件看起来不错、对我来说很有用。 我可以以图形方式更改 BIOS.heapSize。 您使用的 TI-RTOS、CCS 和 XDCtools 是什么版本? 此外、您使用的是什么主机操作系统(Windows、Linux 或 MacOS)?

    当您对文件进行文本编辑并生成时、更改是否会显示。 您可以通过查看映射文件并在.bss 段中搜索 ti_sysbios_堆_HeapMem_instance_State_0_buf__A 来进行确认。

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

    以下是版本:

    TI-RTOS TivaC:2.16.01.14

    CCS:7.1.0.00016

    XDCtools:3.32.00.06.core

    Windows 7

    NDK:2.25.01.11

    好消息是、我在.map 文件中看到以下行:

    20018b40 00005800 (.common:ti_sysbios_堆_HeapMem_instance_State_0_buf__a)

    我知道 XGCONF 在将 BIOS.heapSize 放入其菜单时遇到问题、这一点很好。  我不知道是否实际执行了请求的堆大小、但是、现在我知道没有配置问题。  我将停止使用 XGCONF。

    我有一个小的 HTTP cgi 服务器与连续的31 MB/秒 UDP 传输流并行运行。  服务器响应正常、但我注意到、当我为 HTTP 请求提供服务时、UDP 流仍然会看到 ENOMEM、即使堆已被证明更大。  这是通过以下设置实现的:

    global.memRawPageCount = 24;
    global.pktNumFrameBufs=24;
    udp.receiveBufSize = 16000;
    BIOS.heapSize = 22528;

    当没有 HTTP 活动时、我看到没有 ENOMEM。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    ENOMEM 之后是否恢复了所有功能? 您在哪里可以看到 ENOMEM?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    一切都可以正常恢复、我的缓冲方案甚至可以在重试时成功、而不会丢失任何数据报。  但我宁愿没有存储器问题。

    以下是 sendto ()中失败的代码:

    如果
    (//主机尚未设置自身和我们进行传输
    (!csc.configuration.nhReceive)
    ||
    //无法在套接字上获得状态
    fdStatus (轮询项目[POLL_COIL_DATA].FD、FDSTATUS_SEND、&resultCoilSend)==-1
    ||
    //没有足够的消息缓冲空间
    resultCoilSend < sizeof (cilInput[CI])
    ||
    // SendTo()失败
    (
    SendTo(.
    轮询项目[POLL_CORE_DATA].FD、
    和(coilInput[Ci])、
    sizeof (coilInput[CI])、
    0、
    (struct sockaddr *)_nhCoilAddr、
    sizeof (nhCoilAddr)
    )
    !=
    sizeof (coilInput[CI])
    )
    ){
    //记录丢弃的数据包,但不要关闭 UDP 套接字。
    ++csc.status.ipMessagesDroipped;
    csc.status.lastIpErrno = fdError();
    } 否则{
    ++csc.status.ipMessagesSent;
    }
    

    也许堆栈告诉我 sendto ()有足够的空间,但 HTTP 服务器正在临时窃取空间。  此代码在 fdPoll()之后立即运行。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我要提出另一项任务、即发送不频繁的周期性 UDP 消息。 在任务函数的开头,对 fdOpenSession()的调用显示"00000.000 fdOpenSession: oom,"这意味着,我假设,"内存不足"。 我想这与我的另一个内存问题有关。 FdOpenSession()的第一个 mmAlloc()尝试失败,因为 PITCount 为零。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请忽略最后一条消息。 在 NDK 运行之前、我尝试启动由 NDK 管理的任务。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Leo、


    SendTo()不应将 errno 设置为 ENOMEM。  当它无法分配 PBM 缓冲区时(发送 UDP 数据包需要此缓冲区)、它会将 errno 设置为 ENOBUFS。  我想知道您的代码中 fdError()报告的 ENOMEM 是否在其他地方出现故障。  在调用 sendto 之前,是否可以尝试调用 fdError()?  不知道这可能是多么容易/困难...

    [引用 user="Leo Bredehoft58"] udp.receiveBufSize = 16000 [/quot]

    听起来就像您在发送 UDP 数据的日志。  但是、您是否收到了大量数据?  只需检查您是否需要将每个 UDP 套接字的 RX 缓冲区设置为16K。

    如果不是、您可以尝试减小该大小、这样可以释放空间并允许您增大 NDK 存储器池的大小(即增大*。cfg 文件中为 Global. memRawPageCount 设置的值[看起来它当前设置为24])。

    Steve

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

    抱歉、我一开始发布这篇文章说 ENOBUFS (55)、这实际上是我看到的内容、然后我出错并开始说 ENOMEM。 我没有收到任何 UDP 数据。 我不希望这样做、即使我完成了应用程序也是如此。 我已经让 udp.receiveBufSize 返回到 XGCONF 中看起来的2048字节的默认值。 以下是当前堆栈内存设置:

    global.memRawPageCount = 24;//8;
    global.pktNumFrameBufs=32;//16;

    //var UDP = xdc.useModule('ti.ndk.config.Udp');
    //udp.receiveBufSize = 16000;

    VAR IP = xdc.useModule('ti.ndk.config.Ip');
    ip.socketMaxConnections = 16;

    BIOS.heapSize = 22528;

    我认为您已将我走上正确的道路。 在这种设置下、ENOBUFS 要少得多。 我认为 Global. pktNumFrameBufs=32;成功了。 调谐时、我将继续寻找这条途径。

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

    您是否知道您是否发送了大于3016字节的数据量? (在单个 sendto 调用中)

    如果是、则可能会在 NDK 的 UDP 实现中达到限制。

    有关更多详细信息、请参阅此处:

    e2e.ti.com/.../2072168

    Steve
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    每个 sendto ()调用只发送大约1475字节、因此这可能不是问题。 我在接收端看到数据、位速率大约为正确。

    这不是一个修复请求、但有趣的是、在30 Mbits/second 时、堆栈花费大约1/4的实时时间为 UDP 数据生成校验和。 我查看了代码和生成的汇编代码、没有看到任何明显的低效、因此唯一的改进就是时钟速度更快。 校验和代码的英勇努力可能会带来一些改进、但并不是真正的大好。 在将来的某个时候、我可能希望完全关闭 UDP 校验和、因为数据已经在物理层上进行了检查。

    顺便说一下、这是一个很好的嵌入式堆栈实现。 我遇到的任何困难都不是无法预料的。 很好!