本文由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 发现新大陆
直到今天,我