Embedded linux u boot

Дебажим U-boot на реальном железе

Продолжение предыдущей статьи, в которой мы ускорили разработку под embedded linux. Рабочая станция + sftp сервер + nfs сервер ускорили на порядок (10х) доставку изменений кода на целевое железо. Теперь не нужно часами компилировать код. В этой статье продолжаем очеловечивать разработку. На этот раз прикручиваем полноценную графическую IDE и пошаговую отладку кода на целевом железе с помощью программатора J-Link. Но пока только загрузчика U-boot. И автоматизируем развертывание рабочей среды разработчика с помощью Docker.

Микропроцессор, используемый в статье — imx6ull (ArmV7), программатор — j-link. В случае, если ваш процессор есть в списке поддерживаемых архитектур, — то у вас есть все шансы повторить все шаги, описанные в статье и получить возможность полноценной отладки программного кода на удаленном железе. По крайней мере, с ARM-ами затруднений возникнуть не должно. В данной статье рассматривается только отладка загрузчика (u-boot). Надеюсь, что и до ядра доберемся в одной из следующих статей.

Подготовка железа

Подключаем программатор по JTAG к целевой железке.

подключаем программатор по USB к хосту (рабочему ПК).

подключаем железку к хосту с помощью COM-порта.

подаем питание на железку.

Может случиться такое, что, в ядре выводы JTAG-интерфейса переинициализируются на другие функции. В этом случае, сразу после подачи питания нужно не дать загрузчику начать загрузку ядра. Для этого нужно в консоли нажать любую клавишу до окончания обратного отсчета и остаться в консоли загрузчика.

Установка драйверов

Скачиваем драйвера j-link и устанавливаем их:

Сборка toolchain

В вашем случае он может быть уже предустановлен/предскомпилирован. В нашем случае компилируем:

Установка IDE и создание проекта

Скачиваем Eclipse IDE for Embedded C/C++ Developers и распаковываем архив в /opt/eclipse.

Нажимаем File —> New Project и выбираем Makefile Project with Existing Code:

Задаем каталог с исходниками U-boot. В нашем случае, их можно найти в build_dir/target-arm_cortex-a7+neon-vfpv4_musl_eabi/u-boot-wirelessroad_ecspi3/u-boot-2017.07:

Далее, необходимо задать переменные окружения для корректной работы eclipse с вашим toolchain. Для этого кликаете правой кнопкой мыши на проект в окне Eclipse, нажимаете Properties, а далее — C/C++ Build —> Environment и создаете несколько переменных:

Переменная STAGING_DIR специфична для OpenWrt, — вам она, возможно, и не нужна.
Далее редактируем уже имеющуюся переменную PATH, добавив в ее начало следующее:

Здесь, несколько каталогов тулчейна, разделенных двоеточием. В итоге, должно получиться следующее:

Следующим шагом отключаем дефолтный компилятор:

и задаем пути к заголовочным файлам нашего тулчейна:

Не забываем включить параллельную сборку:

Готово. Теперь можно попробовать собрать u-boot. Нажмите правой кнопкой мыши на проект и затем Clean Project для очистки проекта, Build Project для сборки:

Читайте также:  Загрузочный файлы для установки windows

Далее, необходимо, либо включить в концигурации u-boot опцию CONFIG_TOOLS_DEBUG, либо с помощью утилиты make menuconfig, либо в ручную задав в .config файле следующее:

Возможно, в ide вы не найдете этого файла, поскольку он скрыт. Включить отображение скрытых файлов можно следующим образом:

После этого пересоберите проект, чтобы отладочные символы попали в итоговый бинарник.

Осталось совсем чуть-чуть, а именно настроить конфигурацию программатора. Нажмите Run —> Debug Configurations и задайте настройки:

Автоматизируй это.

Довольно длительная последовательность действий и практически каждый клиент, использующий наше BSP, каждый новый разработчик на каком-нибудь этапе да и споткнется, проверено на практике. Поэтому, логично будет автоматизировать развертнывание всей среды разработки, включая скачивание исходных кодов, сборку тулчейна и установку IDE. При этом, упаковка в docker контейнер дает надежку, что вся процедура развертывания будет более-менее стабильно разработать на максимально большом количестве компьютеров. Таким образом, вся выше-описанная инструкция заменяется четырьмя консольными командами:

И уже из консоли контейнера:

Исходники среды и более подробную инструкцию с некоторыми пояснениями можно найти тут. Eclipse, к сожалению, имеет ограниченные возможности для работы из консоли, но, к счастью, он portable. Таким образом, один раз настроив проект в eclipse, и упаковав его обратно в архив, можно переносить пред-настроенную IDE с машины на машину. Использование docker, в добавок к изоляции среды позволяет также решить возможные ошибки при распаковке архива по другому пути. В теории должно работать, практика покажет как оно на самом деле.

