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

 
 
> 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
Ответов
DeNi
сообщение Oct 28 2017, 09:07
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 18-10-06
Из: Москва
Пользователь №: 21 459



Можно включить в LWIP таймауты, тогда из функции netconn_recv будет выходить через указанное время, даже если ничего не принято.
#define LWIP_SO_RCVTIMEO 1 // accept, receive
#define LWIP_SO_SNDTIMEO 1 // send

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

И насколько помню в lwip/port/sys_arch.c ожидание из очереди без таймаута там зачем-то обернуто в цикл,
хотя документация на FreeRTOS говорить что вызов xQueueReceive с portMAX_DELAY бесконечный.
Так что если не убрать цикл, задача опять заблокируется.

И есть вариант вообще без надобности не блокировать задачу вызовом netconn_recv,
для этого при создании соединение использовать netconn_new_with_proto_and_callback и назначить callback,
в котором допустим взводить семафор. Сколько раз был вызван callback c NETCONN_EVT_RCVPLUS, столько раз
и надо вызвать netconn_recv. Посмотрите как в LWIP реализованы сокеты, там аналогично сделано.
Go to the top of the page
 
+Quote Post
Dmitrich
сообщение Oct 28 2017, 10:15
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 15-02-05
Пользователь №: 2 663



А можно, и я свой вопросик втисну?
Первый раз пытаюсь использовать Lwip, вот какую проблемку пытаюсь решить:

Попробовал пример с эхо - всё хорошо работает:
Код
                while (1)
                {
                    accept_err = netconn_accept(conn, &newconn);
                    if (accept_err == ERR_OK)
                    {
                        while ((netconn_recv(newconn, &buf)) == ERR_OK)
                        {
                            do
                            {
                                netbuf_data(buf, &data, &len);
                                netconn_write(newconn, data, len, NETCONN_COPY);
                            } while (netbuf_next(buf) >= 0);
                            netbuf_delete(buf);
                        }
                        netconn_close(newconn);
                        netconn_delete(newconn);
                    }
                }

( этот цикл крутится в отдельной задаче FreeRTOS)

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

Как это можно сделать?

С уважением, Ефанов Сергей
Go to the top of the page
 
+Quote Post



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

 


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


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