当前位置: 首页 > news >正文

VScode+OpenOCD+HTOS栈回溯在国产mcu芯片上完全调试

VScode+OpenOCD+Cmake+HTOS栈回溯在国产32芯片上完全调试

说实话用的都是HAL库开发的,flash链接文件用的都是stm32的,只能说国产芯片抄的基本完全一样了。具体芯片是什么就不介绍了,看过文章就能猜出来是哪家的了。代码开源在Gitee上了。https://gitee.com/huayi1234/HTOS/tree/VScode+openocd

基于 VS Code 的 STM32+HTOS 开发环境详解

1. 开发环境概述

本文将详细介绍一个基于 VS Code 的 STM32 开发环境配置,该环境使用 CMake 作为构建系统,OpenOCD 作为调试和下载工具,以及 Ninja 作为构建工具。这是一套专业的嵌入式开发环境,特别适用于 STM32F103 系列微控制器的开发,同时集成了自研的 HTOS 轻量级实时操作系统。

2. VS Code 配置文件详解

在这套开发环境中,.vscode 目录下有三个关键的 JSON 配置文件,它们定义了如何在 VS Code 中构建和调试 STM32 项目。下面将详细介绍这些配置文件。

2.1 launch.json - 调试配置

launch.json 文件定义了如何在 VS Code 中调试 STM32 项目:

{"version": "0.2.0","configurations": [{"name": "Cortex Debug","type": "cortex-debug","request": "launch","servertype": "openocd","cwd": "${workspaceRoot}","executable": "${workspaceRoot}/build/Debug/test.elf","device": "STM32F103C8T6","configFiles": ["${workspaceRoot}/apm32_openocd.cfg"],"svdFile": "${workspaceRoot}/STM32F103xx.svd","runToEntryPoint": "main","preLaunchTask": "build","env": {"LC_ALL": "C"}}]
}

这个配置的主要元素:

  • 调试器类型:使用 cortex-debug 插件,这是一个专为 ARM Cortex 芯片调试设计的 VS Code 扩展
  • 硬件类型:配置为 STM32F103C8T6 芯片
  • 可执行文件路径:指向 test.elf
  • OpenOCD 配置:使用 apm32_openocd.cfg 文件(哈哈哈)
  • SVD 文件:使用 STM32F103xx.svd 文件,提供寄存器级别的调试信息
  • 入口点:设置为 main 函数
  • 预启动任务:在调试前先执行 build 任务确保代码已编译

2.2 tasks.json - 任务配置

tasks.json 文件定义了可在 VS Code 中执行的任务:

{"version": "2.0.0","tasks": [{"label": "build","type": "shell","command": "cd ${workspaceFolder}/build/Debug; ninja","group": {"kind": "build","isDefault": true},"problemMatcher": ["$gcc"]},{"label": "download","type": "shell","command": "openocd -f ${workspaceFolder}/openocd.cfg -c \"program ${workspaceFolder}/build/Debug/test.elf verify reset exit\"","dependsOn": "build","problemMatcher": []},{"label": "download-apm32","type": "shell","options": {"shell": {"executable": "cmd.exe","args": ["/c"]}},"command": "openocd -f \"${workspaceFolder}/apm32_openocd.cfg\" -c \"program_apm32\"","dependsOn": "build","problemMatcher": [],"group": "build"},{"label": "debug","type": "shell","options": {"shell": {"executable": "cmd.exe","args": ["/c"]}},"command": "openocd -f \"${workspaceFolder}/apm32_openocd.cfg\"","dependsOn": "build","problemMatcher": [],"isBackground": true,"presentation": {"reveal": "always","panel": "new"}}]
}

主要任务包括:

  1. build:使用 Ninja 构建系统编译项目
  2. download:使用标准 OpenOCD 配置将程序下载到 STM32 芯片
  3. download-apm32:使用特殊的 APM32 配置将程序下载到芯片
  4. debug:启动 OpenOCD 服务器用于调试,这是一个后台任务

2.3 settings.json - VS Code 设置

settings.json 文件包含了 VS Code 的自定义设置:

