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

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> LwIP стек в STM32F217
Acvarif
сообщение Jan 16 2012, 06:36
Сообщение #16


Знающий
****

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



Цитата(MK2 @ Jan 15 2012, 22:20) *
А чем вы с компьютера посылали пакеты?


Да вот этой штукой http://www.hw-group.com/products/hercules/index_en.html Хотя в демке есть программки (вроде под DOS), но они лишены визуальности - работать неудобно.
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Jan 16 2012, 13:23
Сообщение #17


Знающий
****

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



В общем вроде все получилось. Использовал имеющийся в демке проект под FreeRTOS udptcp_echo_server_netconn
и функцию мигания светодиодом void ToggleLed4(void * pvParameters).
Немного ее модифицировал:
CODE
void ToggleLed4(void * pvParameters)
{
struct netconn *connn;
struct netbuf *buf1;
struct netbuf *buf2;
struct ip_addr addr;
char *data1;
char *data2;
char text1[] = "Hello,my name is SK-STM32F217\n\r";
char text2[] = "I am transmit UDP package\n\r";
int i,n = 0;

/* create a new connection */
connn = netconn_new(NETCONN_UDP);
/* set up the IP address of the remote host */
addr.addr = htonl(0xC0A802A8);
/* connect the connection to the remote host */
netconn_connect(connn, &addr, 7);
/* create a new netbuf */
buf1 = netbuf_new();
buf2 = netbuf_new();

while(1)
{
test = xnetif.ip_addr.addr;
/*check if IP address assigned*/
if (test !=0)
{
for( ;; )
{
/* toggle LED1 each 250ms */
STM_EVAL_LEDToggle(LED1);
vTaskDelay(1000);

data1 = netbuf_alloc(buf1, strlen(text1));
/* create some arbitrary data */
for(i = 0; i < sizeof(text1); i++)
data1[i] = text1[i];

data2 = netbuf_alloc(buf2, strlen(text2));
/* create some arbitrary data */
for(i = 0; i < sizeof(text2); i++)
data2[i] = text2[i];
if(n == 0)
{
n = 1;
netbuf_ref(buf1, text1, strlen(text1));
netconn_send(connn, buf1);
netbuf_delete(buf1);
}
else
{
n = 0;
netbuf_ref(buf2, text2, strlen(text2));
netconn_send(connn, buf2);
netbuf_delete(buf2);
}
}
}
}
}


Все вроде работает. Теперь стала задача подсчитать скорость передачи, а заодно и проверить надежность передающей системы.
Как можно это сделать на базе этой функции.
Ну допустим запустить цикл передачи в 1000 пакетов по 256 байт и осциллоскопом как-то (пока не представляю как) померять период передачи 1000 пакетов.
Может можно както без осциллоскопа?
Go to the top of the page
 
+Quote Post
scifi
сообщение Jan 16 2012, 13:36
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Acvarif @ Jan 16 2012, 17:23) *
Все вроде работает. Теперь стала задача подсчитать скорость передачи, а заодно и проверить надежность передающей системы.
Как можно это сделать на базе этой функции.
Ну допустим запустить цикл передачи в 1000 пакетов по 256 байт и осциллоскопом как-то (пока не представляю как) померять период передачи 1000 пакетов.

В MAC есть счётчики для различной статистики (например, число отправленных и принятых пакетов). Просто смотрите их содержимое до и после "передачи в 1000 пакетов по 256 байт". То же самое полезно проделать со стороны ПК.
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Jan 16 2012, 14:52
Сообщение #19


Знающий
****

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



Цитата(scifi @ Jan 16 2012, 17:36) *
В MAC есть счётчики для различной статистики (например, число отправленных и принятых пакетов). Просто смотрите их содержимое до и после "передачи в 1000 пакетов по 256 байт". То же самое полезно проделать со стороны ПК.


Спасибо за информацию. Посмотрю.
Попытался сделать влоб, поставив светодиод (вроде должен индицировать время передачи 1000 пакетов) типа так:
CODE

...
STM_EVAL_LEDOn(LED2);
for(j = 0; j < 1000; j++)
{
data1 = netbuf_alloc(buf1, strlen(text1));
/* create some arbitrary data */
for(i = 0; i < sizeof(text1); i++)
data1[i] = text1[i];

data2 = netbuf_alloc(buf2, strlen(text2));
/* create some arbitrary data */
for(i = 0; i < sizeof(text2); i++)
data2[i] = text2[i];

if(n == 0)
{
n = 1;
netbuf_ref(buf1, text1, strlen(text1));
netconn_send(connn, buf1);
netbuf_delete(buf1);
}
else
{
n = 0;
netbuf_ref(buf2, text2, strlen(text2));
netconn_send(connn, buf2);
netbuf_delete(buf2);
}
}
STM_EVAL_LEDOff(LED2);
}

