Перейти к содержанию
    

IXUS666

Новичок
  • Постов

    4
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный
  1. Попробуйте запустить сервер на не блокирующих сокетах.. Похожая ситуация выплыла с HTTP сервером, когда размер HTTP запроса был больше чем PBUF_POOL_BUFSIZE-(~40-60байт) и netconn_thread блокировалась на совсем. Пока толком не разбирался с этим, но если запустить входное соединения на не блокирующих сокетах то работает (хотя я полагаю что это неправильно, т.к. должно работать и так). Для этого нужно в определить в lwipopts.h #define LWIP_SO_RCVTIMEO 1 и после newconn = netconn_accept(conn), определить newconn->recv_timeout = XX, XX в ms. Хотя у вас механизм UDP, как с ним работать я не знаю. Так если используете плагин AVIX-RT для RTOS, то в окошке Tasks можно посмотреть Event Object. Если задача заблокирована то в Event Object отображается адресс обьекта (очередь/мьютекс) котораый заблокировал задачу.
  2. V_M_Luck, а в ethernetif.c в low_level_input() тоже внесли изменения? static struct pbuf * low_level_input(struct netif *netif) { struct pbuf *p, *q; u16_t len; uint32_t l=0,i =0; FrameTypeDef frame; u8 *buffer; __IO ETH_DMADESCTypeDef *DMARxNextDesc; p = NULL; /* Get received frame */ frame = ETH_Get_Received_Frame_interrupt(); if (frame.descriptor && frame.buffer) { /* check that frame has no error */ if ((frame.descriptor->Status & ETH_DMARxDesc_ES) == (uint32_t)RESET) { /* Obtain the size of the packet and put it into the "len" variable. */ len = frame.length; buffer = (u8 *)frame.buffer; /* We allocate a pbuf chain of pbufs from the pool. */ p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL); /* Copy received frame from ethernet driver buffer to stack buffer */ if (p != NULL) { for (q = p; q != NULL; q = q->next) { memcpy((u8_t*)q->payload, (u8_t*)&buffer[l], q->len); l = l + q->len; } } } /* Release descriptors to DMA */ /* Check if received frame with multiple DMA buffer segments */ if (DMA_RX_FRAME_infos->Seg_Count > 1) { DMARxNextDesc = DMA_RX_FRAME_infos->FS_Rx_Desc; } else { DMARxNextDesc = frame.descriptor; } /* Set Own bit in Rx descriptors: gives the buffers back to DMA */ for (i=0; i<DMA_RX_FRAME_infos->Seg_Count; i++) { DMARxNextDesc->Status = ETH_DMARxDesc_OWN; DMARxNextDesc = (ETH_DMADESCTypeDef *)(DMARxNextDesc->Buffer2NextDescAddr); } /* Clear Segment_Count */ DMA_RX_FRAME_infos->Seg_Count =0; } return p; }
  3. Подскажите исходя из чего нужно задавать константы #define TCPIP_MBOX_SIZE, #define DEFAULT_UDP_RECVMBOX_SIZE, #define DEFAULT_TCP_RECVMBOX_SIZE, #define DEFAULT_ACCEPTMBOX_SIZE ? Или где можно про них почиать. В ST'шном примерах последние три констаны определены как 2000 O_O. У вас кстати ETH_RXBUFNB сколько стоит, 5? У меня до установки SYS_LIGHTWEIGHT_PROT 1, более менее стабильно работало только с ETH_RXBUFNB=1. Сейчас пробую с SYS_LIGHTWEIGHT_PROT 1 и ETH_RXBUFNB 5, на плате одновременно запущен TCP сервер и TCP клиент, работает это все уже часов 7, пока ничто не отвалилось но потихоньку накапливается lwip_stats.sys.mbox.err.
  4. STM32F217 & LwIP 1.3.2

    Здесь решили проблемму переполнения буффера при отладке http://lists.gnu.org/archive/html/lwip-use...9/msg00053.html
×
×
  • Создать...