器件型号: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 数据... 可能是一个长例程 }