【RT-Thread学习笔记】如何优雅地退出QEMU模拟器

本文记录了一位开发者在学习RT-Thread时遇到的如何退出QEMU模拟器的问题及其解决过程。尝试了多种方法,如、未成功,最终在官方文档中找到答案,通过在QEMU命令行输入`Ctrl+A`,然后`X`可以优雅退出,避免了控制台异常情况。作者强调了查阅官方文档的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文由RT-Thread论坛用户@recan原创发布:https://club.rt-thread.org/ask/article/3136.html

1 问题场景

相信很多人也跟我一样,刚接触RT-Thread不久,正在学习RT-Thread的路上,然而学习一款嵌入式实时操作系统,没有一个硬件开发板,在我之前的认知里面,这应该很难把RTOS的内核代码调试起来吧?

直到了解了RT-Thread,我才知道原来有QEMU模拟器这么个东西。

所以我很快就参考相关教程,把QEMU给装起来了,结合RT-Thread编译bsp的方法,很快我选择的qemu-vexpress-a9固件很快就编译出来了。

看了bsp目录下有好几个启动脚本:

bsp/qemu-vexpress-a9$ ls -al *.sh
-rwxr-xr-x 1 recan system 168 Sep  6 10:43 qemu-dbg.sh
-rwxr-xr-x 1 recan system 187 Oct 22 17:41 qemu-nographic.sh
-rwxr-xr-x 1 recan system 166 Sep  6 10:43 qemu.sh

我逐个尝试,发现在我的环境下,只有./qemu-nographic.sh能够跑起来。

bsp/qemu-vexpress-a9$ ./qemu-nographic.sh 
qemu-system-arm: -no-quit is only valid for GTK and SDL, ignoring option
WARNING: Image format was not specified for 'sd.bin' and probing guessed raw.
         Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
         Specify the 'raw' format explicitly to remove the restrictions.
ALSA lib confmisc.c:767:(parse_card) cannot find card '0'
ALSA lib conf.c:4732:(_snd_config_evaluate) function snd_func_card_driver returned error: No such file or directory
ALSA lib confmisc.c:392:(snd_func_concat) error evaluating strings
ALSA lib conf.c:4732:(_snd_config_evaluate) function snd_func_concat returned error: No such file or directory
ALSA lib confmisc.c:1246:(snd_func_refer) error evaluating name
ALSA lib conf.c:4732:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5220:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2642:(snd_pcm_open_noupdate) Unknown PCM default
alsa: Could not initialize DAC
alsa: Failed to open `default':
alsa: Reason: No such file or directory
ALSA lib confmisc.c:767:(parse_card) cannot find card '0'
ALSA lib conf.c:4732:(_snd_config_evaluate) function snd_func_card_driver returned error: No such file or directory
ALSA lib confmisc.c:392:(snd_func_concat) error evaluating strings
ALSA lib conf.c:4732:(_snd_config_evaluate) function snd_func_concat returned error: No such file or directory
ALSA lib confmisc.c:1246:(snd_func_refer) error evaluating name
ALSA lib conf.c:4732:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5220:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2642:(snd_pcm_open_noupdate) Unknown PCM default
alsa: Could not initialize DAC
alsa: Failed to open `default':
alsa: Reason: No such file or directory
audio: Failed to create voice `lm4549.out'

 \ | /
- RT -     Thread Operating System
 / | \     4.0.4 build Nov  5 2021
 2006 - 2021 Copyright by rt-thread team
lwIP-2.1.2 initialized!
[I/sal.skt] Socket Abstraction Layer initialize success.
[I/SDIO] SD card capacity 65536 KB.
[I/SDIO] switching card to high speed failed!
hello rt-thread 99, 99
1, 2
1, 2
1, 2
msh />

不过问题来了,我想重新编译源码,再次运行新的代码,怎么办呢?如何才能退出这个QEMU命令行控制台?

2 尝试解决

2.1 牛刀小试

大家都知道,Linux退出一个控制台启动的程序,使用CTRL+C就可以把它退出来,我试了一下,发现它压根就不认CTRL+C,只是一直输出一些乱码符号。
在这里插入图片描述

2.2 我放大招

既然CTRL+C不能,那我用killall -9 xxx总可以吧?难不成你还能逃脱Linux内核对你的管控?

于是另开一个控制台,直接killall -9 qemu-system-arm,结果一试,的确可以退出QEMU(连进程都退出来了)。

但是问题来了,退出QEMU之后,这个控制台感觉乱来了,我一瞧回车,它都不好好换行了,你看看!
在这里插入图片描述
这就很让人难受了,控制台没法用了,而且这个时候敲命令进去还不能回显,也不知道你敲对了没有,只好退出命令行,重新登入,控制台得以恢复。
在这里插入图片描述

2.3 黔驴技穷

上面的这种情况,显示是我不能接受的,这个我倒是想了一下,QEMU不可能不支持退出吧,会不会什么启动参数我搞错了,于是qemu-system-arm -h,找了几个看似跟这个问题相关的参数:

qemu-system-arm -h
...
-no-quit        disable SDL window close capability
...
-no-reboot      exit instead of rebooting
...
-no-shutdown    stop before shutdown

于是在qemu-nographic.sh添加来尝试:

if [ ! -f "sd.bin" ]; then
dd if=/dev/zero of=sd.bin bs=1024 count=65536
fi

qemu-system-arm -M vexpress-a9 -smp cpus=2 -kernel rtthread.bin -nographic -sd sd.bin -no-shutdown -no-quit -no-reboot

运行之后,同样在另一个控制台使用killall -9 qemu-system-arm退出,发现有的时候退出QEMU的控制台可以好好的,有的时候换行问题依然存在,没有找到规律,实在没办法,就不了了之了。

3 终极方案

3.1 发现新大陆

直到今天,我

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值