QEMU学STM32

一、qemu的STM32虚拟化环境

二、Demo Makefile分析


文章目录

  • QEMU学STM32
  • 前言
  • 一、gdb调试嵌入式程序
  • 二、配置VSCode
  • 总结



前言

前面经过努力搭建了QEMU的STM32的虚拟化环境并运行了Demo。同时,分析了Makefile其实就可以开发和学习STM32了。但是命令行加gdb调试程序感觉不太方便,工欲善其事必先利其器。今天就来搞一下VSCode调试。


一、gdb调试嵌入式程序

认真读一下Demo程序的Makefile,我惊喜的发现Demo作者提供了QEMU
运行程序的调试接口。

# QEMU debug targets
$(QEMU_DBG_TARGETS): %_QEMUDBG : %_ALL
	-killall -q qemu-system-arm
	$(QEMU_ARM_DIR)qemu-system-arm -M stm32-p103 -gdb tcp::3333 -S -kernel demos/$*/main.bin

$(QEMU_DBG_PTY_TARGETS): %_QEMUDBG_PTY : %_ALL
	-killall -q qemu-system-arm
	$(QEMU_ARM_DIR)qemu-system-arm -M stm32-p103 -gdb tcp::3333 -S -kernel demos/$*/main.bin -serial pty
	
$(QEMU_DBG_TEL_TARGETS): %_QEMUDBG_TEL : %_ALL
	-killall -q qemu-system-arm
	$(QEMU_ARM_DIR)qemu-system-arm -M stm32-p103 -gdb tcp::3333 -S -kernel demos/$*/main.bin -serial tcp::7777,server

我们发现gdb的调试端口是tcp::3333,我们运行程序后,在命令行只需要通过gdb从自己的电脑3333端口连接调试即可,可以如下图尝试一下:

qemu虚拟机IP QEMU虚拟机vscode_qemu虚拟机IP


进入后运行

qemu虚拟机IP QEMU虚拟机vscode_qemu虚拟机IP_02


输入

target remote localhost:3333

就可以开始调试了,但是打端点和运行需要输入命令。我们已经习惯了在IDE中用鼠标的方式调试了,所以我搜索了一下,发现VSCode可以做到这一点。

二、配置VSCode

时间有限,ubunut安装VSCode的方法就不在这里说了,这里直接切入主题。

首先打开VSCode,将工作目录切到当前工程目录,然后按CTRL+SHIFT+D进入调试模式如下图

qemu虚拟机IP QEMU虚拟机vscode_qemu虚拟机IP_03


在lannch.json文件中添加如下内容,也可以直接点添加配置

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) 启动",
            "type": "cppdbg",
            "request": "launch",
            //我们的的STM32程序的路径,也可以是绝对路径
            "program": "${workspaceFolder}/demos/systick/main.elf",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": true,
            "MIMode": "gdb",
            //你的arm-none-eabi-gdb的安装路径
            "miDebuggerPath": "/usr/bin/arm-none-eabi-gdb",
            //在本机调试一般是localhost:端口号
            //如果程序运行在另一台电脑或者开发板(在嵌入式linux调试中经常遇到)可以是
            //ip:端口号,例如:192.168.1.123:3333
            "miDebuggerServerAddress": "localhost:3333",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

配置好之后就可以运行调试了。
首先在终端运行下面命令启动QEMU加载程序:

make systick_QEMUDBG_PTY

然后点击调试按钮开始调试

qemu虚拟机IP QEMU虚拟机vscode_嵌入式_04


可以全速运行也可以单步调试,在代码前单击就可以添加断点,使用起来非常方便。

总结

我是一个喜欢折腾的人,奈何工作真的很忙没有时间写的很详细,这里只做抛砖引玉,写的不是很详细。现在运行环境和开发调试工具都已经就绪,下一步我将记录我学习ARM汇编以及Cortex-M3的过程。最终我希望可以实现一个简单嵌入式操作系统,能够实现多任务的调度,希望感兴趣的同学一起学习。当然,实现操作系统这件事比我想象的难一点,我正在学习和进步。