Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F207+FreeRTOS+LwIP Как правильно закрыть соединение?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
=F8=
Девайс работает как сервер. После того как от 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.
gladov
Цитата(=F8= @ Dec 13 2011, 15:26) *
когда закрываю соединение из другого потока функцией netconn_close() то читающий поток остается висеть в netconn_recv пока не выйдет по таймауту. Есть какой-небудь "легальный" способ решить проблему?


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

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

Не хотелось бы. Только в самом крайнем случае.
gladov
Цитата(=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).

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

У меня сопутствующий вопрос: как остановить корректно стек (ppp и tcp), чтобы перевести модем в AT режим и потом вернуть его назад в режим данных без сбоев соединения? ведь в любое время могут как минимум прийти пакет из модема, и если в это время сделать +++ - то произвойдет неладное, или напримр стек шлет повторные пакеты (при ненадежном соединении), а снаружи можем выглядит незанятым....
=F8=
Цитата(kan35 @ Dec 13 2011, 21:24) *
Тоже самое... Сперва разделил на 2 потока, но пришлось все в 1 поток... иного пути нет к сожалению.

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

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


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

Технология стандартна и не нова. Но насколько она прямо/криво поддерживается она quectel-ом не знаю. Спросите лучше на форуме по сотовой связи, там есть много людей которые с quectel-ом работали.
bioniwulf
Добрый день, у меня вопрос немного не по теме но близко, как вы настроили FREERTOS на STM32F207? я использую FreeRTOS_v6.1.0 который в комплекте к демо проектам к LwIP (STM32F2x7_ETH_LwIP_V1.1.0). Если можно ммогли бы скинуть конфиги ОС?
Acvarif
Цитата(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
bioniwulf
Цитата(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();
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.