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.

[参考译文] TDA2EXEVM:TFDTP:错误:PBM_ALLOC()失败...正在退出

Guru**** 2601915 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/640007/tda2exevm-tfdtp-error-pbm_alloc-failure-exiting

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

尊敬的 TI 论坛的各位同仁:

我正在尝试 在 TDA2x (VISION_SDK_02_12_01_00)上运行 TFDTP。

当我运行"TDFTPRx 链接+显示"时、我不断收到以下错误:
   错误:PBM_ALLOC()失败...正在退出!
   PBMQ_FREE 计数= 10239


但是、当我尝试使用网络 RX/TX 用例-> 1.Network RX + Display -> 1. TFDTP、我无法在我的端口上获取任何内容。 电路板似乎在等待数据...

我到目前为止所做的工作如下:
-在 cfg.mk 中设置 NDK_PROC_TO_USE = ipu1_1
-在 cfg.mk 中为 NSP_TFDTP_INCLUDE=yes
- uC_tfdtprx_display=yes in uC_cfg.mk
-在 chains_networkRxDisplay.txt 中设置 NullSource (IPU1_1)-> Display_Video
-在 network_tx_priv.h 中#define TFDTP_TX_STUSE_MODE 1
-已重建网络工具
-已用--usetfdtp 在网络工具中

是否有针对此误差的解决方案?