Но очевидно так будет не корректно. Не знаю почему но пакет из ~10 000 байт светодиод отсчитывает за 160 мс, что очень много для скорости в TBase100
Хотя я не уверен, что скорость Mac выставлена 100. Покак не допру где это утанавливается. Да даже если скорость 10 всеравно 160мс это многовато будет.

Сообщение отредактировал Acvarif - Jan 16 2012, 14:54
Go to the top of the page
 
+Quote Post
scifi
сообщение Jan 16 2012, 19:43
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Acvarif @ Jan 16 2012, 18:52) *
Но очевидно так будет не корректно. Не знаю почему но пакет из ~10 000 байт светодиод отсчитывает за 160 мс, что очень много для скорости в TBase100
Хотя я не уверен, что скорость Mac выставлена 100. Покак не допру где это утанавливается. Да даже если скорость 10 всеравно 160мс это многовато будет.

Пакет 10000 байт? Вы в курсе, что макс. размер кадра Ethernet - это 1500 байт или около того? Это если не учитывать экзотику типа Jumbo Frame. Значит, пакет фрагментируется на уровне IP. Я думаю, скорость физического уровня здесь ни при чём. В lwip есть огромное множество настроек, которые могут влиять на самые разные вещи, включая задержки при пересылке. Но это только предположение.
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Jan 16 2012, 20:16
Сообщение #21


Знающий
****

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



Цитата(scifi @ Jan 16 2012, 22:43) *
Пакет 10000 байт? Вы в курсе, что макс. размер кадра Ethernet - это 1500 байт или около того? Это если не учитывать экзотику типа Jumbo Frame. Значит, пакет фрагментируется на уровне IP. Я думаю, скорость физического уровня здесь ни при чём. В lwip есть огромное множество настроек, которые могут влиять на самые разные вещи, включая задержки при пересылке. Но это только предположение.

Да, я в курсе. Просто я передаю 1000 кадров по 100 байт в каждом. Опять же, наверняка так не корректно. Очевидно нужно передавать просто один кадр, например 500 байт, и как то определять его период. Хотя и в этом не уверен.
Буду признателен, за подсказку - технологию определения скорости.
И вообще интересует вопрос реально ли на LwIP + FreeRtos + UDP + stm32f217 получить сорость ~90..100?
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Jan 17 2012, 08:45
Сообщение #22


Знающий
****

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



Цитата(Acvarif @ Jan 16 2012, 22:16) *
Да, я в курсе. Просто я передаю 1000 кадров по 100 байт в каждом. Опять же, наверняка так не корректно. Очевидно нужно передавать просто один кадр, например 500 байт, и как то определять его период. Хотя и в этом не уверен.
Буду признателен, за подсказку - технологию определения скорости.
И вообще интересует вопрос реально ли на LwIP + FreeRtos + UDP + stm32f217 получить сорость ~90..100?


90 реально, но не по 100 байт, как минимум 512, а то и 1024
Go to the top of the page
 
+Quote Post
sparcmaster
сообщение Jan 17 2012, 08:51
Сообщение #23


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

Группа: Свой
Сообщений: 93
Регистрация: 13-01-12
Из: Гатчина
Пользователь №: 69 333



Цитата(Acvarif @ Jan 17 2012, 00:16) *
Буду признателен, за подсказку - технологию определения скорости.

Я в свое время для оценки скорости замерял за сколько девайс отдаст файл размером в 100 мбайт.
Go to the top of the page
 
+Quote Post
=F8=
сообщение Jan 17 2012, 09:11
Сообщение #24


Знающий
****

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



Цитата(Acvarif @ Jan 16 2012, 17:52) *
Но очевидно так будет не корректно. Не знаю почему но пакет из ~10 000 байт светодиод отсчитывает за 160 мс, что очень много для скорости в TBase100
Хотя я не уверен, что скорость Mac выставлена 100. Покак не допру где это утанавливается. Да даже если скорость 10 всеравно 160мс это многовато будет.


Параметр TCP_WND сильно на скорость передачи влияет. Увеличить его попробуйте.
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Jan 17 2012, 09:44
Сообщение #25


Знающий
****

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



Цитата
Буду признателен, за подсказку - технологию определения скорости.


Я пользуюсь этой
iperf
Go to the top of the page
 
+Quote Post
scifi
сообщение Jan 17 2012, 11:10
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(=F8= @ Jan 17 2012, 13:11) *
Параметр TCP_WND сильно на скорость передачи влияет. Увеличить его попробуйте.

Это из рубрики "Вредные советы"? :-)
Каким образом TCP_WND может повлиять на UDP?
Go to the top of the page
 
