调试期间 Qt Creator 中的外设寄存器

Posted

技术标签:

【中文标题】调试期间 Qt Creator 中的外设寄存器【英文标题】:Peripheral registers in Qt Creator during debugging 【发布时间】:2016-12-11 20:56:47 【问题描述】:

我使用 Qt Creator 为 STM32 使用 Bare Metal 配置开发嵌入式应用程序。当我在不同的 IDE(如 KIEL uVision、IAR System Workbench 或某些 Eclipse IDE)下调试此应用程序时,我有特殊的视图可用,我可以在树列表中看到处理器特定的寄存器。 Qt Creator 有类似的东西吗?

我在调试视图中看到了寄存器视图。有没有可能告诉它显示哪个内存地址?

编辑:我正在编写的应用程序是用 C 和 C++ 编写的。在这种情况下,目标是基于 ARM 架构的微控制器 STM32。不会有 Qt 或 QML 代码。

我的目标是使用 QtCreator 作为 IDE 来开发这个应用程序。这很容易,因为您只需在套件配置中配置编译器 (arm-none-eabi-gcc)、调试器 (arm-none-eabi-gdb) 和 gdb-server (openocd)。这使我可以为裸机目标创建可执行的 elf 文件,然后将其闪存到微控制器内部的 FLASH 存储器中。

所有这些步骤都已完成。

但是调试部分变得棘手,因为内存空间的一部分是直接硬件配置而不是纯内存。该存储空间包含外围设备的配置,例如通过 UART、I2C、ETHERNET、USB 或仅配置引脚或时钟速度。

您需要查看这些值并将它们与参考手册进行比较,看看每个位的作用。目前可以查看内存映射并在那里读取它,但是基于 Keil uVision、IAR System Workbench 和 Ecplipse 的 IDE 有很好的插件,您可以在其中看到与参考手册中完全相同的值。 (见图片)

所以我的问题是是否有一些插件或如何查看和编辑这些插件,或者我是否必须自己编写这个插件?

在后一种情况下,我需要知道如何连接到调试器实例并写入命令和读取输出 - 主要是读取数据@address 和写入数据@address。我了解 gdb 使用 MI 模式。我试图从不同的进程连接到 gdb,但这是不可能的,所以我想我必须为 Qt Creator 创建插件。寄存器描述为 SVD 文件格式,即具有定义结构的 XML。

总结最后一部分,我寻找我必须在插件中实现的代码,它将我连接到正在运行的 gdb 并允许我在遇到断点时发送和接收数据。

【问题讨论】:

这似乎使用了错误的工具来完成这项工作。如果您不使用 Qt 或 QML,为什么选择使用 QtCreator?您已经列出了许多具有您想要的功能的环境,那么您为什么选择不使用这些环境呢? 我将 Qt 和 QML 用于 Win、Mac 和 Linux 程序以及 android。在我看来,它有能力。唯一缺少的是这个特殊的观点。其他环境具有此功能,但它们作为 IDE 很糟糕。 IAR 和 Keil 使用他们自己的构建系统和编译器,这不适合我,因为我需要在构建过程中添加自定义内容,因此我使用 CMake。也有不便携的。怀疑葡萄酒会有所帮助。 带有 GNU ARM 工具的 Eclipse 怎么样?似乎您正试图将方形钉子敲入圆孔,因为您更喜欢方形钉子而不是圆形钉子。您也许可以通过蛮力使其工作,但有更好的解决方案。 我使用 Eclipse 已经有好几年了,我从来没有对 JAVA 产生过兴趣,所以我倾向于避免使用它。您有权将方钉锤入圆孔。但是,当您可以访问 MCU 时,问题会变得更深一些,您可以做很多很棒的事情,例如可视化帧缓冲区,查看文件系统上的文件,分析接收到的网络数据包,检查内存......您只需要导出和导入数据。这也是 Eclipse 所没有的。 带有 GDB 的 Eclipse 应该能够从 STM32 的地址空间导入和导出数据。我想我当时对您的要求感到困惑,因为除了读取和写入微地址空间之外,我从未使用过提供您提到的内容的 IDE。 【参考方案1】:

你没有说你是在调试 C++ 代码还是 QML 代码,所以我无法回答是或否。如果您在汇编语言级别进行调试(这本身可能有用,也可能没有用),这些寄存器值很有用。

如果您正在调试 C++ 代码,那么您可以配置您的编译器以生成该代码的汇编列表,但您将在相当低的级别进行调试。

如果您正在调试 QML 代码,那么您将需要 QML 引擎的汇编列表,我怀疑您是否能够获得。更重要的是,我怀疑尝试使用如此低级的过程调试器来调试像 QML 这样的声明性语言会浪费时间。像 QML 这样的语言的意义在于让您超越一切。

【讨论】:

在嵌入式系统上调试 C 代码时,我必须定期查看寄存器值。这不仅仅是在它们相关的汇编中,特别是对于外围配置寄存器。我确实同意,如果您正在调试 QML,那么您已经远远超出了这一点。 你是对的,尤其是外围寄存器值是相关的,无论你使用什么语言,甚至是 QML(尽管我怀疑你的 QML 代码会修改外围寄存器)。我在考虑 CPU 寄存器,如果没有看到底层的汇编代码就很难解释。

以上是关于调试期间 Qt Creator 中的外设寄存器的主要内容,如果未能解决你的问题,请参考以下文章

gpio啥时候是数字寄存器,啥时候是外设寄存器

x86汇编语言基础

TI_DSP_corePac_带宽管理 - 1.2(仲裁寄存器)

Keil MDK 5.14 仿真时System Viewer菜单显示空白和Peripherals菜单无外设寄存器

X86 I/O端口

Qt creator 调试模式消失了