提前感谢您、
Stefan。

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

    我已将您的问题转交给一位专家征求意见。

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

    您可以在 NDK_CONFIG.cfg 中共享 NDK 缓冲区分配吗? 同时、我们将在设置时尝试重现此问题。
    此外、如果我可能问、您是否有特殊原因想要使用 TFDTP Rx 链路而不是使用 TFDTP 的空源链路?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果我可以将 NullSrc 与 TFDTP 一起使用、那将是更好的选择。 但是、当我使用该选项时、数据将被丢弃。 我可以看到、网络工具会立即发送数据、我可以通过 Wireshark 捕获这些数据、也就是负载
    M4-1会跳跃~80%、但我在显示屏上看不到更多。 数据统计数据如下:
    新数据记录= 10
    驱动程序/通知 CB = 9.96
    在 Recv FPS = 10时
    输出 FPS = 0
    输出下降 FPS = 10
    所有其他= 0.0

    这是否意味着我的 IPC 或链路损坏?

    NullSrc 在不处于 FTDTP 模式时正常工作...

    PMB_alloc 的问题仅发生在 TFDTPRx + Display 上

    下面是完整的 NDK_CONFIG.cfg、对原始变量所做的唯一更改是 var enableStaticIP = 1。


    /*********
    *文件名:NDK_config.cfg
    *此文件包含在使用 NDK 的内核中
    *
    秘书长的报告 /

    VAR enableInstrumentation = 0;
    VAR enableStaticIP = 1;


    /*使用模块*/
    VAR BIOS = xdc.useModule("ti.sysbios.BIOS");
    VAR IntXbar = xdc.useModule('ti.sysbios.family.shared.vayu.IntXbar');
    VAR NdkProcToUse = java.lang.System.getenv ("NDK_PROC_TO_USE");
    var NspTfdtpInclude= java.lang.System.getenv ("NSP_TFFDTP_include");
    var DualA15_smpbios = java.lang.System.getenv ("dual_A15_SMP_BIOS");

    if (NdkProcToUse="a15_0")

    VAR Hwi = xdc.useModule('ti.sysbios.family.arm.gic.Hwi');

    其他

    VAR Hwi = xdc.useModule('ti.sysbios.family.arm.m3.Hwi');


    /* NDK 模块*/
    VAR NdkConfigGlobal = xdc.useModule('ti.ndk.config.Global');
    VAR IP = xdc.useModule('ti.ndk.config.Ip');
    VAR TCP = xdc.useModule('ti.ndk.config.Tcp');
    VAR UDP = xdc.useModule('ti.ndk.config.Udp');
    VAR Telnet = xdc.useModule('ti.ndk.config.Telnet');

    if (DualA15_smpbios="yes")

    /*对 SMP 环境使用信标排除*/
    NdkConfigGlobal.useSemLibs = true;


    /* NSP 驱动程序*/
    VAR GMACSW = xdc.useModule('ti.nsp.drv.GMACSW');

    IF (enableInstrumentation)

    GMACSW.instrumentedBuild = true;

    其他

    GMACSW.instrumentedBuild = false;



    NSP 中的/* Enalbe TFDTP 堆栈*/
    if (NspTfdtpInclude="是")

    GMACSW.tfdtpBuild = true;
    NdkConfigGlobal. stackBeginHook ='&Utils_tfdtpDmaInit';
    NdkConfigGlobal.networkIPAddrHook ='Network_ndkIPAddrHookFxn';


    if (java.lang.System.getenv ("AVBRX_include")="yes")

    /* AVBTP 堆栈*/
    VAR AVBTP = xdc.useModule('ti.avbtp.AVBTP');
    IF (enableInstrumentation)

    AVBTP.instrumentedBuild = true;

    其他

    AVBTP.instrumentedBuild = false;



    /******** \
    | 其他配置 |
    \"******** /

    /*为 BIOS 指定启动初始化函数*/
    BIOS.startupFxns =['&NDK_NSP_Init']; /*在启动时调用 init 函数*/

    VAR irqOffset = 0;

    if (NdkProcToUse="a15_0")

    irqOffset = 32;


    /* GMAC_SW RX_THRESH_PULSE 中断*/
    intXbar.connectIRQMeta (57、334);
    var hwi_param_0 =新的 Hwi.Params;
    Hwi_param_0.arg = 0;
    hwi.create (57+irqOffset、'&HwIntRxThresh'、hwi_param_0);

    /* GMAC_SW RX_PULSE 中断*/
    intXbar.connectIRQMeta (58、335);
    var hwi_param_1 =新的 Hwi.Params;
    Hwi_param_1.arg = 0;
    hwi.create (58+irqOffset、'&HwIntRx'、hwi_param_1);

    /* GMAC_SW TX_PULSE 中断*/
    intXbar.connectIRQMeta (59、336);
    var hwi_param_2 =新的 Hwi.Params;
    Hwi_param_2.arg = 0;
    hwi.create (59+irqOffset、'&HwIntTx'、hwi_param_2);

    /* GMAC_SW MISC_PULSE 中断*/
    intXbar.connectIRQMeta (60、337);
    var hwi_param_3 =新的 Hwi.Params;
    Hwi_param_3.arg = 0;
    hwi.create (60+irqOffset、'&HwIntMisc'、hwi_param_3);


    /******** \
    | NDK 配置 |
    \"******** /

    /*选择所需的堆栈库*/
    NdkConfigGlobal. ipv6 =错误;
    NdkConfigGlobal. stackLibType = NdkConfigGlobal. Min;
    NdkConfigGlobal.netSchedulerPri = NdkConfigGlobal. nc_priority_high;
    NdkConfigGlobal.debugAbortLevel = NdkConfigGlobal. DBG_none;
    NdkConfigGlobal.debugPrintLevel = NdkConfigGlobal. DBG_none;

    /*分配内存段和大小*/
    NdkConfigGlobal. pbmDataSection =".bss:NDK_PACKETMEM";
    NdkConfigGlobal. memDataSection =".bss:NDK_MMBUFFER";
    NdkConfigGlobal. lowTaskStackSize = 8192;
    NdkConfigGlobal.normTaskStackSize = 8192;
    NdkConfigGlobal. highTaskStackSize = 8192;
    NdkConfigGlobal. ndkThreadStackSize = 8192;
    NdkConfigGlobal. pktSizeFrameBuf = 1536;
    if (NspTfdtpInclude="是")

    /* TFDTP 堆栈至少需要512个 NDK 帧缓冲器*/
    NdkConfigGlobal. pktNumFrameBufs=512;

    其他

    NdkConfigGlobal. pktNumFrameBufs=192;

    NdkConfigGlobal. memRawPageSize = 3072;
    NdkConfigGlobal. memRawPageCount = 16;

    /*使用 ti.ndk.config.Global 模块中可用的挂钩函数添加 CGI 命令*/
    NdkConfigGlobal.networkOpenHook ='网 OpenHook';
    NdkConfigGlobal.networkCloseHook ='netCloseHook';

    /*更改接收缓冲区的大小*/
    tcp.transmitBufSize =64*1024;
    tcp.receiveBufSize =64*1024;
    tcp.receiveBufLimit =64*1024;
    udp.receiveBufSize =64*1024;

    /*当 NDK 在 A15上运行时增加缓冲区大小以获得更高的吞吐量*/
    if (NdkProcToUse="a15_0")

    NdkConfigGlobal. pktNumFrameBuf =192*8;
    NdkConfigGlobal. memRawPageCount =16*8;
    tcp.transmitBufSize =256*1024;
    tcp.receiveBufSize =256*1024;
    tcp.receiveBufLimit =256*1024;


    if (enableStaticIP)

    /*静态 IP 配置的设置*/
    ip.address ="192.168.1.200";
    ip.mask ="255.255.255.0;
    ip.gatewayIpAddr ="192.168.1.1";
    ip.ifIdx = 1;

    其他

    ip.dhcpClientMode = ip.CIS_FLG_IFIDXVALID;


    如果(0)

    /*添加 Telnet 服务器*/
    var telnetParams = new telnet.Params();
    telnetParams.callBackFxn ='&ConsoleOpen';
    var telnet = telnet.create (telnetParams);

    /*添加一些用户帐户*/
    var acct1 = new NdkConfigGlobal. Account();
    acct1.username ="用户名";
    acct1.password ="密码";
    NdkConfigGlobal. addUserAccount(acct1);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Stefan、

    很抱歉耽误你的回答。 我想先尝试一下我的装置上的两个用例。 我可以运行这两个用例、而不会出现任何问题。
    以下是需要注意的几点。

    TFDTP Rx+ Display 在流模式下工作、因此需要将 TFDTP_TX_STREGACY_MODE 的工具重建为1
    2.对于具有 TFDTP 用例的空源、可以使用默认二进制文件。 如果使用流模式重建工具、此用例将失败。 它需要将 TFDTP_TX_STREGUSE_MODE 设置为0

    我相信、在使用零源 TFDTP 的情况下、由于您正在使用流模式 Tx 二进制文件、数据会被丢弃。 请确认吗?
    您是否还对用例进行了任何更改? 在本用例中、当前 fps 配置为10、但通过 TFDTP、您可以获得~30fps。
    我建议先尝试10fps、然后再增大。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    具有 TFDTP 的空源的行为类似-当 TFDTP_TX_STREGALY_MODE 设置为0时、我会得到与我提到的相同的 PBM_alloc 错误。 在这种情况下、显示屏上只显示第一个帧的上半部分、它是绿色的。 网络工具不断发出数据帧、但我的显示屏上没有任何变化(由于分配问题)。

    我不再在 EVA 板上工作、因为它有一些问题、我每次都无法 ping 通... 我已切换到我们开发的板(TDA2xx)... 我可以在上面运行所有网络用例、而不会出现任何问题。 我们没有改变任何可能影响 TFDTP 的东西。
    您能告诉我、您使用的是什么 SDK 以及您的设置是什么? 在 TFDTP 配置过程中是否遗漏了任何内容(请再次查看第一个帖子)?

    是否可以将零源(无 TFDTP)设置为在30fps 下工作?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Stefan、

    您是否在 Linux 计算机上运行 PC 工具? 如果没有、您可以在 Linux PC 上运行它吗?
    如果您已经在 Linux 计算机上运行、我们可以通过 WebEx 会话进一步调试。

    是否可以将零源(无 TFDTP)设置为在30fps 下工作?
    >>如果您在 IPU 上运行网络堆栈、则无法获得30fps;将其移动到 A15即可获得。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Prasad、

    很抱歉、我的回答很晚、我尝试了各种方案。
    我正在处理 Windows、现在我已切换到 Linux、然后我得出结论、是 Windows 上的网络工具导致了分配问题。
    我已经尝试将内置在 Linux 和电路板窗口中的应用程序映像放在 Linux 中、并从 Linux 中运行网络工具、TFDTP 工作正常。
    什么可能导致 Windows 网络工具中出现此错误? 我们的整个团队都在 Windows 中工作、因此这可能是一个问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Stefan、

    Windows PC 上不支持网络 Tx 工具上的 FlowControl (吞吐量限制)。 因此、在 Windows PC 上、Tx 速率是实际的线速率(~1Gb)、零源无法处理、从而导致数据包丢弃。
    目前、对于 Linux、流控制是使用延迟实现的、与 Windows 一样、无法使用延迟。
    您可以参阅 apps\tools\network_tools\common\src\tfdtp_api.c 以了解流控制代码。

    请告诉我是否需要任何澄清。 谢谢。