И последнее, — грязный хак, без которого, в нашем случае, u-boot не хотел работать под отладчиком. Вначале, в консоли u-boot вводим:

и данное значение хард-кодим в u-boot/lib/fdtdec.c в функции fdtdec_setup():

Как этот костыль заменить корректными методами мы пока, к сожалению, не разобрались. Надеюсь, осилим в ближайшее время, но пока так. В вашем случае, если eclipse не сможет стартануть отладку кода, может оказаться полезным запустить отладку в консольном режиме. Для этого запускаете GDBServer:

а следом запускаете консольный дебаггер, где u-boot — скомпилированный ранее образ загрузчика:

а далее шагаете до участка кода, на котором все рушится:

Тут можно ознакомиться с тем, как мы искали проблемный код.

Собственно, отладка

Задаем точку остановки, например функцию initcall_run_list, которая в цикле запускает функции инициализации перферии:

И нажимаем на кнопку Debug, а следом на кнопку Resume:

В итоге, должны попасть в выбранную нами функцию. Попробуйте нажать на кнопку Step Over несколько раз — курсор текущего положения должен начать перемещаться по коду:

Давайте попробуем начать знакомство с u-boot. Дойдя до строчки подсвеченной зеленым цветом на предыдущем скриншоте поставьте на ней точку остановки (двойной щелчок левой кнопкой мыши по синему полю слева напротив нужной строки), а далее нажимайте на кнопку Resume. После каждого нажатия на Resume, наводите курсор init_fnc_ptr, — в появляющемся всплывающем окне будет появляться название очередной функции, которая будет вызвана. В итоге, можно получить предстваление о том, какими функциями собтсвенно, и происходит инициализация периферии:

Здесь, левая колонка — вызывающиеся функции, правая — логи в консоли, выдаваемые функцией.

Читайте также:  Mac os monterey vmware

Продолжение

Тут и тут можно ознакомиться с удаленной отладкой приложений пользовательского уровня. В следующей же статье надеюсь добраться до пошаговой отладки ядра.

Источник

Русские Блоги

Конфигурация U-Boot, общие команды и загрузка ramfs Linux

Обзор

Das U-Boot — это главный загрузчик с открытым исходным кодом, используемый для упаковки инструкций во встроенные устройства для загрузки ядра операционной системы устройства. Он часто используется для загрузки и загрузки ядер и файловых систем Linux на встроенных устройствах с архитектурой ARM.
U-Boot поддерживает запуск интерфейса командной строки через последовательный порт. Используя командную строку, пользователи могут загружать и загружать ядро, возможно, изменяя параметры по умолчанию. Также есть команды для чтения информации об устройстве, чтения и записи во флэш-память, загрузки файлов (ядра, загрузочного образа и т. Д.) Из последовательного порта или сети, управления деревом устройств и использования переменных среды (которые могут быть записаны в постоянное хранилище) для Управляйте поведением U-Boot, например командой загрузки по умолчанию и тайм-аутом перед автоматической загрузкой, а также данными оборудования, такими как MAC-адрес Ethernet.

Файл конфигурации

Важная информация о конфигурации U-Boot определена в файле:

Например, общий файл конфигурации по умолчанию для MX6:

В этом файле конфигурации (или при самостоятельном воссоздании нового файла конфигурации) вы можете настроить некоторые часто используемые функции следующим образом:

Команда запуска конфигурации должна загрузить uImage из толстого раздела mmc0 по адресу памяти 0x40007000, а затем запустить ядро ​​отсюда.

После настройки U-Boot есть 3 секунды, чтобы нажать Enter для входа в интерфейс командной строки.Если он настроен на 0, процесс запуска не может быть прерван.

Это конфигурация, относящаяся к сети, которая поддерживает функции загрузки Ethernet MII, ping, dhcp и tftp.

Настройте выход последовательного порта по умолчанию как ttySAC2.

по CONFIG_EXTRA_ENV_SETTINGS Параметры для установки среды U-Boot. Среда U-Boot — это блок памяти, который хранится в постоянном хранилище и копируется в ОЗУ при запуске U-Boot. Он используется для хранения переменных среды, которые можно использовать для настройки системы. Среда защищена контрольной суммой CRC32. В дополнение к ipaddr и serverip, настроенным выше, есть следующие часто используемые переменные среды

