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

Mic*_*sky 8 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
Run Code Online (Sandbox Code Playgroud)

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

我似乎接近一个干净的出口,但不是那里.搜索qemu错误消息(上面)除了切线相关的错误报告之外没有产生任何相关文档.

有没有一种机制可以让main()我在缺少的裸机程序中返回后退出qemu ?这个-no-reboot+系统重置策略会起作用吗?如果是这样,还有什么必要让qemu干净利落?

小智 5

我建议对ARM处理器使用Angel接口。这对于调试非常有帮助。您可以在ARM信息中心阅读有关它的内容。特别要看一下QEMU将了解您的应用程序已结束的操作angel_SWIreason_ReportException(0x18)和参数ADP_Stopped_ApplicationExit

不要忘记使用-semihosting参数运行QEMU,如下所示:

qemu-system-arm -nographic -semihosting -kernel your_binary
Run Code Online (Sandbox Code Playgroud)

这是告诉QEMU停止的代码(您必须使用一些汇编程序):

register int reg0 asm("r0");
register int reg1 asm("r1");

reg0 = 0x18;    // angel_SWIreason_ReportException
reg1 = 0x20026; // ADP_Stopped_ApplicationExit

asm("svc 0x00123456");  // make semihosting call
Run Code Online (Sandbox Code Playgroud)

您也可以在我使用它的github上查看我的项目。


Mic*_*sky 1

对我来说最干净的选择是获取与我们已经使用的版本接近的 Qemu 稳定版本的源代码。以下指的是Qemu源码1.1.2版本。

我修改了 Cortex M3 + Stellaris LM3S6965 评估板的复位向量处理仿真armv7m_nvic.c。我将hw_error()呼叫替换为对 的呼叫qemu_system_reset_request()。此内部系统调用将重置虚拟机,但也会响应-no-reboot命令行选项以进行干净关闭,如我最初的问题中所述。

在获取Qemu 1.1.2 的快照后,这些构建说明对我有用。我遇到了几个构建错误,但网络搜索很快就解决了每个问题。