Проблемы со стеком LWIP: UDP на TMS570LC43x
Я реализую STACK LWIP на TM570LC4357. Я сделал приложение для проверки связи UDP. Здесь задействован код:
void sendUDP(void);
#define UDP_PORT 23
ip_addr_t srcaddrUDP;
ip_addr_t dstaddrUDP;
struct udp_pcb *pcb_u;
int main(void)
{
IP4_ADDR(&dstaddrUDP,160,2,168,192); // the bytes are flipped for some reason..
IP4_ADDR(&srcaddrUDP,44,2,168,192); // the bytes are flipped for some reason..
pcb_u = udp_new();
errorCode = udp_bind(pcb_u,&srcaddrUDP,UDP_PORT);
errorCode = udp_connect(pcb_u,&dstaddrUDP,UDP_PORT);
while(1)
{
if(flag500ms)
{
flag500ms = 0;
sendUDP();
}
}
}
void sendUDP(void){
//UDP
err_t error;
u16_t dst_port;
struct pbuf * pb;
char str[512]="CIAOOO";
pb = pbuf_alloc(PBUF_TRANSPORT, 512, PBUF_REF);
pb->payload = str;
pb->len = pb->tot_len = 512;
error = udp_sendto(pcb_u, pb,&dstaddrUDP,UDP_PORT);
pbuf_free(pb);
}
Проблема в том, что если я отправлю пакет достаточного количества байт (в данном случае 512), все работает нормально (в основном, в wireshark я получаю то, что хочу..) Но если я отправлю пару байтов (т.е. 10 вместо 512 ), sendUDP() работает в первый раз, но во второй раз передает неинициализированные данные (проверено с помощью wireshark).
Я не использую бесплатную RTOS, но я читал в Интернете, что функции отправки должны вызываться внутри прерывания «таймера lwip», чтобы предотвратить неожиданные результаты. Однако я не понял, где найти это прерывание. Может ли это быть проблемой? Кроме того, в файле rawapi.txt (документация) говорится
"lwIP started targeting single-threaded environments. When adding multi-
threading support, instead of making the core thread-safe, another
approach was chosen: there is one main thread running the lwIP core
(also known as the "tcpip_thread"). The raw API may only be used from
this thread! Application threads using the sequential- or socket API
communicate with this main thread through message passing."
может намекая на "lwip timer"... но я не уверен
Я вызываю функцию отправки внутри main под флагом 500ms. Этот флаг устанавливается в 1 в процедуре прерывания таймера каждые 500 мс.
Кто-нибудь сталкивался с такой же ситуацией и знает, как решить эту проблему??
РЕДАКТИРОВАТЬ: я заметил, что есть проблемы и с 200 байтами. Я использую счетчик от 0 до 199. В первый раз без проблем, но во второй раз правильно передаются только числа от 0 до 180. Спасибо, Марко.