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

|
На st имеется демка под LwIP на stm32f207 для PHY DP83848C (режим MII) (в демке реализованы почти все возможные варианты серверов и клиентов). Поскольку у меня на столе имеется платка с stm32f217 + phy ks8721bl (режим RMII) пришлось демку LwIP переделать под нее (не поленился переделал все демки в том числе и под FREE RTOS). Все приложения работают без проблем. Вот ссылка на архив (большой ~47м ). (переделаны проекты для Keil, проекты под IAR переделываюся только сменой камня. Все работает также без проблем) Но остался вопрос. Нормального понимания как работать с LwIP + stm32 пока нет. Дока на стек и демку не проясняет. У кого есть опыт работы с LwIP + stm32 подсобите please для старта простым примером LwIP как принять одни данные по UDP и отправить другие. В демке имеется UDP эхо сервер. Поможет даже подсказка как сделать так, чтобы сервер отправлял не эхо, а конкретные данные из конкретного буфера типа *my_buf. Спасибо. В main все начинается так: Код /* check if any packet received */ if (ETH_CheckFrameReceived()) { /* process received ethernet packet */ LwIP_Pkt_Handle(); } Функция ETH_CheckFrameReceived делает это: CODE /** * @brief This function polls for a frame reception * @param None * @retval Returns 1 when a frame is received, 0 if none. */ uint32_t ETH_CheckFrameReceived(void) { /* check if last segment */ if(((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) == (uint32_t)RESET) && ((DMARxDescToGet->Status & ETH_DMARxDesc_LS) != (uint32_t)RESET)) { DMA_RX_FRAME_infos->LS_Rx_Desc = DMARxDescToGet; DMA_RX_FRAME_infos->Seg_Count++; return 1; } /* check if first segment */ else if(((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) == (uint32_t)RESET) && ((DMARxDescToGet->Status & ETH_DMARxDesc_FS) != (uint32_t)RESET)&& ((DMARxDescToGet->Status & ETH_DMARxDesc_LS) == (uint32_t)RESET)) { DMA_RX_FRAME_infos->FS_Rx_Desc = DMARxDescToGet; DMA_RX_FRAME_infos->LS_Rx_Desc = NULL; DMA_RX_FRAME_infos->Seg_Count = 1; DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMARxDescToGet->Buffer2NextDescAddr); } /* check if intermediate segment */ else if(((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) == (uint32_t)RESET) && ((DMARxDescToGet->Status & ETH_DMARxDesc_FS) == (uint32_t)RESET)&& ((DMARxDescToGet->Status & ETH_DMARxDesc_LS) == (uint32_t)RESET)) { (DMA_RX_FRAME_infos->Seg_Count) ++; DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMARxDescToGet->Buffer2NextDescAddr); } return 0; } Я так понимаю, что функция проверяет имеется ли что-то в DMA В частности если имеется фрейм и сегмент в фрейме последний, то возвращается 1. Что такое последний сегмент? Понимаю, что можно послать меня на очередной мануал. Но мануалы меня уже сильно достали из за их непоследовательности и часто бесполезности. Ответьте пожалуйста на русском коротко работу функции ETH_CheckFrameReceived(void) (функция почемуто всегда, послал я фрейм или нет, возвращает 1) Дальше начинается кошмар по имени Код /* process received ethernet packet */ LwIP_Pkt_Handle(); который далее переходит в Код /* Read a received packet from the Ethernet buffers and send it to the lwIP for handling */ ethernetif_input(&netif); и куда дальше попадают собственно данные посланного из компа UDP пакета, так, чтобы с ними можно было -бы поработать и как послать компу ответ в виде своего пакета (а не того же самого) не допираю. Подсобите, кто сталкивался с этим. Нашел пока это http://lwip.wikia.com/wiki/Raw/UDPВсеравно не понятно как на базе LwIP послать на комп UDP пакет Ну допустим так: Код struct udp_pcb *upcb; /* Create a new UDP control block */ upcb = udp_new(); /* Bind the upcb to the UDP_PORT port */ /* Using IP_ADDR_ANY allow the upcb to be used by any local interface */ udp_bind(upcb, IP_ADDR_ANY, 23); /* Connect to the remote client */ udp_connect(upcb, addr, 23); В каком виде нужно записать addr? Похоже, что дальше можно Код udp_send(struct udp_pcb * pcb, struct pbuf * p) тоесть Код udp_send(upcb, p); Что такое struct pbuf * p
Сообщение отредактировал Acvarif - Jan 12 2012, 14:48
|
|
|
|
|
 |
