Jump to content

    
Sign in to follow this  
Oleg_IT

Продолжаю мучить изернет для STM32F417 без ОС.

Recommended Posts

Собрал простую программу на STM32CubeMX с ETH и LWIP. Пытаюсь установить соединение, как показано в примерах

err_t tcp_recv_cb(void *arg, struct tcp_pcb *tpcb,
						 struct pbuf *p, err_t err)
{
return ERR_OK;
}
void tcp_err_cb(void *arg, err_t err)
{
Err = err;
arg_ = arg;
}
err_t tcp_poll_cb(void *arg, struct tcp_pcb *tpcb)
{
return ERR_OK;
}
err_t tcp_accept_cb(void *arg, struct tcp_pcb *newpcb, err_t err)
{
tcp_arg(tcp_pcb_, tcp_pcb_);
tcp_recv(tcp_pcb_,tcp_recv_cb);
tcp_err(tcp_pcb_,tcp_err_cb);

tcp_poll(tcp_pcb_, tcp_poll_cb, 10);
return ERR_OK;
}
err_t tcp_connected_cb(void *arg, struct tcp_pcb *tpcb, err_t err)
{
return ERR_OK;
}
…………………………………………………………………
To_IP_ADDRESS[0] = 169;
To_IP_ADDRESS[1] = 254;
To_IP_ADDRESS[2] = 248;
To_IP_ADDRESS[3] = 45;
My_IP_ADDRESS[0] = 169;
My_IP_ADDRESS[1] = 254;
My_IP_ADDRESS[2] = 61;
My_IP_ADDRESS[3] = 18;

IP4_ADDR(&To_ipaddr, To_IP_ADDRESS[0], To_IP_ADDRESS[1], To_IP_ADDRESS[2], To_IP_ADDRESS[3]);
IP4_ADDR(&My_ipaddr, My_IP_ADDRESS[0], My_IP_ADDRESS[1], My_IP_ADDRESS[2], My_IP_ADDRESS[3]);

tcp_pcb_ = tcp_new();
tcp_setprio(tcp_pcb_,TCP_PRIO_NORMAL);
Err = tcp_bind(tcp_pcb_,&My_ipaddr,2323);
tcp_accept(tcp_pcb_,tcp_accept_cb);

Err = tcp_connect(tcp_pcb_,&To_ipaddr,2324,tcp_connected_cb);
 while (1)
 {
 /* USER CODE END WHILE */
  MX_LWIP_Process();
 /* USER CODE BEGIN 3 */

 }

Результат смотрю и в Wireshark и в дебагере. Ни какая колбек функция не вызывается. ARP запрос и, соответствующий ответ поступают в Wireshark в тот момент, когда в программе на модуле соединение закрывается, tcp_pcb_.state равно CLOSED. Принимающая программа запущена, она работала с модулем на LPC с TCP_ARM_L.lib.

Все примеры, которые я нашёл это или эхо клиент, сервер или протоколы высокого уровня, а мне нужно просто гонять бинарные буфера между модулем и компьютером. Помогите поднять соединение.

Edited by IgorKossak
[codebox] для длинного кода, [code] - для короткого!!!

Share this post


Link to post
Share on other sites

А почему вы акцентируете внимание на отсутствии ОС? Надо писать промежуточный слой что для ОС, что для голого железа.

 

Посмотрел свой код, не вижу у вас вызовов lwip_init() netif_add, sys_check_timeouts(). Также должны быть предоставлены внешние функции u32_t sys_now(void) и u32_t sys_jiffies(void). Вы это сделали? Время тикает?

 

LWIP имеет развитую систему логов, попробуйте для начала их все включить и посмотреть, что происходит. Включите логи в вашем драйвере ethernet, пакеты приходят/уходят?

 

Share this post


Link to post
Share on other sites
А почему вы акцентируете внимание на отсутствии ОС? Надо писать промежуточный слой что для ОС, что для голого железа.

 

Посмотрел свой код, не вижу у вас вызовов lwip_init() netif_add, sys_check_timeouts(). Также должны быть предоставлены внешние функции u32_t sys_now(void) и u32_t sys_jiffies(void). Вы это сделали? Время тикает?

 

LWIP имеет развитую систему логов, попробуйте для начала их все включить и посмотреть, что происходит. Включите логи в вашем драйвере ethernet, пакеты приходят/уходят?

 

Большой кусок инициализации lwip строит STM32CubeMX, там все вызовы lwip_init() netif_add, ... sys_check_timeouts(), ethernetif_input() включены в MX_LWIP_Process();

