unit-testing - 在没有用户干预的情况下执行裸机程序后如何干净地退出 QEMU?

标签 unit-testing arm qemu bare-metal

我正在为 ARM 系统组装一个交叉编译单元测试平台,并在带有 qemu-system-arm 的主机上运行测试。 .具体来说,我使用 qemu 来模拟 Stellaris LM3S6965 评估板,因为它包含一个 Cortex M3 处理器,就像我的目标环境一样。在 qemu 中运行的二进制文件是使用 GNU Tools for ARM 构建的。

不涉及操作系统。测试套件作为裸机应用程序在 -nographic 中使用 qemu 运行。模式。工具链和测试台本身工作正常。并且测试成功运行到完成并在 qemu 中产生测试结果也很好。

问题在于将 qemu 包装在自动构建工具中(在本例中为 Rake)。除了键盘命令之外,我还没有找到一种在测试套件运行并吐出结果后让 qemu 退出的好方法。这会导致构建环境挂起/依赖用户干预。

我看了很多,也没有找到关于如何在程序终止后完成简单退出的好资料。我确实找到了一些使用 -no-reboot 运行 qemu 的建议。选项,然后从模拟器中运行的程序触发系统重置。我试过这个。它有效……有点。我在 main() 之后将适当的值写入仿真处理器的复位向量执行,这确实会触发重置。运行测试套件后,qemu 报告捕获系统重置。但是,它将此报告为硬件错误,转储寄存器内容,然后生气地退出(下面的错误消息)。虽然这确实在测试套件运行后完成了退出,但由于 qemu 退出并出现错误情况,它会破坏自动构建脚本。

qemu: hardware error: System reset

我想避免将键盘命令插入构建以模拟用户干预。我还想避免依赖 qemu 以错误状态退出。

看来我离一个干净的导出很近,但并不完全在那里。搜索 qemu 错误消息(上图)除了与切线相关的错误报告外,没有产生任何相关文档。

main() 之后是否有导致qemu 退出的机制?在我缺少的裸机程序中返回?请问这个-no-reboot + 系统重置策略有效吗?如果是这样,还需要什么才能让 qemu 干净地退出?

最佳答案

aarch64 半主机退出

https://stackoverflow.com/a/40957928/895245给了A32,这里是A64:

.global main
main:
    /* 0x20026 == ADP_Stopped_ApplicationExit */
    mov x1, #0x26
    movk x1, #2, lsl #16
    str x1, [sp,#0]

    /* Exit status code. Host QEMU process exits with that status. */
    mov x0, #0
    str x0, [sp,#8]

    /* x1 contains the address of parameter block.
     * Any memory address could be used. */
    mov x1, sp

    /* SYS_EXIT */
    mov w0, #0x18

    /* Do the semihosting call on A64. */
    hlt 0xf000

这是 GitHub 上的一个示例:
  • the source
  • how to run it

  • 文档已移至:https://developer.arm.com/docs/100863/latest

    关于unit-testing - 在没有用户干预的情况下执行裸机程序后如何干净地退出 QEMU?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31990487/

    相关文章:

    unit-testing - 对依赖 EJB 和 UserTransaction 的类进行单元测试

    unit-testing - XCTestExpectation : API violation - multiple calls made to -[XCTestExpectation fulfill] 错误

    c# - 如何在 C# 单元测试中显示控制台窗口?

    c - 启用分页时 QEMU 三重故障

    linux - KVM 虚拟机 : Wrong Disk Size

    dos - 并发 DOS + QEMU 通过并行端口模拟丢失数据

    c# - 开发 Visual Studio 加载项时,除了手动测试之外,还有哪些测试选项?

    android - Android 操作系统是否仅用于 ARM CPU?

    c - 硬件随机数生成器错误 Arm M4

    c - 无符号整数a; while(a-- != 0) 和 while(a--> 0) ,哪个 "while"会更快?