mirror of
https://gitee.com/dlmu-cone/bf_original_balance_chassis
synced 2026-07-25 03:47:47 +08:00
新增了教程和注释以及文档
This commit is contained in:
@@ -6,7 +6,7 @@
|
||||
|
||||
> TODO:
|
||||
>
|
||||
> 1. 添加一键编译+启用ozone调试d 脚本,使得整个进一步流程自动化
|
||||
> 1. 添加一键编译+启用ozone调试脚本,使得整个进一步流程自动化
|
||||
> 2. 增加更多的背景知识介绍
|
||||
> 3. 增加VSCode下RTT viewer的支持
|
||||
|
||||
@@ -149,6 +149,32 @@ ITM是instrument trace macrocell指令追踪宏单元的缩写,它用于提供
|
||||
|
||||
> 而对于直接运行在电脑上的程序(.exe),就不需要GDBserver和物理调试器,GDB程序可以直接访问电脑上运行的程序和CPU的寄存器等。
|
||||
|
||||
|
||||
|
||||
### 字节对齐
|
||||
|
||||
这是内存硬件设计和汇编语言设计的结果。在使用结构体的时候,如果你不做任何事情,编译器会自动帮助你完成字节对齐以提高内存访问的效率。stm32是4字节地址和数据总线的设计,单词可以传输32位数据,因此,访问4字节数据(也就是stm32的“字”,“字长”)效率最高。然而,历史的缘由导致i一个内存地址只存储8位的数据,如果你要访问float数据,则一次需要读取4个地址。当这四个地址是连续的时候,你只需要一次就可以将数据读出。然而,如果一个float数据被存放在0x03-0x07这四个地址,cpu首先要读出0x00-0x03这四个连续的地址,然后再取出最后一个字节;随后读取0x04-0x07这四个连续的字节,再取出前三个字节;最后将最后一个字节和前三个字节拼接在一起,形成我们需要的float数据。
|
||||
|
||||
`#pragma`可能是最复杂的预编译指令,不同的编译器支持不同的`#pragma`指令,如常用的`#pragma once`可以替代header guard。arm gnu gcc编译器支持通过`#pragma pack()`来设置字节对齐,支持的对齐参数包括空/1/2/4/8,会启动对应长度的对齐方式。用于通信的结构体(串口/CAN/spi等外设接收数据的时候都是连续的,不会像结构体一样被编译器对齐)在声明时,采用如下的方式:
|
||||
|
||||
```c
|
||||
#pragma pack(1) // 从这句话开始,使用字节对齐(1),即紧凑,关闭对齐
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint8_t id;
|
||||
// ...
|
||||
|
||||
} CANInstance;
|
||||
|
||||
#pragma pack() // 从这里开始,恢复默认配置,一般来说默认配置是 pack(4),如果遇到double/longlong等也会变为8字节对齐
|
||||
// 使用两个#pragma包裹你的结构体声明
|
||||
```
|
||||
|
||||
如果您有兴趣,可以了解一下内存硬件的组织和连接方式,包括奇偶地址/片选/行列扩展等,可以帮助你更好地理解字节对齐。
|
||||
|
||||
|
||||
|
||||
## 环境配置
|
||||
|
||||
> ***所有需要编辑的配置文件都已经在basic_framework的仓库中提供,如果不会写,照猫画虎。***
|
||||
@@ -172,7 +198,7 @@ ITM是instrument trace macrocell指令追踪宏单元的缩写,它用于提供
|
||||
- **C/C++**:提供C/C++的调试和代码高亮支持
|
||||
- **Better C++ Syntax**:提供更丰富的代码高亮和智能提示
|
||||
- **C/C++ Snippets**:提供代码块(关键字)补全
|
||||
- **Cortex-Debug**,**Cortex-Debug: Device Support Pack - STM32F4**:提供调试支持
|
||||
- **Cortex-Debug**,**Cortex-Debug: Device Support Pack - STM32F4**:提供调试支持。cortex debug还会自动帮助你安装一些调试相关的插件。
|
||||
- **IntelliCode**,**Makfile Tools**:提供代码高亮支持
|
||||
|
||||

