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.

[参考译文] Hercules _SAFETY_MCU_DEMOS:处理 UDP 数据接收的 LwIP 最佳实践

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/616610/hercules_safety_mcu_demos-lwip-best-practices-to-handle-reception-of-udp-data

器件型号:Hercules _SAFETY_MCU_DEMOS

大家好、

我正在使用 LwIP 堆栈来使用 Raw API 而不是操作系统来实现 UDP 通信。  提取和处理接收到的 UDP 数据的最佳做法是什么?  下面是初始化 UDP 套接字并设置接收回调的简短代码片段。  回调会将数据从 pbuf 复制到本地缓冲区、然后的想法是通过获取指向 rxData 缓冲区的指针来处理来自 main 中调用的循环的缓冲区的数据。  我担心:

A.在新数据到达之前,数据处理速度可能不够快

b.一旦新数据到达、它将在缓冲区完全处理之前覆盖缓冲区、这将导致我的数据全部混淆(我可以在接收缓冲区中放置一个互斥量、但我担心会丢失一些接收到的数据)

通常、最好在回调之外处理数据、对吧? 因为它在技术上是 ISR 的一部分... 如果我错了、请更正我、否则我可以在回调中执行我需要做的所有操作

这通常是如何处理的? 是否有更好的方法来执行我要做的事情? 是否有示例?

静态 uint16_t rxLength = 0;
静态 uint8_t rxData[4096];


void EMAC_LwIP_Main (uint8_t * macAddress)
{
unsigned intipaddr;

//启用 CPSR 寄存器中的中断生成*/
IntMasterIRQEnable();
_ENABLE_FIQ ();



//使用静态地址初始化 lwIP 库。*/
uint8 ip_addr[4]={ 192、168、2、44 };
uint8 netmask[4]={、255、
255、255};uint8、254};uint2、254}
ipaddr = lwIPInit (0、 MacAddress、
*(((uint32_t *) ip_addr)、
*((uint32_t *)网络掩码)、
*(((uint32_t *)网关)、
IPADDR_USE_STATIC);

struct udp_PCB * mypcb;
mypcb = udp_new ();


if (udp_bind (mypcb、ip_ADDR_any、8760)= ERR_OK)
{
/*为 PCB 设置接收回调*/
udp_recv (mypcb、udp_receive_callback、NULL);
}
否则
{
返回;
}/*

循环永久。 所有工作都在中断处理程序中完成。 //
while (1)
{
ProcessRxData();
}


void udp_receive_callback (void * arg、struct udp_PCB * upcb、struct pbuf * p、struct ip_addr * addr、u16_t port)
{

/*将数据复制到本地缓冲区*/
如果(p != NULL && p->t_len!= 0)
{
rxLength = pbuf_copy_partial (p、rxData、p->tot_len、0);
}
}

void ProcessRxData (void)
{
//在此处理 RX 数据... 可能是一个长例程
}

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

    遗憾的是、除了 Halcogen 提供的 LWIP 示例之外、我们没有任何明确的示例。 由于这是一个开源开发的堆栈、我建议您在 savannah.nongnu.org/.../的开源社区中找到更好的答案和更深入的体验。

    但是、从嵌入式编程最佳实践的角度来看、我可以告诉您、最好始终尽可能少地在 ISR 内部执行操作、并在 HAL 和应用程序之间的中间层中执行大多数处理操作。 您是否考虑过使用 DMA 将数据从接收缓冲区移动到处理缓冲区、以便保留要处理的数据包队列? 如果使用此方法、您仍然需要小心操作、不要使处理缓冲区溢出、或者在使用环形缓冲区的情况下、不要覆盖之前消息中的数据。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您提供信息的回复、Chuck。  要使用 DMA、似乎我必须修改 LwIP 内核、这是正确的还是缺少什么?  因为在执行原始 API 回调后、假设数据已在 pbufs... 我想您建议通过硬件寄存器持续接收数据、并通过主循环处理该数据?  有没有关于如何开始执行该操作的指针?

    我在 LwIP 上发现了很多信息,但不幸的是,我看到的所有信息都是更基本的示例。  如果任何人都能提供一个示例、而不一定是 TI 产品上的示例、这可以实现我要做的事情、我们将不胜感激!

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

    正如我提到过的、以太网协议、尤其是 LWIP 堆栈并不是我的一项特殊专业技术。 我会将您的帖子转发给我的一位同事、他们对您的帖子比较熟悉、看看他们是否能够提供一些其他建议。 您可能还想通过此 E2E 进行搜索、以查看其他帖子/主题是否有更多详细信息或示例可用作学习工具。

    如前所述、开放源代码社区的 LWIP 网页可能是一个很好的资源。 我相信他们还有一个社区页面、您可以在该应用中发布问题并请求帮助。