1. Главная страница » Компьютеры » Lwip документация на русском

Lwip документация на русском

Автор: | 16.12.2019

lwIP (англ. lightweight IP ) широко используемый TCP/IP-стек с открытым исходным кодом, предназначенный для встраиваемых систем. LwIP был первоначально разработан Адамом Дункельсом [en] в Шведском институте компьютерных наук и в настоящее время разрабатывается и поддерживается командой разработчиков.

LwIP используется многими производителями встраиваемых систем, например, Altera (в операционных системах для архитектуры Nios II) [2] , Analog Devices (процессоры Blackfin) [3] [4] , Xilinx [5] и Honeywell (системы авионики). Также на основе lwIP создан TCP/IP драйвер операционной системы ReactOS [6] .

Вместе с lwIP Адам Данкелс создал ещё один TCP/IP стек — uIP. Этот стек оптимизировали для минимизации используемой памяти, в нём не используется динамическое выделение памяти (куча).

Мы уже изучили плотненько две микросхемы, предназначенные для передачи данных по интерфейсу LAN: это ENC28J60 и W5500. Это микросхемы от двух разных производителей. Первая включает в себя два уровня — канальный и физический, а вторая — ко всему этому ещё также сетевой и транспортный, то есть является своего рода воплощением в себе на аппаратном уровне готового стека TCP/IP. Это очень удобно для разработчика, так как не приходится писать весь стек, как мы делали в случае с ENC28J60, но накладывает ряд ограничений на свободу действий, так как кое-что нельзя изменить в работе стека, хотя есть режим RAW, который позволяет стек отключить. Но я не стал использовать данный режим, так как код скорее всего был бы похож на код всех уроков по первой микросхеме, а зачем нам повторение — это была бы огромная потеря времени, а у нас ведь ещё столько всего неизведанного.

Поэтому сегодня мы попробуем поработать с ещё одной микросхемой, которая занимается передачей данных по этой шине — это LAN8720. Данная микросхема, как и первый упомянутый представитель, является детищем компании Microchip, только она на своём борту содержит исключительно только физический уровень. Казалось, бы это накладывает огромную ответственность на разработчика, обязывая его грамотно организовать столько уровней, но это вовсе не так. Потому что на помощь нам приходит библиотека LWIP. Данная библиотека была первоначально разработана Адамом Данкелсом в шведском институте Computer and Networks Architectures (CNA). В данный момент данной библиотекой занимается группа разработчиков (lwIP developers group) распространяется она по модифицированной лицензии BSD, то есть является бесплатной для пользования. LWIP (lightweight IP) является библиотекой, в которой реализован стек протоколов с исходным кодом, поддерживающий следующие протоколы:

  • IPv4 and IPv6 (Internet Protocol v4 and v6)
  • ICMP (Internet Control Message Protocol) for network maintenance and debugging
  • IGMP (Internet Group Management Protocol) for multicast traffic management
  • UDP (User Datagram Protocol) • TCP (Transmission Control Protocol)
  • DNS (Domain Name Server)
  • SNMP (Simple Network Management Protocol)
  • DHCP (Dynamic Host Configuration Protocol)
  • PPP (Point to Point Protocol)
  • ARP (Address Resolution Protocol)

И это не все протоколы, которые поддерживаются данной библиотекой, существует ещё несколько.

Также существует три API-интерфейса, которые можно использовать для разработки ПО для передачи данных

RAW / native API — интерфейс, используемый без операционной системы. Имеет ряд недостатков, но также и ряд преимуществ, например обеспечивает свободу действий, которой зачастую не хватает более продвинутым программистам.

Netconn API — представляет собой высокоуровневый последовательный API, для которого требуется операционная система реального времени (RTOS). API Netconn позволяет выполнять многопоточные операции.

BSD Socket API — API-интерфейс, похожий на Berkeley-Socket (разработанный поверх API-интерфейса Netconn).

Мы пока будем работать с первым интерфейсом RAW. Во-первых потому, что мы ещё как следует не изучили операционную систему FreeRTOS, а во-вторых, нам не привыкать самим сервить события сети и, думаю, не составит слишком большого труда обойтись без использования ОС.

Про саму микросхему LAN8720 много рассказывать не приходится, так как там нет такого обилия регистров, как у W5500.

Стоит сказать о том, что она уже в отличие от W5500 полноправно поддерживает технологию Auto-MDIX, поддержки которой зачастую не хватает для соединения узлов без использования хабов и роутеров, то есть напрямую, обычным не кроссоверным кабелем.

Также данная микросхема поддерживает обмен на скоростях 10/100 мегабит в секунду как в полудуплексном, так и в полнодуплексном режимам, само собой поддерживается режим Auto-negotiation, позволяющий узлам договариваться между собою о скоростях обмена данными.

