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