Ответов
|
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
|
|
|
|
Сообщений в этой теме
Acvarif LwIP стек в STM32F217 Jan 12 2012, 09:42 kan35 Дока на lwIP существует, она вполне полезная, по к... Jan 12 2012, 15:49 Acvarif Спасибо. Начало проясняться.
Удалось послать ст... Jan 13 2012, 06:43 kan35 Вы продолжаете работать на уровне pcb, я же предла... Jan 13 2012, 07:33 Acvarif ЦитатаВы продолжаете работать на уровне pcb, я же ... Jan 13 2012, 11:39  Acvarif Цитата(Acvarif @ Jan 13 2012, 15:39) Пыта... Jan 13 2012, 13:03   Acvarif Все прояснилось. Мануал 2001 года подходит для LwI... Jan 13 2012, 14:51 kan35 Чтобы активировать те или иные Api кроме того, что... Jan 13 2012, 16:34 Acvarif Спасибо. Почти получилось...
Портит картину netcon... Jan 13 2012, 18:58  Acvarif RE: LwIP стек в STM32F217 Jan 14 2012, 13:40 kan35 opt.h - это настройки по умолчанию, их не стоит тр... Jan 14 2012, 17:05 Acvarif Понял. Спасибо. Файл нашел.
Можно ли подружить это... Jan 14 2012, 18:17 kan35 Должен работать конечно, но нюансов не скажу, так ... Jan 14 2012, 19:04 Acvarif Понял. Спасибо. С ОС стек компилится без проблем. ... Jan 14 2012, 19:35      Acvarif Цитата(scifi @ Jan 16 2012, 22:43) Пакет ... Jan 16 2012, 20:16       MALLOY2 Цитата(Acvarif @ Jan 16 2012, 22:16) Да, ... Jan 17 2012, 08:45       sparcmaster Цитата(Acvarif @ Jan 17 2012, 00:16) Буду... Jan 17 2012, 08:51     =F8= Цитата(Acvarif @ Jan 16 2012, 17:52) Но о... Jan 17 2012, 09:11      scifi Цитата(=F8= @ Jan 17 2012, 13:11) Парамет... Jan 17 2012, 11:10       =F8= Цитата(scifi @ Jan 17 2012, 14:10) Это из... Jan 17 2012, 12:37 MALLOY2 ЦитатаБуду признателен, за подсказку - технологию ... Jan 17 2012, 09:44 Acvarif Цитата(MALLOY2 @ Jan 17 2012, 12:44) Я по... Jan 17 2012, 13:25 Twen Аналогично использую МК stm32 + LwIp на FreeRTOS, ... Jan 17 2012, 12:38 =F8= Если кто не знает. В LwIP системма выдачи отладочн... Jan 17 2012, 13:48 Acvarif Спасибо за полезную информацию.
Что имеется ввиду... Jan 17 2012, 14:12  =F8= Цитата(Acvarif @ Jan 17 2012, 18:12) Спас... Jan 17 2012, 15:59 Acvarif Цитата(=F8= @ Jan 17 2012, 16:48) Если кт... Jan 18 2012, 07:40  =F8= Цитата(Acvarif @ Jan 18 2012, 10:40) А эт... Jan 18 2012, 11:25   Acvarif Цитата(=F8= @ Jan 18 2012, 14:25) Извиняю... Jan 18 2012, 13:27    =F8= Прежде всего нужно переопределить макрос LWIP_DBG_... Jan 18 2012, 13:57     Acvarif Сделано так
LWIP_DBG_ON
LWIP_DBG_LEVEL_ALL
CODE/**... Jan 18 2012, 14:29 kan35 Я бы не парился с этим режимом.
лучше напишите сво... Jan 18 2012, 08:11 Acvarif Цитата(kan35 @ Jan 18 2012, 11:11) Я бы н... Jan 18 2012, 08:45 kan35 Все верно у тебя сделано.
Чтобы printf куда-то вы... Jan 18 2012, 10:16 MALLOY2 ЦитатаПолучается определяет функцию для выдачи соо... Jan 18 2012, 10:44 =F8= Глубина стека в задаче какая? printf довольно стек... Jan 18 2012, 15:56 Acvarif Цитата(=F8= @ Jan 18 2012, 18:56) Глубина... Jan 18 2012, 18:46 =F8= Чтоб появились сообшения в настройках проекта укаж... Jan 19 2012, 10:14 Acvarif Цитата(=F8= @ Jan 19 2012, 13:14) Чтоб по... Jan 19 2012, 12:26 =F8= Посмотрел код.....
1 Вы обявляете локальную переме... Jan 19 2012, 13:04 Acvarif Цитата(=F8= @ Jan 19 2012, 16:04) Посмотр... Jan 19 2012, 14:31 =F8= А размер пакета(SIZE) увеличить не забыли? От этог... Jan 19 2012, 14:50 Acvarif Цитата(=F8= @ Jan 19 2012, 17:50) А разме... Jan 19 2012, 15:10  Acvarif Касательно этой темы:
1. Удержит ли LwIP+FreeRto... Jan 20 2012, 15:52 MALLOY2 ЦитатаНапример работа с ADC, DAC, цифровая обработ... Jan 20 2012, 16:05 Acvarif Цитата(MALLOY2 @ Jan 20 2012, 20:05) Стра... Jan 20 2012, 17:58 Twen Добрый день. Я разбираюсь с реализацией веб0сервер... Jan 28 2012, 08:46 Алллексей Цитата(Twen @ Jan 28 2012, 12:46) Добрый ... Aug 20 2013, 12:32 Log_in Доброго времени суток. Пытаюсь разобраться с работ... Dec 20 2013, 11:44 Golikov A. Цитата(Log_in @ Dec 20 2013, 15:44) Добро... Dec 20 2013, 12:37 Log_in Дело в том, что у меня F107, и в связи с этим в би... Dec 20 2013, 12:50 Golikov A. ОЙ блин!
не,... надо ваще забыть про мое сообщ... Dec 20 2013, 13:01 Log_in Использовал функцию LwIP_Periodic_Handle, вызывающ... Dec 23 2013, 11:40
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|