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

 
 
4 страниц V  « < 2 3 4  
Reply to this topicStart new topic
> LwIP стек в STM32F217
=F8=
сообщение Jan 19 2012, 13:04
Сообщение #46


Знающий
****

Группа: Свой
Сообщений: 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]
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Jan 19 2012, 14:31
Сообщение #47


Знающий
****

Группа: Участник
Сообщений: 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 на нужной скорости или со скоростью камня что то не так

Go to the top of the page
 
+Quote Post
=F8=
сообщение Jan 19 2012, 14:50
Сообщение #48


Знающий
****

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



А размер пакета(SIZE) увеличить не забыли? От этого скорость очень сильно зависит.
SIZE = 250
Прикрепленное изображение

SIZE = 1400
Прикрепленное изображение
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Jan 19 2012, 15:10
Сообщение #49


Знающий
****

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



Цитата(=F8= @ Jan 19 2012, 17:50) *
А размер пакета(SIZE) увеличить не забыли? От этого скорость очень сильно зависит.

Да, все сделал. Спасибо.
Сначала не врубился. Теперь все прояснилось. Режим отладки нужно выключить (LWIP_DBG_OFF). Тормозит однако.
Получилось так
Прикрепленное изображение


Сообщение отредактировал Acvarif - Jan 19 2012, 15:26
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Jan 20 2012, 15:52
Сообщение #50


Знающий
****

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



Касательно этой темы:

1. Удержит ли LwIP+FreeRtos скорость ~90 если FreeRtos будет иметь еще 2...3 потока. Например работа с ADC, DAC, цифровая обработка сигналов с ADC?
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Jan 20 2012, 16:05
Сообщение #51


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Цитата
Например работа с ADC, DAC, цифровая обработка сигналов с ADC?


Странный вопрос, цифровая обработка сигналов может быть такая что он и сам не потянет не то что еще и стек sm.gif, на этот вопрос вам никто и никогда не даст ответа.
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Jan 20 2012, 17:58
Сообщение #52


Знающий
****

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



Цитата(MALLOY2 @ Jan 20 2012, 20:05) *
Странный вопрос, цифровая обработка сигналов может быть такая что он и сам не потянет не то что еще и стек sm.gif, на этот вопрос вам никто и никогда не даст ответа.

Не совсем верно поставил вопрос.
Допустим
1 поток - 16 каналов ADC КИХ фильтры (предполагается, что stm32f217 справится)
2 поток - выдача обработанных результатов (все 16 каналов) на комп через LwIP (между выборками)
3 поток - выдача результатов прокрутки каждой выборки через КИХ на DAC
Go to the top of the page
 
+Quote Post
Twen
сообщение Jan 28 2012, 08:46
Сообщение #53


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

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Алллексей
сообщение Aug 20 2013, 12:32
Сообщение #54





Группа: Новичок
Сообщений: 1
Регистрация: 20-08-13
Пользователь №: 77 997



Цитата(Twen @ Jan 28 2012, 12:46) *
Добрый день. Я разбираюсь с реализацией веб0сервера на LwIp стеке. ...


Добрый вечер! Вам удалось разобраться с этим вопросом?

Сообщение отредактировал IgorKossak - Aug 26 2013, 19:30
Причина редактирования: избыточное цитирование
Go to the top of the page
 
+Quote Post
Log_in
сообщение Dec 20 2013, 11:44
Сообщение #55


Участник
*

Группа: Участник
Сообщений: 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), но присланный МАС адрес ПК не добавляется в таблицу. Я так понимаю, что нужно включить обработчик приема сообщений, но не знаю как. Кто знает, подскажите как это сделать, либо укажите где не прав.)
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Dec 20 2013, 12:37
Сообщение #56


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата(Log_in @ Dec 20 2013, 15:44) *
Доброго времени суток. Пытаюсь разобраться с работой стека, следуя по стопам Acvarif, но застрял почти на начале.) Используя пример указанный в самом начале, UDP сообщение так и посылается.

По IP адресу отправляется ARP запрос, ПК шлет ответ (смотрю Wireshark), но присланный МАС адрес ПК не добавляется в таблицу. Я так понимаю, что нужно включить обработчик приема сообщений, но не знаю как. Кто знает, подскажите как это сделать, либо укажите где не прав.)


чтобы стэк работал, надо постоянно вызывать функцию
TCP_IP_Process(),
несмотря на название для UDP тожеsm.gif

а также
timer_tick () с заданным интервалом
Go to the top of the page
 
+Quote Post
Log_in
сообщение Dec 20 2013, 12:50
Сообщение #57


Участник
*

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



Дело в том, что у меня F107, и в связи с этим в библиотеке этих функций нет. Может Вы можете назвать аналоги для этого контроллера? Или следует рассмотреть работу этих функций в для f2xx и самому потом сориентироваться?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Dec 20 2013, 13:01
Сообщение #58


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



ОЙ блин!
не,... надо ваще забыть про мое сообщение - это я от другого стэка вам функции сказал%(...

в LwIP тоже есть функции, которые надо постоянно дергать что все крутилось и пакеты обрабатывались.
это
tcp_fasttmr()
tcp_slowtmr()

одну часто, она стэк крутит
а другую пореже, она таймауты считает и убивает закрытые сокеты
Go to the top of the page
 
+Quote Post
Log_in
сообщение Dec 23 2013, 11:40
Сообщение #59


Участник
*

Группа: Участник
Сообщений: 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 неясность осталась.
Go to the top of the page
 
+Quote Post

4 страниц V  « < 2 3 4
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


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


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