主题中讨论的其他器件:SysConfig、
工具/软件:
我是否可以更改 enet_cpsw_udpclient_am243x-lp_r5fss0-0_freertos_ti-arm-clang 示例以从一个 IP 地址接收所有端口地址? 我尝试将端口号更改为0 (所有端口)、但不起作用。
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.
尊敬的 Baruch Einziger:
感谢您的查询。
你能提供更多的细节吗?
此致
Ashwani
嗨、Goel
我将套接字绑定到我的静态 IP、这样就可以正常工作、直到我在 python UDP 服务器中更改端口号。
这是我添加到 UDP 客户端示例中的代码:
结构体 sockaddr_in local_addr;// 10042025
local_addr.sin_family = AF_iNet;
local_addr.sin_port = htons (0);
local_addr.sin_addr.s_addr = inet_addr ("192.168.1.200");//我的静态 IP
if (lwip_bind (sock、(struct sockaddr*)&local_addr、sizeof (local_addr))< 0){
printf ("绑定失败\n");
while (1);
}
请您就以下问题提供指导:
如何将 lwIP 配置为使用单个 IP 地址跨多个端口与 UDP 配合使用、并在接收和发送操作之间实现明确的分离?
这是我问题的核心。 提前感谢您的支持。
此致、
Baruch
尊敬的 Baruch:
如果您假定将从任何端口号接收到绑定套接字到0、这将不起作用。 0是保留的端口号。
是否要打开单个套接字并接收任何与 IP 地址匹配的 UDP 数据包、而不考虑端口号?
、在接收和发送操作之间有明确的区分?
您能详细说明一下吗?
此致、
Thilak
尊敬的 Baruch:
套接字的概念基于 IP 地址和端口号。 但与广播 MAC 地址和 IP 地址不同、我们不支持广播端口号。 要侦听来自 IP 地址的流量、只要应用程序充当客户端、它就应侦听给定的端口号。
单个套接字从客户端的给定 IP 接收来自所有端口号的数据包的想法看起来像一种非常规的方法。 您能帮助我更好地了解用例吗、以便我们可以了解替代方法吗?
此致、
Teja。
尊敬的 Teja
在单个以太网 IP 地址上使用 UDP 时、我目前只能一次接收一条消息。 理想情况下、如果我可以同时从所有端口捕获消息、我可以通过软件高效地筛选和管理它们。 现有的解决方案需要为每个端口创建一个单独的线程、对于我的 AM243x LP 卡来说、这种解决方案占用的资源太多。
我尝试使用 PCB 通过回调例程处理输入接收、但遗憾的是、我尚未成功。 这一问题的原因仍不清楚。 我已经在 E2E 论坛上提出了这个问题、但到目前为止尚未收到任何有用的回复。
最好的照顾
Baruch
尊敬的 Baruch:
会议结束后、我知道您需要接收给定 IP 地址的 UDP 流量、并通过共享内存将基于端口的后续数据传递给多个内核。 如果每个核心都具有唯一的 IP (如果要在每个核心上运行的进程数量必须是可扩展的)、我建议这样做会更好。 您可以在此处查看一个示例、该示例演示了类似的功能: https://software-dl.ti.com/mcu-plus-sdk/esd/AM64X/latest/exports/docs/api_guide_am64x/EXAMPLES_ENET_INTERCORE_ICSSG.html
或者、 当您 使用并行运行的更多线程时、可以增加任务大小。 您可以在以下位置增加可用于 FreeRTOS 的栈大小。 请查找 MAIN_TASK_SIZE: source/networking/enet/core/examples/lwip/enet_cpsw_udpclient/am243x-lp/r5fss0-0_freertos/main.c
同时、让我来评估您可以在不 增加每个新端口的开销的情况下使用的其他选项。
此致、
Teja。
尊敬的 Teja:
我不接受运行 lwIP 和 FreeRTOS 的两个实例的想法、因为在使用 AM243X-LP 的当前工作环境中、我受到内存限制的严重限制。
为了有效地管理我的内存限制、我已将应用程序配置为仅使用核心 R00来处理四个具有单个 IP 地址的端口上的 UDP 通信。 您的建议涉及使用两个 IP 地址和一个端口、但遗憾的是、这与我的要求不符。
R01来处理 UART 接口。
我遇到的主要问题是,在我的线程中添加额外的代码后,它会在后续系统调用时中止lwip_recvfrom
,例如(仅成功执行一次)、IpcNotify_sendMsg
或SemaphoreP_post
。 当我尝试调试时、线程会在重新进入循环或到达lwip_recvfrom
调用处设置的断点时立即崩溃。
我已经尝试增加MAIN_TASK_SIZE
,但这带来了更多的问题,我目前正在进一步调查.
您能告诉我如何才能最好地继续吗?
谢谢您、
Baruch
尊敬的 Baruch:
这是在 LwIP 库中设置的配置。 默认情况下、我们支持4个并行活动连接。 您可以通过调整 lwipopts.h 文件中的参数"MEMP_NUM_UDP_PCB"来增大该限值。 您可以在<($MCU_PLUS_SDK)/source/networking/lwip/lwip-config/am243x/lwipopts.h >处找到此文件
/* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One per active UDP "connection". */ #define MEMP_NUM_UDP_PCB 4 // Increase this to the required number
通过将此数字增加到所需的数字、可以一次打开超过4个套接字、这是默认值
此致、
Teja。
尊敬的 Tega:
我尝试了两个建议的更改、但我仍然无法声明更多套接字。 我附上了我为您的评论所做的修改。
以下是我的相关章节lwipopts.h
:
#define MEMP_NUM_RAW_PCB 6
// One per active UDP connection
#define MEMP_NUM_UDP_PCB 6 // Previously: 5
// Number of simultaneously active TCP connections
#define MEMP_NUM_TCP_PCB 6 // Previously: 5
而从我的开始main.c
:
#define MAIN_TASK_SIZE (49152U / sizeof(configSTACK_DEPTH_TYPE))
// Previously: #define MAIN_TASK_SIZE (16384U / sizeof(configSTACK_DEPTH_TYPE))
尽管进行了这些更改、但当我尝试创建第5个套接字时、软件会返回错误。
此致、
Baruch
尊敬的 Baruch:
我已经测试了应用程序打开4个以上的与 UDP 并行连接。 除了将 MEMP_NUM_UDP_PCB 增加到6之外、我还必须增加堆大小以满足额外的动态存储器要求。 您可以通过 syscfg-GUI 工具增加 FreeRTOS 堆栈大小。 请查找 Memory Configurator> General> Stack Size 和 Heap Size。 请更新栈和堆大小、重新编译库和示例。
如果您遇到任何其他问题、请告知我们。
此致、
Teja。
尊敬的 Teja:
我尝试增加MEMP_NUM_UDP_PCB
到6个、但我已达到 SysConfig 中设置的最大内存限制、并且无法为 FreeRTOS 分配额外的内存。 我也尝试增加堆和堆栈大小,但当我尝试创建第五个套接字,它失败了,错误。
目前、我只处理客户端的4个套接字。 我正在等待一种解决方案、要么使用 DDR4在下一个电路板上支持10个以上的插座、要么采用一种将 PCB 用于回调例程的有效方法。
此致、
Baruch
让我知道您是否希望它的措辞更具技术性、正式性或随意性。
尊敬的 Baruch:
系统中是否没有可用的 MSRAM 内存? 如果是,那么它将是一个更好的调用等待,直到你可以工作的板与 DDR 因为我已经验证了打开超过5个插座的可行性在一个时间.
但我仍然建议您考虑是否可以为每个内核分配唯一的 IP、因为这是获得可扩展性的更好选择、并且内存影响较小。 在 MCU+ SDK 中、通过内核之间的共享存储器路由以太网流量的驱动程序已提供、但您必须为 AM243x 启用该驱动程序、因为该示例开箱即用。
此致、
Teja。
尊敬的 Teja:
下个月我将迎来一个重要的里程碑。 目前、我使用一个 IP 地址管理五个以上的套接字、尽管我目前使用四个。 以太网处理由内核 R00管理、我正在高效利用共享内存(MSRAM 的一部分)用于所有以太网 UDP 缓冲区、而无需额外的复制。
我采用 IP Notify 来传输28位数据、其中包括存储的缓冲区索引 8.每个位。 在共享、不可缓存的存储器中、以及专用于参数的额外12位。 同时、内核 R01管理 UART 通信、每个通信都具有专用的64字节缓冲器、支持高达3Mbps 的数据速率、并且响应时间非常短。
我现在准备向我的客户端演示 AM2434的功能。 我对保护一个重要项目感到乐观、这将使我能够设计自己的包含 DDR4内存的硬件解决方案。 到目前为止、我的共享存储器策略和 IPC Notify 消息传递概念已被证明非常有效。
此致、
Baruch
尊敬的 Baruch:
我现在准备向我的客户端演示 AM2434的功能。 我对保护一个重要项目感到乐观、这将使我能够设计自己的包含 DDR4内存的硬件解决方案。 到目前为止,我的共享内存策略和 IPC Notify 消息传递概念已经证明非常有效。[/报价]感谢您的更新、我希望在演示过程中您不会再遇到其他问题。 如果您遇到任何问题、请告诉我。
谢谢。此致、
Teja。