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

 
 
> LwIP стек в STM32F217
Acvarif
сообщение Jan 12 2012, 09:42
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
MK2
сообщение Jan 15 2012, 18:20
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 202
Регистрация: 30-10-10
Пользователь №: 60 535



А чем вы с компьютера посылали пакеты?
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Jan 16 2012, 06:36
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 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
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 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
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 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
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 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   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


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

 


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


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