【问题标题】:Debug remotely on STM32CubeIDE with an STM32 eval board使用 STM32 评估板在 STM32CubeIDE 上远程调试
【发布时间】:2019-08-01 15:35:17
【问题描述】:

我想设置以下环境:我有一块 STM32H753I-EVAL2 评估板,连接在 Windows PC 上。到目前为止,我一直在使用 STM32CubeIDE 在这台 PC 上进行本地开发和调试。由于多种原因,我的代码源位于 Linux 服务器上(安装 Samba),因此构建项目需要很长时间。因此,我想从我的 Windows 机器上在 linux 服务器上进行开发。

编译工作正常(而且速度更快),但问题在于调试。我知道可以远程调试,Eclipse 的调试配置窗口(我正在使用 OpenOcd)允许连接到远程 GDB 服务器。我不知道的是如何在Windows机器上启动一个GDB服务器来连接STM32板子?

【问题讨论】:

  • (我没有答案,但是...)听起来很奇怪。为什么不只在本地做所有事情,而是在你的 Linux 服务器上拥有一个每天推送到的远程 git 存储库?这样,您的文件都可以在您的 本地 机器上构建、工作和运行,同时在您的 remote 机器上仍然拥有所有文件的副本。
  • 我同意这样会更好。但不幸的是,我无法在这台机器上做我想做的事。
  • @GabrielStaples 不管 OP 的设置是否奇怪,这仍然是一个有效的问题。 Eclipse 支持使用 gdb 客户端-服务器模型进行调试,并且模型使用 TCP 的事实应该允许 gdbservergdb 在不同的机器上运行。就目前而言,Eclipse 似乎允许您创建一个自行启动 gdb 的配置,但没有明显的方式自行启动互补的 gdbserver

标签: gdb stm32 gdbserver openocd


【解决方案1】:

很抱歉“对自己的回答”,但我认为它可能对其他人有用(甚至对我几周后忘记的我也有用;))。

这里是怎么做的。

  • 在主机端(在物理插入评估板的机器上),您必须手动启动 STM32CubeIDE 安装随附的 GDB 服务器应用程序。有关详细信息,请参阅 STMicro 应用笔记 UM2576。默认命令行是:

ST-LINK_gdbserver.exe -d -v -cp "C:\ST\STM32CubeIDE_1.0.0.19w12patch\STM32CubeIDE\plugins\com.st.stm32cube.ide.mcu.externaltools.cubeprogrammer.win32_1.0.0.201903011553\tools\bin"

  • 现在您已经完成了最艰难的任务。在服务器/远程端,您必须设置调试配置以使用带有选项“连接到远程 GDB 服务器”的 OpenOcd,并且只需输入 IP 地址和端口号(默认情况下不是 3333,而是 61234,但可以修改)。

此设置运行良好,即使我偶尔在调试过程中遇到一些不稳定因素。

【讨论】:

    【解决方案2】:

    我看到两个(也许三个)选项

    • 使用备用 GDB 服务器(见下文)
    • 从 STMCubeIDE 单独运行 GDB 服务器(请参阅 OP 的 Windows 答案,Linux 答案)
    • GDB 串行(目前还不是真正的选择,但我会分享我目前的经验)

    我已经使用第二个选项成功调试了我的目标,使用任意 GDB,例如 gdb-multiarch 命令行和(非 STMCube-ified)Eclipse CDT

    替代 GDB 服务器

    你可以试试STLink open source。我做到了。问题是,您的设备可能未得到正确支持。我从 Github 构建了 1.6.1 以启用对 STM32G03x 设备的支持。迁移到此版本时,它可以检测设备,我可以使用st-flash 对设备进行编程,但调试器无法使用(尝试更改寄存器,它会更改错误的寄存器,尝试单步执行程序,它会崩溃立即)。

    请尝试一下。它的安装(或构建)简单快捷,因此值得检查您的设备是否可以正常使用它。

    Openocd 是另一种选择,但似乎不支持 SWD 连接。我尝试了一个据称对此有补丁但没有运气的构建。

    如果您可以使用这些开源替代方案之一,它们还有另一个优势,您可以在 Raspberry PI 之类的设备上运行它们,这意味着您不必让 PC 物理上靠近您的目标.

    从 STMCubeIDE 单独运行 GDB 服务器

    对于 Windows,请参阅 OP 的答案。对于 Linux,我这样做更改路径名以适合您的安装

    LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/user/apps/st/stm32cubeide_1.5.1/plugins/com.st.stm32cube.ide.mcu.externaltools.stlink-gdb-server.linux64_1.5.0.202011040924/tools/bin/native/linux_x64/ /home/user/apps/st/stm32cubeide_1.5.1/plugins/com.st.stm32cube.ide.mcu.externaltools.stlink-gdb-server.linux64_1.5.0.202011040924/tools/bin/ST-LINK_gdbserver -p 61234 -l 1 -d -s -cp /home/user/apps/st/stm32cubeide_1.5.1/plugins/com.st.stm32cube.ide.mcu.externaltools.cubeprogrammer.linux64_1.5.0.202011040924/tools/bin -m 0 -k
    

    我是怎么做到的?首先从 STMCubeIDE 启动调试会话,然后运行

    ps aux | grep gdbserver
    

    然后我们可以看到 Eclipse (STMCube) 是如何启动 gdbserver 并从那里开始工作的。

    如果您发现它抱怨 .so 文件,请从 STMCube 安装中找到该文件,并确保包含它的目录的路径在 LD_LIBRARY_PATH 中(根据我的示例)

    您还可以使用 --help 启动程序以显示更多选项。

    如果添加 -e(持久),您可以在不重置目标的情况下断开并重新连接 GDB 客户端(尽管它会在 gdb 服务器的初始调用时重置,即使没有 -k)。

    GDB 序列号

    这是目标实现协议的 GDB 服务器端的地方。 GDB 存根通常在异常处理程序中运行。这通常是您的断点处理程序,但您也可以将其设置为未处理异常的默认处理程序,或者例如 ctrl-c 中断。

    我最近在谷歌上搜索了很多关于这个的内容,基本上当人们在论坛上询问它时,他们通常会得到类似“这里是龙”或“你为什么不使用 JTAG?”的回答。

    因此,您可能想知道的驱动程序位于 GDB 源代码 git://sourceware.org/git/binutils-gdb.gitgdb/stubs。文档是here那里没有针对 arm 的存根实现。 真的很可悲,我曾经在我工作的地方经常使用 GDB 远程串行,其中一些目标确实是 ARM .操作系统是 ecos。

    那么可以将 ecos GDB 存根移植到裸机吗?给它一个很好的外观,我相信是的,他们可以。存根基于 GDB 源中的存根,但它们受到 Ecos 和 Redboot 构建宏和版权的严重污染(原始文件由 HP 编写并在没有版权的情况下发布)。我们不知道 Ecos 存根可能包含哪些错误(我在当天至少修复了一个,我不记得我是否提交了补丁)。我们不知道他们是否真的正确支持最新的架构。而且,我们不知道在那之后它们是否会占用太多内存——我的 STM32 有 8K 的 SRAM,我已经看到默认大小为 2K 的缓冲区(不是说这是必要的,但你会看到工作需要在这里完成..)

    所以这第三个选项,我有一天会重新审视这个选项,但现在,对我来说,这是一个不行的。

    【讨论】:

      猜你喜欢
      • 2019-12-28
      • 2019-10-15
      • 1970-01-01
      • 2017-06-28
      • 2023-03-26
      • 2021-08-08
      • 1970-01-01
      • 2015-12-11
      • 2011-01-31
      相关资源
      最近更新 更多