реклама на сайте
подробности

 
 
> Lwip: netconn TCP app
k000858
сообщение Oct 27 2017, 06:09
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



В проекте используется LwIP + FreeRTOS. Поднят TCP сервер на Netconn API.
Необходимо данные из входящего соединения отправлять в последовательный порт, и в обратную сторону.
Проблема в том, что реализация TCP соединения подразумевает блокирующую функцию обработки принятых данных

Код
            while (netconn_recv(ntcnn232->newc, &buf) == ERR_OK)
            {


То есть пока не принял данные по TCP не могу отправить принятые данные по последовательному порту.

Как быть в этой ситуации?

Пока реализовано так: 2 задачи ОС:
1) сидит в блокирующей функции и отправляет принимаемые данные в последовательный порт
2) отправляет данные, принимаемые по последовательному порту, в TCP

Но это создает кучу проблем, например работа этих задач может "сломать" соединение.

Есть альтернативы как это можно реализовать?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
vadon
сообщение Oct 31 2017, 09:08
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 97
Регистрация: 27-07-10
Из: харьков
Пользователь №: 58 632



Цитата
Если во время выполнения функции netconn_recv выполнится netconn_write в параллельной задаче, соединение ломается.


Все должно работать, у меня работает, что то у вас или настроено не так или что не то с файлом sys_arch.c.

Цитата
Если надо прервать ожидание netconn_recv из другой задачи, во FreeRTOS можно включить опцию
#define INCLUDE_xTaskAbortDelay 1
и вызовом xTaskAbortDelay(hTask) разблокировать задачу.


Это самый глупый совет никогда так не делайте !!!!, в лучшем случае получите утечку памяти, так как ресурсы занятые стеком никто не освободит, в худшем вылет или зависание стека.

Если нужно не зависать в netconn_recv:

Настроить и включить для соединения TCP_KEEEP_ALIVE это основное.

Далее в зависимости от преследуемых целей можно использовать 2 варианта.

1) Установить таймаут на прием и соответсвенно его обрабатывать.
2) Если нужно выйти по команде с другой задачи нужно воспользоваться функцией netconn_shutdown, с параметром закрытия RX, после этой команды цикл netconn_recv прервется с ошибкой ERR_CLS, но соединение по прежнему будет активно только на передачу, этой же командой можно прервать и передачу, если этой функции поставить rx = 1 и tx = 1 она закроет соединение как команда netconn_close.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th July 2025 - 11:01
Рейтинг@Mail.ru


Страница сгенерированна за 0.66847 секунд с 7
ELECTRONIX ©2004-2016