Проблемы со стеком 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. Спасибо, Марко.

0 ответов

Другие вопросы по тегам