Перейти к содержанию
    

STM32F207+FreeRTOS+LwIP Как правильно закрыть соединение?

Девайс работает как сервер. После того как от 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.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

когда закрываю соединение из другого потока функцией netconn_close() то читающий поток остается висеть в netconn_recv пока не выйдет по таймауту. Есть какой-небудь "легальный" способ решить проблему?

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну в общем перед после закрытия соединения, перед его удалением добавил

netconn_close(ChildConn[index]);

sys_mbox_trypost(ChildConn[index]->recvmbox, NULL);

vTaskDelay(10);

netconn_delete(ChildConn[index]);

Работает, но как то нехорошо получается.

 

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

Не хотелось бы. Только в самом крайнем случае.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не хотелось бы. Только в самом крайнем случае.

 

Мне тоже не хотелось, но таков 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).

Еще одна ссылка

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

МИХО в этом случае лучше сразу использовать мультиплексный режим. По одному из виртуальных портов поднимаете GPRS соединение, по другому опрашиваете модем. По ссылке описание мультиплексного режима.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо =F8=

вроде не сильно сложно - попробую прикрутить, парвда модуль quectel m72, в это связи вопрос - на сколько эта технология стандарта..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо =F8=

вроде не сильно сложно - попробую прикрутить, парвда модуль quectel m72, в это связи вопрос - на сколько эта технология стандарта..

 

У quectel есть режим непрозрачного обмена через AT-команды

смотри описание команд AT+QISEND, AT+QINDI, AT+QIRD.

Изменено пользователем EugenyAM

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо =F8=

вроде не сильно сложно - попробую прикрутить, парвда модуль quectel m72, в это связи вопрос - на сколько эта технология стандарта..

Технология стандартна и не нова. Но насколько она прямо/криво поддерживается она quectel-ом не знаю. Спросите лучше на форуме по сотовой связи, там есть много людей которые с quectel-ом работали.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день, у меня вопрос немного не по теме но близко, как вы настроили 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В этой демке уже все настроено. Там ничего настраивать не нужно. Все и так нормально работает. Тут кое что обсуждалось http://electronix.ru/forum/index.php?showt...=98347&st=0

По FreeRTOS тут неплохо прописано http://www.kit-e.ru/articles/micro/2011_2_96.php

 

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

 

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();

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...