Отладочные средства🔗
Создание и настройка отладочной сессии Vitis🔗
Отладочная конфигурация🔗
Для осуществления процесса отладки с возможностью доступа ко внутренним ресурсам SoC необходимо создать отладочную сессию. Для этого требуется создать и настроить отладочную конфигурацию. Все действия выполняются средствами GUI Vitis.
СОВЕТ
Графическая оболочка Vitis при запуске использует системную тему оформления, и если эта тема тёмная, то отображение окон программы оказывается очень некомфортным – многие места является нечитаемыми из-за низкого контраста текста и фона. Исправить это путём настройки цветовой схемы в полной мере не удаётся, намного более простым и эффективным путём является указание темы при загрузке программы, например:
Создание отладочной конфигурации🔗
Диалог отладочных сессий🔗
Первым действием является активация диалога отладочных сессий:
Далее, нужно создать отладочную конфигурацию, указав имя и тип:
Затем задать опции приложения: CPU, имя ELF образа.
И завершающие действия: задать файл Hardware Platform (.xsa), файл скрипта инициализации и другие опции:
Файл .xsa является zip-архивом, содержащим набор файлов описания аппаратной платформы – описания сигналов, исходный код инициализации регистров периферии и т.д. Этот файл генерируется системой сборки в build/src
.
Скрипт инициализации (ps7_init.tcl
) осуществляет действия, аналогичные выполняемым на рантайме при вызове функции pc7_init()
(исходный код в файле ps7_init.c
). Этот скрипт полезен, когда требуется запустить приложение (.elf) без использования загрузчика, что обычно и нужно при отладке. В описываемом сценарии – тандемный запуск "загрузчик-прикладная программа" – использование этого скрипта не требуется, т.к. загрузчик выполняет нужные действия с помощью штатной ps7_init()
. Тем не менее, указать путь к этому скрипту необходимо, т.к. без него отладочная сессия не запускается, выдавая ошибку:
ЗАМЕЧАНИЕ
Отладочная сессия Vitis не является необходимой для загрузки и запуска программы в SoC, это можно сделать, например, с помощью команд консоли xsct
:
При этом необходимо, чтобы hardware server был запущен. При запуске отладочной сессии его запускает Vitis. В случае без использования Vitis hardware server предварительно нужно запустить руками (как это делается, описано в официальной документации).
Пример загрузки с помощью консоли xsct
показан ниже.
Загрузка в режиме отладки🔗
В процессе разработки значительно удобнее и быстрее запускать код путём непосредственной загрузки образов (ELF) в память SoC. Для корректной работы необходимо проимитировать процесс штатной загрузки, который состит из двух этапов:
- запуск загрузчика (это часть, которой посвящен данный раздел);
- запуск прикладной программы.
В результате работы загрузчика и непосредственно перед запуском прикладной программы SoC находится в следующем состоянии:
- низкоуровневая инициализация (SCU, MMU, кэши) выполнена;
- все четыре сегмента OCM размещены по адресу
0xfffc0000
в виде непрерывной области памяти. - таблица векторов прерываний размещена по адресу
0xfffc0000
; - таблица трансляции MMU находится по адресу
0xffffc000
[^1]; - инициализация периферийных устройств PS части SoC выполнена загрузчиком (файл
ps7_init.c
).
Всю эту работу осуществил загрузчик, и проэмулировать его работу средствами отладки весьма проблематично. С другой стороны, программировать флешь память при каждой отладочной итерации является неудачным решением: это затратно по времени, это расходует ресурс флешь памяти и, главное, теряется (или сильно затрудняется) возможность иметь доступ к отладочным средствам в виде инспекции объектов программы, установки точек останова и т.п.
Поэтому для организации отладочной сессии применяется следующий сценарий. Хост:
- производит сброс SoC;
- загружает (через JTAG) образ загрузчика (ELF);
- устанавливает точку останова на функции
load_img
; - запускает программу загрузчика;
- дожидается останова работы программы, что означает, что загрузчик остановился в точке перед непосредственно загрузкой прикладной программы из флешь памяти;
- удаляет точки останова;
- загружает образ прикладной программы (вместо
load_img
); - запускает работу программы.
Описанный сценарий в виде Tcl скрипта, пригодный для запуска из консоли xsct:
proc rl { } {
rst
dow build/zed/sw/apu/bld/bld.elf
bpadd load_img
con
while { [state] == "Running" } {
}
bpremove -all
dow build/zed/sw/apu/cam/cam.elf
con
}
Таким образом, описанный алгоритм эмулирует работу связки "загрузчик-прикладная программа", позволяя при этом иметь все возможности пользоваться отладочными средствами благодаря тому, что в SoC заргужен полноценный образ ELF.