Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511

TCP сервер LWIP stm32f746

21.10.2020, 12:25. Показов 5176. Ответов 23

Студворк — интернет-сервис помощи студентам
Настроил TCP сервер на плате stm32f746 discovery при помощи FREERTOS и LWIP (использую CubeMX). Дальше измеряю скорость передачи данных от ПК к МК, использую передачу одного и того же массива данных в цикле определенное колличесво раз (сеть локальная, просто провод 10 м от МК к ПК).
А именно массив в 1 кбайт передаю 12800 раз (итого передается 100 МБит)
C
1
uint8_t TcpSendBuffer[1024];
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
            for (n = 0; n < 16; n++)
            {
            HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_SET);
                HAL_TIM_OC_Start_IT(&htim4, TIM_CHANNEL_4);
                for (i = 0; i < 800; i++)
                {
                    netconn_write(conn, TcpSendBuffer, 1024, NETCONN_COPY);
                }
                HAL_TIM_OC_Stop_IT(&htim4, TIM_CHANNEL_4);
                HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_RESET);
                TcpTime = TcpTime + CountTime;
                CountTime = 0;
                osDelay(100);
            }
Разбил передачу на два цикла 16 и 800, чтобы добавить задержку в передаче 100 мсек, т.к. иначе терминальная программа подтормаживала.
Дальше замеряю таймером время передачи всех этих данных в преывании увеличивая счетчик
C
1
2
3
4
5
6
7
8
9
10
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM4)
    {
        if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_4)
        {
            CountTime++;
        }
    }
}
Таймер настроен на срабатывание раз в 1 мсек.
В среднем время, за которое передается все 100 Мбит данных равняется 55 сек, что уже достаточно много, так как PHY позволяет работу на 100 Мбит/сек, а тут получается около 3-4 Мбит/сек.
Но еще есть такой момент: из кода выше видно, что массив передается 16 раз по 800 раз (итого 12800 раз), если замерять логическим анализатором время передачи каждой порции из 800 массивов, то они будут существенно различаться. Т.е. эти 800 массивов могут передаться за 1.5 секунды, следующие 800 уже за 5 секунд и тд. Помимо передачи по TCP программа почти ничего не выполняет, мигает светодиодом раз в секунду в отдельной задаче. Почему наблюдается такое сильное различие ов времени передачи при абсолютно одинаковых условиях работы кода? От каких настроек зависит скорость работы LWIP?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.10.2020, 12:25
Ответы с готовыми решениями:

LWIP TCP сервер ошибки соединения
Уже довольно долго не могу найти причину ошибок соединения TCP сервера с клиентом. Сервер - stm32f746. Клиент - ПК. PHY - LAN8742a ...

Передача данных по Ethernet TCP LWIP
На плате stm32f746 discovery реализован TCP эхо сервер, хочу переделать его под передачу данных с АЦП. Код реализации соединения сокета: ...

LWIP TCP RAW API server
Решил настроить на stm32f746 discovery LWIP TCP RAW сервер, но никак не могу это реализовать. Есть настроенный TCP netconn на FreeRTOS, но...

23
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
24.10.2020, 10:25  [ТС]
Студворк — интернет-сервис помощи студентам
locm, Нашел где включить оптимизацию в STM32Cude IDE
Почитал про оптимизацию
https://wiki.gentoo.org/wiki/GCC_optimization/ru
https://www.drive2.ru/b/532287598853358311/
Но какой бы уровень оптимизации не выбрал, время передачи все равно примерно одинаковое.
Вот время, за которое передается 100 МБит в миллисекундах, при оптимизации O0, O1, O2, Ofast
26081
24568
26809
26843
28849
31029
26045
29345
30867
26537
26536
27021
31312
31086
28921
Имеем те же 3 Мбит/сек
Ну как вариант, большую часть измеренного времени уходит не на передачу, а на обработку функций LWIP и FreeRTOS, поэтому какие-либо изменения не заметны.
Цитата Сообщение от locm Посмотреть сообщение
Чтобы достичь скорости передачи 100 МБит/с нужно чтобы при частоте 200 МГц отправка каждого байта требовала не больше 16 тактов (это с учетом всего фонового кода типа прерываний, ОС и т. д.)
А как-нибудь можно посмотреть сколько тактов сейчас занимает отправка одного байта?
Миниатюры
TCP сервер LWIP stm32f746   TCP сервер LWIP stm32f746  
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
24.10.2020, 14:25
DmitryDDDD, заведи счетчик тактов типа DWT. Узнай такт до функции отправки и во второй точке где данные выгружаются в DMA модуля Ethernet внутри LWIP. Найди разницу в тактах, узнаешь сколько времени тратится на обработку.
0
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
26.10.2020, 14:52  [ТС]
_SayHello, locm, Спасибо за совет, подключи DWT счетчик, но для начала измери время передачи 100 кБайт данных 16 раз
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
            for (n = 0; n < 16; n++)
            {
                // DWT counter START
                CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
                DWT->LAR = 0xC5ACCE55;
                DWT->CYCCNT = 0;
                DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
 
                for (i = 0; i < 100; i++)
                {
                    netconn_write(conn, TcpSendBuffer, 1024, NETCONN_NOCOPY);
                }
 
                // DWT counter result
                count_tic = DWT_CYCCNT;
                snprintf(str_DWT, 18, "Takt %lu\r\n", count_tic);
                HAL_UART_Transmit(&huart1, (uint8_t*)str_DWT, strlen(str_DWT), 1000);
            }
