Захват QEMU Semihosted I/O
В целях модульного тестирования я хочу иметь возможность запускать двоичный файл с нуля с qemu и фиксировать его вывод.
Образец файла:
#include <stdio.h>
#include <stdint.h>
static void qemu_exit() {
register uint32_t r0 __asm__("r0");
r0 = 0x18;
register uint32_t r1 __asm__("r1");
r1 = 0x20026;
__asm__ volatile("bkpt #0xAB");
}
int main(void) {
puts("This is some example text that I want to capture");
qemu_exit();
return 0;
}
Работает с:
qemu-system-gnuarmeclipse --nographic --no-reboot \
--board STM32F4-Discovery --mcu STM32F429ZI \
--semihosting-config enable=on,target=native \
--image <binary>
На консоли отображается:
QEMU 2.8.0-13 monitor - type 'help' for more information
(qemu) This is some example text that I want to capture
Этот «примерный текст» генерируется в QEMU, поэтому перенаправление stdout в файл не захватывает его (только: монитор QEMU 2.8.0-13 - введите «help» для получения дополнительной информации (qemu) ). Просмотр доступных параметров ведения журнала qemu
-d help
Насколько я понимаю, ничего не предлагает.
РЕДАКТИРОВАТЬ
Хакерское решение - использовать скрипт для захвата сеанса терминала:
script --quiet --command <qemu-shell-script-wrapper>
1 ответ
Это не QEMU основной ветки разработки, и версия 2.8 тоже довольно старая, но, надеюсь, там будут работать те же функции, что и в QEMU основной ветки разработки.
Во-первых, предполагая, что вы на самом деле не используете монитор, вы можете избавиться от этой части вывода, удалив «--nographic» и вместо этого используя «-display none». (--nographic делает много вещей одновременно, включая "отсутствие графического отображения", а также "вывод серийного номера на терминал по умолчанию, добавление монитора QEMU и мультиплексирование монитора и последовательного порта", среди прочего. Это удобно, если это то, что вы хотите, но иногда проще указать все по отдельности.)
Во-вторых, вы говорите, что используете вывод полухостинга, но является ли гостевая stdlib определенно использованием полухостинга для вывода строки puts(), а не вывода последовательного порта (UART)? Вывод будет выводиться на терминал в любом случае, но то, как вы скажете QEMU перенаправить его в другое место, будет отличаться. (Я подозреваю, что он может использовать вывод UART, потому что, если бы он использовал вывод полухостинга, то перенаправление stdout, которое вы пробовали, должно было сработать.)
Если вывод от гостя осуществляется через последовательный порт, вы можете контролировать, куда он идет, с помощью параметра «-serial» (наиболее просто «-serial stdio» для отправки на стандартный вывод, но вы также можете делать более сложные вещи, такие как отправка на файлы, каналы или TCP-сокеты.). Если это через полухостинг, вы можете контролировать, куда он идет, используя подопцию 'chardev=id' -semihosting-config.