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
大家好、
我正在使用 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 数据... 可能是一个长例程 }
感谢您提供信息的回复、Chuck。 要使用 DMA、似乎我必须修改 LwIP 内核、这是正确的还是缺少什么? 因为在执行原始 API 回调后、假设数据已在 pbufs... 我想您建议通过硬件寄存器持续接收数据、并通过主循环处理该数据? 有没有关于如何开始执行该操作的指针?
我在 LwIP 上发现了很多信息,但不幸的是,我看到的所有信息都是更基本的示例。 如果任何人都能提供一个示例、而不一定是 TI 产品上的示例、这可以实现我要做的事情、我们将不胜感激!