{"VsCodeTaskButtons.showCounter": true,"VsCodeTaskButtons.tasks": [{"label": "$(tools) 编译","task": "build","tooltip": "编译STM32项目"},{"label": "$(cloud-download) 下载-APM32","task": "download-apm32","tooltip": "编译并下载程序到APM32"},]
}

这个配置使用了 “VsCodeTaskButtons” 扩展,它在 VS Code 界面上添加按钮,方便一键执行常用任务:

  • 一个编译按钮,执行 build 任务
  • 一个下载按钮,执行 download-apm32 任务

3. 调试方法详解

3.1 调试工具链

该项目使用以下调试工具链:

  1. VS Code + Cortex-Debug 扩展:提供 IDE 界面和调试 UI
  2. OpenOCD:提供与调试器硬件的通信
  3. SVD 文件:提供芯片寄存器级别的详细信息,增强调试体验

3.2 调试步骤

在该环境中调试 STM32 项目的步骤:

  1. 编译项目

    • 点击 VS Code 界面上的 “编译” 按钮,或
    • 按下 Ctrl+Shift+B 运行默认构建任务,或
    • 在命令面板中执行 “Tasks: Run Build Task”
  2. 下载程序

    • 点击 VS Code 界面上的 “下载-APM32” 按钮,或
    • 从命令面板中运行 “Tasks: Run Task” 然后选择 “download-apm32”
  3. 启动调试

    • 按下 F5 或点击侧边栏的调试图标,然后点击 “开始调试”
    • VS Code 会自动执行 build 任务,然后启动 OpenOCD 连接目标设备
    • 程序会停在 main 函数入口点
  4. 调试操作

    • 设置断点:点击代码行号左侧
    • 单步执行:F10(逐过程)、F11(逐语句)
    • 查看变量:调试面板中的 “变量” 视图或将鼠标悬停在代码上
    • 查看寄存器:Cortex-Debug 提供的 “寄存器” 视图
    • 查看内存:运行 “Cortex-Debug: View Memory” 命令

3.3 硬件故障调试

该环境特别配置了硬件故障触发和处理机制。在 main.c 中的 task4Function 函数专门设计用来触发硬件故障:

if(counter == 5) {/* 在计数到5时触发硬件故障 */printf("Task4: Trying to trigger hardware fault...\r\n");//HAL_Delay(500); /* 等待消息输出完成 *//* 两种触发硬件故障的方式: *//* 方式1: 访问非法地址 */volatile uint32_t *invalid_ptr = (uint32_t *)0xCCCCCCCC;*invalid_ptr = 0x12345678;  /* 这会触发硬件故障 *//* 方式2: 除零操作 (注释掉,以便上面的方式生效) *//* volatile uint32_t a = 10;volatile uint32_t b = 0;volatile uint32_t c = a / b; /* 这会触发硬件故障 *//* (void)c; /* 避免未使用变量的警告 */
}

通过调试这段代码,可以观察系统如何响应硬件故障,这对测试 HTOS 操作系统的异常处理能力非常有价值。在调试时,可以观察:

  1. 触发硬件故障时的 CPU 寄存器状态
  2. 硬件故障处理程序的执行流程
  3. 系统如何恢复或重置

这个东西的话,其实如果可以在线调试的话倒是没什么用。但是对于无法在线调试的情况下就很有用了,而且整个环境是基于完全开源的场景的,所以可以把代码下载到任何芯片上。任何架构都可以。

4. CMake 构建系统

该项目使用 CMake 作为构建系统,主要配置文件包括:

  • CMakeLists.txt:定义项目的构建规则
  • CMakePresets.json:定义不同的构建预设
  • cmake/gcc-arm-none-eabi.cmake:配置 ARM 交叉编译器的设置

CMake 在项目中的作用:

  1. 自动查找和配置工具链
  2. 定义构建目标和依赖关系
  3. 生成 Ninja 构建文件
  4. 简化交叉编译配置

5. OpenOCD 配置

项目使用了两个 OpenOCD 配置文件:

  • openocd.cfg:标准 STM32 配置
  • apm32_openocd.cfg:针对 APM32 芯片或特定调试器的自定义配置

这些文件定义了:

  1. 调试适配器类型和配置(如 ST-Link)
  2. 目标芯片的配置
  3. 特殊的下载和调试命令

