|
STM32F207+FreeRTOS+LwIP Как правильно закрыть соединение? |
|
|
|
Dec 13 2011, 11:26
|
Знающий
   
Группа: Свой
Сообщений: 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.
|
|
|
|
|
 |
Ответов
(1 - 11)
|
Dec 13 2011, 11:34
|
Частый гость
 
Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687

|
Цитата(=F8= @ Dec 13 2011, 15:26)  когда закрываю соединение из другого потока функцией netconn_close() то читающий поток остается висеть в netconn_recv пока не выйдет по таймауту. Есть какой-небудь "легальный" способ решить проблему? Только один: загнать все в один поток, т.к. LwIP не позволяет работать с одним и тем же соединением из разных потоков.
|
|
|
|
|
Dec 13 2011, 12:53
|
Знающий
   
Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954

|
Ну в общем перед после закрытия соединения, перед его удалением добавил netconn_close(ChildConn[index]); sys_mbox_trypost(ChildConn[index]->recvmbox, NULL); vTaskDelay(10); netconn_delete(ChildConn[index]); Работает, но как то нехорошо получается. Цитата Только один: загнать все в один поток, т.к. LwIP не позволяет работать с одним и тем же соединением из разных потоков. Не хотелось бы. Только в самом крайнем случае.
|
|
|
|
|
Dec 13 2011, 13:11
|
Частый гость
 
Группа: Свой
Сообщений: 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). Еще одна ссылка
|
|
|
|
|
Dec 13 2011, 20:38
|
Знающий
   
Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954

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

Группа: Свой
Сообщений: 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
|
|
|
|
|
Jan 21 2012, 06:01
|
Группа: Новичок
Сообщений: 2
Регистрация: 21-01-12
Пользователь №: 69 771

|
Добрый день, у меня вопрос немного не по теме но близко, как вы настроили FREERTOS на STM32F207? я использую FreeRTOS_v6.1.0 который в комплекте к демо проектам к LwIP (STM32F2x7_ETH_LwIP_V1.1.0). Если можно ммогли бы скинуть конфиги ОС?
|
|
|
|
|
Jan 21 2012, 07:24
|
Знающий
   
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jan 22 2012, 06:18
|
Группа: Новичок
Сообщений: 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();
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|