新增了教程和注释以及文档

This commit is contained in:
NeoZng
2023-02-09 00:09:28 +08:00
parent 637d7de114
commit 4e2b750037
6 changed files with 66 additions and 18 deletions

View File

@@ -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**:提供代码高亮支持
![image-20221112172157533](assets\image-20221112172157533.png)
@@ -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`(文件中已经添加,需要的话取消注释即可)。