+Quote Post
=F8=
сообщение Jan 17 2012, 12:37
Сообщение #27


Знающий
****

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



Цитата(scifi @ Jan 17 2012, 14:10) *
Это из рубрики "Вредные советы"? :-)
Каким образом TCP_WND может повлиять на UDP?

Сорри, недосмотрел. На UDP никак.
Go to the top of the page
 
+Quote Post
Twen
сообщение Jan 17 2012, 12:38
Сообщение #28


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

Группа: Участник
Сообщений: 163
Регистрация: 7-02-09
Пользователь №: 44 543



Аналогично использую МК stm32 + LwIp на FreeRTOS, при ключении прибора не всегда начинает пинговаться, после нескольких сбросов отвечает, хотя эзернет модуль принимает данные(проверено)...У кого нибудь возник еще такая проблема?
Хотя, когда прошил пример без ОС udp_echo_server, пингуется ставильно после вкл./выкл. питания.

Сообщение отредактировал Twen - Jan 17 2012, 13:04
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Jan 17 2012, 13:25
Сообщение #29


Знающий
****

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



Цитата(MALLOY2 @ Jan 17 2012, 12:44) *
Я пользуюсь этой
iperf


Спасибо. Уже ближе. Попробую с этим разобраться применительно к stm32.
В окончательном варианте для тестирования сделал так.
CODE
void ToggleLed4(void * pvParameters)
{
const int Size = 255;
const int Count = 100;
struct netconn *connn;
struct netbuf *buf1;
struct ip_addr addr;
char *data1;
char text1[Size];
int i,j,n = 0;

for(n = 0; n < Size; n++)
text1[n] = 0x55;
/* create a new connection */
connn = netconn_new(NETCONN_UDP);
/* set up the IP address of the remote host */
addr.addr = htonl(0xC0A802A8);
/* connect the connection to the remote host */
netconn_connect(connn, &addr, 7);
/* create a new netbuf */
buf1 = netbuf_new();

while(1)
{
test = xnetif.ip_addr.addr;
/*check if IP address assigned*/
if (test !=0)
{
for( ;; )
{
/* toggle LED1 each 250ms */
STM_EVAL_LEDToggle(LED1);
vTaskDelay(1000);

STM_EVAL_LEDOn(LED2);
for(j = 0; j < Count; j++)
{
data1 = netbuf_alloc(buf1, strlen(text1));
/* create some arbitrary data */
for(i = 0; i < sizeof(text1); i++)
data1[i] = text1[i];


netbuf_ref(buf1, text1, strlen(text1));
netconn_send(connn, buf1);
netbuf_delete(buf1);
}
STM_EVAL_LEDOff(LED2);
}
}
}
}

Отправка из потока ToggleLed4 на комп 100 пакетов по 255 байт. Количеством пакетов и их размером можно управлять. Передается без проблем (со скоростью буду разбираться).
Да, по ходу возникла небольшая проблема. Пакеты немногим более 300 байт не хотят отправляться.
Вообще все виснет. Хотя в UDP должны нормально отправляться (без фрагментации) не менее 512. Очевидно что то в настройках LwIP...

Почитал про iperf - получается, что в моем случае придется воспользоваться UDP эхо сервером, который работает в другом потоке ОС

Сообщение отредактировал Acvarif - Jan 17 2012, 13:37
Go to the top of the page
 
+Quote Post
=F8=
сообщение Jan 17 2012, 13:48
Сообщение #30


Знающий
****

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



Если кто не знает. В LwIP системма выдачи отладочной информации.
1. Чтоб ее задействовать нужно определить макрос LWIP_PLATFORM_DIAG в файле debug.h Если говорить про iar то все просто:
#define LWIP_PLATFORM_DIAG printf
и устанавливаете в опциях пректа флажек "include semihosting interfice", если поддерживает контороллер и отладчик включаете режим "Semihosted, stdout/stderr via SWO"(в режиме "Semihosted, stdout/stderr via semihosting" лучше даже не пытаться - уж больно тормозяво, если не получается через SWO лучше уж через UART предварительно написав драйвер с приличным буфером), в общем включаете выдачу отладочных сообщений на консоль.
2 в файле opt.h
#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_ALL/LWIP_DBG_LEVEL_WARNING/LWIP_DBG_LEVEL_SERIOUS в зависимости от того какие сообщения хотите получать.
там-же #define LWIP_DBG_TYPES_ON LWIP_DBG_ON
там-же настраиваете от каких модулей хотите получать сообщения.
90% вопросов "почему не работает" отпадет при просмотре логов.
Ваш К.О.
Go to the top of the page
 
+Quote Post

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

 


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


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