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

 
 
 
Reply to this topicStart new topic
> STM32F207+FreeRTOS+LwIP Как правильно закрыть соединение?
=F8=
сообщение Dec 13 2011, 11:26
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954



Девайс работает как сервер. После того как от netconn_accept будет получено новое соединение создаю 2 потока один для чтения, другой для записи. Читаю вот так:
Код
void СE2ComRead::СThread()
{
    struct netbuf *buf;
    while((!TerminateFlag)&&((buf = netconn_recv(Conn)) != NULL))
    {
        do{
            char *p_data;
            u16_t len;

            if(netbuf_data(buf, (void**)&p_data, &len) == ERR_OK)
            {
                if(pPort->Write(p_data, len, 2000) != len)
                {
                    TerminateFlag = 1;
                }
                if(TerminateFlag)break;
            }
        }while(netbuf_next(buf) >= 0);
        netbuf_delete(buf);
    }
}

Столкнулся с такой проблемой когда закрываю соединение из другого потока функцией netconn_close() то читающий поток остается висеть в netconn_recv пока не выйдет по таймауту. Есть какой-небудь "легальный" способ решить проблему? А то пока приходит в голову только вариант вручную отправить сообщение в очередь conn->recvmbox.
Go to the top of the page
 
+Quote Post
gladov
сообщение Dec 13 2011, 11:34
Сообщение #2


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

Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687



Цитата(=F8= @ Dec 13 2011, 15:26) *
когда закрываю соединение из другого потока функцией netconn_close() то читающий поток остается висеть в netconn_recv пока не выйдет по таймауту. Есть какой-небудь "легальный" способ решить проблему?


Только один: загнать все в один поток, т.к. LwIP не позволяет работать с одним и тем же соединением из разных потоков.
Go to the top of the page
 
+Quote Post
=F8=
сообщение Dec 13 2011, 12:53
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954



Ну в общем перед после закрытия соединения, перед его удалением добавил
netconn_close(ChildConn[index]);
sys_mbox_trypost(ChildConn[index]->recvmbox, NULL);
vTaskDelay(10);
netconn_delete(ChildConn[index]);
Работает, но как то нехорошо получается.

Цитата
Только один: загнать все в один поток, т.к. LwIP не позволяет работать с одним и тем же соединением из разных потоков.

Не хотелось бы. Только в самом крайнем случае.
Go to the top of the page
 
+Quote Post
gladov
сообщение Dec 13 2011, 13:11
Сообщение #4


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

Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687



Цитата(=F8= @ Dec 13 2011, 16:53) *
Не хотелось бы. Только в самом крайнем случае.


Мне тоже не хотелось, но таков LwIP. Цитата с LwIP wiki:
Цитата
Sockets generally can't be used by more than one application thread (on udp/raw netconn, do a sendto/recv is currently possible).

Еще одна ссылка
Go to the top of the page
 
+Quote Post
kan35
сообщение Dec 13 2011, 18:24
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Тоже самое... Сперва разделил на 2 потока, но пришлось все в 1 поток... иного пути нет к сожалению.

У меня сопутствующий вопрос: как остановить корректно стек (ppp и tcp), чтобы перевести модем в AT режим и потом вернуть его назад в режим данных без сбоев соединения? ведь в любое время могут как минимум прийти пакет из модема, и если в это время сделать +++ - то произвойдет неладное, или напримр стек шлет повторные пакеты (при ненадежном соединении), а снаружи можем выглядит незанятым....
Go to the top of the page
 
+Quote Post
=F8=
сообщение Dec 13 2011, 20:38
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954



Цитата(kan35 @ Dec 13 2011, 21:24) *
Тоже самое... Сперва разделил на 2 потока, но пришлось все в 1 поток... иного пути нет к сожалению.

У меня сопутствующий вопрос: как остановить корректно стек (ppp и tcp), чтобы перевести модем в AT режим и потом вернуть его назад в режим данных без сбоев соединения? ведь в любое время могут как минимум прийти пакет из модема, и если в это время сделать +++ - то произвойдет неладное, или напримр стек шлет повторные пакеты (при ненадежном соединении), а снаружи можем выглядит незанятым....