С логами разберусь, надеюсь поможет.

Share this post


Link to post
Share on other sites
Собрал простую программу на STM32CubeMX с ETH и LWIP.
Выкидывайте из головы все эти библиотеки - простите - этого говнокод. Пишите все свое. Столкнулся с МК от ST не так давно. Документация не всегда точная . Про библиотеки я сказал. Пишите свое, анализируя на первое и второе. Результат будет быстрее, чем спрашивать тех, кто пользуются этими либами - это очевидно. Кто ими пользуется могут ответить только - работает/не работает.

 

Share this post


Link to post
Share on other sites
Вы предлагаете самому переписать lwip или ...?

Нет -я не имел ввиду lwIP. Хотя я не использую его в своих проектах. Есть своя билиотека. Я имел ввиду библиотеки от ST. Они, на мой взгляд, не готовы для использования в серьезных проектах.

Share this post


Link to post
Share on other sites

А я так и не смог прикрутить LwIP. Наверное, у меня руки не из плеч немного.. Зато в HAL приём/отправка пакетов реализуются достаточно быстро. Можно как с прерываниями, так и без них.

Как раз случай ТС - достаточно собственно, HAL библиотеки. Инициализировать только придётся самому содержимое пакетов. Либо забивать готовым дампом заголовки.

Примерно, как это сделано в TCP/IP стэке здесь.

Кстати, использую именно логику данного примера: ZeroCopy и сборку пакета по уровням.

 

Последняя мысль к связи контроллера с сетью Ethernet без полного переписывания "родных" библиотек производителя: "О сколько грабель чудных готовит нам отладки час!".

Собственно, минимум, что можно получить:

- Не работают прерывания.

- Прерывания работают, но не те. /HardFault?/

- Прерывания работают. Всё остальное не работает.

- Работает!!!! А почему принимается только N пакетов?

- Принимается!!!! А с передачей у нас что?

- Хм...

- А, вот!

- А теперь-то что?! Как CRC? Куда оно делось? Почему пакетов два?

- Ах вот ты какой, зелёный солнёнок... Но зачем?

Edited by AlanDrakes

Share this post


Link to post
Share on other sites
А я так и не смог прикрутить LwIP.

А я смог. Перед эти был lwip на ColdFire. Драйвер сам сделал в обоих случаях. Переход был довольно безболезненным (обратите внимание, в том числе big endian --> little endian). После того, как влез в кишки lwip, и, слушая страдальцев по кубу, не верю, что наивные тыкатели в галочки куба смогут получить вменяемый Ethernet. Тут, пардон, надо разбираться в том, как эта штука работает.

Share this post


Link to post
Share on other sites
А я смог. Перед эти был lwip на ColdFire. Драйвер сам сделал в обоих случаях. Переход был довольно безболезненным (обратите внимание, в том числе big endian --> little endian). После того, как влез в кишки lwip, и, слушая страдальцев по кубу, не верю, что наивные тыкатели в галочки куба смогут получить вменяемый Ethernet. Тут, пардон, надо разбираться в том, как эта штука работает.

Я собственно этим и занимаюсь сейчас, лезу внутрь библиотеки, смотрю как оно там работает. А Куб, повторюсь, использую только для начального конфигурирования

Есть у меня желание найти рабочий пример, такой как для LPC - LEDClient, с ним у меня сходу всё получилось.

 

Примерно, как это сделано в TCP/IP стэке здесь.

Нет на сервере странички по ссылке:(

Share this post


Link to post
Share on other sites
А я смог. Перед эти был lwip на ColdFire. Драйвер сам сделал в обоих случаях. Переход был довольно безболезненным (обратите внимание, в том числе big endian --> little endian). После того, как влез в кишки lwip, и, слушая страдальцев по кубу, не верю, что наивные тыкатели в галочки куба смогут получить вменяемый Ethernet. Тут, пардон, надо разбираться в том, как эта штука работает.

У меня просто проект не компилится с использованием arm-none-eabi-gcc. Возможно, недостаточно библиотек, возможно, что-то ещё. По сути - забил на либу, решив использовать другой вполне вменяемый, легковесный стэк. Сейчас вот допиливаю его. По будням.. Сейчас занят стабилизатором питания.

 

ЗЫ: Извиняюсь, ссылка битая. Рабочая сслыка.

 

Исправил.

Edited by AlanDrakes

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this