Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F4 + lwIP
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
TolikG
Отлаживаю модем для удлинения Ethernet соединения. Пропускная способность порта Ethernet 100 Мб/сек, пропускная способность модема 1 Мб/сек. Схема работает следующим образом: Ethernet фрейм попадает в драйвер lwIP, здесь я его перефатываю и отправляю в модем (вместо стека lwIP), на втором конце такой же модем принимает этот фрейм - кладу его в драйвер lwIP (как будто он пришел со стека lwIP) и дальше он попадает в порт Ethernet.
Для тестирования на обоих концах подключены компьютеры. Пинги проходят, файлы передаются. Запускаю на обоих компьютерах утилиту jperf, тестирую пропускную способность TCP соединения. Несколько секунд работает нормально (1 Мб/сек), затем скорость падает почти до нуля, через несколько секунд возникают небольшие увеличения пропускной способности (порядка 100 кБит/сек). Складывается впечатление, что отправляющий комп не получает вовремя подтверждения сегментов и делает паузы. После перезапуска всей схемы картина повторяется. Подскажите, в какую сторону копать?
Golikov A.
может буферы накрываются?
В LWIP есть медленный таймер который отвечает за очистку использованных буферов, может его почаще подергать?

у меня было с lwIP что он время от времени почему то замирал и начинались повторные пересылки пакетов, потом все восстанавливалось, причину этого не нашел, так как перешли на другой стек.
mantech
Цитата(Golikov A. @ Jul 1 2015, 07:35) *
у меня было с lwIP что он время от времени почему то замирал


Да, замечал у себя такое же поведение, пока не принципиально, работает в веб-морде, но буду признателен, если кто подскажет, где можно подшаманить laughing.gif
kolobok0
Цитата(TolikG @ Jul 1 2015, 07:24) *
.. Подскажите, в какую сторону копать?


Просмотрите обработчики по таймерам. Там не все состояния прописаны. Такое очучение было, что кто-то специально выкинул пару-тройку строк
из обработки состояния канала. Это правда наверное ближе к реплике Голикова...

По поводу заминки в переходнике - думаю надо ещё обрабатывать флаг быстрой передачи, в стэке TCP и возможно глянуть в сторону
SNMP как управляющего слоя соединения.
scifi
Цитата(TolikG @ Jul 1 2015, 07:24) *
Схема работает следующим образом: Ethernet фрейм попадает в драйвер lwIP, здесь я его перефатываю и отправляю в модем (вместо стека lwIP), на втором конце такой же модем принимает этот фрейм - кладу его в драйвер lwIP (как будто он пришел со стека lwIP) и дальше он попадает в порт Ethernet.

Что-то не пойму, зачем нужен lwip, если нужно всего лишь перебрасывать кадры Ethernet?
TolikG
Цитата(scifi @ Jul 1 2015, 09:36) *
Что-то не пойму, зачем нужен lwip, если нужно всего лишь перебрасывать кадры Ethernet?

Кроме переброски кадров там еще есть web-интерфейс для конфигурации модема
SasaVitebsk
Цитата(Golikov A. @ Jul 1 2015, 07:35) *
у меня было с lwIP что он время от времени почему то замирал и начинались повторные пересылки пакетов

У меня тоже было. Проблема была не в LwIP а в процедуре ethernetif_input куба. В последней версии всё подправили и проблема ушла.
До тех пор пока она существовала, я ввёл копирование ID пакета и мониторил его на приёмной стороне.
Quasar
Цитата(SasaVitebsk @ Jul 1 2015, 12:07) *
в процедуре ethernetif_input куба.


Да, тоже столкнулся с таким в свое время, вот такой там код был:
Код
void ethernetif_input( void const * argument )

{

  struct pbuf *p;
  struct netif *netif = (struct netif *) argument;

  for(;; )
  {
    if (osSemaphoreWait( s_xSemaphore, TIME_WAITING_FOR_INPUT)==osOK)
    {
      p = low_level_input( netif );
      if   (p != NULL)
      {
        if (netif->input( p, netif) != ERR_OK )
        {
          pbuf_free(p);
          p = NULL;
        }
      }
    }

  }
}


TolikG проверьте, есть у вас такое?
TolikG
У меня такой код:
Код
void ethernetif_input( void * pvParameters )
{
  struct pbuf *p;
  
  for(;; )
  {
    if (xSemaphoreTake( s_xSemaphore, emacBLOCK_TIME_WAITING_FOR_INPUT)==pdTRUE)
    {
TRY_GET_NEXT_FRAME:
      p = low_level_input( s_pxNetIf );
      if   (p != NULL)
      {
        if (ERR_OK != s_pxNetIf->input( p, s_pxNetIf))
        {
          pbuf_free(p);
        }
        else
        {
          goto TRY_GET_NEXT_FRAME;
        }
      }
    }
  }
}
TolikG
Прошу прощения за бездумное цитирование, форматирование - не умею вставлять в сообщения фрагменты кода - подскажите как это делать?
IgorKossak
Чтобы бездумно не цитировать предыдущее сообщение, достаточно нажать не Reply в сообщении, а AddReply внизу страницы. Или удалить в цитате всё ненужное, чтобы не раздувать тему.
Для оформления кода надо выделить этот код и нажать на иконку CODE (над текстовым полем) или CODEBOX (слева) в зависимости от длины кода.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.