这个下面是用cortex-debug这个插件调试的情况。当然对于RISC-V这种没有插件的应该也可以用OpenOCD的GDB服务器调试。
在这里插入图片描述
如上图可以完全进行在线调试,个人认为调试很方便。另外就是这个debug插件似乎支持一些实时内核,我这个是自己写的内核所以应该不支持,之后可以尝试一些移植来试试。

6. 项目结构

该项目的结构是典型的 STM32CubeMX 生成的项目,增加了 HTOS 操作系统组件:

  • Core/: 包含应用程序代码
    • Inc/: 头文件
    • Src/: 源文件,包括 main.c
  • Drivers/: STM32 HAL 库和 CMSIS 代码
  • HTOS/: 自定义操作系统代码
    • include/: HTOS 头文件
    • kernel/: HTOS 内核实现
    • portable/: 移植层代码
  • build/: 构建输出目录

7. 使用技巧与最佳实践

7.1 高效调试技巧

  1. 断点策略

    • 设置条件断点可以在特定条件满足时才停止
    • 使用日志断点可以在不停止执行的情况下打印信息
  2. 硬件异常分析

    • 设置中断向量表断点来捕获所有异常
    • 使用 SVD 文件查看外设寄存器状态
    • 检查故障状态寄存器了解异常原因
  3. 内存优化

    • 使用内存视图监控栈/堆使用情况
    • 监控 HTOS 任务栈使用情况防止溢出

7.2 常见问题解决

  1. OpenOCD 连接问题

    • 检查 USB 线缆质量
    • 确认 ST-Link 固件是最新版本
    • 尝试降低 SWD 时钟频率
  2. 构建错误

    • 检查工具链路径配置
    • 确认 CMake 和 Ninja 版本兼容
    • 查看详细构建日志
  3. 调试卡死

    • 检查是否进入了无限循环
    • 查看是否触发了硬件故障但没有正确处理
    • 检查硬件连接和供电情况

结语

这套 VSCode + CMake + OpenOCD + Ninja 的开发环境构成了一个功能强大、灵活且高效的 STM32 开发平台。通过本文介绍的 VS Code 配置文件和调试技术,可以充分利用现代工具链的优势,提高嵌入式开发效率。特别是硬件故障调试功能,对于开发可靠的嵌入式系统尤为重要。

希望这篇文章能够帮助开发者更好地理解和使用这套开发环境,构建出更稳定、高效的嵌入式系统!


注:本文中介绍的开发环境和方法可能需要根据具体项目和硬件进行调整,以适应不同的开发需求。

相关文章:

  • 十倍开发效率 - IDEA 插件之RestfulBox - API
  • LangGraph中预构件,creat_react_agent的实现流程
  • 解决 Kubernetes 调度器启动报错:缺少 Bind 插件
  • PFDF-SPWM(并联续流-倍频正弦脉宽调制)
  • 尚硅谷-react[1-6集]
  • Vue 3 中 ref和reactive的详细使用场景
  • 使用阿里云创建公司官网(使用wordpress)
  • 菊厂20250416软件机考T2解答(200分)
  • GR00T N1:面向通用类人机器人的开放基础模型
  • Google Cloud最新报告:全球领先企业AI应用案例与智能体落地方向探索
  • 利用Global.asax在ASP.NET Web应用中实现功能
  • 绿盟二面面试题
  • 概念实践极速入门 - 常用的设计模式 - 简单生活例子
  • 在 Redis Lua 脚本中,keyCount 参数的作用是明确区分脚本参数中的 KEYS 和 ARGV,具体关系如下:
  • JNI的使用
  • 华为OD机试真题——硬件产品销售方案(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
  • 设计模式(责任链模式)
  • SyntaxError: Unexpected end of JSON input 内容被截断报错
  • ios接入穿山甲【Swift】
  • 自动驾驶创建场景(just soso)
  • 如何选择网站建设案例/品牌宣传方式
  • 杭州城市建设网站/有什么引流客源的软件
  • 有哪些网站可以做h5/免费发布推广的网站有哪些
  • 做外贸没有网站需要注意什么/苏州seo关键词优化方法
  • 做网站主页效果图/优化大师优化项目有
  • cms开源建站系统/市场推广方案范文