Читайте также:  Elex все приходится делать самому

Остальные прелести данной микросхем, думаю, мы ощутим, когда начнём ей пользоваться. Также вы можете всегда скачать последнюю версию технической документации на данную микросхему на официальном сайте компании-производителя и ознакомиться со всеми интересующими вас тонкостями этой микросхемы.

Давайте посмотрим расположение ножек на ней

Данные ножки представляют собой все необходимые контакты для шины RMII, про которую мы поговорим чуть позже и также все необходимые контакты для обеспечения физического уровня, также само собой есть ножки для тактирования с помощью кварцевого резонатора, а также ножки для питания.

Данная микросхема у меня находится на модуле от WaveShare. От данной компании мы часто используем модули.

Вот так выглядит наш модуль

Все контакты обозначены, то есть пользоваться можно спокойно.

Только подключить данную микросхему, а равно и модуль мы можем ни к каждому контроллеру. Так как у данной микросхемы нет канального уровня, то он должен поддерживаться и желательно аппаратно самим микроконтроллером. В качестве такого контроллера мы возьмём STM32F407VG, который расположен на нашей любимой плате STM32F4-Discovery, с которой мы прошли ранее немало уроков и знаем о ней далеко не понаслышке.

В данный момент на многие, да не на многие, а почти все свои платы нового поколения STM устанавливает также подобную микросхему, правда более нового поколения, но разницы в работе я пока не заметил. Но так как на нашей любимой Discovery 4 нет такой микросхемы, а многим, я уверен, хочется с данной платой организовать сетевой обмен данными, мы подключим к ней именно такой модуль, так как две рассмотренные нами ранее микросхемы с присутствующим в них канальным уровнем к данной отладочной плате подключать нет смысла ибо на МК, расположенном на ней, уже есть аппаратно реализованный канальный уровень, и, думаю, что нет никакого резона ему простаивать.

К микроконтроллеру STM32F407 подобные микросхемы, имеющие только физический уровень, подключаются по одному из межканальных интерфейсов MII или RMII. Это похожие шины, отличающиеся незначительно. Данные передаются по разным направлениям по отдельным проводам. Для передачи и приёма данных в MII используются по 4 провода для каждого из направлений. Интерфейс является синхронным, то есть есть ножка синхронизации, на которую подаются в случае использования MII импульсы частотой 25 мегагерц. Следовательно мы за один тик синхронизации передаём сразу 4 бита информации. Вот так и получается наша скорость 100 мегабит в секунду. Причём можем передавать с такой скоростью одновременно по обоим направлениям, так как у нас по 4 провода на каждое направление. В случае использования RMII у нас уже в наличии проводов вдове меньше, то есть только по 2 провода на направление, но за счёт того, что тактирование уже производится с частотой 50 мегагерц, то мы также пердаём и принимаем данные со скоростью 100 мегабит в секунду. Вот оно и различие этих интерфейсов.

Давайте я также приведу наглядные примеры передачи данных по интерфейсам из документации к контроллеру

Теперь, думаю, всем стало намного очевиднее. Мы видим, что тактирование на интерфейсе RMII вдвое быстрее, а ножек вдвое меньше.

Мы с вами будем использовать именно RMII, так как у нас выбора нет, потому что наша микросхема LAN8720 работает именно по такому интерфейсу. В этом есть положительная сторона. Мы выигрываем в количестве проводов, но это накладывает на нас ответственность за качество этих самых проводов. Мы не можем их использовать слишком длинные, так как 50 мегагерц для передачи данных — скорость уже не малая, хотя и не очень большая. Думаю, экранировать провода не придется. По крайней мере, у меня всё прекрасно передаётся.

Вот так вот у меня подключена микросхема к плате (нажмите на картинку для увеличения изображения)

Также давайте подключим переходник USB-TTL для управления и мониторинга по интерфейсу USART. Подключим мы его к контактам шины USART6

Именно к шине USART6 я подключил переходник не только из соображений удобства его расположения скраю, но ещё из-за совместимости с платой STM32F4DIS-BB, которая имеется у меня также в наличии, в которую очень удобно вставляется отладочная плата STM32F4-DISCOVERY и которая очень удобна, так как в ней есть много готовых решений, например микросхема LAN8720 там уже установлена на борту. Кроме этого можно подключить дисплей и для которого выведены отдельные ножки, видеокамеру, также имеется картоприёмник Micro-SD, вообщем много чего интересного. Вот её вид сверху

Читайте также:  Macbook air 2017 разборка

А вот так данная плата выглядит вместе с вставленной в неё отладочной платой STM32F4-DISCOVERY

