Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Продолжаю мучить изернет для STM32F417 без ОС.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Oleg_IT
Собрал простую программу на STM32CubeMX с ETH и LWIP. Пытаюсь установить соединение, как показано в примерах
CODE
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.
Все примеры, которые я нашёл это или эхо клиент, сервер или протоколы высокого уровня, а мне нужно просто гонять бинарные буфера между модулем и компьютером. Помогите поднять соединение.
Непомнящий Евгений
А почему вы акцентируете внимание на отсутствии ОС? Надо писать промежуточный слой что для ОС, что для голого железа.

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

LWIP имеет развитую систему логов, попробуйте для начала их все включить и посмотреть, что происходит. Включите логи в вашем драйвере ethernet, пакеты приходят/уходят?
Oleg_IT
Цитата(Непомнящий Евгений @ Dec 25 2015, 15:40) *
А почему вы акцентируете внимание на отсутствии ОС? Надо писать промежуточный слой что для ОС, что для голого железа.

Посмотрел свой код, не вижу у вас вызовов 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();
С логами разберусь, надеюсь поможет.
prottoss
Цитата(Oleg_IT @ Dec 25 2015, 17:34) *
Собрал простую программу на STM32CubeMX с ETH и LWIP.
Выкидывайте из головы все эти библиотеки - простите - этого говнокод. Пишите все свое. Столкнулся с МК от ST не так давно. Документация не всегда точная . Про библиотеки я сказал. Пишите свое, анализируя на первое и второе. Результат будет быстрее, чем спрашивать тех, кто пользуются этими либами - это очевидно. Кто ими пользуется могут ответить только - работает/не работает.
Oleg_IT
Цитата(prottoss @ Dec 25 2015, 16:31) *
Выкидывайте из головы все эти библиотеки - простите - этого говнокод.

Вы предлагаете самому переписать lwip или ...?
prottoss
Цитата(Oleg_IT @ Dec 25 2015, 19:11) *
Вы предлагаете самому переписать lwip или ...?

Нет -я не имел ввиду lwIP. Хотя я не использую его в своих проектах. Есть своя билиотека. Я имел ввиду библиотеки от ST. Они, на мой взгляд, не готовы для использования в серьезных проектах.
AlanDrakes
А я так и не смог прикрутить LwIP. Наверное, у меня руки не из плеч немного.. Зато в HAL приём/отправка пакетов реализуются достаточно быстро. Можно как с прерываниями, так и без них.
Как раз случай ТС - достаточно собственно, HAL библиотеки. Инициализировать только придётся самому содержимое пакетов. Либо забивать готовым дампом заголовки.
Примерно, как это сделано в TCP/IP стэке здесь.
Кстати, использую именно логику данного примера: ZeroCopy и сборку пакета по уровням.

Последняя мысль к связи контроллера с сетью Ethernet без полного переписывания "родных" библиотек производителя: "О сколько грабель чудных готовит нам отладки час!".
Собственно, минимум, что можно получить:
- Не работают прерывания.
- Прерывания работают, но не те. /HardFault?/
- Прерывания работают. Всё остальное не работает.
- Работает!!!! А почему принимается только N пакетов?
- Принимается!!!! А с передачей у нас что?
- Хм...
- А, вот!
- А теперь-то что?! Как CRC? Куда оно делось? Почему пакетов два?
- Ах вот ты какой, зелёный солнёнок... Но зачем?
scifi
Цитата(AlanDrakes @ Dec 25 2015, 19:51) *
А я так и не смог прикрутить LwIP.

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

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

Цитата(AlanDrakes @ Dec 25 2015, 20:51) *
Примерно, как это сделано в TCP/IP стэке здесь.

Нет на сервере странички по ссылкеsad.gif
AlanDrakes
Цитата(scifi @ Dec 26 2015, 01:11) *
А я смог. Перед эти был lwip на ColdFire. Драйвер сам сделал в обоих случаях. Переход был довольно безболезненным (обратите внимание, в том числе big endian --> little endian). После того, как влез в кишки lwip, и, слушая страдальцев по кубу, не верю, что наивные тыкатели в галочки куба смогут получить вменяемый Ethernet. Тут, пардон, надо разбираться в том, как эта штука работает.

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

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

Исправил.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.