переменная Описание
bootargs Содержимое этой переменной передается ядру Linux в качестве параметров загрузки (также называемых «командной строкой»).
bootcmd Эта переменная определяет командную строку, которая автоматически выполняется, когда начальный обратный отсчет не прерывается. Эта команда выполняется только тогда, когда bootdelay определяет переменные!
bootdelay После сброса U-Boot будет ждать это количество секунд перед выполнением содержимого переменной bootcmd. В этот период печатается обратный отсчет, и обратный отсчет можно прервать, нажав любую кнопку.
ethaddr Ethernet MAC-адрес первого / единственного интерфейса Ethernet
ipaddr IP-адрес; требуется команда tftp
loadaddr Адрес загрузки по умолчанию таких команд, как tftp или load
serverip IP-адрес TFTP-сервера; требуется команда tftp.

Общие команды и практики

Вот некоторые наиболее часто используемые команды после ввода командной строки:

команда Описание
help Распечатать онлайн-справку
bootm Запустить зеркалирование приложений из памяти
bootz Запустить Linux zImage из памяти
ext4load Загрузить двоичные файлы из раздела Ext4
ext4ls Список файлов в каталоге
fatinfo Распечатать информацию о файловой системе
fatls Список файлов в каталоге
fatload Загрузить двоичный файл из файловой системы dos
md Отображение памяти
mm Модификация памяти (автоинкремент)
mtest Простой тест RAM
mw Запись в память
mmc Подсистема MMC
ping Отправить ICMP ECHO_REQUEST на хост
printenv Печатать переменные среды
reset Сбросить CPU
setenv Установить переменные среды
saveenv Сохранить переменные среды в постоянное хранилище
usb подсистема usb
tftpboot Используйте протокол TFTP для загрузки образа по сети

Установить переменные среды

использовать setenv Чтобы установить переменные среды, связанные с tftp, а затем используйте printenv Распечатайте эти переменные

использовать saveenv (Если есть эта команда) для сохранения этих переменных

Команда памяти

использовать md с mw Чтобы отобразить и изменить данные памяти, md с mw Формат команды аналогичен

[.b, .w, .l] соответствовать [Байт 8 бит, слово 16 бит, двойное слово 32 бита]
Затем установите для памяти 0x82000000-0x82000100 нулевое значение (часть журнала отображения опущена)

Подсистема USB / MMC

Сначала с usb start Дайте U-образному диску нормально работать, а затем используйте fatload С первого раздела U диска с номером устройства 0 u-boot.bin Копировать в память 0x82000000 Место, а потом по памяти 0x82000000 Должность u-boot.bin Скопируйте в область размещения u-boot eMMC (здесь сектор 0x2-0x400)

Если на USB / MMC-диске уже есть раздел FAT / EXT4, вы можете его использовать fatls/ext4ls Чтобы просмотреть информацию о файлах в разделе

Вот список всей информации о файлах из первого раздела FAT U-диска с номером устройства 0.

Теперь попробуйте загрузить и запустить ramfs Linux с диска U

Сначала пройдите сюда fatload Загрузите образ ядра, DTB и образ ramfs с диска U в память, затем настройте параметры загрузки ядра Linux и, наконец, запустите ramfs Linux из памяти.

Используйте tftp для загрузки и запуска Linux ramfs

Первое использование ping Команда для обеспечения связи с tftp сервером

Загрузите и запустите Linux ramfs с tftp-сервера

Сначала пройдите сюда tftpboot Загрузите образ ядра, DTB и образ ramfs в память, затем настройте параметры загрузки ядра Linux и, наконец, запустите ramfs Linux из памяти.

Интеллектуальная рекомендация

Пошаговая загрузка файла Spring MVC-09 (на основе файла загрузки клиента Servlet3.0 + Html5)

пример тестовое задание Исходный код Несмотря на загрузку файлов в Servlet3.0 +, мы можем очень легко программировать на стороне сервера, но пользовательский интерфейс не очень дружелюбен. Одна HTML-ф.

Создайте многоканальное окно в приложениях Win32

Создайте многоканальное окно в приложениях Win32, создайте несколько оконных объектов одного и того же класса Windows, а окна объектов разных классов окон. .

Путь к рефакторингу IOS-APP (3) Введение в модульное тестирование

IOS-APP реконструкция дороги (1) структура сетевых запросов IOS-APP реконструкция дороги (два) Модельный дизайн При рефакторинге нам нужна форма, позволяющая вносить смелые изменения, обеспечивая при .

Tree——No.617 Merge Two Binary Trees

Problem: Given two binary trees and imagine that when you put one of them to cover the other, some nodes of the two trees are overlapped while the others are not. You need to merge them into a new bin.

Источник

Читайте также:  Драйвер для hp laserjet 1010 windows server
Оцените статью