【问题标题】:Capture QEMU Semihosted I/O捕获 QEMU 半主机 I/O
【发布时间】:2022-01-18 07:14:15
【问题描述】:

出于单元测试的目的,我希望能够使用 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 监视器 - 键入“帮助”以获取更多信息 (qemu))。就我所见,查看可用的 qemu 日志记录选项 -d help 并没有提供任何东西。

编辑

一个 hacky 解决方案是使用script 来捕获终端会话: script --quiet --command &lt;qemu-shell-script-wrapper&gt;

【问题讨论】:

    标签: arm stm32 qemu semihosting


    【解决方案1】:

    那不是上游 QEMU,而且 2.8 也很老了,但希望与上游 QEMU 一起工作的东西也能在那里工作。

    首先,假设您实际上并没有使用显示器,您可以通过删除“--nographic”而不是使用“-display none”来摆脱那部分输出。 (--nographic 同时做很多事情,包括“无图形显示”和“默认串行输出到终端,添加 QEMU 监视器并复用监视器和串行”等等。如果这就是您想要的,但有时单独指定所有内容会更容易混淆。)

    其次,您说您使用的是半主机输出,但来宾的标准库是否肯定使用半主机作为其 puts() 字符串输出而不是串行端口 (UART) 输出?无论哪种方式,输出都会在终端上输出,但是您告诉 QEMU 将其重定向到其他地方的方式会有所不同。 (我怀疑它可能使用的是 UART 输出,因为如果它使用的是半主机输出,那么您尝试的 stdout 重定向应该可以工作。)

    如果来宾的输出是通过串行端口,那么您可以使用“-serial”选项控制它的去向(最简单的是,“-serial stdio”发送到标准输出,但您也可以做更复杂的事情例如发送到文件、管道或 TCP 套接字。)。如果是通过半主机,那么您可以使用 -semihosting-config 的 'chardev=id' 子选项来控制它的去向。

    【讨论】:

    • 对于 Cortex-M 设备不支持 xPack QEMU UART,所以我认为它是实际的半主机。添加-display none 时,我仍然会弹出董事会图像。还有--chardev file,id=c0,path=/dev/stdout --semihosting-config enable=on,target=native,chardev=c0 我得到无效的参数'chardev'。这是因为我的 qemu 太旧还是我的命令调用错误?我想使用更现代的 qemu,但我想模拟一个 cortex-m4。
    • 听起来 chardev= 子选项可能不在 QEMU 分叉中。我不确定这里的“板图像”是什么,这可能是那个叉子特有的。上游 QEMU 支持 Cortex-M4,我们有使用它的 netduinoplus2 和 mps2-an386 板模型。
    猜你喜欢
    • 1970-01-01
    • 2013-10-03
    • 2018-04-19
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    相关资源
    最近更新 更多