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

STM32 LWIP UDP пропадания пакетов

Добрый день!

Не могу до конца разобраться с проблемой. Прошу подсказки.

STM32F767 LWIP RAW UDP

Две одинаковые платы обмениваются пакетами UDP. Раз в 1мс посылается 5 пакетов по 272 байта. Пакеты отправляются пачкой, практически друг за другом с задержкой где то 15-20 мкс, затем пауза.

В итоге периодически на приеме происходят пропадания пакетов. Сначала все принимается (минуту-две), затем несколько секунд могут происходить пропадания, затем все опять принимается исправно и т.д.

При этом:

1. Пропадают исключительно пакеты отправляемые из пачки пятыми, очень редко четвертыми. Пакеты с 1го по 3-й не теряются совсем.

2. Пропадания возникают только если на данной плате производится передача UDP. Если на плате отключить передачу UDP пакетов, то на приеме ошибки исчезают.

3. Выяснено, что пропадания совпадают с моментами, когда в функции low_level_input программа попадает в условие, что дескриптор принадлежит хосту и не может быть получен DMA.

/* When Rx Buffer unavailable flag is set: clear it and resume reception */
  if ((heth.Instance->DMASR & ETH_DMASR_RBUS) != (uint32_t)RESET)
  {
    /* Clear RBUS ETHERNET DMA flag */
    heth.Instance->DMASR = ETH_DMASR_RBUS;
    /* Resume DMA reception */
    heth.Instance->DMARPDR = 0;
    
    test_counter++;
  }

В какой то момент test_counter начинает активно расти и в это же время начинают пропадать пакеты. Затем пропадания прекращаются и test_counter также перестает расти. Значение test_counter значительно больше чем количество пропаданий.

Не могу понять куда дальше смотреть, почему теряются только последние пакеты из пачки и как это связано с передачей.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

48 минут назад, Dec_NN сказал:

3. Выяснено, что пропадания совпадают с моментами, когда в функции low_level_input программа попадает в условие, что дескриптор принадлежит хосту и не может быть получен DMA.

Значит - ваша программа не успевает вычитывать входящие Ethernet-кадры из приёмного FIFO.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, jcxz said:

Значит - ваша программа не успевает вычитывать входящие Ethernet-кадры из приёмного FIFO.

Да вроде должна успевать. Проверка на входящие пакеты производится каждые 30 мкс. Делал чаще, ничего не меняется. В чем то здесь в другом проблема. 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А дескрипторов приемных сколько? Помимо целевых пакетов могут ведь и левые прилетать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, Dec_NN сказал:

Да вроде должна успевать. Проверка на входящие пакеты производится каждые 30 мкс. Делал чаще, ничего не меняется. В чем то здесь в другом проблема.

Ну вообще-то надо делать не "чаще", а по событию добавления пакета очередь.

И затык у вас может быть не из-за того, что редко проверяете, а из-за того что предыдущий пакет долго обрабатываете. Или из-за того, что какой-то другой, более приоритетный процесс, время забирает. И очередь успевает переполниться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

Quote

А дескрипторов приемных сколько? Помимо целевых пакетов могут ведь и левые прилетать.

 

Вы имеете ввиду PBUF_POOL_SIZE?

Сейчас PBUF_POOL_SIZE = 16, PBUF_POOL_BUFSIZE = 1200 байт

Делал и больше, никакого влияния не оказывает. Платы соединены напрямую, так что других пакетов там нет, кроме ARP запросов ответов.

Если рассуждать логически, т.к. теряется последний пакет в пачке, то значит он куда то не влезает. Но места куда влезть более чем достаточно. Ну и непонятно как влияет наличие передачи по UDP. Приемные и передающие буфера ведь должны быть разделены и никак не пересекаться.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 minutes ago, Dec_NN said:

Вы имеете ввиду PBUF_POOL_SIZE?

Я имею в виду тот пул дескрипторов, который используется MAC'ом. Мне неизвестно, связан ли он в вашем коде напрямую с pbuf.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 minutes ago, jcxz said:

Ну вообще-то надо делать не "чаще", а по событию добавления пакета очередь.

Т.е. по установке бита RS в статусном регистре DMA? Попробую сейчас, но вроде я уже это проверял.

Посмотрел сейчас регистр настройки DMA, в нем бит RSF=0, т.е. включен режим cut-through mode. Может в этом проблема.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 минут назад, Dec_NN сказал:

Т.е. по установке бита RS в статусном регистре DMA? Попробую сейчас, но вроде я уже это проверял.

Не знаю как там этот флаг в вашем МК называется. Но общий алгоритм такой: взводится флаг "заполнен очередной кадр в RX-FIFO" или флаг "завершена передача очередного кадра из TX-FIFO". По этому событию вызывается ISR. В этом ISR объект синхронизации ОС переводится в состояние "signalled" (объект, на котором ожидает задача Ethernet-/TCP-стека). Задача работает до исчерпания данных в очередях передачи/приёма. По исчерпании - опять ожидание на объекте синхронизации.

Это называется "event-driven" работа (событийно-ориентированная архитектура (Event-driven architecture)).

И никаких поллингов. Хоть 30мкс хоть сколько.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, aaarrr said:

Я имею в виду тот пул дескрипторов, который используется MAC'ом. Мне неизвестно, связан ли он в вашем коде напрямую с pbuf.

Не понимаю как это выяснить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, Dec_NN сказал:

Не понимаю как это выяснить.

Нанять специалиста-программиста?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...