|
|
  |
LwIP стек в STM32F217 |
|
|
|
Jan 16 2012, 06:36
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Цитата(MK2 @ Jan 15 2012, 22:20)  А чем вы с компьютера посылали пакеты? Да вот этой штукой http://www.hw-group.com/products/hercules/index_en.html Хотя в демке есть программки (вроде под DOS), но они лишены визуальности - работать неудобно.
|
|
|
|
|
Jan 16 2012, 13:23
|
Знающий
   
Группа: Участник
Сообщений: 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 пакетов. Может можно както без осциллоскопа?
|
|
|
|
|
Jan 16 2012, 14:52
|
Знающий
   
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jan 16 2012, 20:16
|
Знающий
   
Группа: Участник
Сообщений: 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?
|
|
|
|
|
Jan 17 2012, 08:45
|
Знающий
   
Группа: 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
|
|
|
|
|
Jan 17 2012, 08:51
|
Частый гость
 
Группа: Свой
Сообщений: 93
Регистрация: 13-01-12
Из: Гатчина
Пользователь №: 69 333

|
Цитата(Acvarif @ Jan 17 2012, 00:16)  Буду признателен, за подсказку - технологию определения скорости. Я в свое время для оценки скорости замерял за сколько девайс отдаст файл размером в 100 мбайт.
|
|
|
|
|
Jan 17 2012, 09:44
|
Знающий
   
Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317

|
Цитата Буду признателен, за подсказку - технологию определения скорости. Я пользуюсь этой iperf
|
|
|
|
|
Jan 17 2012, 13:25
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Цитата(MALLOY2 @ Jan 17 2012, 12:44)  Спасибо. Уже ближе. Попробую с этим разобраться применительно к 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
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|