说实话用的都是HAL库开发的,flash链接文件用的都是stm32的,只能说国产芯片抄的基本完全一样了。具体芯片是什么就不介绍了,看过文章就能猜出来是哪家的了。代码开源在Gitee上了。https://gitee.com/huayi1234/HTOS/tree/VScode+openocd
本文将详细介绍一个基于 VS Code 的 STM32 开发环境配置,该环境使用 CMake 作为构建系统,OpenOCD 作为调试和下载工具,以及 Ninja 作为构建工具。这是一套专业的嵌入式开发环境,特别适用于 STM32F103 系列微控制器的开发,同时集成了自研的 HTOS 轻量级实时操作系统。
在这套开发环境中,.vscode
目录下有三个关键的 JSON 配置文件,它们定义了如何在 VS Code 中构建和调试 STM32 项目。下面将详细介绍这些配置文件。
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 扩展main
函数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"
}
}
]
}
主要任务包括:
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 界面上添加按钮,方便一键执行常用任务:
download-apm32
任务该项目使用以下调试工具链:
在该环境中调试 STM32 项目的步骤:
编译项目:
Ctrl+Shift+B
运行默认构建任务,或下载程序:
启动调试:
F5
或点击侧边栏的调试图标,然后点击 “开始调试”调试操作:
该环境特别配置了硬件故障触发和处理机制。在 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 操作系统的异常处理能力非常有价值。在调试时,可以观察:
这个东西的话,其实如果可以在线调试的话倒是没什么用。但是对于无法在线调试的情况下就很有用了,而且整个环境是基于完全开源的场景的,所以可以把代码下载到任何芯片上。任何架构都可以。
该项目使用 CMake 作为构建系统,主要配置文件包括:
CMake 在项目中的作用:
项目使用了两个 OpenOCD 配置文件:
这些文件定义了:
这个下面是用cortex-debug这个插件调试的情况。当然对于RISC-V这种没有插件的应该也可以用OpenOCD的GDB服务器调试。
如上图可以完全进行在线调试,个人认为调试很方便。另外就是这个debug插件似乎支持一些实时内核,我这个是自己写的内核所以应该不支持,之后可以尝试一些移植来试试。
该项目的结构是典型的 STM32CubeMX 生成的项目,增加了 HTOS 操作系统组件:
断点策略:
硬件异常分析:
内存优化:
OpenOCD 连接问题:
构建错误:
调试卡死:
这套 VSCode + CMake + OpenOCD + Ninja 的开发环境构成了一个功能强大、灵活且高效的 STM32 开发平台。通过本文介绍的 VS Code 配置文件和调试技术,可以充分利用现代工具链的优势,提高嵌入式开发效率。特别是硬件故障调试功能,对于开发可靠的嵌入式系统尤为重要。
希望这篇文章能够帮助开发者更好地理解和使用这套开发环境,构建出更稳定、高效的嵌入式系统!
注:本文中介绍的开发环境和方法可能需要根据具体项目和硬件进行调整,以适应不同的开发需求。