我正在为 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 上的一个示例:
文档已移至:https://developer.arm.com/docs/100863/latest
关于unit-testing - 在没有用户干预的情况下执行裸机程序后如何干净地退出 QEMU?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31990487/