- Дебажим U-boot на реальном железе
- Подготовка железа
- Установка драйверов
- Сборка toolchain
- Установка IDE и создание проекта
- Автоматизируй это.
- Собственно, отладка
- Продолжение
- Русские Блоги
- Конфигурация U-Boot, общие команды и загрузка ramfs Linux
- Обзор
- Файл конфигурации
- Общие команды и практики
- Установить переменные среды
- Команда памяти
- Подсистема USB / MMC
- Используйте tftp для загрузки и запуска Linux ramfs
- Интеллектуальная рекомендация
- Пошаговая загрузка файла Spring MVC-09 (на основе файла загрузки клиента Servlet3.0 + Html5)
- Создайте многоканальное окно в приложениях Win32
- Путь к рефакторингу IOS-APP (3) Введение в модульное тестирование
- Tree——No.617 Merge Two Binary Trees
Дебажим 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 для сборки:
Далее, необходимо, либо включить в концигурации 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, — в появляющемся всплывающем окне будет появляться название очередной функции, которая будет вызвана. В итоге, можно получить предстваление о том, какими функциями собтсвенно, и происходит инициализация периферии:
Здесь, левая колонка — вызывающиеся функции, правая — логи в консоли, выдаваемые функцией.
Продолжение
Тут и тут можно ознакомиться с удаленной отладкой приложений пользовательского уровня. В следующей же статье надеюсь добраться до пошаговой отладки ядра.
Источник
Русские Блоги
Конфигурация 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.
Источник