|
|
  |
LwIP стек в STM32F217 |
|
|
|
Jan 19 2012, 13:04
|
Знающий
   
Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954

|
Посмотрел код..... 1 Вы обявляете локальную переменную char text1[SIZE]; размером в 255 байт, при этом размер стека у потока configMINIMAL_STACK_SIZE 128 * 4 = 512 байт. т.е. одна локальная переменная съедает мол стека. Оставшихся 64 слов хватает едава едава. Отсюда и зависания при вызове printf и невозможность увеличить SIZE. 2 разберитесь с назначением функций netbuf_alloc и netbuf_ref. А то у вас пулучается что сначала вы с помощью data1 = netbuf_alloc(buf1, sizeof(text1)); создаете новый буфер в buf1, затем с помощью netbuf_ref(buf1, text1, sizeof(text1)); прикрепляете к buf1 буффер text1. Что при этом происходит с предварительно выделеным буфером - х.з. ниже привел исправленный код, у меня с ним, правда с MII интерфейсом(RTL8201) получается скорость около 90-95Mbit CODE #define SIZE 1000 void ToggleLed4(void * pvParameters) { struct netconn *connn; struct netbuf *buf1; struct ip_addr addr; static char text1[SIZE];//!!!! Буфер объявлен как static memset(text1, 0x55, SIZE); // create a new connection connn = netconn_new(NETCONN_UDP); // set up the IP address of the remote host IP4_ADDR(&addr, 192, 168, 0, 18);//Не забудте исправить IP // connect the connection to the remote host netconn_connect(connn, &addr, 7); // create a new netbuf buf1 = netbuf_new();
while(1) { vTaskDelay(1000); test = xnetif.ip_addr.addr; //check if IP address assigned if (test !=0) { for(;; ) { // toggle LED1 each 1000ms STM_EVAL_LEDToggle(LED1); //vTaskDelay(1000); //printf("test\r\n");
STM_EVAL_LEDOn(LED2); for(int j = 0; j < 10000; j++) { netbuf_ref(buf1, text1, sizeof(text1)); netconn_send(connn, buf1); } STM_EVAL_LEDOff(LED2); } } } }
Сообщение отредактировал IgorKossak - Jan 20 2012, 16:37
Причина редактирования: [codebox]
|
|
|
|
|
Jan 19 2012, 14:31
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Цитата(=F8= @ Jan 19 2012, 16:04)  Посмотрел код..... 1 Вы обявляете локальную переменную char text1[SIZE]; размером в 255 байт, при этом размер стека у потока configMINIMAL_STACK_SIZE 128 * 4 = 512 байт. т.е. одна локальная переменная съедает мол стека. Оставшихся 64 слов хватает едава едава. Отсюда и зависания при вызове printf и невозможность увеличить SIZE. 2 разберитесь с назначением функций netbuf_alloc и netbuf_ref. А то у вас пулучается что сначала вы с помощью data1 = netbuf_alloc(buf1, sizeof(text1)); создаете новый буфер в buf1, затем с помощью netbuf_ref(buf1, text1, sizeof(text1)); прикрепляете к buf1 буффер text1. Что при этом происходит с предварительно выделеным буфером - х.з. Большое спасибо. Все заработало. Виноват. Совсем вылетело, что у ОС свой стек у каждого потока. А локалка заседает в стеке. Надо будет с FreeRTOS поразбираться. До сего времени использовал только scmRTOS Про функции буду читать мануал. Со скоростью пока не понятно. Perf показывает ~13 Mbits/s Или я не врубился как мерять или что то не так с инициализацией MAC+RMII на нужной скорости или со скоростью камня что то не так
|
|
|
|
|
Jan 19 2012, 14:50
|
Знающий
   
Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954

|
А размер пакета(SIZE) увеличить не забыли? От этого скорость очень сильно зависит. SIZE = 250
SIZE = 1400
|
|
|
|
|
Jan 19 2012, 15:10
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Цитата(=F8= @ Jan 19 2012, 17:50)  А размер пакета(SIZE) увеличить не забыли? От этого скорость очень сильно зависит. Да, все сделал. Спасибо. Сначала не врубился. Теперь все прояснилось. Режим отладки нужно выключить (LWIP_DBG_OFF). Тормозит однако. Получилось так
Сообщение отредактировал Acvarif - Jan 19 2012, 15:26
|
|
|
|
|
Jan 20 2012, 16:05
|
Знающий
   
Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317

|
Цитата Например работа с ADC, DAC, цифровая обработка сигналов с ADC? Странный вопрос, цифровая обработка сигналов может быть такая что он и сам не потянет не то что еще и стек  , на этот вопрос вам никто и никогда не даст ответа.
|
|
|
|
|
Jan 20 2012, 17:58
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Цитата(MALLOY2 @ Jan 20 2012, 20:05)  Странный вопрос, цифровая обработка сигналов может быть такая что он и сам не потянет не то что еще и стек  , на этот вопрос вам никто и никогда не даст ответа. Не совсем верно поставил вопрос. Допустим 1 поток - 16 каналов ADC КИХ фильтры (предполагается, что stm32f217 справится) 2 поток - выдача обработанных результатов (все 16 каналов) на комп через LwIP (между выборками) 3 поток - выдача результатов прокрутки каждой выборки через КИХ на DAC
|
|
|
|
|
Jan 28 2012, 08:46
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 7-02-09
Пользователь №: 44 543