Замеряю эту часть кода, получаю такие данные:
Takt 12449006
Takt 18952682
Takt 32974479
Takt 54536577
Takt 31351780
Takt 56832385
Takt 58247099
Takt 36650756
Takt 53156139
Takt 35063716
Takt 52047291
Takt 63575872
Takt 44820579
Takt 69919346
Takt 31370231
Takt 68210624
Частота работы МК 200 МГц, т.е. чтобы перевести колличесво тиков в миллисекунды необходимо разделить на 200 000
Но опять же, получается, что одна и та же функция выполняемая множество раз, каждый раз выполняется различное время, которое существенно различается
Цитата Сообщение от _SayHello Посмотреть сообщение
Узнай такт до функции отправки и во второй точке где данные выгружаются в DMA модуля Ethernet внутри LWIP. Найди разницу в тактах, узнаешь сколько времени тратится на обработку.
Попробую еще сделать как Вы посоветовали
0
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
27.10.2020, 12:43  [ТС]
locm, _SayHello, Не получилось пока найти место, где данные передаются в DMA, но замерил выполнение функции
C
1
netconn_write(conn, TcpSendBuffer, 1024, NETCONN_NOCOPY);
Оно составляет оставляет примерно 19000 тактов, но это передача 1 кБ, Вы писали, что передача одного байта должна быть меньше 16 тактов для сокрости 100 МБит/сек, т.е. передача 1кБ тогда должна составлять 16*1024 = 16384. У меня получается почти 20000 на 1кБ, т.е. около 20 тактов на 1 байт.
Если смотреть по тикам, то передача 1 кБ 10 раз выглядит так
Takt 19706
Takt 19058
Takt 18959
Takt 32113
Takt 19736
Takt 18944
Takt 19016
Takt 18933
Takt 19031
Takt 19740
Count 1 (в млсек)
Т.е. чуть больше чем за 1 мс передачется 10 кБ
Получается, что если при 16 тиках на байт мы имеем 100 МБит/сек, то при 20 должно быть порядка 80 Мбит/сек
Но по таймеру, если передавать 100 Мбит данных, они все равно передаются за 30 сек. Не сходится, может у меня ошибка в рассуждениях?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.10.2020, 12:43

Можно ли на netconn api LwIP сделать сервер с несколькими подключениями на один порт
Добрый вечер, целый день сегодня потратил в поисках решения такой задачи На один порт может конектится несколько клиентов, которые...

TCP сервер stm32
Здравствуйте, пытаюсь организовать TCP сервер на stm32, уже перечитал кучу информации, поискал примеры, но ничего подходящего пока не...

Stm32f746-disco b-02 и b-04
Есть несколько плат stm32f746-disco board b-02 , работают отлично, Получаю board b-04, и получаю тупеж платы -04 раз так в сто! на том же...

STM32F746, sim800l, воспроизведение аудио
День добрый. Нужно сделать голосове меню. Для начала хочу опробовать на отладочном комплекте STM32F746Dyscovery + GSM модуль SIM800....

STM32F746 LCD лишние точки
Доброго всем здравия. Изготовил плату для собственного проекта по аналогии с отладочным комплектом STM32F746Dyscovery. LCD и SDROM...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru