运行与调试

运行应用程序

应用程序镜像既可以运行在真实硬件上,也可以运行在模拟器上。Zephyr 内核已经包含了一个支持 QEMU 的内置模拟器,它允许你在将镜像加载、运行到真实目标硬件之前进行模拟仿真测试。

  1. 打开一个中断控制台,并进入应用程序目录 ~/app

  2. 输入如下命令来使用一个 QEMU 所支持的板级配置(例如 qemu_cortex_m3 或者 qemu_x86)来编译、运行应用程序:

    $ make [BOARD=<type> ...] run
    

    Zephyr 编译系统先产生一个 zephyr.elf 镜像文件,然后在终端控制台上面运行它。

  3. 输入 Ctrl A, X 可停止 QEMU 仿真的过程。

    应用程序将停止运行,然后终端会重新显示控制台的提示符。

调试应用程序

本节是利用 QEMU 调试应用程序的快速上手参考手册,里面的多数内容都已在 QEMUGNU_Debugger 参考手册中涵盖。

在这个快速参考手册中,您可以找到有助于您快速设置您的调试环境的捷径、环境变量和参数。

调试运行在 QEMU 中的应用程序的最简单的方法是使用 GNU Debugger —— 通过 QEMU 在您的开发系统中设置一个本地的 GDB Server。

为了调试,您需要一个 ELF 格式的二进制镜像文件。编译系统会在输出目录里自动产生该镜像。默认情况下,内核镜像的名字是 zephyr.elf,但是您也可以通过 Kconfig 选项对其进行修改。

我们将使用表示的 1234 TCP 端口来打开一个 GDB 服务实例。您可以根据您的实际开发环境修改该端口号。

您可以让 QEMU 在执行代码前先监听 gdb 连接:

qemu -s -S <image>

上面的代码会让 QEMU 监听端口 1234,并等待一个 GDB 连接。

上面使用的选项的含义是:

  • -S 在 QEMU 启动时先不要启动 CPU;您需要在监视器中输入 ‘c’ 时它才会继续运行。
  • -s 这是 -gdb tcp::1234: 的简写,用于在 TCP 端口 1234 上面打开一个 GDB Server。

要达到上面的目录,您可以直接在应用程序的目录下输入如下命令:

make BOARD=qemu_x86 debugserver

上面的命令会使编译系统启动 QEMU 实例,并让它在启动时挂起 CPU,并开启一个监听 1234 端口的 GDB Server。

使用本地 GDB 配置文件 .gdbinit 有助于您每次运行时初始化 GDB 实例。在这个例子中,当初始化文件执行 GDB Server 实例时,它会尝试连接本地主机的端口号 1234 的 TCP 连接。初始化时会将内核的根目录作为参考目录。

The .gdbinit file contains the following lines:

target remote localhost:1234
dir ZEPHYR_BASE

注解

可以通过变量 ZEPHYR_BASE 替换当前内核的根目录。

gdbinit 文件的同一目录下执行应用程序。如果需要使用中断用户接口,您可以在命令行包含 --tui 选项。 下面的命令将使用 gdb 来连接 GDB Server。在这个例子里面,elf 文件的名字是 zephyr.elf

$ gdb --tui zephyr.elf

注解

某些开发系统的 GDB 版本可能不支持 –tui 选项。、

如果您没有使用 .gdbinit 文件,则需要在 GDB 里面发出如下命令来连接 GDB Server:

(gdb) target remote localhost:1234

最后,您可以使用下面的命令来使用数据显示器调试器 (Data Displayer Debugger (ddd))来连接 GDB Server。 这个命令会从 elf 二进制文件中加载符号表。

ddd --gdb --debugger "gdb zephyr.elf"

如果您的开发系统中默认没有安装 DDD,请按照您系统对应的方法进行安装。