МИХО в этом случае лучше сразу использовать мультиплексный режим. По одному из виртуальных портов поднимаете GPRS соединение, по другому опрашиваете модем. По ссылке описание мультиплексного режима.
Go to the top of the page
 
+Quote Post
kan35
сообщение Dec 15 2011, 16:41
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Спасибо =F8=
вроде не сильно сложно - попробую прикрутить, парвда модуль quectel m72, в это связи вопрос - на сколько эта технология стандарта..
Go to the top of the page
 
+Quote Post
EugenyAM
сообщение Dec 16 2011, 03:46
Сообщение #8


Участник
*

Группа: Свой
Сообщений: 73
Регистрация: 14-10-08
Из: Omsk
Пользователь №: 40 929



Цитата(kan35 @ Dec 15 2011, 23:41) *
Спасибо =F8=
вроде не сильно сложно - попробую прикрутить, парвда модуль quectel m72, в это связи вопрос - на сколько эта технология стандарта..


У quectel есть режим непрозрачного обмена через AT-команды
смотри описание команд AT+QISEND, AT+QINDI, AT+QIRD.

Сообщение отредактировал EugenyAM - Dec 16 2011, 03:50
Go to the top of the page
 
+Quote Post
=F8=
сообщение Dec 16 2011, 11:13
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954



Цитата(kan35 @ Dec 15 2011, 20:41) *
Спасибо =F8=
вроде не сильно сложно - попробую прикрутить, парвда модуль quectel m72, в это связи вопрос - на сколько эта технология стандарта..

Технология стандартна и не нова. Но насколько она прямо/криво поддерживается она quectel-ом не знаю. Спросите лучше на форуме по сотовой связи, там есть много людей которые с quectel-ом работали.
Go to the top of the page
 
+Quote Post
bioniwulf
сообщение Jan 21 2012, 06:01
Сообщение #10





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



Добрый день, у меня вопрос немного не по теме но близко, как вы настроили FREERTOS на STM32F207? я использую FreeRTOS_v6.1.0 который в комплекте к демо проектам к LwIP (STM32F2x7_ETH_LwIP_V1.1.0). Если можно ммогли бы скинуть конфиги ОС?
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Jan 21 2012, 07:24
Сообщение #11


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Цитата(bioniwulf @ Jan 21 2012, 09:01) *
Добрый день, у меня вопрос немного не по теме но близко, как вы настроили FREERTOS на STM32F207? я использую FreeRTOS_v6.1.0 который в комплекте к демо проектам к LwIP (STM32F2x7_ETH_LwIP_V1.1.0). Если можно ммогли бы скинуть конфиги ОС?

В этой демке уже все настроено. Там ничего настраивать не нужно. Все и так нормально работает. Тут кое что обсуждалось http://electronix.ru/forum/index.php?showt...=98347&st=0
По FreeRTOS тут неплохо прописано http://www.kit-e.ru/articles/micro/2011_2_96.php
Go to the top of the page
 
+Quote Post
bioniwulf
сообщение Jan 22 2012, 06:18
Сообщение #12





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



Цитата(Acvarif @ Jan 21 2012, 10:24) *
В этой демке уже все настроено. Там ничего настраивать не нужно. Все и так нормально работает. Тут кое что обсуждалось http://electronix.ru/forum/index.php?showt...=98347&st=0
По FreeRTOS тут неплохо прописано http://www.kit-e.ru/articles/micro/2011_2_96.php


Странно, ничего не получается, даже просто мигание лампочкой не работает, она инициализируется, загорается и всё, больше ничего не происходит:

CODE

void ToggleLed4(void * pvParameters)
{
while(1)
{
STM_EVAL_LEDToggle(LED4);
vTaskDelay(500);
}
}
LCD_LED_Init();
xTaskCreate(ToggleLed4, "LED4", configMINIMAL_STACK_SIZE, NULL, LED_TASK_PRIO, NULL);

vTaskStartScheduler();
Go to the top of the page
 
+Quote Post

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

 


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


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