|
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
|
|||||||||||
Организация работы FREERTOS и LWIP12.08.2020, 10:47. Показов 9478. Ответов 17
Имеется проект на stm32f746 в котором настроена FREERTOS и LWIP (TCP эхо сервер). LWIP и задачи FREERTOS (опрос АЦП, мигание светодиодами и тд) независимо друг от друга работают хорошо. Теперь возникла проблема в том, как организовать их совместную работу, например: принять по TCP пакет данных, обработать его, в зависимости от содержимого пакета забрать данные АЦП и отправить по TCP, помигать светодиодом, отправить данные по USART и тд, т.е. выполнить какое либо действие. Сейчас реализован эхо сервер, данные пришли, вывелись на дисплей и отправились обратно. Но я не знаю как сделать так, чтобы данные можно было вынести из функции соединения TCP обработать и, как уже писал выше, например передать по TCP данные АЦП.
Код реализации соединения TCP: Кликните здесь для просмотра всего текста
Кликните здесь для просмотра всего текста
0
|
|||||||||||
| 12.08.2020, 10:47 | |
|
Ответы с готовыми решениями:
17
FreeRTOS+LwIP на TE-STM32F207 LPC2368 + FreeRTOS + LwIP STM32 + ENC28J60 + LwIP + FreeRTOS |
|
76 / 52 / 26
Регистрация: 23.01.2019
Сообщений: 134
|
|||||||||||
| 13.08.2020, 15:16 | |||||||||||
|
Привет.
Используй очереди сообщений. Когда через tcp приходит очередная команда, то tcp_thread должен ее расшифровать, сформировать соответствующее сообщение и запихнуть его в очередь сообщений. Другой же поток должен постоянно мониторить очередь сообщений и, при появлений оных, выбирать их и выполнять команды. У вас в коде потока tcp_thread уже даже есть зачатки этого процесса
1
|
|||||||||||
|
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
|
|||||||||||||||||||||
| 14.08.2020, 06:57 [ТС] | |||||||||||||||||||||
|
yatrim, спасибо за ответ, тоже пытаюсь что-то с очередями сделать, но у меня пока возникают вопросы:
1) В чем различия создания очереди таким образом
ожидает приема данных recv_err = netconn_recv(newconn, &inbuf); Т.е. я принимаю данные, передаю их с помощью очереди в другой поток и вроде все нормально, но возникает вопрос как передать данные из потока в tcp_thread. Например работает АЦП по таймеру, и каждую секунду хочет отправлять по TCP измеренное значение, тут надо организовать какую-то проверку наличия соединения TCP? И в какую часть кода tcp_thread потом передать данные из очереди? Сейчас у меня получилось сделать только так, что данные с АЦП берутся и отправляются только если есть входящее сообщение TCP Добавлено через 11 минут 4) Еще такой вопрос, если я создаю очередь на один элемент: send_data = xQueueCreate(1, sizeof(uint16_t)); дальше отправляю данные из потока xQueueSend(send_data, &adcData, portMAX_DELAY);, а считываю эти данные xQueueReceive(send_data, &adcSendData, portMAX_DELAY); и xQueueReceive(send_data, &adcSendDataTCP, portMAX_DELAY); т.е. из двух разных потоков, так можно делать или при первом xQueueReceive помещенные в очередь данные удалятся?
0
|
|||||||||||||||||||||
|
76 / 52 / 26
Регистрация: 23.01.2019
Сообщений: 134
|
|
| 14.08.2020, 14:14 | |
|
1. Разница в том, что Mail Queue - это надстройка над Message Queue, в которой элементами очереди являются указатели на блоки памяти.
2. Да, если в функции xQueueReceive параметр таймаута установлен portMAX_DELAY, то функция вернет результат, только когда в очереди появиться очередной элемент. Насчет расположения в теле функции я не понял, что вы имели ввиду. Ничто не мешает вам расположить ее в любом месте. 3. Для отправки данных через TCP соединение лучше создать отдельный поток, который при появлении данных которые следует передать, проверял бы наличие соединения и передавал данные. 4. Функция xQueueReceive удаляет элемент из очереди, чтоб выбрать элемент и оставить его в очереди нужно вызывать функцию xQueuePeek
1
|
|
|
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
|
||||||||||||
| 14.08.2020, 14:30 [ТС] | ||||||||||||
|
yatrim,
1) Я правильно понимаю, что передавая массивы данных через очереди, лучше будет использовать Mail Queue? 2) Тут я имел ввиду следующую ситуацию: есть какая-либо функция мигания светодиодами
Кода это произойдет выполнится оставшийся код: мигание 2 и 3 светодиодами. Однако как сохранив такую же конструкцию кода сделать так, чтобы в цикле for мы мигали 1 светодиодом, потом 3м, а когда получим данные в очередь xQueueReceive, то вторым? Ну либо похожая ситуация, но в цикле будут находится две очереди:
3) С TCP пока только разбираюсь, может у Вас есть похожий код для реализации? 4) А используя xQueuePeek при поступлении новых данных они перезапишут те, что уже есть в очереди?
0
|
||||||||||||
|
76 / 52 / 26
Регистрация: 23.01.2019
Сообщений: 134
|
||||||
| 14.08.2020, 15:50 | ||||||
|
1. Да, именно для таких случаев Mail Queue и предназначена
2. В таком случае нужно использовать в функции xQueueReceive таймауты
1
|
||||||
|
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
|
|||||||||||||||||||||||||||
| 15.08.2020, 10:31 [ТС] | |||||||||||||||||||||||||||
|
yatrim, С очередями вроде разобрался, спасибо за помощь. Можете подсказать по потокам?
Кликните здесь для просмотра всего текста
Потоки для приема данных по двум TCP соединениям
Дальше просто пытаюсь передать пробный массив в созданном потоке но ничего не выходит
Приведу еще используемые структуры:
0
|
|||||||||||||||||||||||||||
|
76 / 52 / 26
Регистрация: 23.01.2019
Сообщений: 134
|
|||||||||||
| 15.08.2020, 14:30 | |||||||||||
|
Я бы создавал потоки уже после подключения клиента, то есть после netconn_accept
1
|
|||||||||||
|
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
|
|
| 16.08.2020, 17:27 [ТС] | |
|
yatrim, Спасибо, использовал предложенный Вами код, данные от МК (буфер send_TCP_buf[10] = {0,1,2,3,4,5,6,7,8,9}
, правда теперь появилась следующая проблема: соединение между ПК и МК устанавливается, однако МК данные не принимает, если смотреть Wireshark, то некоторые данные от ПК до МК доходят без ошибок, но МК их никак не обрабатывает (раньше выводил на дисплей, мигал светодиодами), некоторые данные идут с ошибками, так же МК не отвечает на сигнал об завершении соединения. Пока не нашел в чем может быть причина, буду благодарен если подбросите какие-либо идеиДобавлено через 14 минут Так же второе соединение не подключается, только первое
0
|
|
|
76 / 52 / 26
Регистрация: 23.01.2019
Сообщений: 134
|
|
| 16.08.2020, 18:11 | |
|
DmitryDDDD,
Покажи как сейчас у тебя выглядит поток приема данных по tcp
0
|
|
|
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
|
|
| 17.08.2020, 11:57 [ТС] | |
|
yatrim,
IP 192.168.1.195 - МК IP 192.168.1.125 - ПК 1 изображение - установление соединения от клиента (ПК) 2 - сообщение от МК к ПК (массив 0,1,2,3,4,5,6,7,8,9) 3 - сообщение от ПК к МК (Hi!!!) 4 - сообщение с ошибкой и некорректное завершение соединения от клиента
0
|
|
|
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
|
|
| 17.08.2020, 12:09 [ТС] | |
|
yatrim, Вот небольшая сессия с кодом до добавления потока передачи данных, т.е. тут идет передача только от ПК к МК
0
|
|
|
76 / 52 / 26
Регистрация: 23.01.2019
Сообщений: 134
|
|
| 17.08.2020, 18:53 | |
|
DmitryDDDD,
Извини, я походу неточно выразился. Я хотел попросить показать, как сейчас у тебя выглядит код программы Stm32, где обрабатывается прием данных по tcp.
0
|
|
|
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
|
||||||||||||||||
| 17.08.2020, 20:06 [ТС] | ||||||||||||||||
|
yatrim,
0
|
||||||||||||||||
|
76 / 52 / 26
Регистрация: 23.01.2019
Сообщений: 134
|
||||||
| 17.08.2020, 20:25 | ||||||
Сообщение было отмечено DmitryDDDD как решение
Решение
Тебе в потоке tcp_thread уже не нужно вызывать netconn_accept ведь подключение уже совершается в StartDefaultTask. Из-за этого получается, что поток зависает на netconn_accept до подключения следующего клиента.
1
|
||||||
|
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
|
|||||||||||||||||||||||||||
| 18.08.2020, 11:19 [ТС] | |||||||||||||||||||||||||||
|
yatrim, отлично, код заработал, правда если оставить так:
netconn_close(conn); и netconn_delete(conn); лучше оставить здесь или их можно перенести в задачу void StartDefaultTask(void const * argument) где создается соединение? В эту часть кода:
Добавлено через 15 минут yatrim, зачем эту часть кода помещать в цикл for(i = 0; i < 2; i ++)?
yatrim, еще сейчас обнаружил, что при попытке подключить второе соединение, оно не создается, пока не нашел в чем может быть проблема Добавлено через 12 минут yatrim, точнее оно создается, но данные идут с ошибками, соединение периодически обрывается, и данные не выводятся на дисплей как при первом соединении Добавлено через 1 час 17 минут yatrim, Сразу еще спрошу, пока пытаюсь разобраться в вопросе передачи из задачи в функцию static void tcp_thread_send(void *arg) АЦП в отдельной задаче раз с секунду оцифровывает входной сигнал
Пока попробовал настроить передачу через очередь osMail, мк зависает
0
|
|||||||||||||||||||||||||||
|
76 / 52 / 26
Регистрация: 23.01.2019
Сообщений: 134
|
|||||||||||
| 18.08.2020, 20:19 | |||||||||||
|
1. Логичнее чтоб подключение закрывал и открывал один и тот же поток.
И обрати внимание, что функция netconn_recv может вернуть ошибку не только при потере подключения, но и, например,по таймауту. Если в течение определенного интервала времени не поступит новых данных, то функция вернет ошибку ERR_TIMEOUT. Не факт, что в таком случае нужно закрывать соединение. 2. osDelay(1) добавлять не обязательно. 3. Цикл for(i = 0; i < 2; i ++) я сделал просто для примера двух подключений. Сначала ожидается первое подключение. Когда оно происходит, то для него запускаются потоки чтения и записи. Потом тоже делается для второго. На самом деле реальная логика должна быть сложнее и зависит от приложения. Например диспетчер должен следить за состоянием подключений, и если происходит разрыв, то давать возможность заново подключаться. 4. У тебя поле adc_str структуры struct_adc имеет целочисленный тип uint16_t
0
|
|||||||||||
|
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
|
||||||||
| 19.08.2020, 08:16 [ТС] | ||||||||
|
yatrim,
1)
4) Спасибо за подсказку, с типами данных в очередях пока проблема
0
|
||||||||
| 19.08.2020, 08:16 | |
|
Помогаю со студенческими работами здесь
18
LwIP + NXP + freeRtos трабл stm32f2 ethernet lwip freeRtos stm32f107vc + ethernet + freertos + IAR + lwIP STM32F4+PHY+FREERTOS+LWIP+UDP скорость Одновременная работа LWIP и USB HS FreeRTOS STM32F407 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|