Дебажим U-boot на реальном железе |
||
МЕНЮ Главная страница Поиск Регистрация на сайте Помощь проекту Архив новостей ТЕМЫ Новости ИИ Голосовой помощник Разработка ИИГородские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Искусственный интеллект Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Нейронные сети начинающим Психология ИИ Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Творчество ИИ Техническое зрение Чат-боты Авторизация |
2021-09-20 18:47 Продолжение предыдущей статьи, в которой мы ускорили разработку под embedded linux. Рабочая станция + sftp сервер + nfs сервер ускорили на порядок (10х) доставку изменений кода на целевое железо. Теперь не нужно часами компилировать код. В этой статье продолжаем очеловечивать разработку. На этот раз прикручиваем полноценную графическую IDE и пошаговую отладку кода на целевом железе с помощью программатора J-Link. Но пока только загрузчика U-boot. И автоматизируем развертывание рабочей среды разработчика с помощью Docker. Микропроцессор, используемый в статье - imx6ull (ArmV7), программатор - j-link. В случае, если ваш процессор есть в списке поддерживаемых архитектур, - то у вас есть все шансы повторить все шаги, описанные в статье и получить возможность полноценной отладки программного кода на удаленном железе. По крайней мере, с ARM-ами затруднений возникнуть не должно. В данной статье рассматривается только отладка загрузчика (u-boot). Надеюсь, что и до ядра доберемся в одной из следующих статей. Подготовка железа
Может случиться такое, что, в ядре выводы JTAG-интерфейса переинициализируются на другие функции. В этом случае, сразу после подачи питания нужно не дать загрузчику начать загрузку ядра. Для этого нужно в консоли нажать любую клавишу до окончания обратного отсчета и остаться в консоли загрузчика. Установка драйверов Устанавливаем gdb-multiarch: Скачиваем драйвера 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, - вам она, возможно, и не нужна. Здесь, несколько каталогов тулчейна, разделенных двоеточием. В итоге, должно получиться следующее: Следующим шагом отключаем дефолтный компилятор: и задаем пути к заголовочным файлам нашего тулчейна: Не забываем включить параллельную сборку: Готово. Теперь можно попробовать собрать u-boot. Нажмите правой кнопкой мыши на проект и затем Clean Project для очистки проекта, Build Project для сборки: Далее, необходимо, либо включить в концигурации u-boot опцию CONFIG_TOOLS_DEBUG, либо с помощью утилиты make menuconfig, либо в ручную задав в .config файле следующее: Возможно, в ide вы не найдете этого файла, поскольку он скрыт. Включить отображение скрытых файлов можно следующим образом: После этого пересоберите проект, чтобы отладочные символы попали в итоговый бинарник. Осталось совсем чуть-чуть, а именно настроить конфигурацию программатора. Нажмите Run --> Debug Configurations и задайте настройки: Автоматизируй это. Довольно длительная последовательность действий и практически каждый клиент, использующий наше BSP, каждый новый разработчик на каком-нибудь этапе да и споткнется, проверено на практике. Поэтому, логично будет автоматизировать развертнывание всей среды разработки, включая скачивание исходных кодов, сборку тулчейна и установку(например с Driverpaksolution) 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, - в появляющемся всплывающем окне будет появляться название очередной функции, которая будет вызвана. В итоге, можно получить предстваление о том, какими функциями собтсвенно, и происходит инициализация периферии: Здесь, левая колонка - вызывающиеся функции, правая - логи в консоли, выдаваемые функцией. Продолжение Тут и тут можно ознакомиться с удаленной отладкой приложений пользовательского уровня. В следующей же статье надеюсь добраться до пошаговой отладки ядра. Источник: habr.com Комментарии: |
|