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.

[参考译文] TMS320C6457:NDK 库中的 PBM 资源

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/917299/tms320c6457-pbm-resource-in-ndk-library

器件型号:TMS320C6457

我收到有关 PBM (数据包缓冲管理器)的查询。 此咨询与以下 E2E 主题(https://e2e.ti.com/support/processors/f/791/p/905776/3370042#3370042)相关。

我们收到了专家的评论,即"在发送和接收之间共享多溴联苯资源"。 这是否意味着 PBM 资源是"TCP 发送缓冲区大小"和"TCP 接收缓冲区大小"的总和?

2.专家告诉说,最大 TCP 传输缓冲区大小为65535字节。 关于"最大 TCP 接收缓冲区大小"、此最大大小是否也是65535字节? 这意味着,客户能否理解最大 PBM 资源是"65535字节 x2"?

3.关于 PBM 资源,您能否共享有用的文档/用户指南信息? 就我查找的内容而言、以下用户指南可能会有所帮助。 不过、如果您能与我们分享专家对此的意见、我们将不胜感激。

此致、Miyazaki

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

    你好、Takayuki、

    希望此页面将回答您对 NDK 的存储器相关问题: https://processors.wiki.ti.com/index.php/TI-RTOS_Networking_Stack_Memory_Usage

    Todd

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

    您好 Todd、

    我尝试在此处理器 Wiki 中查找#1和#2的答案、但我无法找到它们。 根据 NDK 用户指南( https://www.ti.com/lit/pdf/spru523 ),似乎用户能够将 MMALLOC_MAXSIZE 设置为“65500”,我们能不能对这些查询有什么意见吗?

    此致、Miyazaki

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

    宫崎

    PBM 数据包由低级 EMAC 驱动程序使用。

    让我们首先看一下接收端。 当以太网数据包进入时、它被放入一个 PBM 数据包中。 PBM 数据包是以太网数据包的最大大小。 如果向器件发送较大的 TCP 或 UDP、以太网将会将其破坏。 因此、需要多个 PBM 数据包才能接收较大的 TCP 或 UDP 数据包。 重新组装在 NDK 堆栈中的较高位置发生。  

    在发送端、如果发送了较大的缓冲区、它将被拆分为多个 PBM 数据包(然后成为多个以太网数据包)。

    这是默认行为。 NDK 确实支持大型数据包、但需要重新构建 NDK。  

    Todd

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

    您好 Todd、

    我从我们的客户那里获得了有关 NDK API 参考指南(www.ti.com/.../spru524k.pdf)的更多查询。 我不熟悉 NDK API、因此我只是尝试直接翻译他们的查询。 抱歉。

    关于"_ipcfg.SockBufMinTx"(p173)

    “发送缓冲区大小”是否意味着“transmitBufSize”? 根据此说明、该值通常约为发送缓冲区大小的25%至50%。 客户似乎设定了6%左右。 在这种情况下、是否存在任何问题?

    关于 CCS 配置文件中的每个定义

    CCS 配置文件中的每个定义是否与 NDK 中的描述相匹配? 这意味着、客户希望确认他们之间的以下关系。

    【app_p64P.cfg.xml】→【sep524】
    
    receivBufSize→_ipcfg.SockTcpTxBufSize
    
    IpeBufSize→_ipcfg.SockTcpRxBufSize
    
    maxReassemblySize→_ipcfg.Rx ReasmSocketBufMinTxSize
    
    →_ipcfg.SockPbufMinSockPx
    
    PecSize→_ipcfg.SockPecfTxBuck PecSize 

    NDK_SEND ()/NDK_recv ()

    客户目前正在使用 SEND()/recv() API,客户是否应该使用 NDK_SEND()/NDK_recv()?  

    关于 PBM

    客户在当前项目中不使用 NDK_***() API。 但是、在这种情况下、客户还应该使用 PBM 任务吗?

    5.客户注意到,在他们的应用程序软件中从未调用过 TaskCreate()。 在这种情况下、客户还应该使用 PBM 的缓冲器、并且应该与 PBM 进行以太网通信?

    6.在使用 PBM 的情况下,SEND()/recv()使用 PBM 池。 PBM 池可能会耗尽。 类似于以下 URL 说明(https://e2e.ti.com/support/processors/f/791/p/905776/3370042#3370042)。 是这样吗?

     

    如果您能够分享您对这些查询的意见、我们将不胜感激。

     

    此致、

    宫崎

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

    宫崎

    回复:#1 -_ipcfg.SockBufMinTx

    当_ipcfg.SockBufMinTx 的说明引用"发送缓冲区大小"时、是指由_ipcfg.SockTcpTxBufSize 定义的值。 在启动期间,此参数将由 application.cfg 脚本中定义的 tcp.transmitBufSize 设置,但稍后可以通过调用 CfgAddEntry()来更改。

    将_ipcfg.SockBufMinTx 设置为发送缓冲区大小的6%不会出现问题。 这意味着套接字将更快地标记为可写、但新数据的空间更小。 请注意,使用_ipcfg.SockBufMinTx 意味着您使用的是具有非阻塞套接字的 fdSelect()。 使用 send()函数时,它不使用此配置参数。


    回复:#2 - CCS 配置与 NDK _ipcfg 的对比

    您在这些参数之间具有正确的关系。 您在 application.cfg 脚本中指定的值将在启动阶段应用于 NDK _ipcfg 参数。 创建新套接字时、它将从_ipcfg 获取其值。 拥有套接字后,可以使用 setSockOpt ()函数修改其参数。


    回复:#3 - BSD 与 NDK

    建议使用 BSD 函数(send、recv)。 但是、允许应用同时使用 BSD 和 NDK 函数(NDK_SEND、NDK_REV)。 必须从 NDK 任务中调用这两个 API、以便激活正确的 fdSession。

    可能无法使用同一源文件中的两个 API、因为头文件可能不兼容。 但是、如果您将代码分成两个单独的源文件、它应该起作用。 但最好仅使用 BSD API。


    回复:#4- PBM

    客户不应使用任何 PBM 功能。 PBM 的唯一注意事项是 PBM 池的配置。 之后、NDK 和驱动器在内部使用 PBM 缓冲器。 它们不应由直接访问
    应用程序。


    回复:#5-任务创建

    强烈建议应用程序使用 TaskCreate()来创建一个调用网络 API 的新任务。 设置正确的 fdSession 上下文时需要执行此操作。 但是、可以直接从内核任务调用 BSD 和 NDK API、但需要手动设置适当的 fdSession 上下文。 不建议使用此方法。


    回复:#6- PBM 池

    BSD 和 NDK API 均使用 PBM 池。 如果应用程序结构不正确、PBM 池可能会耗尽并导致网络流量停止。

    PBM 缓冲器在内部用于发送和接收数据。 它们用于在驱动程序层和应用层之间双向移动数据。 接收路径上可能出现问题。 当接收到新数据时、驱动程序将自动获取 PBM 缓冲区以存储传入的数据、然后将 PBM 缓冲区向上传递到 NDK 堆栈。 数据将一直保存在那里,直到应用程序调用 recv(),此时数据从 PBM 缓冲区传输到应用程序缓冲区。 然后空的 PBM 缓冲区返回到池中。 如果应用程序从未调用 recv(),或没有调用足够快,则 PBM 池可能会耗尽。 如果发生这种情况、并且应用程序尝试发送数据、则会失败、因为没有 PBM 缓冲区可用于将出站数据从应用程序传输到驱动程序。

    ~Ramsey