Столкнулся с такой проблемой. Делаю обмен данными по UDP на МК ST32F207 + стек LwIP 1.3.2 на основе примера udpechoserver для ST322xG_EVAL.
По приёму UDP датаграммы срабатывает такой callback
CODE
void udp_echoserver_receive_callback(void *arg, struct udp_pcb *upcb, struct pbuf *p, struct ip_addr *addr, u16_t port)
{
//запоминаем данные клиента
upcb1 = upcb;
addr1 = addr;
//разбираем входящее сообщение
parseIncomingMessage(p);
/* Free the p buffer */
pbuf_free(p);
}
И, если пришло сообщение "start", то начинает периодически вызывается такая функция, принимающая массив данных и отправляющая его по UDP клиенту.
CODE
void udpSendArray(uint16_t data[])
{
//выделим память для pbuf буфера
pb1 = pbuf_alloc(PBUF_RAW, udpPackageSize+headerSize, PBUF_RAM);
//сформируем pbuf из массива данных data[]
pbuf_take( pb1, data, udpPackageSize+headerSize);
//подсоединимся к клиенту и отошлём данные
udp_connect(upcb1, addr1, UDP_CLIENT_PORT);
udp_send(upcb1, pb1);
udp_disconnect(upcb1);
//очистим pbuf буфер
pbuf_free(pb1);
}
проблема в том, что если в конце udp_echoserver_receive_callback вызывать pbuf_free(p), как положено, то передача данных становится неравномерная, рывками.
Если закоментировать pbuf_free(p) в конце udp_echoserver_receive_callback, то передача данных нормальная. Скорость до 70мбит. Но тогда pbuf буфер входящего сообщения не очищается, и после ~30 входящих сообщения перестают приниматься.
Я не могу понять, почему если хотя бы один раз вызвать pbuf_free(p), то передача становится неравномерной, перепробовал кучу опций LwIP, пробовал очищать pbuf напрямую mem_free. не знаю что и сделать.