Вопрос:
Как я могу получить вывод UART из программы «baremetal», запущенной с Qemu?
Фон
Вот вызов командной строки, который я использовал:
qemu-system-arm -M xilinx-zynq-a9 -cpu cortex-a9 -nographic -kernel $BUILD_DIR/mm.elf -m 512M -s -S
- используя машину
xilinx-zynq-a9
- процессор
cortex-a9
- поскольку это чистый металл, исполняемый файл представляет собой автономный файл ELF.
-m 512M
означает, что на платформе 512 МБ ОЗУ.-s
- это ярлык для-gdb tcp::1234
-S
означает зависание процессора при запуске
Используемый мной файл ELF (mm.elf
) выполняет простую операцию умножения матриц, а затем выводит информацию о том, удалось ли она выполнить или нет, и сколько времени потребовалось для выполнения. ELF был скомпилирован с использованием инструментария Xilinx ARM. Я использую это для программного обеспечения внедрения ошибок. В настоящее время я использую GDB, чтобы запросить значения переменных, которые должны быть напечатаны. Однако, поскольку есть много вещей, которые могут пойти не так с печатью в контексте внедрения неисправности, было бы неплохо увидеть, что на самом деле отправляется через UART.
Связанные ответы:
перенаправить вывод окна QEMU на терминал, на котором запущен qemu
Я пробовал несколько советов, но это неприменимо, потому что вопрос касался получения загрузочных сообщений Linux в окне терминала хоста.
Как запустить программу без операционной системы?
Это не очень связано, потому что все еще предполагает, что у пользователя есть какой-то загрузчик. Хотя технически для запуска приложения должен быть загрузчик, Xilinx предоставляет этот системный код в таких файлах, как boot.S, которые затем компилируются в файл ELF как код, который выполняется до main
.
Вещи, которые я пробовал:
Я попытался добавить каждый из них в конец моей текущей команды Qemu. Результаты соответствуют опробованным параметрам.
-serial mon:stdio
- nothing
-serial null -serial mon:stdio
(because Cortex-A9 has two UARTs)- nothing
- the above two with
-semihosting
added- nothing
-serial stdio
- cannot use stdio by multiple character devices
- не удалось подключить последовательное устройство к символьному серверу 'stdio'
-console=/dev/tty
- invalid option
-curses
- black screen, no output
Расследование
Я посмотрел на разборку файла ELF и убедился, что адрес, на который записываются сообщения UART, совпадает с ожидаемым настройкой Qemu (info mtree
). Базовый адрес 0xe0000000
, одинаковый в обоих местах.
Цель
Я хочу иметь возможность фиксировать вывод сообщений, отправленных на UART. Если это делается путем перенаправления на стандартный вывод, ничего страшного. Если он проходит через сокет TCP, это тоже нормально. В настройке внедрения ошибок используется Python, а Qemu работает как подпроцесс, поэтому было бы легко получить выходные данные из любого из этих источников.
Примечание: при запуске в настройке внедрения неисправности вызов Qemu
qemu-system-arm -M xilinx-zynq-a9 -cpu cortex-a9 -nographic -kernel $BUILD_DIR/mm.elf -m 512M -gdb tcp::3345 -S -monitor telnet::3347,server,nowait
Основные отличия заключаются в следующем: 1) номер порта GDB отличается (поэтому несколько экземпляров могут работать одновременно) и 2) Qemu должен управляться с помощью соединения telnet через сокет, поэтому им можно управлять с помощью скрипта Python.