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/PROCESSOR-SDK-AM437X:应用程序丢失 UDP 数据报

Guru**** 2589265 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/638569/rtos-processor-sdk-am437x-application-loses-udp-datagrams

器件型号:PROCESSOR-SDK-AM437X

工具/软件:TI-RTOS

您好!

我的应用程序正在丢失 UDP 数据报。

 AM437x 入门套件板通过网络开关连接到 PC。 PC 使用 JPERF 工具每隔大约1秒向端口60000发送128字节的 UDP 数据报。 PC 还运行 Wireshark 以检查数据报。 我的应用程序发回 UDP 数据报。 我可以看到、接收到的数据报数量与 PC 发送的数据报数量不匹配、反之亦然。 端口60000的 UDP 套接字永远不会返回错误。
 
应用程序有4个任务。 所有任务的优先级为1。 所有任务的堆栈大小为4096。 任务#1仅闪烁一个 LED。 tast #2从控制台侦听命令并转储统计信息。 任务#3以非阻塞模式调用 recvfrom()并生成(Task_yield ())。 任务#4在邮箱上挂起。 每当任务#3收到 UDP 数据报时,它就会向任务#4发送邮件,该任务将数据报发送回 PC。

cfg 文件中针对 IP 和 UDP 的所有设置都是默认设置。

以下是打开 UDP 套接字的函数:

int udpOpen (udp_handle self、uint32_t ipaddr、uint16_t port)
{
套筒垫;
struct sockaddr_in sockAddress;
int sockOption;
字符 ipStr[16];
INT 结果;

//创建套接字。
sock = NDK_socket (AF_iNet、SOCK_DGRAM、IPPROTO_UDP);
如果(sock == invalid_socket)
{
返回 EC_FAIL;
}

//将端口绑定到套接字
bzero (等位地址、sizeof (struct sockaddr_in));
sockAddress.Sin_Family = AF_iNet;
sockAddress.Sin_port =端口;
sockAddress.sin addr.s_addr = ipaddr;

结果= ndk_bind (sock、(struct sockaddr *)&sockAddress、sizeof (struct sockaddr_in));
if (socket_error ==结果)
{
返回 EC_FAIL;
}

//设置广播包的套接字选项。
sockOption = true;
结果= NDK_setsockopt (sock、SOL_socket、SO_broadcast、(void *)等选项、sizeof (int));
if (socket_error ==结果)
{
返回 EC_FAIL;
}

//非阻塞操作
sockOption = 0;
结果= NDK_setsockopt (sock、SOL_socket、SO_blocking、(void *)等选项、sizeof (int));
if (socket_error ==结果)
{
返回 EC_FAIL;
}

sockOption = 8192;
结果= NDK_setsockopt (sock、SOL_socket、SO_SNDBUF、等式选项、sizeof (int));
if (socket_error ==结果)
{
返回 EC_FAIL;
}

sockOption = 8192;
结果= NDK_setsockopt (sock、SOL_socket、SO_RCVBUF、等式选项、sizeof (int));
if (socket_error ==结果)
{
返回 EC_FAIL;
}

//成功。
self->localIpAddr = ipaddr;
self->localPort=端口;
self->socket = sock;

返回 EC_SUCCESS;
}// udpInit


我´ve 了"TI 网络开发者套件(NDK) v2.25用户指南"的第3.5.1节(常见问题疑难解答)、并且正在尝试调整我的应用。 我有几个问题:

CFGITEM_IP_SOCKUDPRXLIMIT 的含义是什么? NDK 编程人员参考指南仅显示“UDP/RAW 接收限制”。 它是 XGCONF 的 UDP -模块设置选项卡中的"UDP 接收缓冲区大小"属性吗?

XGCONF 的"IP -常规设置"选项卡上的"最小发送大小"(IP.socketBufMinTxSize)属性有何含义?

如何检查以太网设备驱动程序是否由于 RX 队列深度而丢弃数据包?

Nimu_osal.c 文件中的函数 OSAL_TaskCreate()将任务优先级设置为10。 是这样吗? n´t 低于 NetScheduler()?

"ips.CacheMiss 始终为1。 "IPS.Cache小姐"的含义是什么?

"ips.CacheMiss 始终为1。 "IPS.Cache小姐"的含义是什么?

已安装的组件:
CCS 7.2
GCC ARM 编译器4.9.3
PROCESSOR_SDK_RTOS_AM437X 4.00.04
AM437x PDK v1.0.7
BIOS 6.46.05.55
xdctools 3.32.02.25_core

电路板:AM437X 入门套件


此致、
Marcio。

已编辑:已添加通信统计信息。


PC 在端口60000上发送了1001个数据报,仅收到620个数据报。

