添加ozone调试教程和vscode使用

This commit is contained in:
NeoZng 2022-11-13 14:40:21 +08:00
parent 27f83405ad
commit 3dd1b807cc
20 changed files with 150 additions and 30 deletions

View File

@ -1 +1 @@
[]
[{"node":"CAN1","expanded":true,"format":0,"pinned":false},{"node":"CAN1.MCR","expanded":true,"format":0},{"node":"GPIOG","expanded":true,"format":0,"pinned":false}]

6
.vscode/launch.json vendored
View File

@ -17,7 +17,8 @@
// path to your gcc-arm-none-eabi/bin,cortex-debug,
"armToolchainPath": "D:\\gcc-arm-none-eabi\\bin",
// path to your gcc-arm-none-eabi/arm-none-eabi-gdb.exe,cortex-debug,
"gdbPath": "D:\\gcc-arm-none-eabi\\bin\\arm-none-eabi-gdb.exe"
"gdbPath": "D:\\gcc-arm-none-eabi\\bin\\arm-none-eabi-gdb.exe",
//"preLaunchTask": "build task",//Build,使
},
{ // 使j-link
"name": "Debug-jlink",
@ -33,7 +34,8 @@
//cortex-debug,
"armToolchainPath": "D:\\gcc-arm-none-eabi\\bin",
//cortex-debug,
"gdbPath": "D:\\gcc-arm-none-eabi\\bin\\arm-none-eabi-gdb.exe"
"gdbPath": "D:\\gcc-arm-none-eabi\\bin\\arm-none-eabi-gdb.exe",
// "preLaunchTask": "build task",//Build,使
}
]
}

View File

@ -128,7 +128,12 @@ modules/super_cap/super_cap.c \
modules/master_machine/seasky_protocol.c \
modules/algorithm/crc8.c \
modules/algorithm/crc16.c \
modules/can_comm/can_comm.c
modules/can_comm/can_comm.c \
\ \
application/gimbal.c \
application/chassis.c \
application/shoot.c \
application/robot_cmd.c
# ASM sources

View File