Как мы видим, USART выполнен на данной плате в виде разъёма COM-порта и схематически он подключен именно к USART6. Правда мне пока не удалось его задействовать. Не ужился он пока с моим виртуальным COM-портом, но тем не менее именно поэтому я без использования данной платы расширения свой переходник USB-TTL подключил именно к контактам шины USART6.

Сначала мы поработаем без платы расширения, а потом я, с вашего позволения, перейду именно на неё, мне так удобнее, а вы можете продолжать пользоваться именно модулем от WaweShare, который также удобен, причём стоит он очень недорого. Ну это конечно, если у вас нет платы расширения STM32F4DIS-BB, если есть, то рекомендую использовать именно её. Причём потом я расскажу о главном отличии настройки проекта с использованием платы расширения и без использования оной. Я не сразу это заметил, что вообще мне не позволяло обходиться без этой платы.

В следующей части урока мы создадим и настроим проект, напишем несколько функций и попробуем на практике соединиться с сервером TCP.

Отладочную плату можно приобрести здесь: STM32F4-DISCOVERY

Модуль LAN можно приобрести здесь: LAN8720

Плату расширения можно приобрести здесь: STM32F4DIS-BB

Переходник USB to TTL можно приобрести здесь ftdi ft232rl

Смотреть ВИДЕОУРОК (нажмите на картинку)

LwIP — это стек протоколов TCP/IP с открытым исходным кодом. Первоначально LwIP был
разработан Адамом Дункельсом в Шведском институте компьютерных наук, сейчас разработка ведется силами сообщества.
LwIP получил очень широкое распространение во встраиваемых системах на базе микроконтроллеров благодаря
низкому потреблению оперативной памяти. Именно этот TCP/IP стек используется в фреймворке ARM mbed и генераторе кода инициализации STM32CubeMX.
LwIP распространяется под BSD лицензией.

В состав стека LwIP входят такие протоколы :

  • IPv4 и IPv6 (Интернет протокол 4-ой и 6-ой версий)
  • ICMP (протокол межсетевых управляющих сообщений)
  • IGMP (протокол управления группами Интернета)
  • UDP(протокол пользовательских датаграмм)
  • TCP(протокол управления передачей)
  • DNS(система доменных имен)
  • SNMP(простой протокол сетевого управления)
  • DHCP(протокол динамической настройки узла)
  • PPP(двухточечный протокол канального уровня)
  • ARP(протокол определения адреса)

Архитектура стека LwIP построена на модели, включающей четыре уровня абстракции. Список уровней от самого низкого до самого высокого :

  • Уровень связи (link layer) содержит технологии коммуникации для одного сегмента локальной сети.
  • Интернет уровень (IP) соединяет независимые сети, устанавливая межсетевое взаимодействие.
  • Транспортный уровень обрабатывает соединения между хостами.
  • Прикладной уровень содержит все протоколы для передачи данных между процессами.

В стеке LwIP доступно три интерфейса прикладного программирования (API) :

  • RAW API – родной интерфейс LwIP. Он предусматривает использование обратных вызовов функций (callbacks) внутри стека.
    Это означает, что вам перед началом работы со стеком необходимо присвоить указатели на функции-обработчики событий,
    которые в процессе работы будут вызываться внутри LwIP. RAW API имеет наибольшую производительность и наименьший результирующий размер кода.
  • Netconn API – высокоуровневый последовательный интерфейс, построенный поверх RAW API. Этот интерфейс требует наличия RTOS и поддерживает мнопоточные операции.
  • BSD Socket API – высокоуровневый интерфейс сокетов, разработанный поверх Netconn API. Этот интерфейс обеспечивает высокую переносимость ваших приложений, поскольку является стандартизированным API.

В состав пакета программ STM32CubeMX от компании STMicroelectronics входят примеры работы со стеком LwIP для отладочных плат STM32.
Именно этими примерами мы воспользуемся для первоначального ознакомления со стеком.
Я буду использовать отладочную плату NUCLEO_F429ZI на микроконтроллере STM32F429ZI, к которому через интерфейс RMII подключен физический уровень Ethernet на микросхеме LAN8742A.

После установки STM32CubeMX примеры программ можно найти в каталоге STM32CubeRepositorySTM32Cube_FW_F4_V1.21.0ProjectsSTM32F429ZI-NucleoApplications.
Для демонстрации работы NUCLEO_F429ZI со стеком LwIP доступен только один пример, — HTTP сервер, использующий интерфейс Netconn API и работающий под управлением FreeRTOS (с интерфейсом CMSIS_RTOS первой версии).