|
||||
@@ -425,7 +451,9 @@ VSCode `ctrl+,`进入设置,通过`搜索`找到cortex-debug插件的设置。
|
||||
|
||||
4. 片上外设。这里可以查看外设的**控制寄存器**和**状态寄存器**的值,如果通过断点无法定位bug,则需要查找数据手册和Cortex M4指南的相关内容,根据寄存器值来判断程序当前的情况。
|
||||
|
||||
5. 断点。所有添加的断点都会显示于此,注意,不像我们自己的电脑,单片机的DBG外设对断点的数量有限制(资源所限),超过5个断点会导致debug失败,此时将断点减少即可。
|
||||
5. 断点。所有添加的断点都会显示于此,注意,不像我们自己的电脑,单片机的DBG外设对断点的数量有限制(资源所限),超过5个断点会导致debug失败,此时将断点减少即可。由于单行代码编译之后可能会对应多条汇编指令,或一条表达式由多个表达式构成,你还可以插入**行内断点**以逐个执行表达式或汇编语句,你还可以在汇编窗口插入断点调试汇编代码,帮助你发现错误。
|
||||
|
||||
对于不方便判断何时需要停止代码执行进行观察和测试的情况,你可以右键行号左侧的断点栏插入条件断点,输入表达式,当表达式满足时才会进入断点。
|
||||
|
||||
6. 调试控制台。调试器输出的信息会显示在这里,要**查看**和**追踪**的变量的信息也会显示在这里。如果调试出现问题,报错信息同样也会在这里显示。要是出现异常,可以复制这里的信息在搜索引擎里查找答案,不过最好的方法是查询gdb和openocd的官方文档。
|
||||
|
||||
@@ -452,9 +480,23 @@ VSCode `ctrl+,`进入设置,通过`搜索`找到cortex-debug插件的设置。
|
||||
建议安装以下插件:
|
||||
|
||||
1. Hex Hover Converter,鼠标悬停在数值上的时候会自动显示其对应的16、2、10进制值和编码
|
||||
|
||||
2. Hex Editor,在查看汇编代码和机器代码的时候,提供2、10、16进制转换,并且可以以16进制或2进制的格式编辑文件。
|
||||
|
||||
3. GitLens,提供强大的可视化Git支持
|
||||
|
||||
4. Blockman - Highlight Nested Code Blocks 此插件会高亮嵌套的代码块(即花括号包围的部分或for/while/ifelse代码块)
|
||||
|
||||
5. bookmark提供代码中插入书签的功能,从而快速在页面间跳转。
|
||||
|
||||
6. Code Issue Manager,为团队提供issues和todo管理,方便协同开发
|
||||
|
||||
7. github copilot:超强,超快,需要一些小钱
|
||||
|
||||
8. `ctrl+k ctrl+s`配置属于你的快捷键,提高效率!
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
---
|
||||
@@ -885,7 +927,7 @@ download_jlink:
|
||||
|
||||
首先设定了flash烧录区的起始地址,下面两个构建目标分别用于daplink和jlink的下载。我们统一使用openocd进行烧录。命令中,`-c`表明的是启动openocd之后要执行的命令,openocd作为一个gdbserver是用作调试的,因此这里我们在`flash write_image`之后直接`reset`让单片机复位开始运行程序,然后立刻退出调试,从而达到下载程序运行但不调试的目的。
|
||||
|
||||
接下来我们希望能够直接下载,不要在命令行里面输入`make download_dap`这么复杂的指令,因此在tasks.json中添加如下两个任务:
|
||||
接下来我们希望能够直接下载,不要在命令行里面输入`make download_dap`这么复杂的指令,我们可以利用make构建伪造目标来实现命令行命令执行,因此在tasks.json中添加如下两个任务:
|
||||
|
||||
```json
|
||||
{
|
||||
@@ -906,6 +948,7 @@ download_jlink:
|
||||
"isDefault": false,
|
||||
}
|
||||
},
|
||||
// 实际上也可以直接编写命令行指令,他们是等效的
|
||||
```
|
||||
|
||||
这样,在工具栏的Terminal页面,就可以选择对应的任务直接下载执行了。你也可以通过快捷键`ctrl+shift+B`唤起任务执行页面进行选择。如果你希望立刻检验你代码修改的效果,在下载之前进行编译,那么在`command`信息下新增加一个`mingw32-make -j24`即可,或者添加一个`preLaunchTask`。对于调试,如果不想点两下想在修改代码之后直接调试,也可以在launch.json中增加`preLaunchTask`(文件中已经添加,需要的话取消注释即可)。
|
||||
|
||||
Reference in New Issue
Block a user