@ -118,7 +118,7 @@ ITM是instrument trace macrocell指令追踪宏单元的缩写它用于提供
- ***所有需要编辑的配置文件都已经在basic_framework的仓库中提供如果不会写照猫画虎。***
- 安装STM32CubeMX并安装F4支持包和DSP库支持包-
- 安装STM32CubeMX并安装F4支持包和DSP库支持包
- 安装VSCode并安装C/C++Cortex-DebugCortex-Debug: Device Support Pack - STM32F4Better C++ SyntaxIntelliCodeMakfile ToolsC/C++ Snippets插件
@ -150,9 +150,7 @@ ITM是instrument trace macrocell指令追踪宏单元的缩写它用于提供
打开命令行win+Rcmd回车输入`gcc -v`,如果没有报错,并输出了一堆路径和参数说明安装成功。
- 配置gcc-arm-none-eabi环境变量
同上将工具链的bin添加到PATH
- 配置gcc-arm-none-eabi环境变量**把压缩包解压以后放在某个地方**然后同上将工具链的bin添加到PATH
![image-20221112172858593](assets\image-20221112172858593.png)
@ -164,7 +162,7 @@ ITM是instrument trace macrocell指令追踪宏单元的缩写它用于提供
> 添加到环境变量PATH的意思是当一些程序需要某些依赖或者要打开某些程序时系统会自动前往PATH下寻找对应项。**一般需要重启使环境变量生效。**
- **将OpenOCD解压到一个文件夹里**稍后需要在VSCode中设置这个路径。
- **将OpenOCD解压到一个文件夹里**稍后需要在VSCode的插件中设置这个路径。
- CubeMX生成代码的时候工具链选择makefile
@ -175,6 +173,8 @@ ITM是instrument trace macrocell指令追踪宏单元的缩写它用于提供
![image-20221112174211802](assets\image-20221112174211802.png)
Makefile就是我们要使用的构建规则文件。
> **如果你使用basic_framework不需要重新生成代码。**
## VSCode编译和调试配置
@ -282,17 +282,28 @@ Makefile的大部分内容在CubeMX初始化的时候就会帮你生成。如果
> 和KEIL新增文件的方式很相似但是更方便。
### 简单调试
### 简单调试配置
> 在VSCode中调试不能像Keil一样查看变量动态变化但是支持以外的所有操作如查看外设和反汇编代码设置断点触发方式等。
用于调试的配置参考这篇博客:[Cortex-debug 调试器使用介绍](https://blog.csdn.net/qq_40833810/article/details/106713462)
用于调试的配置参考这篇博客:[Cortex-debug 调试器使用介绍](https://blog.csdn.net/qq_40833810/article/details/106713462)。你需要配置**arm gnu工具链的路径****OpenOCD的路径**使得GDB调试器可以找到OpenOCD并调用它从而连接硬件调试器如j-link等该工作区文件夹的**launch.json文件**用于启动vscode的调试任务
***配置需要的文件已经全部在basic_framework中提供***,包括`openocd.cfg STM32F407.svd .vscode/launch.json`
VSCode `ctrl+,`进入设置通过搜索找到cortex-debug插件的设置
你需要配置**arm gnu工具链的路径****OpenOCD的路径**使得GDB调试器可以找到OpenOCD并调用它从而连接硬件调试器如j-link等该工作区文件夹的**launch.json文件**用于启动vscode的调试任务
1. 搜索armToolchainPath设置你的arm gcc toolchain的`bin`文件夹bin是binary的缩写实际上文件夹内部是一些可执行文件
2. 搜索openocdPath设置你的openocd路径需要包含到openocd的可执行文件
如果教程看不懂,请看`.vscode`下的`launch.json`,照葫芦画瓢。
**注意**windows下路径需要使用两个反斜杠`\\`代表下一级文件夹。
***其他配置需要的文件已经全部在basic_framework中提供***,包括`openocd.cfg STM32F407.svd .vscode/launch.json`。
![image-20221113125439857](assets\image-20221113125439857.png)
<center>主要需要配置这2个路径</center>
如果教程中的启动json文件看不懂请看仓库里的`.vscode`下的`launch.json`,照葫芦画瓢。
根目录下已经提供了C板所需的.svd和使用无线调试器时所用的openocd.cfg配置文件。
@ -300,59 +311,153 @@ Makefile的大部分内容在CubeMX初始化的时候就会帮你生成。如果
![image-20221112180103750](assets\image-20221112180103750.png)
我们的仓库中默认提供了两种下载器的支持dap-link无线调试器属于这一种和j-link包括小的j-link OB和黑色大盒子jlink
### 调试介绍
开始调试后,显示的界面如下:
![](assets\vscodedebug.png)
1. 变量查看窗口包括当前调用栈当前作用域或代码块内的局部变量、当前文件的静态变量和全局变量。register选项卡可以查看cpu内核的寄存器数值。
2. 变量watch窗口。右键单击要查看的变量选择watch加入查看。
![image-20221113131044191](assets\image-20221113131044191.png)
还支持直接运行到指针所选处Run to Cursor以及直接跳转到指针处执行Jump to Cursor。添加行内断点若一个表达式由多个表达式组成也是很方便的功能可以帮助进一步定位bug。
右键点击添加到watch窗口的变量**可以临时修改它们的值。**调参的时候非常好用。
VSCode提供的一个最大的便利就是你可以将鼠标悬停在需要查看的变量上**不需要添加到watch就能观察变量值。**如果是指针还可以自动解析,获取解引用后的值。结构体也支持直接展开。
![image-20221113133624273](assets\image-20221113133624273.png)
3. 调用栈。表明在进入当前代码块之前调用了哪些函数,称之为栈也是因为调用的顺序从下至上。当前函数结束之后栈指针会减小,控制权会返还给上一级的调用者。通过调用栈可以确认程序是**如何**(按怎样的顺序)运行到当前位置的。
4. 片上外设。这里可以查看外设的**控制寄存器**和**状态寄存器**的值如果通过断点无法定位bug则需要查找数据手册和Cortex M4指南的相关内容根据寄存器值来判断程序当前的情况。
5. 断点。所有添加的断点都会显示于此注意不像我们自己的电脑单片机的DBG外设对断点的数量有限制资源所限超过5个断点会导致debug失败此时将断点减少即可。
6. 调试控制台。调试器输出的信息会显示在这里,要**查看**和**追踪**的变量的信息也会显示在这里。如果调试出现问题报错信息同样也会在这里显示。要是出现异常可以复制这里的信息在搜索引擎里查找答案不过最好的方法是查询gdb和openocd的官方文档。
7. 调试控制。
- 复位:单片机复位
- 继续运行/暂停
- 单步跳过,如果这一行有函数调用,不会进入内部
- 进入,如果这一行有函数调用,会进入函数内部
- 跳出跳出当前调用栈顶层的函数即如果在函数内部会直接运行到return
- 重启调试器(当然单片机也会复位,一般出现异常的时候使用这个按钮)
- 终止调试
> **如果你希望在编译之后立刻启动调试**,不要分两次点击,你可以在`launch.json`中添加一个`prelaunchtask`(意为在启动调试之前要运行的任务),将他设置为我们在[编译章节](###编译)介绍的构建任务。我们已经提供了这个选项,取消注释即可使用。
---
---
## Ozone可视化调试和LOG功能
> Ozone暂时只支持jlink。
### 软件安装
安装Ozone和J-link工具箱驱动、gdb以及各种调试工具。安装包都在网盘里。
### 配置调试项目
打开ozone后会显示一个new project wizard如果没有打开在工具栏的File-> New -> New project wizard。
![image-20221113133904084](assets\image-20221113133904084.png)
选择M4内核为了能够查看外设寄存器的值还需要svd文件。所有mcu的svd都在图中的文件夹里提供当然你也可以使用我们仓库根目录下的文件。
![image-20221113134025339](assets\image-20221113134025339.png)
接口选择swd接口速度不需要太高如果调试的时候需要观察大量的变量并且使用日志功能可以调高这个值。如果连接了jlikn下面的窗口中会显示。
![image-20221113134252407](assets\image-20221113134252407.png)
选择构建之后生成的.elf文件。这是调试器专用的文件格式对其内容感兴趣可以自行搜索细节。此外ozone还支持.bin .hex .axf最后一个是amr-cc也就是keil的工具链会生成的等格式。
![image-20221113134605331](assets\image-20221113134605331.png)
这页不要动。如果希望保存jlink的调试日志最后一个选项选择一个文件或者新建一个日志文件。
### 常用调试窗口和功能
下图的配置是笔者常用的layout。每个窗口是否显示、放在什么位置等都是可以自己定义的。通过工具栏的view选项卡可以自行选择需要展示的窗口。
![](assets\ozone.png)
1. 调试控制和vscode类似
2. 变量watch窗口这里的变量不会实时更新只有在暂停或遇到断点的时候才会更新。若希望实时查看在这里右键选择需要动态查看的变量选择Graph他就会出现在**窗口8**的位置。
3. 断点和运行追踪管理
4. 调试控制台,输出调试器的信息。
5. 终端支持一些jlink script的命令。**单片机通过log模块发送的日志也会显示在这里。**
6. 代码窗口用于添加断点、添加查看等。鼠标悬停在变量上可以快速查看变量值和类型。希望打开整个项目文件点击工具栏的view选项卡单击Source Files就可以打开一个项目中所有源文件的窗口。右键点击函数或变量可以跳转到定义和声明、查看汇编代码等。按**F12**跳转到定义。
7. **变量可视化窗口这就是Ozone的大杀器。**在变量添加到查看watch之后右键点击watch中的变量选择Graph变量会被添加到可视化查看中。你可以选择“示波器”的显示时间步长以及颜色等信息还可以更改采样率。
8. 窗口8和7配合。在窗口8中会实时显示变量值并且统计平均值和最大最小值**而且还会将所有采样值保存到一个csv文件当中**,如果需要进一步分析可以导出这个数据文件。
9. 内存视图。可以直接查看任意内存位置的值。
> 再次注意,这些窗口是否开启以及位置都是可以自定义的。
#### 变量动态查看(可视化)
- 如果没有打开窗口现在view->timeline中打开可视化窗口。动态变量查看的窗口也在view->data sampling。
启用动态变量查看的流程如下:
```mermaid
graph LR
在代码窗口中选中需要观察的变量 --> 添加到watch窗口 --> 在watch选择要动态查看的变量 --> 添加到Datasample窗口
```
第一步的快捷键是`ctrl+w`,选中变量之后按。
第二部的快捷键是`ctrl+g`选中watch中的变量后按。
第三步可以修改示波器的步长和采样频率。
- 如果当前文件没有你要的变量你想查看项目中的其他文件夹在view-> source files中可以打开该项目所有的源文件双击可以打开源文件。
![image-20221113142448939](assets\image-20221113142448939.png)
#### 日志打印
在Terminal窗口查看还可以通过命令直接控制单片机的运行不过不常用
未打开窗口则在view-> terminal中打开。
#### 外设查看
在view-> register中打开窗口选择Peripherals可以查看所有外设寄存器
CPU选项卡可以查看CPU的寄存器。
#### 调用栈
在view-> call stack中打开窗口。
### 常用快捷键
| 组合 | 功能 |
| -------------------- | ---------------------------------------------------- |
| ctrl+w | 添加到查看 |
| ctrl+g | 添加到动态查看(需要先添加到查看) |
| f12 | 跳转到定义 |
| f5 | 启动调试 |
| f10 | 单步跳过 |
| f11 | 单步进入 |
| shift+f11 | 单步跳出 |
| 右键+break on change | 当变量发生变化的时候进入此断点 |
| ctrl+H | 展示调用图,会列出该函数调用的所有函数(内部调用栈) |
### 保存调试项目
退出时可以将调试项目保存在项目的根目录下,方便下次调试使用,不需要重新设置。

0
application/robot_cmd.c Normal file
View File

0
application/robot_cmd.h Normal file
View File

0
application/robot_cmd.md Normal file
View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
assets/ozone.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

BIN
assets/vscodedebug.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 KiB

View File

@ -1,13 +1,20 @@
#include "bsp_buzzer.h"
#include "main.h"
extern TIM_HandleTypeDef htim4;
void buzzer_on(uint16_t psc, uint16_t pwm)
{
__HAL_TIM_PRESCALER(&htim4, psc);
__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, pwm);
extern TIM_HandleTypeDef htim4;
static uint8_t tmp_warning_level=0;
void buzzer_on(uint16_t psc, uint16_t pwm,uint8_t level)
{
if(level>tmp_warning_level)
{
tmp_warning_level=level;
__HAL_TIM_PRESCALER(&htim4, psc);
__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, pwm);
}
}
void buzzer_off(void)
{
__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 0);
tmp_warning_level=0;
}

View File

@ -3,7 +3,7 @@
#include "struct_typedef.h"
extern void buzzer_on(uint16_t psc, uint16_t pwm);
extern void buzzer_on(uint16_t psc, uint16_t pwm,uint8_t level);
extern void buzzer_off(void);
#endif

View File

@ -2,6 +2,7 @@
#include "main.h"
extern TIM_HandleTypeDef htim5;
static tmp_output_level=0;
void aRGB_led_show(uint32_t aRGB)
{