IP 统计信息:
总接收数量:          965 被丢弃:              0
Badsum:                0 Badhlen:               0
Badlen:                0 收养:            0
Badvers:               0 正向:               0
NOPROTO:               0 delivered:           918
Cantforward:           0 CantforwardBa:        47.
过期:               0 重定向发送:          0
本地输出:            851 本地输出:          0
高速             缓存命中:850高速缓存未命中             :1.
碎片:             0 碎片丢弃:           0
碎片超时:           0 重新汇编:           0
碎片:            0 碎片:            0
CANTfrag:              0 滤波:              0

UDP 统计:
合计:   918
RcvShort:   0
RcvBadLen:  0
RcvBadSum:  0
RcvFull:    0
RcvNoPort:  0
RcvNoPortB: 67
SndTotal:   851
SndNoPacket:0

UDP 统计:

192.168.1.16:60000
数字 已发送消息:           851
数字 发送错误:               0
上次发送错误:                0
数字 接收的消息:       851
数字 接收错误:          0
最后一个接收错误:           0

这是_mmCheck 的返回:


 12:48  (18%)   20:96  (62%)    2:128 ( 8%)    1:256 ( 8%)
  3:512 (50%)    0:1536           0:3072
(15360/49152毫米分配:48/0/10、毫米波:0/0/0)

在512字节页中分配的3个块
在48字节页中分配了12个块
在128字节页中分配的2个块
在96字节页中分配了20个块
在256字节页中分配1个块

 

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RTOS 团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Marcio、

    >> CFGITEM_IP_SOCKUDPRXLIMIT 的含义是什么? NDK 编程人员参考指南仅显示“UDP/RAW 接收限制”。 它是 XGCONF 的 UDP -模块设置选项卡中的"UDP 接收缓冲区大小"属性吗?

    CFGITEM_IP_SOCKUDPRXLIMIT 是用于在 TCP/IP 堆栈中设置配置值"UDP 接收缓冲区大小"的标签:

    CfgAddEntry (hCfg、CFGTAG _IP、CFGITEM_IP_SOCKUDPRXLIMIT、
    CFG_ADDMODE_UNIQUE、sizeof (uint)、(uint8 *)&receiveBufSize、0);

    >> XGCONF 的“IP -常规设置”选项卡上的“最小发送大小”(ip.socketBufMinTxSize)属性的含义是什么?
    它是套接字"能够写入"的最小大小(以字节为单位)。

    >>如何检查数据包是否由于 RX 队列深度而被以太网设备驱动程序丢弃?
    您可以使用 API - emac_get_statistics (port_num、* p_stats)检查 EMAC 统计信息。 EMAC_statistics 结构在 EMAC_drv.h 中定义

    >> NIMU_osal.c 文件中的函数 OSAL_TaskCreate()将任务优先级设置为10。 是这样吗? n´t 低于 NetScheduler()?
    这取决于应用程序,如果应用程序没有实时要求,则需要更高的 NetScheduler()优先级,而网络性能是目标。

    >>"IPS.CacheMiss 始终为1。 "IPS.Cache小姐"的含义是什么?
    当在缓存的路由中找不到 IP 地址路由时,IP 统计的 CacheMiss 将增加。

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

    感谢 Garrett 的回复。

    我将检查 EMAC 统计信息。

    XGCONF 为高优先级提供以下参数:

    1) 1)高优先级 NDK 任务的优先级= 7

    2) 2)内核优先级 NDK 任务的优先级= 11

    从上图可以看出、如果我将网络调度程序任务优先级设置为高、那么网络调度程序的优先级是什么? 11还是7?

    OSAL_TaskCreate()应该设置什么优先级? 10还是6?


    您能否建议采取一些措施来确定我的程序丢失 UDP 数据报的原因?

     您是否发现通信统计数据有任何问题?

    此致、
    Marcio。

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

    >>查看上图,如果我将网络调度程序任务优先级设置为“高”,那是网络调度程序优先级? 11还是7?
    7.

    >> OSAL_TaskCreate()应该设置什么优先级? 10还是6?
    实际上,在这种情况下-在 Nimu_osal.c 中,OSAL_TaskCreate()任务是链路状态轮询,因此如果是10或6则无关紧要,因为还没有 Tx/Rx 通信。

    您是否可以尝试将任务优先级设置为-、而不是4个具有相同优先级的任务-
    任务1 =#2、任务2 =#2、任务3 =#6、任务4 =#5。
    网络调度程序任务优先级=#7。

    从通信统计数据中、我无法找到 UDP 数据报丢失的原因。 但 mmCheck 看起来正常。

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

    您好、Garrett、

    我´ve 了您建议的更改。

    EMAC 统计信息显示 RxAlignCodeErrors 和 RxCRCrrors。 我´ve 到 proplem 只发生在 eth0上。 ETH1运行良好。

    我认为这是我的 EVM 板的硬件方案。 我仍在测试。 我不是100%´ve、´ve 我在 EMAC 驱动程序中发现了一些错误(我已经为这些错误打开了线程-我找到了一些错误、可能会有更多错误)。

    非常感谢。