Dec_NN 0 28 февраля, 2022 Опубликовано 28 февраля, 2022 · Жалоба Добрый день! Не могу до конца разобраться с проблемой. Прошу подсказки. 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 значительно больше чем количество пропаданий. Не могу понять куда дальше смотреть, почему теряются только последние пакеты из пачки и как это связано с передачей. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 28 февраля, 2022 Опубликовано 28 февраля, 2022 · Жалоба 48 минут назад, Dec_NN сказал: 3. Выяснено, что пропадания совпадают с моментами, когда в функции low_level_input программа попадает в условие, что дескриптор принадлежит хосту и не может быть получен DMA. Значит - ваша программа не успевает вычитывать входящие Ethernet-кадры из приёмного FIFO. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dec_NN 0 28 февраля, 2022 Опубликовано 28 февраля, 2022 · Жалоба 2 hours ago, jcxz said: Значит - ваша программа не успевает вычитывать входящие Ethernet-кадры из приёмного FIFO. Да вроде должна успевать. Проверка на входящие пакеты производится каждые 30 мкс. Делал чаще, ничего не меняется. В чем то здесь в другом проблема. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 28 февраля, 2022 Опубликовано 28 февраля, 2022 · Жалоба А дескрипторов приемных сколько? Помимо целевых пакетов могут ведь и левые прилетать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 28 февраля, 2022 Опубликовано 28 февраля, 2022 · Жалоба 2 часа назад, Dec_NN сказал: Да вроде должна успевать. Проверка на входящие пакеты производится каждые 30 мкс. Делал чаще, ничего не меняется. В чем то здесь в другом проблема. Ну вообще-то надо делать не "чаще", а по событию добавления пакета очередь. И затык у вас может быть не из-за того, что редко проверяете, а из-за того что предыдущий пакет долго обрабатываете. Или из-за того, что какой-то другой, более приоритетный процесс, время забирает. И очередь успевает переполниться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dec_NN 0 28 февраля, 2022 Опубликовано 28 февраля, 2022 · Жалоба Quote А дескрипторов приемных сколько? Помимо целевых пакетов могут ведь и левые прилетать. Вы имеете ввиду PBUF_POOL_SIZE? Сейчас PBUF_POOL_SIZE = 16, PBUF_POOL_BUFSIZE = 1200 байт Делал и больше, никакого влияния не оказывает. Платы соединены напрямую, так что других пакетов там нет, кроме ARP запросов ответов. Если рассуждать логически, т.к. теряется последний пакет в пачке, то значит он куда то не влезает. Но места куда влезть более чем достаточно. Ну и непонятно как влияет наличие передачи по UDP. Приемные и передающие буфера ведь должны быть разделены и никак не пересекаться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 28 февраля, 2022 Опубликовано 28 февраля, 2022 · Жалоба 7 minutes ago, Dec_NN said: Вы имеете ввиду PBUF_POOL_SIZE? Я имею в виду тот пул дескрипторов, который используется MAC'ом. Мне неизвестно, связан ли он в вашем коде напрямую с pbuf. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dec_NN 0 28 февраля, 2022 Опубликовано 28 февраля, 2022 · Жалоба 6 minutes ago, jcxz said: Ну вообще-то надо делать не "чаще", а по событию добавления пакета очередь. Т.е. по установке бита RS в статусном регистре DMA? Попробую сейчас, но вроде я уже это проверял. Посмотрел сейчас регистр настройки DMA, в нем бит RSF=0, т.е. включен режим cut-through mode. Может в этом проблема. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 28 февраля, 2022 Опубликовано 28 февраля, 2022 · Жалоба 14 минут назад, Dec_NN сказал: Т.е. по установке бита RS в статусном регистре DMA? Попробую сейчас, но вроде я уже это проверял. Не знаю как там этот флаг в вашем МК называется. Но общий алгоритм такой: взводится флаг "заполнен очередной кадр в RX-FIFO" или флаг "завершена передача очередного кадра из TX-FIFO". По этому событию вызывается ISR. В этом ISR объект синхронизации ОС переводится в состояние "signalled" (объект, на котором ожидает задача Ethernet-/TCP-стека). Задача работает до исчерпания данных в очередях передачи/приёма. По исчерпании - опять ожидание на объекте синхронизации. Это называется "event-driven" работа (событийно-ориентированная архитектура (Event-driven architecture)). И никаких поллингов. Хоть 30мкс хоть сколько. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dec_NN 0 28 февраля, 2022 Опубликовано 28 февраля, 2022 · Жалоба 1 hour ago, aaarrr said: Я имею в виду тот пул дескрипторов, который используется MAC'ом. Мне неизвестно, связан ли он в вашем коде напрямую с pbuf. Не понимаю как это выяснить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 28 февраля, 2022 Опубликовано 28 февраля, 2022 · Жалоба 11 minutes ago, Dec_NN said: Не понимаю как это выяснить. Код изучить, как же еще? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 35 28 февраля, 2022 Опубликовано 28 февраля, 2022 · Жалоба 2 hours ago, aaarrr said: Код изучить, как же еще? Хрустальный шар Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 28 февраля, 2022 Опубликовано 28 февраля, 2022 · Жалоба 3 часа назад, Dec_NN сказал: Не понимаю как это выяснить. Нанять специалиста-программиста? 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться