- Какие знания нужны для Embedded Linux?
- Building Embedded Linux Systems
- mcu.by
- Услуги разработки встраиваемого ПО и контрактная разработка электроники на ShuraCore
- U-Boot и uClinux
- U-Boot и uClinux.
- U-Boot.
- uClinux.
- Embedded Linux в двух словах. Первое
- Das U-Boot
- ARM Toolchain
- Ядро Linux
- Корневая файловая система. BusyBox
Какие знания нужны для Embedded Linux?
Какие знания (кроме языка С) нужны для Embedded Linux? Как лучше всего начать?
электроника, цифровая схемотехника
Знание целевой архитектуры.
Я могу ошибаться, но одной из систем сборки типа Yocto/OpenEmbedded. или Buildroot, и прочие.
Можно готовить такие образы вручную, но почему бы не освоить систему сборки.
А есть какой-то популярный стандарт?
Каждая архитектура имеет свой собственный стандарт, если можно так выразиться. Например x86, MIPS, ARM, etc.
Короче, что именно ты хочешь изучить? Я с трудом представляю изучение без цели и конкретики.
Можешь купить себе Raspberry Pi — можно даже сказать что это embedded, и тренироваться на этой штуке.
ХЗ, нравится Linux, нравится С, вот думаю о будущем, так сказать. Учусь в техническом универе, интегральную электронику знал хорошо, но программирования микропроцессоров/микроконтроллеров не было.
Вот здесь перечень процессоров ARM, поддерживаемых ядром 3.x: http://www.arm.com/community/software-enablement/linux.php (во вкладке «Linux OS Downloads»).
Выбирай на вкус, изучай. Купи кит на нём и засабачь туда Линукс, пиши проги.
Купи себе Raspberry Pi, будешь самым модным, умным и крутым 🙂
То что надо тебе для изучения, без лишнего гемора 🙂
Думаю будут полезны
— «Операционные системы. Разработка и реализация», Э. Таненбаум, А. Вудхалл;
— «Архитектура компьютера», Э. Таненбаум.
В этой книге архитектура какого компьютера? И насколько применимо к например raspberry?
Там даны фундаментальные знания, но тебе этого не понять.
Там даны фундаментальные знания, но тебе этого не понять.
Да уж, действительно. Пойду поплачу )))
Мог бы поискать оглавление в гугле и не засорять тред.
Описывается архитектура разных ЭВМ на разных уровнях, в том числе на уровне внутренностей процессоров.
А на этом Pi свет клином не сошелся. Тем более есть жалобы на качество — Raspberry PI портит корень.
Для кого-то кит (development board и т.п.) — «лишний гемор», а для кого-то — то, что нужно и интересно.
Мог бы, но взял и не поискал. Свои советы, которые посчитал нужными, я уже написал. Вопросы?
Бывает брак, но что — обделаться теперь и не покупать популярную плату с широким разнообразием поддерживаемого софта?
Плакать не надо, но и нести чушь тоже.
Судя по отзывам в интернете, у них там постоянный брак. Причём они вечно из-за этого переделывают железо и выпускают всё новые и новые его редакции. Скорее стабильный Распберри Пи в таком случае является приятным исключением.
Плакать не надо, но и нести чушь тоже.
Да что ж мне все сегодня хамят =))) Я уже давно на это серьезно не реагирую, поставь мне диагноз развесели.
Судя по отзывам в интернете, у них там постоянный брак.
Учту. Сам планирую малинку заказывать 🙂
вновь не поленюсь толкнуть идею что mk802+arduino круче
Если интересно работать на низком уровне, то можно начать с микроконтроллеров на базе ARM Cortex-M3, например, и попрограммировать на голом железе без ОС. По-моему будет очень полезно.
Потом попробовать простенькие ОС как FreeRTOS, работающие без MMU на тех же самых микроконтроллерах.
Затем Линукс на процах потяжелее. Разные уровни embedded будут перед глазами — сможешь осознано выбирать.
Здесь есть несколько класных текстов на русском.
Этот блог в плане сборки ядер под ARM тоже очень помог.
Хорошие простые для освоения слайды, всегда любил их. Они под свободной лицензией по самым разным тематикам. Правда последнее время они в Android ударились.
Они специализируются на как раз Embedded Linux. Эти слайды + упражнения не сильно подходят мне по части сборки системы, т.к. я осваиваю Yocto, но что касается драйверов — там универсально.
Минимум для задачи максимум (не рассматривая детские варианты, когда есть гарантированно рабочая плата с SD картой куда по методичке можно вкорячить готовый бинарный образ).
1. Немного цифровой схемотехники (как минимум преобразование уровней, #CS и прочие простые электронные вещи для работы с переферией). Умение из usb rs232 сколхозить usb uart.
2. JTAG (может и не пригодится, но лучше знать и уметь).
3. Кросскомпиляция (понимать что где и куда).
4. Сборка и прошивка загрузчика для целевой платформы (чаще всего u-boot, но бывают и другие)
5. Сборка и прошивка ядра, rootfs и целевого ПО.
6. Если целевая платформа работает с/через сеть то весьма пользительно tftp/bootp/nfs.
Учусь в техническом универе, интегральную электронику знал хорошо, но программирования микропроцессоров/микроконтроллеров не было.
В таком случае, просто разбирайся углубленно в Linux и C. Параллельно займись простыми микроконтроллерами (например, AVR). После этого переход в область Embedded Linux будет легким.
Источник
Building Embedded Linux Systems
There’s a great deal of excitement surrounding the use of Linux in embedded systems — for everything from cell phones to car ABS systems and water-filtration plants — but not a lot of practical information. Building Embedded Linux Systems offers an in-depth, hard-core guide to putting together embedded systems based on Linux.
Updated for the latest version of the Linux kernel, this new edition gives you the basics of building embedded Linux systems, along with the configuration, setup, and use of more than 40 different open source and free software packages in common use. The book also looks at the strengths and weaknesses of using Linux in an embedded system, plus a discussion of licensing issues, and an introduction to real-time, with a discussion of real-time options for Linux.
This indispensable book features arcane and previously undocumented procedures for:
- Building your own GNU development toolchain
- Using an efficient embedded development framework
- Selecting, configuring, building, and installing a target-specific kernel
- Creating a complete target root filesystem
- Setting up, manipulating, and using solid-state storage devices
- Installing and configuring a bootloader for the target
- Cross-compiling a slew of utilities and packages
- Debugging your embedded system using a plethora of tools and techniques
- Using the uClibc, BusyBox, U-Boot, OpenSSH, thttpd, tftp, strace, and gdb packages
By presenting how to build the operating system components from pristine sources and how to find more documentation or help, Building Embedded Linux Systems greatly simplifies the task of keeping complete control over your embedded operating system.
Источник
mcu.by
Услуги разработки встраиваемого ПО и контрактная разработка электроники на ShuraCore
U-Boot и uClinux
U-Boot и uClinux.
U-Boot и uClinux.
U-Boot.
U-Boot – универсальный загрузчик ориентированный на встраивание систем на базе архитектур ARM, NIOS II, MIPS и других. Может быть установлен в загрузочную ПЗУ и от туда запущен, является загрузчиком второго уровня (в основном). U-boot ориентирован на запуск Linux, для микроконтроллеров uClinux(может быть использован для загрузки обычных прошивок).
Статья посвящена U-Boot и uClinux. Основной тип операционных систем используемых для микроконтроллеров остается RTOS. При наличии большой бизнес логики используют Linux. Для обеспечения реального времени применяют AMP, RTLinux и др. U-Boot (Universal bootloader) — универсальный загрузчик.
Запуск U-boot на одной из поддерживаемых им плат обычно не требует редактирования исходного кода. Зная, что файл настроек include/configs/”Платформа.h” уже составлен, необходимо выбрать нужную конфигурацию, скомпилировать и записать получившийся образ на загрузочный носитель (NAND, NOR т.д.).
Что касается микроконтроллеров, необходимо значительный объем памяти на микроконтроллере, или поддержка нативной адресации ПЗУ (ROM) со стороны внешней памяти микроконтроллера, в случае отсутствии последнего, bin файл загружается из внешней памяти (NOR, SD и др.) в RAM с нативной адресацией.
Важность Das U-Boot в Embedded Linux системах достаточно лаконично изложена в книге Embedded Linux системы, Карим Ягмур. Текст о U-Boot начинается словами: «Хотя существует довольно много других загрузчиков, Das U-Boot, универсальный загрузчик, возможно, является самым богатым, самым гибким и наиболее активно развивающимся из загрузчиков с открытым исходным кодом». U-boot может использовать следующие файловые системы:
Для работы с U-Boot и uClinux для микроконтроллеров понадобиться репозиторий с github u-boot.
Все эксперименты будут происходит на базе данного репозитория, в качестве отладочной платы используется stm32f746g-disco и операционная система ubuntu 14.04 (можно использовать иные дистрибутивы Linux).
Для сборки u-boot нам понадобиться GNU Cross-Build Tools (возможно вам придется еще установить ia32-libs).
Распаковываем Cross-Build Tools и добавляем его в PATH.
В конце файла добавляем строку.
Основные директории для нашей отладочной платы:
Для примера изменим файл board.c функцию checkboard.
В директории lib-arm нужно открыть файл config.mk и изменить компилятор на arm-uclinuxeabi (можно передать как аргумент при сборке системы).
Сохраняем файл и в корне каталога выполняем следующею команду.
Затем находим необходимый VCP(COM-порт).
Затем bin файл зашиваем в плату с помощью openocd.
Запускаем sudo minicom -s или запускаем sudo gtkterm и
подключить VCP к Serial 6.
Для читателей которые еще не использовали openocd, переходим по ссылке openocd и скачиваем данный репозиторий к себе на компьютер.
uClinux.
Следующим моментом будет настройка tftp сервера.
Аргумент /srv/tftp команды in.tftpd указывает на каталог в котором будут храниться файлы TFTP сервера. Заменим /srv/tftp на /tftpboot.
Создадим директорию /tftpboot:
Чтобы новые настройки вступили в силу, перезапустим службу inetd:
нужно записать в директорию с проектом networking.uImage (скачиваемым образ с emcraft) и настраиваем окружение для u-boot (нужно воспользоваться командой setenv, saveenv, printenv).
Итого: установили U-Boot и uClinux, собрали исполняемый bin файл и запустили uClinux.
Источник
Embedded Linux в двух словах. Первое
В этой небольшой серии статей я попытаюсь пролить свет на тему построения Embedded Linux устройств, начиная от сборки загрузчика и до написания драйвера под отдельно разработанный внешний модуль с автоматизацией всех промежуточных процессов.
Платформой послужит плата BeagleBone Black с процессором производства Техасских Инструментов AM3358 и ядром Arm Cortex-A8, и, чтобы не плодить мигающие светодиодами мануалы, основной задачей устройства будет отправка смайлов в топовый чат, широко известного в узких кругах, сайта, в соответствии с командами от смайл-пульта. Впрочем, без мигания светодиодами тоже не обошлось.
Итак, на столе лежит чистая, т.е. без каких-либо предустановленных дистрибутивов, плата BeagleBone Black, блок питания, переходник USB-UART. Для общения с платой, переходник нужно подключить к 6-ти выводному разъему, где первый вывод обозначен точкой — это GND, выводы 4/5 — RX/TX соответственно. После установки скорости в какой-либо терминальной программе, например putty, на 115200, можно взаимодействовать с платой, о подключении подробнее и с картинками здесь.
Топовые чаты, пульты и светодиоды будут позже, а сейчас на плату подается питание и плата отвечает CCCCCCCCCCC
В переводе с бутлоадерского это означает, что первичному загрузчику, зашитому в ROM процессора, нечего загружать. Ситуацию проясняет Reference Manual, где на странице 5025 в разделе 26.1.5 описана процедура начальной загрузки. Процедура такая: первичный загрузчик проводит некоторую инициализацию: тактирование процессора, необходимой периферии, того же UART, и, в зависимости от логических уровней на выводах SYSBOOT, строит приоритетный список источников где можно взять следующий загрузчик, т.е. посмотреть сначала на MMC карте, SPI-EEPROM или сразу ждать данных по Ethernet.
Я использую способ загрузки с помощью SD карты, вот что говорит об этом раздел RM 26.1.8.5.5 на странице 5057: первичный загрузчик сначала проверяет несколько адресов 0x0/ 0x20000/ 0x40000/ 0x60000 на наличие так называемой TOC структуры, по которой он может определить загрузочный код, если так код не найти, то первичный загрузчик, предполагая на SD карте наличие файловой системы FAT, будет искать там файл с названием MLO, как это расшифровывается в RM не сказано, но многие склоняются что Master LOader. Возникает резонный вопрос, где же взять этот MLO?
Das U-Boot
Das U-Boot или просто U-Boot — Universal Boot Loader, один из самых, если не самый, распространенный загрузчик для встроенных систем, именно с его помощью можно создать требуемый вторичный загрузчик (MLO), который будет загружать третичный загрузчик (сам U-Boot), который будет загружать ядро Linux.
Перед скачиванием U-Boot, стоит сходить в репозиторий и найти тег последней версии, далее
U-Boot содержит больше тысячи конфигураций, в том числе нужную:
Это конфигурация платы AM335x evaluation module, этот модуль лежит в основе других плат, в том числе BeagleBone Black, что можно видеть, к примеру, по Device Tree, но о нем позже. Настраивается и собирается U-Boot с помощью Kconfig, то же, что используется и при сборке ядра Linux.
Установка нужного конфига:
Можно, к примеру, убрать, установленную по умолчанию, 2-х секундную задержку при загрузке платы с U-Boot
Boot options —> Autoboot options —> (0) delay in seconds before automatically booting
В вышеуказанных командах, используется компилятор по умолчанию, если таковой в системе установлен, и, скорее всего, он не подходит для ARM процессоров, и здесь пора упомянуть о кросскомпиляции.
ARM Toolchain
Один из видов кросскомпиляции это сборка на одной архитектуре, как правило x86-64, именуемой HOST, исходного кода для другой, именуемой TARGET. Например, для TARGET архитектуры ARMv7-A, ядра ARM CortexA-8 процессора AM3358, платы BeagleBone Black. К слову, чтобы не запутаться в ARM’ах, даже есть свой справочник, так их много и разных.
Сама сборка осуществляется набором инструментов — компилятор, компоновщик, runtime библиотеки, заголовочные файлы ядра; так называемый Toolchain. Toolchain можно собрать самостоятельно либо с помощью crosstool-NG, а можно взять готовый от компании Linaro, или самой ARM. Здесь я буду использовать Toolchain от ARM “GNU Toolchain for the A-profile Architecture Version 10.2-2020.11, x86_64 Linux hosted cross compilers, AArch32 target with hard float (arm-linux-none-gnueabihf)», если не вдаваться в излишние подробности, то это все означает, что набор инструментов будет работать на десктопной машине с Linux и собирать программы для 32-х битной ARM платформы с аппаратной поддержкой операций с плавающей запятой.
Теперь для успешной сборки U-Boot, нужно указать в переменных ARCH и CROSS_COMPILE требуемые архитектуру и путь к кросскомпилятору соответственно, например так
Либо использовать export ARCH/CROSS_COMPILE , чтобы каждый раз не набирать все это. Я, для наглядности, буду каждый раз набирать все это.
После сборки U-Boot, в папке появятся необходимые файлы, а именно
MLO — вторичный загрузчик (напомню, первичный зашит в самом процессоре)
u-boot.img — третичный загрузчик, собственно U-Boot
Для успешной загрузки с SD карты, нужно ее некоторым образом разметить. Карта должна содержать минимум два раздела, первый, отмеченный как BOOT, с файловой системой FAT, второй раздел с ext4. Разметить карту можно, к примеру, программой fdisk.
Теперь нужно просто скопировать результаты сборки U-Boot в FAT раздел, вставить карту в BeagleBone Black и в терминале наблюдать уже более осознанный ответ платы
В ответе платы есть такие строки
Failed to load ‘boot.scr’
Failed to load ‘uEnv.txt’
U-Boot, во время загрузки, смотрит наличие дополнительных команд, сначала в файле boot.scr, при его наличии, затем, если boot.scr не нашлось, в uEnv.txt. Эти файлы, помимо очередности при поиске, отличаются тем, что в файле uEnv.txt, дополнительные команды представлены в текстовом виде, т.е. он проще для восприятия и редактирования. U-Boot не создает файлы с дополнительными командами, делать это нужно самостоятельно.
Здесь происходят некоторые манипуляции в результате которых U-Boot загружает из SD карты в RAM по адресу [loadaddr] — образ ядра [zImage], и по адресу [fdtaddr] — дерево устройств [Flattened Device Tree]. Формируются аргументы, передаваемые ядру Linux, это параметры консоли, к которой подключен переходник USB-UART [console=ttyS0,115200n8], место размещения корневой файловой системы [bootpartition=mmcblk0p2], параметры разрешения на чтение/запись корневой файловой системы [rw], ее тип [ext4] и ожидание появления корневой файловой системы [rootwait]. Чтобы раскрутить всю цепочку действий U-Boot, можно, после того как U-Boot прекратит попытки найти что бы загрузить и выдаст приглашение на работу в виде =>, ввести команду printenv , она покажет значения всех переменных, которыми располагает U-Boot.
В завершении своей работы U-Boot, командой bootz , вместе с вышеуказанными аргументами и адресом дерева устройств, передает управление ядру Linux.
Ядро Linux
Прежде чем приступать к любым действиям с ядром, стоит заглянуть сюда и убедится в наличии необходимых пакетов. Следующим шагом нужно определиться с тем, какую версию ядра использовать. Здесь я использую версию 5.4.92 и вот по каким соображениям. Одной из основных причин того, что не стоит брать просто последнюю версию ядра, доступную на данный момент, наряду с наличием драйверов, является невозможность быстро протестировать это ядро на всем разнообразии платформ поддерживаемых Linux, а значит можно потратить кучу сил и времени на исправление неполадок, если что-то пойдет не так, и не факт что это вообще получится сделать. BeagleBone Black имеет официальный репозиторий, где можно найти версию ядра, протестированную на данной платформе, и long term версия 5.4.92 была последней на тот момент.
Нужный конфиг, расположенный в /arch/arm/configs, называется omap2plus_defconfig, OMAP — это название линейки процессоров, продолжением которых является AM3358, впринципе, подойдет и более общий multi_v7_defconfig.
Сам конфиг пока остается без изменений, поэтому можно просто его установить и запустить компиляцию ядра(zImage), модулей(modules) и дерева устройств(dtbs)
Проходит некоторое время.
Результат сборки, в виде zImage, находится в /arch/arm/boot, там же в папке /dts находится скомпилированное дерево устройств am335x-boneblack.dtb, оба отправляются на SD карту к файлам загрузчика. На этом FAT раздел SD карты можно считать скомплектованным. Итого, там присутствуют:
MLO — вторичный загрузчик
u-boot.img — третичный загрузчик
uEnv.txt — дополнительные команды загрузчика
zImage — образ ядра Linux
am335x-boneblack.dtb — скомпилированное дерево устройств платы
Еще при сборке ядра заказывались модули ядра, но они уже относятся к корневой файловой системе.
Корневая файловая система. BusyBox
Ядро получает корневую файловую систему путем монтирования блочного устройства, заданного в, переданном при запуске ядра, аргументе root=, и далее, первым делом, исполняет оттуда программу под названием init.
Если запустить BeagleBone Black, имея только вышеуказанные файлы для FAT раздела, то ядро будет паниковать по причине отсутствия init и, в целом, по причине пустой rootfs, т.е. корневой файловой системы.
Можно шаг за шагом создать все минимально необходимые компоненты корневой файловой системы, такие как оболочка, различные демоны запускаемые init, сам init, конфигурационные файлы, узлы устройств, псевдофайловые системы /proc и /sys и просто системные приложения. Для желающих совершать подобные подвиги, существует проект Linux From Scratch, здесь же я воспользуюсь швейцарским ножом встроенных систем с Linux, утилитой BusyBox.
Скачивание последней, на тот момент, версии:
Настройка конфигурации по умолчанию:
Чтобы не думать сейчас о разделяемых библиотеках, стоит установить статическую сборку BusyBox:
Settings —> Build static binary (no shared libs)
Установка в папку по умолчанию _install:
Теперь в папке _install можно видеть будущую корневую файловую систему, в которую нужно добавить некоторые вещи.
Папки, помимо созданных BusyBox:
Стартовый скрипт. Дело в том, что, запускаемая в первую очередь, программа init, делает много полезного, например, выводит в консоль приглашение, но до выдачи приглашения, init проверяет наличие стартового скрипта /etc/init.d/rcS, и, при наличии, запускает его.
Этот скрипт монтирует псевдофайловые системы proc и sysfs, и ничего не мешает ему запускать, к примеру, пользовательскую программу, отвечающую за функционал устройства, но лучше будет делать это в отдельных скриптах, скомпонованных по функциональному назначению.
Стоит сказать, что работа init, на самом деле, начинается с чтения конфигурационного файла /etc/inittab, но BusyBox’овская init включает таблицу inittab по умолчанию, если таковой не окажется в корневой файловой системе.
Теперь пора вспомнить про модули ядра. Их также нужно разместить в корневой файловой системе в /lib/modules/5.4.92/, но сейчас они разбросаны по всей папке в которой собиралось ядро. Чтобы собрать модули в кучу, нужно в папке с ядром выполнить
Где в INSTALL_MOD_PATH указать путь к папке с корневой файловой системой, кросскомпилятор указывать не нужно, т.к. здесь модули ядра просто копируются по месту назначения. В результате папка /lib корневой файловой системы пополнится разделом /lib/mudules/5.4.92/ содержащим модули ядра, полученные при компиляции ядра.
Осталось скопировать все содержимое папки _install во второй раздел SD карты, тот который с ext4, и поменять владельца всего содержимого на root.
После запуска BeagleBone Black с корневой файловой системой, через 1.910315 секунды после старта ядра, система предложит активировать консоль и начать работу.
Но начать работу в такой системе, скорее всего не получится, т.к. в ней нет ничего кроме системных утилит BusyBox и моей небольшой программы, нарисовавшей приветствие, зато, эта система поможет получить общее представление о том, какая магия происходит внутри подобных устройств. Именно общее, т.к. в реальных устройствах, из-за необходимости минимизации времени загрузки, ограниченности ресурсов, заточенности под конкретную задачу, различий между ARM процессорами, построение системы может сильно отличаться. Например, на малинке, вообще сначала стартует графический процессор, который затем запускает все остальное.
По поводу же заявленных в начале драйверов, взаимодействия с внешними устройствами, автоматизации сборки и некоторого полезного функционала, пойдет рассказ в следующей статье.
Источник