|
Добрый день. Я разбираюсь с реализацией веб0сервера на LwIp стеке. Сейчас меня интересует верхний уровень, сам HTTP. У примере под stm32F207 реализован HTTP с поддержкой POST и GET запросов. Но с POST запросами есть один нюанс, после объявления константы, как: #define LWIP_HTTPD_SUPPORT_POST 1 компилятор показывает, что в проекте не определены 3 функции:
err_t httpd_post_receive_data(void *connection, struct pbuf *p);
void httpd_post_finished(void *connection, char *response_uri, u16_t response_uri_len);
err_t httpd_post_begin(void *connection, const char *uri, const char *http_request, u16_t http_request_len, int content_len, char *response_uri, u16_t response_uri_len, u8_t *post_auto_wnd);
Для начала я их определил , как пустыми, возвращающими return ERR_OK(все норм.)...я так понимаю их нужно самому дописывать, может кто-нибудь посоветовать что-то по поводу их правильного описания.
За раннее, спасибо!
Сообщение отредактировал Twen - Jan 28 2012, 15:31
|
|
|
|
|
Aug 20 2013, 12:32
|
Группа: Новичок
Сообщений: 1
Регистрация: 20-08-13
Пользователь №: 77 997

|
Цитата(Twen @ Jan 28 2012, 12:46)  Добрый день. Я разбираюсь с реализацией веб0сервера на LwIp стеке. ... Добрый вечер! Вам удалось разобраться с этим вопросом?
Сообщение отредактировал IgorKossak - Aug 26 2013, 19:30
Причина редактирования: избыточное цитирование
|
|
|
|
|
Dec 20 2013, 11:44
|
Участник

Группа: Участник
Сообщений: 21
Регистрация: 9-06-12
Пользователь №: 72 244

|
Доброго времени суток. Пытаюсь разобраться с работой стека, следуя по стопам Acvarif, но застрял почти на начале.) Используя пример указанный в самом начале, UDP сообщение так и посылается. CODE struct udp_pcb *upcb; struct pbuf *p; struct ip_addr DestIPaddr; char tdata[] = {"Test"}; char *data = tdata;
/* Create a new UDP control block */ upcb = udp_new(); /*assign destination IP address */ IP4_ADDR( &DestIPaddr, DEST_IP_ADDR0, DEST_IP_ADDR1, DEST_IP_ADDR2, DEST_IP_ADDR3 ); /* configure destination IP address and port */ udp_connect(upcb, &DestIPaddr, UDP_SERVER_PORT); /* allocate pbuf from pool*/ p = pbuf_alloc(PBUF_TRANSPORT,strlen((char*)data), PBUF_POOL); /* copy data to pbuf */ pbuf_take(p, (char*)data, strlen((char*)data)); /* send udp data */ udp_send(upcb, p); По IP адресу отправляется ARP запрос, ПК шлет ответ (смотрю Wireshark), но присланный МАС адрес ПК не добавляется в таблицу. Я так понимаю, что нужно включить обработчик приема сообщений, но не знаю как. Кто знает, подскажите как это сделать, либо укажите где не прав.)
|
|
|
|
|
Dec 20 2013, 12:37
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата(Log_in @ Dec 20 2013, 15:44)  Доброго времени суток. Пытаюсь разобраться с работой стека, следуя по стопам Acvarif, но застрял почти на начале.) Используя пример указанный в самом начале, UDP сообщение так и посылается.
По IP адресу отправляется ARP запрос, ПК шлет ответ (смотрю Wireshark), но присланный МАС адрес ПК не добавляется в таблицу. Я так понимаю, что нужно включить обработчик приема сообщений, но не знаю как. Кто знает, подскажите как это сделать, либо укажите где не прав.) чтобы стэк работал, надо постоянно вызывать функцию TCP_IP_Process(), несмотря на название для UDP тоже а также timer_tick () с заданным интервалом
|
|
|
|
|
Dec 20 2013, 12:50
|
Участник

Группа: Участник
Сообщений: 21
Регистрация: 9-06-12
Пользователь №: 72 244

|
Дело в том, что у меня F107, и в связи с этим в библиотеке этих функций нет. Может Вы можете назвать аналоги для этого контроллера? Или следует рассмотреть работу этих функций в для f2xx и самому потом сориентироваться?
|
|
|
|
|
Dec 23 2013, 11:40
|
Участник

Группа: Участник
Сообщений: 21
Регистрация: 9-06-12
Пользователь №: 72 244

|
Использовал функцию LwIP_Periodic_Handle, вызывающую tcp_tmr, которая в свою очередь tcp_fasttmr и tcp_slowtmr с заданной периодичностью. Но ситуация не особо изменилась. В ходе просмотра выполнения функций было обнаружено, что переменная tcp_active_pcbs, используемая в tcp_fasttmr, всегда принимает значение равное нулю. В связи с этим функция сразу вываливается из цикла без каких либо действий. Вроде эта структура означает все доступные соединения. Есть какие-нибудь соображения? Неужели соединение некорректно установлено? Интересно, что не мне удалось бы найти функции, где бы происходило присвоение каких либо значений. И не могли бы Вы также пояснить, где в конкретно происходила бы обработка ARP ответов при штатной работе стека?
Использовал функцию LwIP_Pkt_Handle(), вызывающую ethernetif_input, сразу после udp_send(upcb, p) и стек смог принять и корректно обработать ARP ответ, добавив МАС адрес в таблицу, после чего UDP дошла до ПК, но хотелось бы более элегантное и разумное решение для приема. Да и с tcp_active_pcbs неясность осталась.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|