Именно с этого примера мы и начнем наше знакомство со стеком Lightweight IP. Открываем проект в предпочитаемой среде разработки (IAR EWB, MDK-ARM, SW4STM32). Я буду это делать в бесплатной SW4STM32, построенной на базе Eclipse CDT.

Читайте также:  Http mil ru личный кабинет

Собираем и запускаем проект, а если ничего не получается, то читаем readme.txt 🙂 . В этом файле указано название руководства пользователя UM1713 “Интерфейс STM32Cube с LwIP и приложениями” для более детального изучения примера, а также предоставлено краткое описание основных файлов проекта.

Пример собирается в SW4STM32 без проблем, для загрузки прошивки в микроконтроллер достаточно подключить плату NUCLEO_F429ZI к компьютеру и скопировать бинарный файл на диск NODE_F429ZI.

По-умолчанию в примере используется динамическое назначение IP адреса с помощью DHCP . Узнать назначенный адрес можно с помощью консольной команды

Я установил для своей платы статический IP адрес 192.168.1.10 . Для этого необходимо закоментировать строку «#define USE_DHCP» и отредактировать IP адрес платы и шлюза в файле main.h.
После прошивки платы подключаем ее к компьютерной сети и набираем в строке браузера адрес web-сервера (в моем случае http://192.168.1.10).

Теперь настало время разобраться в работе web -сервера, изучая исходный код примера.
В главной функции main создается и запускается одна-единственная задача StartThread, которая выполняет начальную инициализацию lwip и запуск остальных задач.
Если вы ранее работали c FreeRTOS, но синтаксис функций вам кажется незнакомым (или не работали с RTOS вообще), ознакомьтесь с документацией CMSIS_RTOS API.

Первой вызывается функция tcpip_init , в которой производится начальная инициализация lwip и запуск задачи (программного потока), отвечающей за работу TCP/IP стека. Исходный код tcpip_init находится в файле tcpip.c .Второй вызываемой функцией является статическая функция Netif_Config , объявленная в файле main.c.

В этой функции назначается IP адрес платы (динамически или статически в зависимости от макроса USE_DHCP), маска сети и адрес шлюза .
Функция netif_add производит инициализацию структуры netif назначенными параметрами. Также в ней присваивается указатель на функцию инициализации Ethernet интерфейса ethernetif_init и функцию обратного вызова для обработки принятого пакета tcpip_input.

В функции netif_default_init регистрируется ранее инициализированная структура netif для использования в качестве сетевого интерфейса по-умолчанию.
Завершаем инициализацию проверкой флага NETIF_FLAG_LINK_UP и запуском интерфейса с помощью функции netif_set_up или отключением интерфейса с помощью функции netif_set_down в зависимости от значения флага.

Глубокого понимание инициализирующей последовательности на данном этапе от нас не требуется.

Дальше по коду производится инициализация web -сервера с помощью функции http_server_netconn_init, внутри которой создается новая задача (программный поток) для обработки запроса к web -серверу.
Web -сервер в этом примере очень простой, он обрабатывает только один запрос HTTP протокола. GET – запрос (команда GET) предназначен для получения указанного файла от web – сервера. Если это, например, html — файл , то он будет отображен в вашем браузере, архивный файл будет загружен на ваш компьютер и сохранен на жестком диске. Тип передаваемого контента указывается в параметрах GET – запроса.
Для получения подробной информации необходимо обратиться к спецификации протокола HTTP .
Исходный код обработки запроса к серверу можно просмотреть в функции http_server_netconn_thread из файла httpserver-netconn.c .

Вдаваться в подробности реализации web – сервера от компании STMicroelectronics мы не станем, потому что наша цель — научиться использовать стек LwIP.
Для нас на данном этапе наиболее важным моментом является понимание каким образом можно подключить
Ethernet драйвер к LwIP. Второе, чему мы должны научится , — это настраивать стек LwIP.


Интерфейс LwIP с драйвером Ethernet.

Для связывания LwIP стека с Ethernet интерфейсом микроконтроллеров stm32f4xx используется файл ethernetif.c.
Порт стека LwIP , предназначенный для работы с микроконтроллерами stm32f4xx, находится в каталоге lwip/system .

Вот перечень основных функций Ethernet драйвера :

  • low_level_init – вызывает функции драйвера для инициализации Ethernet периферии stm32f4xx .
  • low_level_output – вызывает функции драйвера для отправки Ethernet пакета.
  • low_level_input — вызывает функции драйвера для приема Ethernet пакета.
  • ethernetif_init – инициализирует структуру сетевого интерфейса (netif) и вызывает low_level_init.
  • ethernetif_input – вызывает low_level_input, чтобы принять пакет и потом передать его в стек LwIP.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *