commit 46f3570ec046825e6f6c6e09a949b293f5652a51 Author: ywh <2227158009@qq.com> Date: Thu Jul 9 07:56:21 2026 +0800 第一次提交 diff --git a/yuwenhao/IAR/IAR.md b/yuwenhao/IAR/IAR.md new file mode 100644 index 0000000..4605f64 --- /dev/null +++ b/yuwenhao/IAR/IAR.md @@ -0,0 +1,2070 @@ +# IAR 学习文档 + +## 1. IAR 简介 + +IAR Embedded Workbench 是常用的嵌入式集成开发环境,主要用于单片机工程的创建、代码编写、编译、链接、下载和调试。 + +在嵌入式开发中,IAR 通常用于完成以下工作: + +1. 创建和管理嵌入式工程; +2. 编写 `.c`、`.h`、`.s` 等源码文件; +3. 配置芯片型号、编译选项和链接文件; +4. 编译生成可执行文件; +5. 连接仿真器进行下载和调试; +6. 查看变量、寄存器、内存、调用堆栈等调试信息。 + +![IAR主界面](pictures/IAR_01_主界面.png) + +## 2. 工程操作 + +工程操作主要包括工作区、工程、分组和文件的创建、打开、添加等操作。 + +在 IAR 中,需要先理解 **工作区** 和 **工程** 的关系: + +```text +工作区 Workspace:用于管理一个或多个工程。 + +工程 Project:用于管理具体的源码文件、头文件、启动文件、链接文件和工程配置。 +``` + +一个工作区中可以包含多个工程,一个工程中可以包含多个分组和文件。 + +## 3. 各类型文件含义 + +IAR 工程中常见文件类型如下: + +| 文件类型 | 作用 | +| ------------- | -------------------------------------------- | +| `.eww` | IAR 工作区文件,用于保存工作区信息 | +| `.ewp` | IAR 工程文件,用于保存工程配置和文件组织 | +| `.ewd` | IAR 调试配置文件 | +| `.c` | C 源文件,用于编写程序代码 | +| `.h` | 头文件,用于声明函数、变量、宏定义等 | +| `.s` / `.asm` | 汇编文件,常用于启动文件或底层代码 | +| `.icf` | 链接配置文件,用于配置 Flash、RAM 等存储空间 | +| `.a` | 静态库文件,用于封装后的库调用 | +| `.out` | 编译链接后生成的调试输出文件 | +| `.hex` | 可下载或烧录的十六进制文件 | +| `.bin` | 二进制烧录文件 | + +简单理解: + +```text +.eww:打开整个工作区 +.ewp:打开单个工程 +.c / .h:写代码用 +.icf:配置芯片存储地址 +.a:静态库文件 +.hex / .bin:烧录文件 +``` + +## 4. 新建 / 打开工作区 + +工作区用于管理一个或多个 IAR 工程。 + +### 4.1 新建工作区 + +操作步骤: + +1. 打开 IAR Embedded Workbench; +2. 点击顶部菜单栏 **File**; +3. 选择 **New Workspace**; +4. 创建完成后,IAR 会生成一个新的空工作区; +5. 后续可以在该工作区中创建或添加工程。 + +操作路径: + +```text +File → New Workspace +``` + +![新建工作区](pictures/IAR_03_新建工作区.png) + +### 4.2 保存工作区 + +新建工作区后,需要保存工作区文件。 + +操作步骤: + +1. 点击顶部菜单栏 **File**; +2. 选择 **Save Workspace As**; +3. 选择保存路径; +4. 输入工作区名称; +5. 点击保存。 + +操作路径: + +```text +File → Save Workspace As +``` + +![保存工作区](pictures/IAR_04_保存工作区.png) + +保存后会生成 `.eww` 文件。 + +例如: + +```text +test.eww +``` + +![保存工作区](pictures/eww.png) + +### 4.3 打开工作区 + +如果已经有现成的 IAR 工作区,可以直接打开 `.eww` 文件。 + +操作步骤: + +1. 点击顶部菜单栏 **File**; +2. 选择 **Open**; +3. 选择 **Workspace**; +4. 找到对应的 `.eww` 文件; +5. 点击打开。 + +操作路径: + +```text +File → Open Workspace +``` + +![打开工作区](pictures/IAR_05_打开工作区.png) + +## 5. 新建 / 打开工程 + +工程用于管理具体的源码文件、头文件、启动文件、链接文件以及编译调试配置。 + +### 5.1 新建工程 + +操作步骤: + +1. 打开 IAR; +2. 点击顶部菜单栏 **Project**; +3. 选择 **Create New Project**; +4. 选择工程类型; +5. 一般选择 C 工程或空工程; +6. 选择工程保存路径; +7. 输入工程名称; +8. 点击保存。 + +操作路径: + +```text +Project → Create New Project +``` + +![新建工程](pictures/IAR_06_新建工程.png) + +创建完成后,工作区中会出现新建的工程。 + +![新建工程完成](pictures/IAR_07_新建工程完成.png) + +### 5.2 打开工程 + +如果已有 `.ewp` 工程文件,可以通过打开工作区或添加工程的方式使用。 + +通常推荐打开 `.eww` 工作区文件,因为工作区中会保存工程结构和相关配置。 + +如果只需要打开工程,可以使用添加工程的方式。 + +## 6. 工作区中导入 / 添加工程 + +一个工作区中可以添加多个工程。 + +例如,一个工作区中可以同时包含: + +```text +Application 工程 +Bootloader 工程 +Library 工程 +``` + +### 6.1 添加已有工程 + +操作步骤: + +1. 打开一个工作区; +2. 点击顶部菜单栏 **Project**; +3. 选择 **Add Existing Project**; +4. 找到需要添加的 `.ewp` 工程文件; +5. 点击打开; +6. 工程会被添加到当前工作区中。 + +操作路径: + +```text +Project → Add Existing Project +``` + +### 6.2 设置活动工程 + +如果工作区中有多个工程,需要选择当前要编译或调试的工程。 + +操作步骤: + +1. 在工作区窗口中找到目标工程; + +2. 右键点击该工程; + +3. 选择 **Set as Active**; + + ![设置活动工程](pictures/IAR_09_设置活动工程.png) + +4. 被设置为活动工程后,后续编译、下载、调试都会针对该工程进行。 + +## 7. 新建分组 + +分组用于在 IAR 工程中分类管理文件。 + +常见分组方式: + +```text +Application +Driver +CMSIS +Startup +User +Library +``` + +注意:IAR 中的分组主要是工程内部的逻辑分类,不一定等同于电脑磁盘中的真实文件夹。 + +### 7.1 新建分组操作步骤 + +1. 在工作区窗口中右键点击工程名称; +2. 选择 **Add**; +3. 选择 **Add Group**; +4. 输入分组名称; +5. 点击确定。 + +操作路径: + +```text +右键工程 → Add → Add Group +``` + +![新建分组](pictures/新建分组.png) + +### 7.2 分组作用 + +分组可以让工程结构更加清晰。 + +例如: + +```text +Driver:存放驱动文件 +User:存放用户代码 +Startup:存放启动文件 +CMSIS:存放内核相关文件 +``` + +![工程分组效果](pictures/IAR_11_工程分组效果.png) + +## 8. 新建 / 打开文件 + +IAR 中可以新建源码文件,也可以打开已有文件。 + +## 8.1 新建文件 + +操作步骤: + +1. 点击顶部菜单栏 **File**; +2. 选择 **New File** ; +3. 在编辑区输入代码; +4. 点击保存; +5. 选择保存路径; +6. 输入文件名,例如 `main.c`; +7. 保存后再将文件添加到工程中。 + +操作路径: + +```text +File → New File +``` + +### 8.2 添加文件到工程 + +新建文件后,如果只是保存到了电脑目录中,还不一定属于 IAR 工程。 + +需要将文件添加到工程中。 + +操作步骤: + +1. 右键点击对应分组; +2. 选择 **Add**; +3. 选择 **Add Files**; +4. 找到需要添加的 `.c` 或 `.h` 文件; +5. 点击打开。 + +操作路径: + +```text +右键分组 → Add → Add Files +``` + +![添加文件到工程](pictures/IAR_13_添加文件到工程.png) + +### 8.3 打开已有文件 + +操作步骤: + +1. 点击顶部菜单栏 **File**; +2. 选择 **Open File**; +3. 选择需要打开的文件; +4. 点击打开。 + +操作路径: + +```text +File → Open File +``` + +![打开文件](pictures/打开文件.png) + +## 9. 工程目录与文件目录的关系 + +IAR 工程中的文件显示结构,不一定和电脑磁盘中的真实文件目录完全一致。 + +### 9.1 工程目录 + +工程目录是 IAR 左侧工作区中看到的结构。 + +例如: + +```text +Project +|---Application +| |---main.c +|---Driver +| |---gpio.c +|---Startup +| |---startup.s +``` + +这是 IAR 工程中的逻辑分组结构。 + +### 9.2 文件目录 + +文件目录是电脑磁盘中的真实文件存放位置。 + +例如: + +```text +D:\Project\User\main.c +D:\Project\Driver\gpio.c +D:\Project\Startup\startup.s +``` + +### 9.3 二者区别 + +| 类型 | 含义 | +| -------- | -------------------------------- | +| 工程目录 | IAR 中显示的逻辑结构 | +| 文件目录 | 电脑磁盘中的真实路径 | +| 分组 | 方便管理文件,不一定是真实文件夹 | +| 文件路径 | 文件在磁盘上的实际位置 | + +简单理解: + +```text +IAR 左侧看到的是工程管理结构; +电脑文件夹里看到的是真实文件位置。 +``` + +## 10. 工程配置 + +工程配置主要通过 **Options** 窗口完成。 + +操作步骤: + +1. 在工作区中选中工程; +2. 右键点击工程名称; +3. 选择 **Options**; +4. 在弹出的窗口中配置设备、编译器、链接器、调试器等内容。 + +操作路径: + +```text +右键工程 → Options +``` + +也可以通过顶部菜单栏: + +```text +Project → Options +``` + +![工程配置入口](pictures/IAR_16_工程配置入口.png) + +## 11. 设备配置 + +设备配置用于选择当前工程使用的芯片型号。 + +### 11.1 配置步骤 + +1. 打开工程 **Options**; +2. 选择 **General Options**; +3. 找到 **Target** 选项; +4. 在 **Device** 中选择对应芯片型号; +5. 点击确定保存。 + +操作路径: + +```text +Project → Options → General Options → Target → Device +``` + +![设备配置](pictures/IAR_17_设备配置.png) + +### 11.2 作用 + +设备配置会影响编译器和调试器对芯片型号的识别。 + +如果设备选择错误,可能会导致: + +```text +编译配置不匹配 +下载失败 +调试异常 +芯片寄存器信息不正确 +``` + +## 12. 编译配置 + +编译配置主要用于设置编译器相关选项,包括优化等级、预处理宏、头文件路径、硬件浮点等。 + +常用配置入口: + +```text +Project → Options → C/C++ Compiler +``` + +![编译配置入口](pictures/IAR_18_编译配置入口.png) + +## 13. 优化等级配置 + +优化等级用于控制编译器对代码的优化程度。 + +### 13.1 操作步骤 + +1. 打开工程 **Options**; +2. 选择 **C/C++ Compiler**; +3. 进入 **Optimizations** 相关页面; +4. 根据需要选择优化等级; +5. 点击确定保存。 + +操作路径: + +```text +Project → Options → C/C++ Compiler → Optimizations +``` + +![优化等级配置](pictures/IAR_19_优化等级配置.png) + +### 13.2 常见说明 + +| 优化等级 | 说明 | +| -------- | -------------------- | +| None | 不优化,适合调试 | +| Low | 低优化 | +| Medium | 中等优化 | +| High | 高优化,适合正式发布 | + +调试阶段一般选择较低优化,方便单步调试和查看变量。 + +正式发布时可以适当提高优化等级,减小代码体积或提升运行效率。 + +## 14. 硬件浮点配置 + +硬件浮点配置用于设置是否使用芯片的 FPU 浮点运算单元。 + +### 14.1 操作步骤 + +1. 打开工程 **Options**; +2. 选择 **General Options**; +3. 进入 **Target** 相关页面; +4. 找到 FPU 或 Floating Point 相关选项; +5. 根据芯片支持情况选择硬件浮点或软件浮点; +6. 点击确定保存。 + +操作路径: + +```text +Project → Options → General Options → Target +``` + +![硬件浮点配置](pictures/IAR_20_硬件浮点配置.png) + +### 14.2 注意事项 + +硬件浮点配置需要和芯片型号、启动文件、库配置保持一致。 + +如果芯片不支持 FPU,却选择了硬件浮点,可能导致程序运行异常。 + +## 15. 预处理配置 + +预处理配置主要包括宏定义和头文件搜索路径。 + +常用入口: + +```text +Project → Options → C/C++ Compiler → Preprocessor +``` + +![预处理配置](pictures/IAR_21_预处理配置.png) + +### 15.1 宏定义配置 + +在预处理页面中,可以添加工程需要的宏定义。 + +例如: + +```text +USE_HAL_DRIVER +STM32F103xB +DEBUG +``` + +这些宏会影响条件编译。 + +示例: + +```c +#ifdef DEBUG + printf("debug mode"); +#endif +``` + +### 15.2 头文件路径配置 + +如果工程中包含头文件,例如: + +```c +#include "gpio.h" +#include "usart.h" +``` + +需要确保头文件所在目录已经添加到 Additional include directories 中。 + +常见路径示例: + +```text +$PROJ_DIR$\User +$PROJ_DIR$\Driver +$PROJ_DIR$\CMSIS +$PROJ_DIR$\Inc +``` + +如果头文件路径没有配置正确,编译时可能会报错: + +```text +Fatal Error: cannot open source input file +``` + +![](pictures/宏定义.png) + +## 16. 链接文件配置 + +链接文件用于配置程序的存储空间分布,例如 Flash 和 RAM 的起始地址、大小等。 + +IAR 中常见链接文件后缀为: + +```text +.icf +``` + +### 16.1 操作步骤 + +1. 打开工程 **Options**; +2. 选择 **Linker**; +3. 进入 **Config** 页面; +4. 勾选或选择自定义链接文件; +5. 添加对应的 `.icf` 文件路径; +6. 点击确定保存。 + +操作路径: + +```text +Project → Options → Linker → Config +``` + +![链接文件配置](pictures/IAR_22_链接文件配置.png) + +### 16.2 链接文件作用 + +链接文件决定代码和数据放到哪里。 + +常见内容包括: + +```text +Flash 起始地址 +Flash 大小 +RAM 起始地址 +RAM 大小 +栈空间 +堆空间 +中断向量表位置 +``` + +如果链接文件配置错误,可能导致程序无法正常启动或下载失败。 + +## 17. 文件路径配置 + +文件路径配置主要包括源码文件路径、头文件路径、库文件路径和输出路径。 + +在 IAR 中,建议使用相对路径,方便工程在不同电脑之间移动。 + +常见相对路径写法: + +```text +$PROJ_DIR$ +``` + +其中 `$PROJ_DIR$` 表示当前工程文件所在目录。 + +### 17.1 头文件路径配置 + +操作路径: + +```text +Project → Options → C/C++ Compiler → Preprocessor +``` + +在 Additional include directories 中添加头文件目录。 + +![头文件路径配置](pictures/IAR_23_头文件路径配置.png) + +### 17.2 库文件路径配置 + +库文件路径配置用于在工程中添加静态库文件,使工程在编译链接时能够使用库中的函数。 + +调用静态库时,一般需要配置两部分内容: + +```text +1. 添加头文件路径 +2. 添加静态库文件 +``` + +#### 17.2.1 添加头文件路径 + +操作步骤: + +1. 在 IAR 左侧工程窗口中,右键点击工程名称; + +2. 选择: + + ```text + Options + ``` + +3. 在左侧选择: + + ```text + C/C++ Compiler + ``` + +4. 切换到: + + ```text + Preprocessor + ``` + +5. 在: + + ```text + Additional include directories + ``` + + 中添加头文件所在的文件夹路径。 + + 例如: + + ```text + $PROJ_DIR$\Lib\Include + ``` + +6. 点击 **OK** 保存配置。 + +![添加头文件路径](pictures\Snipaste_2026-07-08_14-35-54.png) + +注意:这里添加的是头文件所在的**文件夹路径**,不是具体的 `.h` 文件。 + +正确写法: + +```text +$PROJ_DIR$\Lib\Include +``` + +错误写法: + +```text +$PROJ_DIR$\Lib\Include\lib_demo.h +``` + +#### 17.2.2 添加静态库文件 + +操作步骤: + +1. 在 IAR 左侧工程窗口中,右键点击需要添加库文件的分组; + + 如果没有专门的分组,可以先新建一个分组,例如: + + ```text + Library + ``` + +2. 选择: + + ```text + Add → Add Files + ``` + +3. 在文件选择窗口中,找到需要添加的静态库文件。 + + 例如: + + ```text + lib_demo.a + ``` + +4. 选中 `.a` 文件后,点击 **打开**; + +5. 添加完成后,`.a` 静态库文件会显示在工程分组中; + +6. 重新编译工程。 + +![添加静态库文件](pictures/IAR_库文件路径配置_添加静态库文件.png) + +## 18. 输出文件路径配置 + +输出文件路径用于设置编译后生成文件的保存位置。 + +常见输出文件包括: + +```text +.out +.hex +.bin +.map +``` + +## 18. 输出文件路径配置 + +输出文件路径配置用于设置 IAR 编译后生成文件的保存位置。 + +常见输出文件包括: + +```text +.out +.hex +.bin +.map +.obj +``` + +其中,`.out`、`.obj`、`.map` 等文件一般会生成到工程的输出目录中。 + +### 18.1 操作步骤 + +1. 在 IAR 左侧工程窗口中,右键点击工程名称; + +2. 选择: + + ```text + Options + ``` + +3. 在左侧选择: + + ```text + General Options + ``` + +4. 切换到: + + ```text + Output + ``` + +5. 在输出路径相关位置设置输出文件目录; + + 常见输出目录包括: + + ```text + Debug + Release + Exe + Obj + List + ``` + +6. 根据需要修改输出文件保存路径; + +7. 点击 **OK** 保存配置; + +8. 重新编译工程,查看输出目录中是否生成对应文件。 + +![输出文件路径配置](pictures/IAR_输出文件路径配置.png) + +### 18.2 Linker 中的 Output 配置说明 + +`Linker → Output` 主要用于配置链接器输出文件的相关信息。 + +链接器的作用是将编译生成的目标文件、库文件等内容进行链接,最终生成工程的输出文件。 + +操作路径: + +```text +Project → Options → Linker → Output +``` + +![Linker输出配置](pictures/IAR_Linker_Output配置.png) + +#### 操作步骤 + +1. 在 IAR 左侧工程窗口中,右键点击工程名称; + +2. 选择: + + ```text + Options + ``` + +3. 在左侧选择: + + ```text + Linker + ``` + +4. 切换到: + + ```text + Output + ``` + +5. 根据需要查看或修改链接输出相关配置; + +6. 点击 **OK** 保存配置; + +7. 重新编译工程,查看输出文件是否正常生成。 + +#### 配置说明 + +`Linker → Output` 中主要关注链接后生成的输出文件。 + +常见输出文件包括: + +```text +.out +.map +.hex +.bin +``` + +其中: + +| 文件类型 | 说明 | +| -------- | -------------------------------------------------- | +| `.out` | IAR 默认生成的调试输出文件,调试时常用 | +| `.map` | 链接映射文件,用于查看函数、变量、段地址和内存占用 | +| `.hex` | 十六进制文件,常用于程序烧录 | +| `.bin` | 二进制文件,也可用于程序烧录 | + +#### 注意事项 + +`Linker → Output` 主要和链接输出结果有关。 + +如果需要配置链接脚本,应到: + +```text +Project → Options → Linker → Config +``` + +如果需要生成 `.hex` 或 `.bin` 文件,一般还需要配置: + +```text +Project → Options → Output Converter +``` + +简单理解: + +```text +Linker → Output: +查看或设置链接器最终输出文件相关内容。 + +Linker → Config: +配置链接文件,例如 .icf 文件。 + +Output Converter: +配置是否额外生成 .hex、.bin 等烧录文件。 +``` +## 19. 输出文件配置 + +输出文件配置用于设置是否生成 `.hex`、`.bin` 等文件。 + +### 19.1 生成 hex 文件 + +操作步骤: + +1. 打开工程 **Options**; +2. 选择 **Output Converter**; +3. 勾选生成额外输出文件; +4. 选择 Intel HEX 格式; +5. 点击确定保存; +6. 重新编译工程。 + +操作路径: + +```text +Project → Options → Output Converter +``` + +![生成hex文件](pictures/IAR_26.png) + +### 19.2 生成 bin 文件 + +如果需要生成二进制文件,可以在输出转换配置中选择 binary 格式。 + +![生成bin文件](pictures/IAR_27.png) + +### 19.3 输出文件说明 + +| 文件 | 作用 | +| ------ | ------------------------------ | +| `.out` | 调试用输出文件 | +| `.hex` | 常用于烧录 | +| `.bin` | 二进制烧录文件 | +| `.map` | 链接映射文件,用于分析内存占用 | + +## 20. 调试器配置 + +调试器配置用于设置 IAR 使用哪种调试方式连接目标板。 + +常见调试器包括: + +```text +Simulator +J-Link +ST-LINK +I-jet +CMSIS-DAP +``` + +### 20.1 操作步骤 + +1. 打开工程 **Options**; +2. 选择 **Debugger**; +3. 进入 **Setup** 页面; +4. 在 Driver 中选择调试器类型; +5. 根据实际硬件选择 J-Link、ST-LINK 或其他调试器; +6. 点击确定保存。 + +操作路径: + +```text +Project → Options → Debugger → Setup → Driver +``` + +![调试器配置](pictures/IAR_28_调试器配置.png) + +### 20.2 注意事项 + +调试器配置需要和实际连接的仿真器一致。 + +如果使用 J-Link,就选择 J-Link; +如果使用 ST-LINK,就选择 ST-LINK。 + +选择错误可能导致下载或调试失败。 + +## 21. 库相关配置 + +库相关配置主要用于设置工程使用的运行库,以及静态库的生成和调用方式。 + +在 IAR 中,库相关内容一般包括以下三部分: + +```text +1. C 库配置 +2. 静态库的封装 +3. 静态库的调用 +``` + +### 21.1 C 库配置 + +C 库配置用于设置工程使用的标准 C 库类型。 + +标准 C 库中包含一些常用函数,例如: + +```c +printf(); +memcpy(); +strlen(); +malloc(); +``` + +在 IAR 中,可以根据工程需要选择不同的库配置。 + +#### 操作步骤 + +1. 在 IAR 左侧工程窗口中,右键点击工程名称; + +2. 选择: + + ```text + Options + ``` + +3. 在左侧选择: + + ```text + General Options + ``` + +4. 找到: + + ```text + Library Configuration + ``` + +5. 根据工程需要选择对应的 C 库配置; + +6. 点击 **OK** 保存配置。 + +![C库配置](pictures/IAR_库相关配置_C库配置.png) + +#### 常见说明 + +不同库配置会影响工程对标准库函数的支持情况。 + +例如: + +| 配置内容 | 说明 | +| -------- | ------------------------------------------------------------ | +| None | 不使用 / 不链接 C 运行库。 | +| Normal | 使用 C/C++ 运行时库的普通配置。不支持区域设置接口,使用 C 区域设置;不支持文件描述符;printf 和 scanf 不支持多字节字符;strtod 不支持十六进制浮点数。 | +| Full | 控制格式化输入输出函数的支持程度 | +| Custom | 使用 C/C++ 运行时库的完整配置。支持完整的区域设置接口,使用 C 区域设置;支持文件描述符;printf 和 scanf 支持多字节字符;strtod 支持十六进制浮点数。 | + +在嵌入式工程中,如果程序空间较小,可以选择较精简的库配置; +如果需要使用 `printf`、`sprintf` 等函数,则需要确认库配置是否支持相关功能。 + +### 21.2 静态库相关内容 + +静态库是将多个源文件编译后封装成的库文件。 + +IAR 中常见的静态库文件后缀为: + +```text +.a +``` + +静态库通常由两部分组成: + +```text +.h 头文件:提供函数声明 +.a 库文件:提供函数实现 +``` + +调用静态库时,其他工程通常不需要看到库内部的 `.c` 源文件,只需要使用 `.h` 头文件和 `.a` 库文件即可。 + +### 21.3 静态库的使用流程 + +静态库一般分为两个步骤: + +```text +第一步:封装静态库 +将多个 .c 文件编译生成 .a 库文件。 + +第二步:调用静态库 +在其他工程中添加 .a 文件,并配置 .h 头文件路径。 +``` + +简单理解: + +```text +封装静态库:把源码打包成库。 + +调用静态库:在其他工程中使用这个库。 +``` + +## 22. 静态库的封装 + +静态库封装是指将一个或多个 `.c` 源文件编译成一个 `.a` 静态库文件,供其他工程调用。 + +封装后的静态库可以隐藏具体实现代码,只向外提供头文件和库文件。 + +例如有以下文件: + +```text +lib_demo.c +lib_demo.h +``` + +可以将 `lib_demo.c` 编译生成: + +```text +lib_demo.a +``` + +然后其他工程只需要使用: + +```text +lib_demo.h +lib_demo.a +``` + +即可调用库中的函数。 + +### 22.1 静态库封装前准备 + +封装静态库前,需要准备好需要封装的源码文件和头文件。 + +例如: + +```text +lib_demo.c +lib_demo.h +``` + +其中: + +```text +lib_demo.c:函数实现文件 +lib_demo.h:函数声明文件 +``` + +示例头文件内容: + +```c +#ifndef __LIB_DEMO_H +#define __LIB_DEMO_H + +void Lib_Demo_Init(void); +void Lib_Demo_Run(void); + +#endif +``` + +示例源文件内容: + +```c +#include "lib_demo.h" + +void Lib_Demo_Init(void) +{ + /* 初始化代码 */ +} + +void Lib_Demo_Run(void) +{ + /* 运行代码 */ +} +``` + +![静态库源码文件](pictures/IAR_静态库封装_源码文件.png) + +### 22.2 新建静态库工程 + +操作步骤: + +1. 打开 IAR; + +2. 点击顶部菜单栏: + + ```text + Project + ``` + +3. 选择: + + ```text + Create New Project + ``` + +4. 在工程类型中选择空工程选项; + + ```text + Empty project + ``` + +5. 选择工程保存路径; + +6. 输入工程名称,例如: + + ```text + LibDemo + ``` + +7. 点击保存,完成静态库工程创建。 + +![新建静态库工程](pictures/IAR_静态库封装_新建静态库工程.png) + +### 22.3 添加需要封装的文件 + +静态库工程创建完成后,需要将需要封装的 `.c` 文件添加到工程中。 + +操作步骤: + +1. 在左侧工程窗口中,右键点击静态库工程; + +2. 选择: + + ```text + Add → Add Files + ``` + +3. 选择需要封装的 `.c` 文件; + + 例如: + + ```text + lib_demo.c + ``` + +4. 点击打开; + +5. 文件添加完成后,会显示在工程列表中。 + +![添加静态库源文件](pictures/IAR_静态库封装_添加源文件.png) + +如果工程中需要分组管理文件,可以先新建分组,例如: + +```text +Source +Include +``` + +再将对应文件添加到分组中。 + +### 22.4 配置头文件路径 + +如果 `.c` 文件中包含了头文件,例如: + +```c +#include "lib_demo.h" +``` + +需要确保 IAR 能找到对应的 `.h` 文件。 + +操作步骤: + +1. 右键点击工程名称; + +2. 选择: + + ```text + Options + ``` + +3. 在左侧选择: + + ```text + C/C++ Compiler + ``` + +4. 切换到: + + ```text + Preprocessor + ``` + +5. 在: + + ```text + Additional include directories + ``` + + 中添加头文件所在文件夹路径。 + +例如: + +```text +$PROJ_DIR$\Include +``` + +6. 点击 **OK** 保存。 + +![静态库头文件路径配置](pictures/IAR_静态库封装_头文件路径配置.png) + +注意:这里添加的是文件夹路径,不是具体的 `.h` 文件。 + +正确写法: + +```text +$PROJ_DIR$\Include +``` + +错误写法: + +```text +$PROJ_DIR$\Include\lib_demo.h +``` + +### 22.5 配置设备和编译选项 + +静态库工程也需要配置设备型号、输出类型和编译选项。 + +操作步骤: + +1. 右键点击静态库工程; + +2. 选择: + + ```text + Options + ``` + +3. 在左侧选择: + + ```text + General Options + ``` + +4. 在 **Target** 中选择和目标工程一致的芯片型号; + +5. 切换到 **Output** 页面; + +6. 将输出类型设置为: + + ```text + Library + ``` + + 或类似选项: + + ```text + Static Library + ``` + + 这一步很重要,如果没有选择 **Library**,工程可能会按照普通应用工程编译,最终不会生成 `.a` 静态库文件。 + +7. 在 **C/C++ Compiler** 中检查编译配置; + +8. 如果工程使用浮点功能,需要确认浮点配置和调用该库的工程一致; + +9. 点击 **OK** 保存配置。 + +![静态库设备和输出类型配置](pictures/IAR_静态库封装_设备和输出类型配置.png) + +注意:静态库工程的芯片型号、编译器配置、浮点配置应尽量和后续调用该库的工程保持一致,否则可能出现链接失败或运行异常。 + +同时,静态库工程必须将输出类型设置为 **Library**,否则编译后可能不会生成 `.a` 文件。 + +### 22.6 编译生成静态库 + +配置完成后,可以编译静态库工程。 + +操作步骤: + +1. 确认当前活动工程是静态库工程; + +2. 点击顶部菜单栏: + + ```text + Project → Make + ``` + + 或: + + ```text + Project → Rebuild All + ``` + +3. 等待编译完成; + +4. 查看 Build 窗口是否有错误; + +5. 如果没有错误,会生成 `.a` 静态库文件。 + + ![查看静态库文件](pictures/IAR_静态库封装_查看静态库文件.png) + +### 22.7 查看生成的静态库文件 + +编译成功后,可以在工程输出目录中找到生成的 `.a` 文件。 + +常见输出目录可能类似: + +```text +Debug\Exe +Release\Exe +``` + +生成的静态库文件示例: + +```text +LibDemo.a +``` + +![查看静态库文件](pictures/IAR_静态库封装_查看静态库件.png) + +### 22.8 静态库封装完成后需要提供的文件 + +静态库封装完成后,如果要给其他工程使用,一般需要提供以下文件: + +```text +1. .a 静态库文件 +2. .h 头文件 +``` + +例如: + +```text +LibDemo.a +lib_demo.h +``` + +其中: + +```text +LibDemo.a:保存函数实现 +lib_demo.h:提供函数声明 +``` + +如果只提供 `.a` 文件,没有 `.h` 文件,其他工程不知道有哪些函数可以调用。 + +如果只提供 `.h` 文件,没有 `.a` 文件,编译可能能通过,但链接时会报错。 + +### 22.9 静态库封装总结 + +静态库封装流程可以总结为: + +```text +准备 .c 和 .h 文件 +→ 新建静态库工程 +→ 添加 .c 文件到工程 +→ 配置头文件路径 +→ 配置设备和编译选项 +→ 编译工程 +→ 生成 .a 静态库文件 +→ 提供 .a 文件和 .h 文件给其他工程使用 +``` + +简单理解: + +```text +.c 文件负责实现功能。 + +.h 文件负责声明接口。 + +.a 文件是编译后生成的静态库。 + +别人调用库时,需要 .h + .a。 +``` +## 23. 静态库的调用 + +静态库调用是指在应用工程中使用已经封装好的 `.a` 库文件。 + +### 23.1 添加头文件路径 + +如果调用库函数,需要先添加库对应的头文件路径。 + +操作路径: + +```text +Project → Options → C/C++ Compiler → Preprocessor +``` + +在 Additional include directories 中添加库头文件目录。 + +![静态库头文件路径](pictures/IAR_32_静态库头文件路径.png) + +### 23.2 添加静态库文件 + +操作步骤: + +1. 在应用工程中右键点击分组; +2. 选择 **Add**; +3. 选择 **Add Files**; +4. 找到 `.a` 静态库文件; +5. 将静态库添加到工程中。 + +![添加静态库文件](pictures/IAR_33_添加静态库文件.png) + +### 23.3 包含头文件并调用函数 + +在代码中包含库头文件: + +```c +#include "lib_demo.h" +``` + +然后调用库中的函数: + +```c +Lib_Demo_Init(); +Lib_Demo_Run(); +``` + +![调用静态库函数](pictures/IAR_34_调用静态库函数.png) + +### 23.4 静态库调用注意事项 + +调用静态库时需要注意: + +1. `.a` 文件已经添加到工程; +2. `.h` 头文件路径已经配置; +3. 函数声明和函数调用名称一致; +4. 静态库和当前工程芯片平台、编译配置兼容; +5. 如果库依赖其他文件,也需要一起添加。 + +## 24. 工程编译 + +IAR 中常用编译操作包括 Make 和 Rebuild All。 + +### 24.1 Make + +Make 只编译发生变化的文件。 + +操作路径: + +```text +Project → Make +``` + +或者点击工具栏中的 Make 按钮。 + +![Make编译](pictures/IAR_35_Make编译.png) + +### 24.2 Rebuild All + +Rebuild All 会重新编译整个工程。 + +操作路径: + +```text +Project → Rebuild All +``` + +![RebuildAll编译](pictures/IAR_36_RebuildAll编译.png) + +### 24.3 查看编译结果 + +编译完成后,可以在 Build 窗口查看结果。 + +常见结果: + +```text +Errors:错误数量 +Warnings:警告数量 +``` + +如果 Errors 为 0,说明工程编译通过。 + +![编译结果](pictures/IAR_37_编译结果.png) + +## 25. 工程调试 + +工程调试用于下载程序、运行程序、设置断点、查看变量和分析程序执行过程。 + +进入调试前,需要先完成: + +1. 工程可以正常编译; +2. 调试器配置正确; +3. 开发板和仿真器连接正常; +4. 目标板供电正常。 + +常用调试入口: + +```text +Project → Download and Debug +``` + +![下载并调试](pictures/IAR_38_下载并调试.png) + +## 26. 断点 + +断点用于让程序运行到指定代码行时暂停,方便查看当前变量、寄存器和程序状态。 + +## 26.1 设置断点 + +操作步骤: + +1. 打开需要调试的源码文件; +2. 找到需要暂停的代码行; +3. 点击该行左侧空白区域; +4. 出现红色圆点,表示断点设置成功。 + +![设置断点](pictures/IAR_39.png) + +## 26.2 禁用断点 + +禁用断点是指暂时不使用该断点,但不删除断点。 + +操作步骤: + +1. 找到已经设置的断点; + +2. 右键点击断点; + +3. 选择 Disable Breakpoint; + + ![禁用断点](pictures\IAR39.png) + +4. 断点变为禁用状态。 + +![禁用断点](pictures/IAR_41.png) + +## 26.3 启用断点 + +如果需要重新使用被禁用的断点,可以启用断点。 + +操作步骤: + +1. 找到被禁用的断点; + +2. 右键点击断点; + +3. 选择 Enable Breakpoint; + + ![启用断点](pictures/启用断点.png) + +4. 断点恢复启用状态。 + + + +## 26.4 删除断点 + +删除断点是指将断点完全移除。 + +操作步骤: + +1. 点击已经设置断点的红点; +2. 红点消失,表示断点删除成功。 + +或者右键断点,选择删除断点。 + +## 26.5 条件断点 + +条件断点是指只有满足指定条件时,程序才会在该断点处暂停。 + +例如: + +```text +count == 10 +flag == 1 +``` + +操作步骤: + +1. 设置普通断点; + +2. 右键点击断点; + +3. 选择 Edit Breakpoint; + + ![条件断点](pictures/IAR_43.png) + +4. 在条件栏中输入条件表达式; + +5. 点击确定。 + +![条件断点](pictures/IAR44.png) + +条件断点适合循环次数较多或只想观察特定条件下程序状态的情况。 + +## 27. 监控信息 + +监控信息用于查看变量的当前值。 + +IAR 中常用 Watch 窗口查看变量。 + +### 27.1 打开 Watch 窗口 + +调试模式下,点击菜单: + +```text +View → Watch +``` + +![Watch窗口](pictures/IAR_44_Watch窗口.png) + +### 27.2 添加监控变量 + +操作步骤: + +1. 进入调试模式; +2. 打开 Watch 窗口; +3. 在 Watch 窗口中输入变量名; +4. 程序运行或单步执行时,可以查看变量值变化。 + +![添加监控变量](pictures/IAR_45_添加监控变量.png) + +## 28. 寄存器信息 + +寄存器窗口用于查看 CPU 寄存器和外设寄存器信息。 + +### 28.1 打开寄存器窗口 + +调试模式下,点击菜单: + +```text +View → Register +``` + +![寄存器窗口](pictures/IAR_46_寄存器窗口.png) + +### 28.2 作用 + +寄存器窗口可以查看: + +```text +通用寄存器 +程序计数器 PC +堆栈指针 SP +状态寄存器 +外设寄存器 +``` + +在调试底层驱动或硬件问题时,寄存器窗口非常常用。 + +## 29. 内存信息 + +内存窗口用于查看指定地址处的内存数据。 + +### 29.1 打开内存窗口 + +调试模式下,点击菜单: + +```text +View → Memory +``` + +![内存窗口](pictures/IAR_47_内存窗口.png) + +### 29.2 查看指定地址 + +在 Memory 窗口中输入地址,例如: + +```text +0x20000000 +``` + +可以查看 RAM 中的数据。 + +也可以输入变量地址,查看变量在内存中的实际内容。 + +![查看内存地址](pictures/IAR_48_查看内存地址.png) + +## 30. 栈信息 + +栈信息用于分析函数调用过程中栈空间的使用情况。 + +### 30.1 打开栈窗口 + +调试模式下,可以通过 View 菜单打开 Stack 相关窗口。 + +操作路径示例: + +```text +View → Stack +``` + +![栈信息窗口](pictures/IAR_49.png) + +### 30.2 作用 + +栈信息可以帮助分析: + +```text +函数调用占用的栈空间 +局部变量使用情况 +栈是否溢出 +程序异常时的调用情况 +``` + +## 31. 汇编信息 + +汇编窗口用于查看 C 代码对应的汇编指令。 + +### 31.1 打开汇编窗口 + +调试模式下,点击菜单: + +```text +View → Disassembly +``` + +![汇编窗口](pictures/IAR_50_汇编窗口.png) + +### 31.2 作用 + +汇编信息常用于: + +```text +分析底层执行流程 +查看编译后的指令 +调试启动文件 +分析中断入口 +分析程序跑飞问题 +``` + +## 32. 调用堆栈信息 + +调用堆栈用于查看当前程序是通过哪些函数调用到当前位置的。 + +### 32.1 打开调用堆栈窗口 + +调试模式下,点击菜单: + +```text +View → Call Stack +``` + +![调用堆栈窗口](pictures/IAR_51_调用堆栈窗口.png) + +### 32.2 作用 + +调用堆栈可以帮助分析函数调用关系。 + +例如程序停在某个函数中,可以通过调用堆栈查看: + +```text +main +Task_Run +Driver_Init +Error_Handler +``` + +这样可以知道程序是怎么执行到当前位置的。 + +## 33. 单步调试 + +单步调试用于逐行或逐函数执行程序,方便观察程序运行流程。 + +常用单步调试功能包括: + +```text +逐过程 +逐语句 +复位 +跳出 +``` + +## 33.1 逐过程 + +逐过程一般对应 Step Over。 + +作用是执行当前这一行代码,如果当前行是函数调用,则直接执行完整个函数,不进入函数内部。 + +操作方式: + +```text +Debug → Step Over +``` + +![逐过程](pictures/IAR_52_逐过程.png) + +适用场景: + +```text +只关心当前函数执行结果,不需要进入函数内部。 +``` + +## 33.2 逐语句 + +逐语句一般对应 Step Into。 + +作用是执行当前这一行代码,如果当前行是函数调用,则进入函数内部继续调试。 + +操作方式: + +```text +Debug → Step Into +``` + +![逐语句](pictures/IAR_53_逐语句.png) + +适用场景: + +```text +需要查看函数内部具体执行过程。 +``` + +## 33.3 复位 + +复位用于将程序重新复位到初始状态。 + +操作方式: + +```text +Debug → Reset +``` + +![复位](pictures/IAR_54_复位.png) + +适用场景: + +```text +程序运行异常 +需要重新从启动位置开始调试 +需要重新观察初始化流程 +``` + +## 33.4 跳出 + +跳出一般对应 Step Out。 + +作用是从当前函数中执行出去,返回到调用该函数的位置。 + +操作方式: + +```text +Debug → Step Out +``` + +![跳出](pictures/IAR_55_跳出.png) + +适用场景: + +```text +已经进入某个函数内部,但不想继续逐行查看该函数。 +``` + +## 34. 调试流程示例 + +一个常见的 IAR 调试流程如下: + +1. 确认工程可以正常编译; +2. 配置正确的调试器; +3. 连接开发板和仿真器; +4. 点击 Download and Debug; +5. 设置断点; +6. 运行程序; +7. 程序停在断点处; +8. 查看 Watch 变量; +9. 查看寄存器、内存、调用堆栈; +10. 使用逐过程、逐语句、跳出等方式分析程序。 + +## 35. 常见问题 + +### 35.1 找不到头文件 + +现象: + +```text +cannot open source input file +``` + +可能原因: + +```text +头文件路径没有添加 +文件没有加入工程 +include 路径写错 +``` + +解决方法: + +1. 检查头文件是否存在; +2. 检查 include 路径是否正确; +3. 在 Preprocessor 中添加头文件路径。 + +### 35.2 链接失败 + +现象: + +```text +Error while running linker +``` + +可能原因: + +```text +链接文件配置错误 +函数只声明未定义 +库文件没有添加 +内存空间不足 +``` + +解决方法: + +1. 检查 `.icf` 链接文件; +2. 检查所有 `.c` 文件是否加入工程; +3. 检查静态库是否添加; +4. 查看 `.map` 文件分析内存占用。 + +### 35.3 下载失败 + +可能原因: + +```text +调试器选择错误 +开发板未供电 +仿真器未连接 +芯片型号选择错误 +``` + +解决方法: + +1. 检查调试器连接; +2. 检查目标板供电; +3. 检查 Debugger 配置; +4. 检查 Device 设备型号配置。 + +### 35.4 断点不生效 + +可能原因: + +```text +优化等级过高 +代码没有执行到该位置 +断点被禁用 +程序已经跑飞 +``` + +解决方法: + +1. 降低优化等级; +2. 确认断点已启用; +3. 确认程序流程会执行到该位置; +4. 重新下载程序并调试。 + +## 36. 总结 + +IAR 学习主要包括工程操作、工程配置和工程调试三部分。 + +工程操作包括: + +```text +新建/打开工作区 +新建/打开工程 +添加已有工程 +新建分组 +新建/打开文件 +理解工程目录与文件目录关系 +``` + +工程配置包括: + +```text +设备配置 +编译配置 +优化等级 +硬件浮点 +预处理 +链接文件 +文件路径 +输出文件 +调试器 +库相关配置 +静态库封装 +静态库调用 +``` + +工程调试包括: + +```text +设置断点 +禁用断点 +启用断点 +删除断点 +条件断点 +查看变量 +查看寄存器 +查看内存 +查看栈 +查看汇编 +查看调用堆栈 +单步调试 +``` + +通过以上学习,可以掌握 IAR 在嵌入式工程中的基本使用流程,为后续进行单片机程序开发、编译下载和调试分析打下基础。 \ No newline at end of file diff --git a/yuwenhao/IAR/pictures/IAR39.png b/yuwenhao/IAR/pictures/IAR39.png new file mode 100644 index 0000000..980835a Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR39.png differ diff --git a/yuwenhao/IAR/pictures/IAR44.png b/yuwenhao/IAR/pictures/IAR44.png new file mode 100644 index 0000000..165fbb0 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR44.png differ diff --git a/yuwenhao/IAR/pictures/IAR_01_主界面.png b/yuwenhao/IAR/pictures/IAR_01_主界面.png new file mode 100644 index 0000000..f9da94f Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_01_主界面.png differ diff --git a/yuwenhao/IAR/pictures/IAR_03_新建工作区.png b/yuwenhao/IAR/pictures/IAR_03_新建工作区.png new file mode 100644 index 0000000..f1fb6c5 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_03_新建工作区.png differ diff --git a/yuwenhao/IAR/pictures/IAR_04_保存工作区.png b/yuwenhao/IAR/pictures/IAR_04_保存工作区.png new file mode 100644 index 0000000..98621d2 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_04_保存工作区.png differ diff --git a/yuwenhao/IAR/pictures/IAR_05_打开工作区.png b/yuwenhao/IAR/pictures/IAR_05_打开工作区.png new file mode 100644 index 0000000..a8a0ce2 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_05_打开工作区.png differ diff --git a/yuwenhao/IAR/pictures/IAR_06_新建工程.png b/yuwenhao/IAR/pictures/IAR_06_新建工程.png new file mode 100644 index 0000000..c173bf2 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_06_新建工程.png differ diff --git a/yuwenhao/IAR/pictures/IAR_07_新建工程完成.png b/yuwenhao/IAR/pictures/IAR_07_新建工程完成.png new file mode 100644 index 0000000..4128282 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_07_新建工程完成.png differ diff --git a/yuwenhao/IAR/pictures/IAR_09_设置活动工程.png b/yuwenhao/IAR/pictures/IAR_09_设置活动工程.png new file mode 100644 index 0000000..f925456 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_09_设置活动工程.png differ diff --git a/yuwenhao/IAR/pictures/IAR_11_工程分组效果.png b/yuwenhao/IAR/pictures/IAR_11_工程分组效果.png new file mode 100644 index 0000000..7ce9a37 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_11_工程分组效果.png differ diff --git a/yuwenhao/IAR/pictures/IAR_13_添加文件到工程.png b/yuwenhao/IAR/pictures/IAR_13_添加文件到工程.png new file mode 100644 index 0000000..07338f1 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_13_添加文件到工程.png differ diff --git a/yuwenhao/IAR/pictures/IAR_16_工程配置入口.png b/yuwenhao/IAR/pictures/IAR_16_工程配置入口.png new file mode 100644 index 0000000..cd51ae5 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_16_工程配置入口.png differ diff --git a/yuwenhao/IAR/pictures/IAR_17_设备配置.png b/yuwenhao/IAR/pictures/IAR_17_设备配置.png new file mode 100644 index 0000000..1efe65f Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_17_设备配置.png differ diff --git a/yuwenhao/IAR/pictures/IAR_18_编译配置入口.png b/yuwenhao/IAR/pictures/IAR_18_编译配置入口.png new file mode 100644 index 0000000..f2f65fc Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_18_编译配置入口.png differ diff --git a/yuwenhao/IAR/pictures/IAR_19_优化等级配置.png b/yuwenhao/IAR/pictures/IAR_19_优化等级配置.png new file mode 100644 index 0000000..0605e51 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_19_优化等级配置.png differ diff --git a/yuwenhao/IAR/pictures/IAR_20_硬件浮点配置.png b/yuwenhao/IAR/pictures/IAR_20_硬件浮点配置.png new file mode 100644 index 0000000..3796740 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_20_硬件浮点配置.png differ diff --git a/yuwenhao/IAR/pictures/IAR_21_预处理配置.png b/yuwenhao/IAR/pictures/IAR_21_预处理配置.png new file mode 100644 index 0000000..b8131ca Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_21_预处理配置.png differ diff --git a/yuwenhao/IAR/pictures/IAR_22_链接文件配置.png b/yuwenhao/IAR/pictures/IAR_22_链接文件配置.png new file mode 100644 index 0000000..60a0dbe Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_22_链接文件配置.png differ diff --git a/yuwenhao/IAR/pictures/IAR_23_头文件路径配置.png b/yuwenhao/IAR/pictures/IAR_23_头文件路径配置.png new file mode 100644 index 0000000..d017a9d Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_23_头文件路径配置.png differ diff --git a/yuwenhao/IAR/pictures/IAR_26.png b/yuwenhao/IAR/pictures/IAR_26.png new file mode 100644 index 0000000..81a96ff Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_26.png differ diff --git a/yuwenhao/IAR/pictures/IAR_27.png b/yuwenhao/IAR/pictures/IAR_27.png new file mode 100644 index 0000000..e7e67e9 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_27.png differ diff --git a/yuwenhao/IAR/pictures/IAR_28_调试器配置.png b/yuwenhao/IAR/pictures/IAR_28_调试器配置.png new file mode 100644 index 0000000..456b11c Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_28_调试器配置.png differ diff --git a/yuwenhao/IAR/pictures/IAR_32_静态库头文件路径.png b/yuwenhao/IAR/pictures/IAR_32_静态库头文件路径.png new file mode 100644 index 0000000..06133d0 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_32_静态库头文件路径.png differ diff --git a/yuwenhao/IAR/pictures/IAR_33_添加静态库文件.png b/yuwenhao/IAR/pictures/IAR_33_添加静态库文件.png new file mode 100644 index 0000000..f172491 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_33_添加静态库文件.png differ diff --git a/yuwenhao/IAR/pictures/IAR_34_调用静态库函数.png b/yuwenhao/IAR/pictures/IAR_34_调用静态库函数.png new file mode 100644 index 0000000..b1b582e Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_34_调用静态库函数.png differ diff --git a/yuwenhao/IAR/pictures/IAR_35_Make编译.png b/yuwenhao/IAR/pictures/IAR_35_Make编译.png new file mode 100644 index 0000000..6df02f8 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_35_Make编译.png differ diff --git a/yuwenhao/IAR/pictures/IAR_36_RebuildAll编译.png b/yuwenhao/IAR/pictures/IAR_36_RebuildAll编译.png new file mode 100644 index 0000000..1f75805 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_36_RebuildAll编译.png differ diff --git a/yuwenhao/IAR/pictures/IAR_37_编译结果.png b/yuwenhao/IAR/pictures/IAR_37_编译结果.png new file mode 100644 index 0000000..3037ffd Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_37_编译结果.png differ diff --git a/yuwenhao/IAR/pictures/IAR_38_下载并调试.png b/yuwenhao/IAR/pictures/IAR_38_下载并调试.png new file mode 100644 index 0000000..e1b51aa Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_38_下载并调试.png differ diff --git a/yuwenhao/IAR/pictures/IAR_39.png b/yuwenhao/IAR/pictures/IAR_39.png new file mode 100644 index 0000000..bb94d89 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_39.png differ diff --git a/yuwenhao/IAR/pictures/IAR_41.png b/yuwenhao/IAR/pictures/IAR_41.png new file mode 100644 index 0000000..62ae06b Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_41.png differ diff --git a/yuwenhao/IAR/pictures/IAR_43.png b/yuwenhao/IAR/pictures/IAR_43.png new file mode 100644 index 0000000..32a7176 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_43.png differ diff --git a/yuwenhao/IAR/pictures/IAR_44_Watch窗口.png b/yuwenhao/IAR/pictures/IAR_44_Watch窗口.png new file mode 100644 index 0000000..9c68a26 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_44_Watch窗口.png differ diff --git a/yuwenhao/IAR/pictures/IAR_45_添加监控变量.png b/yuwenhao/IAR/pictures/IAR_45_添加监控变量.png new file mode 100644 index 0000000..3d03b57 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_45_添加监控变量.png differ diff --git a/yuwenhao/IAR/pictures/IAR_46_寄存器窗口.png b/yuwenhao/IAR/pictures/IAR_46_寄存器窗口.png new file mode 100644 index 0000000..456baeb Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_46_寄存器窗口.png differ diff --git a/yuwenhao/IAR/pictures/IAR_47_内存窗口.png b/yuwenhao/IAR/pictures/IAR_47_内存窗口.png new file mode 100644 index 0000000..34dcb37 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_47_内存窗口.png differ diff --git a/yuwenhao/IAR/pictures/IAR_48_查看内存地址.png b/yuwenhao/IAR/pictures/IAR_48_查看内存地址.png new file mode 100644 index 0000000..d66fb25 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_48_查看内存地址.png differ diff --git a/yuwenhao/IAR/pictures/IAR_49.png b/yuwenhao/IAR/pictures/IAR_49.png new file mode 100644 index 0000000..dd1f810 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_49.png differ diff --git a/yuwenhao/IAR/pictures/IAR_50_汇编窗口.png b/yuwenhao/IAR/pictures/IAR_50_汇编窗口.png new file mode 100644 index 0000000..fde8192 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_50_汇编窗口.png differ diff --git a/yuwenhao/IAR/pictures/IAR_51_调用堆栈窗口.png b/yuwenhao/IAR/pictures/IAR_51_调用堆栈窗口.png new file mode 100644 index 0000000..8b59cf2 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_51_调用堆栈窗口.png differ diff --git a/yuwenhao/IAR/pictures/IAR_52_逐过程.png b/yuwenhao/IAR/pictures/IAR_52_逐过程.png new file mode 100644 index 0000000..e92adc5 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_52_逐过程.png differ diff --git a/yuwenhao/IAR/pictures/IAR_53_逐语句.png b/yuwenhao/IAR/pictures/IAR_53_逐语句.png new file mode 100644 index 0000000..389d905 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_53_逐语句.png differ diff --git a/yuwenhao/IAR/pictures/IAR_54_复位.png b/yuwenhao/IAR/pictures/IAR_54_复位.png new file mode 100644 index 0000000..dae8952 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_54_复位.png differ diff --git a/yuwenhao/IAR/pictures/IAR_55_跳出.png b/yuwenhao/IAR/pictures/IAR_55_跳出.png new file mode 100644 index 0000000..84f88ee Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_55_跳出.png differ diff --git a/yuwenhao/IAR/pictures/IAR_Linker_Output配置.png b/yuwenhao/IAR/pictures/IAR_Linker_Output配置.png new file mode 100644 index 0000000..1223c1f Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_Linker_Output配置.png differ diff --git a/yuwenhao/IAR/pictures/IAR_库文件路径配置_添加静态库文件.png b/yuwenhao/IAR/pictures/IAR_库文件路径配置_添加静态库文件.png new file mode 100644 index 0000000..090a136 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_库文件路径配置_添加静态库文件.png differ diff --git a/yuwenhao/IAR/pictures/IAR_库相关配置_C库配置.png b/yuwenhao/IAR/pictures/IAR_库相关配置_C库配置.png new file mode 100644 index 0000000..59c6d05 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_库相关配置_C库配置.png differ diff --git a/yuwenhao/IAR/pictures/IAR_输出文件路径配置.png b/yuwenhao/IAR/pictures/IAR_输出文件路径配置.png new file mode 100644 index 0000000..fa25651 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_输出文件路径配置.png differ diff --git a/yuwenhao/IAR/pictures/IAR_静态库封装_头文件路径配置.png b/yuwenhao/IAR/pictures/IAR_静态库封装_头文件路径配置.png new file mode 100644 index 0000000..b42e559 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_静态库封装_头文件路径配置.png differ diff --git a/yuwenhao/IAR/pictures/IAR_静态库封装_新建静态库工程.png b/yuwenhao/IAR/pictures/IAR_静态库封装_新建静态库工程.png new file mode 100644 index 0000000..2b4cf6a Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_静态库封装_新建静态库工程.png differ diff --git a/yuwenhao/IAR/pictures/IAR_静态库封装_查看静态库件.png b/yuwenhao/IAR/pictures/IAR_静态库封装_查看静态库件.png new file mode 100644 index 0000000..4867efe Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_静态库封装_查看静态库件.png differ diff --git a/yuwenhao/IAR/pictures/IAR_静态库封装_查看静态库文件.png b/yuwenhao/IAR/pictures/IAR_静态库封装_查看静态库文件.png new file mode 100644 index 0000000..976e55e Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_静态库封装_查看静态库文件.png differ diff --git a/yuwenhao/IAR/pictures/IAR_静态库封装_添加源文件.png b/yuwenhao/IAR/pictures/IAR_静态库封装_添加源文件.png new file mode 100644 index 0000000..10724b1 Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_静态库封装_添加源文件.png differ diff --git a/yuwenhao/IAR/pictures/IAR_静态库封装_源码文件.png b/yuwenhao/IAR/pictures/IAR_静态库封装_源码文件.png new file mode 100644 index 0000000..c2b159a Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_静态库封装_源码文件.png differ diff --git a/yuwenhao/IAR/pictures/IAR_静态库封装_设备和输出类型配置.png b/yuwenhao/IAR/pictures/IAR_静态库封装_设备和输出类型配置.png new file mode 100644 index 0000000..cbbf24b Binary files /dev/null and b/yuwenhao/IAR/pictures/IAR_静态库封装_设备和输出类型配置.png differ diff --git a/yuwenhao/IAR/pictures/Snipaste_2026-07-08_14-34-57.png b/yuwenhao/IAR/pictures/Snipaste_2026-07-08_14-34-57.png new file mode 100644 index 0000000..a122794 Binary files /dev/null and b/yuwenhao/IAR/pictures/Snipaste_2026-07-08_14-34-57.png differ diff --git a/yuwenhao/IAR/pictures/Snipaste_2026-07-08_14-35-54.png b/yuwenhao/IAR/pictures/Snipaste_2026-07-08_14-35-54.png new file mode 100644 index 0000000..49c2459 Binary files /dev/null and b/yuwenhao/IAR/pictures/Snipaste_2026-07-08_14-35-54.png differ diff --git a/yuwenhao/IAR/pictures/eww.png b/yuwenhao/IAR/pictures/eww.png new file mode 100644 index 0000000..102a486 Binary files /dev/null and b/yuwenhao/IAR/pictures/eww.png differ diff --git a/yuwenhao/IAR/pictures/启用断点.png b/yuwenhao/IAR/pictures/启用断点.png new file mode 100644 index 0000000..e9dfff1 Binary files /dev/null and b/yuwenhao/IAR/pictures/启用断点.png differ diff --git a/yuwenhao/IAR/pictures/宏定义.png b/yuwenhao/IAR/pictures/宏定义.png new file mode 100644 index 0000000..050cca1 Binary files /dev/null and b/yuwenhao/IAR/pictures/宏定义.png differ diff --git a/yuwenhao/IAR/pictures/打开文件.png b/yuwenhao/IAR/pictures/打开文件.png new file mode 100644 index 0000000..cebdb6e Binary files /dev/null and b/yuwenhao/IAR/pictures/打开文件.png differ diff --git a/yuwenhao/IAR/pictures/新建分组.png b/yuwenhao/IAR/pictures/新建分组.png new file mode 100644 index 0000000..4973111 Binary files /dev/null and b/yuwenhao/IAR/pictures/新建分组.png differ diff --git a/yuwenhao/Markdown/Markdown.md b/yuwenhao/Markdown/Markdown.md new file mode 100644 index 0000000..5044e8c --- /dev/null +++ b/yuwenhao/Markdown/Markdown.md @@ -0,0 +1,226 @@ + + +[TOC] + +# 一级标题 + +## 二级标题 + +### 三级标题 + +- 第一项 +- 第二项 + 1. 嵌套 + 2. 嵌套 + + +- 第四项 + +1. 第一步 +2. 第二步 +3. 第三步 +4. 第四步 +5. 第五步 + - 嵌套 + - 嵌套 + - 嵌套 + +**加粗文字** + +*倾斜文字* + +***加粗倾斜文字*** + +~~删除线文字~~ + +`printf` + +`hello` + +``` +int main(void) +{ + printf("Hello World\n"); + return 0; +} +``` + +[百度](www.baidu.com) + +[必应](www.bing.com) + +[![截图](C:\Users\ywh\Desktop\Snipaste_2026-07-07_09-17-56.png)](www.baidu.com) + + [![截图2](C:\Users\ywh\Desktop\Snipaste_2026-07-07_09-17-56.png)](www.baidu.com) + +[跳转到一级标题](#一级标题) + +[跳转到二级标题](#二级标题) + +[跳转到指定位置1](#target) + +[跳转到指定位置2](#target2) + +------ + +![kk]() + +------ + +| xixi | 11 | +| ---- | ---- | +| haha | 22 | + +> 一级引用 +> +> > 二级引用 +> > +> > > 三级引用 + +[跳转到目录](#mulu) + +------ + +------ + +------ + +------ + +------ + + + +# Markdown 学习笔记 + +## 目录 + +- [跳转到标题语法](#title) +- [跳转到列表语法](#list) +- [跳转到代码块语法](#code) +- [跳转到表格语法](#table) +- [跳转到学习总结](#summary) + +------ + + + +## 一、标题语法 + +Markdown 使用 `#` 表示标题,`#` 越多,标题级别越低。 + +```markdown +# 一级标题 +## 二级标题 +### 三级标题 +``` + +[返回目录](#markdown-学习笔记) + +------ + + + +## 二、列表语法 + +### 1. 无序列表 + +```markdown +- 第一项 +- 第二项 +- 第三项 +``` + +### 2. 有序列表 + +```markdown +1. 第一步 +2. 第二步 +3. 第三步 +``` + +### 3. 嵌套列表 + +```markdown +- 软件学习 + 1. Typora + 2. SourceTree + 3. IAR +- 代码学习 + - C语言 + - 单元测试 +``` + +[返回目录](#markdown-学习笔记) + +------ + + + +## 三、代码块语法 + +### 1. 单行代码块 + +```markdown +`printf("Hello World");` +``` + +### 2. 多行代码块 + +```c +#include + +int main(void) +{ + printf("Hello World\n"); + return 0; +} +``` + +[返回目录](#markdown-学习笔记) + +------ + + + +## 四、表格语法 + +```markdown +| 序号 | 软件 | 作用 | +| ---- | ---- | ---- | +| 1 | Typora | 编写 Markdown 文档 | +| 2 | SourceTree | 代码版本管理 | +| 3 | IAR | 嵌入式工程开发 | +``` + +显示效果: + +| 序号 | 软件 | 作用 | +| ---- | ---------- | ------------------ | +| 1 | Typora | 编写 Markdown 文档 | +| 2 | SourceTree | 代码版本管理 | +| 3 | IAR | 嵌入式工程开发 | + +[返回目录](#markdown-学习笔记) + +------ + + + +## 五、学习总结 + +通过本次学习,掌握了 Markdown 的标题、列表、代码块、表格以及自定义锚点跳转的基本用法。 + +自定义锚点跳转的核心写法是: + +```html + +``` + +然后通过下面这种方式跳转: + +```markdown +[跳转到学习总结](#summary) +``` + +[返回目录](#markdown-学习笔记) \ No newline at end of file diff --git a/yuwenhao/SourceInsight/SourceInsight.md b/yuwenhao/SourceInsight/SourceInsight.md new file mode 100644 index 0000000..e523b8e --- /dev/null +++ b/yuwenhao/SourceInsight/SourceInsight.md @@ -0,0 +1,1431 @@ +# SourceInsight 学习文档 + +## 1. 软件介绍 + +SourceInsight 是一款代码阅读和编辑工具,常用于 C/C++ 等工程代码的查看、跳转、搜索和维护。 + +在嵌入式软件开发中,SourceInsight 常用于查看大型工程代码,能够帮助开发人员快速定位函数、变量、宏定义以及它们之间的引用关系。 + +### 主要作用 + +1. 查看和编辑代码; +2. 创建代码工程; +3. 添加已有代码文件; +4. 生成和同步符号表; +5. 快速跳转函数、变量和宏定义; +6. 搜索符号引用关系; +7. 通过不同窗口辅助理解代码结构。 + +## 2. 学习目标 + +根据基础学习任务要求,需要熟练使用 SourceInsight 进行代码查看及编辑。 + +本节主要掌握以下内容: + +1. 工程新建与添加; +2. 文件新建与添加; +3. 符号表同步; +4. 视图切换; +5. 常用窗口打开与关闭; +6. 搜索引用。 + +## 3. 工程新建 / 添加 + +SourceInsight 中的工程用于管理一组代码文件。创建工程后,可以将源码文件添加到工程中,方便后续进行代码跳转、搜索和查看。 + +### 3.1 新建工程 + +新建工程适用于第一次使用 SourceInsight 管理某个代码目录的情况。 + +#### 操作步骤 + +1. 打开 SourceInsight; + +2. 点击菜单栏中的 **Project**; + +3. 选择 **New Project**; + +4. 在弹出的窗口中输入工程名称; + +5. 选择工程文件保存路径; + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceInsight\pictures\新建工程弹窗.png) + +6. 选择需要管理的源码目录; + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceInsight\pictures\新建工程弹窗源码目录.png) + +7. 根据提示完成工程创建; + +8. 工程创建完成后,进入工程文件添加界面; + +9. 选择需要加入工程的源码文件; + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceInsight\pictures\添加文件.png) + +10. 点击"Close",完成工程新建。 + +#### 说明 + +新建工程只是让 SourceInsight 管理代码文件,不会改变原始代码的内容。 + +工程创建完成后,SourceInsight 会根据加入的源码文件建立符号信息,便于后续进行函数跳转和引用搜索。 + +### 3.2 添加已有工程或代码目录 + +如果已经存在代码目录,可以将该目录中的文件添加到 SourceInsight 工程中。 + +#### 操作步骤 + +1. 打开 SourceInsight; + +2. 打开已有工程,或者先新建一个工程; + +3. 点击菜单栏中的 **Project**; + +4. 选择 **Open Project **; + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceInsight\pictures\打开工程2.png) + +5. 在窗口中选择工程文件; + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceInsight\pictures\打开工程.png) + +6. 点击“OK”; + +#### 注意事项 + +- 添加工程文件时,应优先添加源码文件和头文件; +- 不需要把编译生成的中间文件、日志文件、临时文件加入工程; +- 添加文件后建议同步符号表,保证代码跳转和搜索结果正确。 + +## 4. 文件新建 / 添加 + +SourceInsight 不仅可以查看已有文件,也可以新建和编辑代码文件。 + +### 4.1 新建文件 + +新建文件适用于需要在工程中新增 `.c`、`.h` 等源码文件的情况。 + +#### 操作步骤 + +1. 点击菜单栏中的 **File**; + +2. 选择 **New**; + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceInsight\pictures\新建文件.png) + +3. 在新建文件窗口中输入或编辑代码内容; + +4. 点击 **File**; + +5. 选择 **Save As**; + +6. 将文件保存到当前工程对应的源码目录下; + +7. 返回 SourceInsight 工程; + +8. 点击 **Project**; + +9. 选择 **Add and Remove Project Files**; + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceInsight\pictures\添加文件2.png) + +10. 将新建文件添加到工程中; + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceInsight\pictures\添加文件3.png) + +11. 添加完成后,同步符号表。 + +#### 说明 + +如果只是新建并保存文件,但没有添加到 SourceInsight 工程中,SourceInsight 可能无法对该文件进行完整的符号分析和引用搜索。 + +所以新建文件后,需要确认文件已经加入工程。 + +### 4.2 添加已有文件 + +添加已有文件适用于外部已经存在代码文件,需要放入 SourceInsight 工程中查看和管理的情况。 + +#### 操作步骤 + +1. 打开对应 SourceInsight 工程; + +2. 点击菜单栏中的 **Project**; + +3. 选择 **Add and Remove Project Files**; + +4. 在文件列表中找到需要添加的文件; + +5. 选中对应文件; + +6. 点击添加; + +7. 确认后关闭窗口; + +8. 执行符号表同步。 + +#### 注意事项 + +- 添加 `.c` 文件后,也要检查相关 `.h` 文件是否已经加入工程; +- 如果添加文件后无法跳转函数或变量,通常需要重新同步符号表; +- 如果工程文件较多,可以按目录批量添加。 + +## 5. 符号表同步 + +符号表是 SourceInsight 根据工程中的源码文件分析出来的索引信息。 + +函数、变量、宏定义、结构体等都可以看作代码中的符号。SourceInsight 通过符号表实现快速跳转、搜索引用和查看关系。 + +### 5.1 什么情况下需要同步符号表 + +一般在以下情况需要同步符号表: + +1. 新建工程后; +2. 添加新文件后; +3. 删除或移除文件后; +4. 外部工具修改了源码文件后; +5. 代码跳转不准确时; +6. 搜索引用结果不完整时; +7. 函数或变量列表没有更新时。 + +### 5.2 同步符号表操作步骤 + +1. 打开 SourceInsight 工程; + +2. 点击菜单栏中的 **Project**; + +3. 选择 **Synchronize Files**; + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceInsight\pictures\同步符号表.png) + +4. 在弹出的窗口中确认同步范围; + +5. 点击"Start",开始同步; + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceInsight\pictures\同步开始.png) + +6. 等待同步完成; + +7. 同步完成后,再进行函数跳转或引用搜索。 + +### 5.3 说明 + +同步符号表不会修改源码内容,只是更新 SourceInsight 内部的代码索引信息。 + +如果代码文件发生变化但 SourceInsight 没有及时识别,可以通过同步符号表解决。 + +## 6. 视图切换 + +Source Insight 中的视图切换主要用于调整多个已打开文件窗口的显示方式。 + +在查看嵌入式工程代码时,经常需要同时打开多个源码文件,例如主函数文件、中断文件、驱动文件和头文件。通过视图切换功能,可以将多个窗口进行层叠、水平平铺、垂直平铺或双窗口显示,方便开发人员对比代码、查看函数调用关系和修改程序。 + +### 6.1 打开多个文件 + +在 Source Insight 中,可以同时打开多个文件。 + +例如: + +```text +main.c +stm32f1xx_it.c +readme.txt +``` + +当多个文件被打开后,Source Insight 会将这些文件作为不同的窗口进行管理。 + +操作步骤如下: + +1. 打开 Source Insight 工程; + +2. 在工程文件列表中找到需要查看的文件; + +3. 双击打开多个文件; + +4. 打开后,可以通过窗口菜单对这些文件窗口进行排列和切换。 + +![打开多个文件](pictures/SourceInsight_视图切换_打开多个文件.png) + +### 6.2 打开窗口排列菜单 + +视图切换主要通过顶部菜单栏中的 **Window** 菜单完成。 + +操作路径如下: + +```text +Window → Arrange Windows +``` + +点击 **Arrange Windows** 后,可以看到多种窗口排列方式。 + +![窗口排列菜单](pictures/SourceInsight_视图切换_窗口排列菜单.png) + +常见窗口排列方式如下: + +| 选项 | 中文理解 | 作用 | +| ---------------- | ---------- | ------------------------------- | +| Cascade Windows | 层叠窗口 | 将多个窗口层叠显示 | +| Tile Horizontal | 水平平铺 | 将多个窗口按上下方向排列 | +| Tile Vertical | 垂直平铺 | 将多个窗口按左右方向排列 | +| Tile One Window | 单窗口显示 | 只显示一个主要窗口 | +| Tile Two Windows | 双窗口显示 | 同时显示两个窗口,快捷键为 `F6` | + +### 6.3 Cascade Windows 层叠显示 + +选择: + +```text +Window → Arrange Windows → Cascade Windows +``` + +可以将多个已打开的文件窗口以层叠方式显示。 + +层叠显示时,多个窗口会相互覆盖,但每个窗口的标题栏仍然可以看到,方便快速判断当前打开了哪些文件。 + +操作步骤如下: + +1. 先打开多个文件; + +2. 点击顶部菜单栏 **Window**; + +3. 选择 **Arrange Windows**; + +4. 点击 **Cascade Windows**; + +5. 多个文件窗口会以层叠方式显示。 + +![层叠显示窗口](pictures/SourceInsight_视图切换_层叠显示窗口.png) + +适用场景: + +- 当前打开了很多文件; +- 需要快速查看当前有哪些窗口; +- 不需要同时对比代码,只需要在多个窗口之间切换。 + +### 6.4 Tile Horizontal 水平平铺 + +选择: + +```text +Window → Arrange Windows → Tile Horizontal +``` + +可以将多个文件窗口按上下方向排列显示。 + +水平平铺后,窗口会从上到下排列,适合上下对比不同文件中的代码内容。 + +操作步骤如下: + +1. 打开两个或多个文件; + +2. 点击顶部菜单栏 **Window**; + +3. 选择 **Arrange Windows**; + +4. 点击 **Tile Horizontal**; + +5. Source Insight 会将窗口按上下方向平铺显示。 + +![水平平铺窗口](pictures/SourceInsight_视图切换_水平平铺窗口.png) + +适用场景: + +- 需要上下对比两个文件; +- 需要查看一个函数的声明和实现; +- 需要同时查看源文件和说明文件。 + +例如,可以同时查看: + +```text +main.c +readme.txt +``` + +### 6.5 Tile Vertical 垂直平铺 + +选择: + +```text +Window → Arrange Windows → Tile Vertical +``` + +可以将多个文件窗口按左右方向排列显示。 + +垂直平铺后,窗口会从左到右排列,适合左右对比代码内容。 + +操作步骤如下: + +1. 打开两个或多个文件; + +2. 点击顶部菜单栏 **Window**; + +3. 选择 **Arrange Windows**; + +4. 点击 **Tile Vertical**; + +5. Source Insight 会将窗口按左右方向平铺显示。 + +![垂直平铺窗口](pictures/SourceInsight_视图切换_垂直平铺窗口.png) + +适用场景: + +- 需要左右对比 `.c` 文件和 `.h` 文件; +- 需要一边查看函数定义,一边查看函数调用; +- 需要同时查看驱动文件和应用层文件。 + +例如,可以同时查看: + +```text +main.c +main.h +``` + +或者: + +```text +stm32f1xx_it.c +main.c +``` + +### 6.6 Tile One Window 单窗口显示 + +选择: + +```text +Window → Arrange Windows → Tile One Window +``` + +可以将当前显示方式切换为单窗口显示。 + +单窗口显示时,Source Insight 会主要显示当前选中的文件窗口,适合集中查看某一个文件。 + +操作步骤如下: + +1. 打开多个文件; + +2. 点击需要重点查看的文件窗口; + +3. 点击顶部菜单栏 **Window**; + +4. 选择 **Arrange Windows**; + +5. 点击 **Tile One Window**; + +6. 当前窗口会以单窗口方式显示。 + +![单窗口显示](pictures/SourceInsight_视图切换_单窗口显示.png) + +适用场景: + +- 只想专注查看一个文件; +- 当前窗口太多,想恢复单文件查看状态; +- 修改代码时需要更大的编辑区域。 + +### 6.7 Tile Two Windows 双窗口显示 + +选择: + +```text +Window → Arrange Windows → Tile Two Windows +``` + +也可以使用快捷键: + +```text +F6 +``` + +该功能可以快速切换为两个窗口显示模式。 + +双窗口显示适合同时查看两个相关文件,例如一个源文件和一个头文件,或者一个函数调用文件和一个函数实现文件。 + +操作步骤如下: + +1. 打开两个或多个文件; + +2. 点击顶部菜单栏 **Window**; + +3. 选择 **Arrange Windows**; + +4. 点击 **Tile Two Windows**; + +5. Source Insight 会以两个窗口的方式显示文件; + +6. 也可以直接按 `F6` 快速切换双窗口显示。 + +![双窗口显示](pictures/SourceInsight_视图切换_双窗口显示.png) + +适用场景: + +- 同时查看 `.c` 文件和 `.h` 文件; +- 同时查看函数调用位置和函数实现位置; +- 对比两个文件中的相似代码; +- 查看中断处理文件和主函数文件之间的关系。 + +例如: + +```text +stm32f1xx_it.c +main.c +``` + +### 6.8 Pick Window 选择窗口 + +在 **Window** 菜单中,还可以看到已经打开的文件窗口列表。 + +例如: + +```text +1 stm32f1xx_it.c +2 readme.txt +``` + +点击对应文件名,可以快速切换到该文件窗口。 + +如果打开的文件较多,也可以选择: + +```text +Window → Pick Window +``` + +通过窗口选择功能切换到指定文件。 + +![选择窗口](pictures/SourceInsight_视图切换_选择窗口.png) + +适用场景: + +- 当前打开文件较多; +- 想快速切换到某个指定文件; +- 不想在多个窗口中手动查找文件。 + +### 6.9 视图切换作用总结 + +Source Insight 的视图切换功能可以提高代码查看和分析效率。 + +常用视图切换方式如下: + +| 功能 | 适用情况 | +| ---------------- | -------------------------------- | +| Cascade Windows | 打开多个文件时,快速查看窗口数量 | +| Tile Horizontal | 上下对比两个或多个文件 | +| Tile Vertical | 左右对比两个或多个文件 | +| Tile One Window | 专注查看单个文件 | +| Tile Two Windows | 同时查看两个相关文件 | +| Pick Window | 在多个已打开窗口之间快速切换 | + +在嵌入式工程开发中,常见的使用方式是同时打开主函数文件、中断文件、驱动文件和头文件,通过窗口排列功能进行对比查看。 + +例如: + +```text +main.c:查看主函数和程序流程 +stm32f1xx_it.c:查看中断处理函数 +gpio.c:查看 GPIO 初始化配置 +main.h:查看宏定义和函数声明 +``` + +通过合理使用视图切换功能,可以更方便地阅读工程代码、分析函数关系和修改程序。 + +## 7. 常用窗口打开 / 关闭 + +Source Insight 中的常用窗口和工具栏主要通过顶部菜单栏中的 **View** 菜单进行打开和关闭。 + +在 Source Insight 中,部分功能属于 **Toolbars(工具栏)**,部分功能属于 **Panels(面板窗口)**。 +勾选表示显示该窗口或工具栏,取消勾选表示关闭或隐藏该窗口或工具栏。 + +### 7.1 打开 View 菜单 + +点击顶部菜单栏中的: + +```text +View +``` + +可以看到常用的显示相关功能,例如工具栏、面板窗口、全屏、窗口标签、状态栏、滚动条、符号窗口等。 + +![View菜单](pictures/SourceInsight_常用窗口_View菜单.png) + +常见功能说明如下: + +| 功能 | 作用 | +| --------------------- | --------------------------------------- | +| Toolbars | 打开或关闭工具栏 | +| Panels | 打开或关闭面板窗口 | +| Full Screen | 全屏显示,快捷键为 `F11` | +| Window Tabs | 显示或隐藏窗口标签 | +| Tab Tray | 显示或隐藏标签托盘 | +| Status Bar | 显示或隐藏状态栏 | +| Horizontal Scroll Bar | 显示或隐藏水平滚动条 | +| Vertical Scroll Bar | 显示或隐藏垂直滚动条 | +| Symbol Window | 显示或隐藏符号窗口,快捷键为 `Alt + F8` | +| Overview | 显示或隐藏代码缩略视图 | +| Line Numbers | 显示或隐藏行号 | + +### 7.2 Toolbars 工具栏打开 / 关闭 + +工具栏用于显示常用功能按钮,例如文件操作、搜索、符号跳转、窗口排列等。 + +打开方式: + +```text +View → Toolbars +``` + +![工具栏菜单](pictures/SourceInsight_常用窗口_Toolbars菜单.png) + +在 **Toolbars** 子菜单中,可以看到多个工具栏选项。 + +常见工具栏说明如下: + +| 工具栏 | 作用 | +| ---------------------- | ------------------------------------------ | +| Main Toolbar | 主工具栏,显示常用基础操作按钮 | +| Browse Toolbar | 浏览工具栏,用于代码跳转和浏览 | +| File Toolbar | 文件工具栏,用于文件新建、打开、保存等操作 | +| Edit Toolbar | 编辑工具栏,用于复制、粘贴、撤销等编辑操作 | +| Search Toolbar | 搜索工具栏,用于快速搜索代码内容 | +| Navigation Toolbar | 导航工具栏,用于前进、后退等代码跳转 | +| Symbols Toolbar | 符号工具栏,用于符号相关操作 | +| Arrangement Toolbar | 窗口排列工具栏 | +| View Toolbar | 视图工具栏 | +| Help Toolbar | 帮助工具栏 | +| Source Control Toolbar | 源码管理工具栏 | +| Build Toolbar | 构建工具栏 | +| Outline Toolbar | 大纲工具栏 | +| Layout Toolbar | 布局工具栏 | + +#### 操作步骤 + +1. 点击顶部菜单栏 **View**; + +2. 选择 **Toolbars**; + +3. 在右侧子菜单中选择需要显示的工具栏; + +4. 工具栏前面出现 `√`,表示该工具栏已经显示; + +5. 如果想关闭某个工具栏,再次点击该工具栏名称,取消 `√` 即可。 + +#### 示例 + +如果需要显示搜索工具栏,可以选择: + +```text +View → Toolbars → Search Toolbar +``` + +如果需要关闭搜索工具栏,再次点击: + +```text +View → Toolbars → Search Toolbar +``` + +取消勾选即可。 + +### 7.3 Panels 面板窗口打开 / 关闭 + +面板窗口用于辅助查看工程文件、符号信息、上下文信息、函数关系等内容。 + +打开方式: + +```text +View → Panels +``` + +![面板窗口菜单](pictures/SourceInsight_常用窗口_Panels菜单.png) + +在 **Panels** 子菜单中,可以看到多个面板窗口选项。 + +常见面板窗口说明如下: + +| 面板窗口 | 作用 | +| ------------------------- | -------------------------------------- | +| Clip Window | 剪贴窗口,用于保存和管理代码片段 | +| Bookmark Window | 书签窗口,用于查看代码书签 | +| Context Window | 上下文窗口,用于查看当前符号的相关信息 | +| Relation Window | 关系窗口,用于查看函数或符号之间的关系 | +| Window List | 窗口列表,用于查看当前打开的窗口 | +| FTP Browser | FTP 浏览器 | +| Snippet Window | 代码片段窗口 | +| Directory Compare | 目录比较窗口 | +| File Compare | 文件比较窗口 | +| Project Window | 工程窗口,用于显示工程相关内容 | +| Project Folder Browser | 工程文件夹浏览器 | +| Project File List | 工程文件列表 | +| Project File Types | 工程文件类型 | +| Project Symbol List | 工程符号列表 | +| Project Symbol Categories | 工程符号分类 | + +#### 操作步骤 + +1. 点击顶部菜单栏 **View**; + +2. 选择 **Panels**; + +3. 在右侧子菜单中选择需要打开的面板窗口; + +4. 面板窗口前面出现 `√`,表示该窗口已经打开; + +5. 如果想关闭某个面板窗口,再次点击该窗口名称,取消 `√` 即可。 + +### 7.4 Project Window 工程窗口 + +Project Window 用于显示当前 Source Insight 工程中的文件和工程结构。 + +打开方式: + +```text +View → Panels → Project Window +``` + +![工程窗口](pictures/SourceInsight_常用窗口_ProjectWindow.png) + +#### 作用 + +Project Window 可以帮助用户快速查看当前工程中包含的文件。 + +常见操作包括: + +1. 查看工程中的 `.c`、`.h` 文件; +2. 双击文件打开源码; +3. 快速切换不同文件; +4. 查看工程文件结构。 + +#### 关闭方式 + +再次点击: + +```text +View → Panels → Project Window +``` + +取消勾选后,即可关闭或隐藏工程窗口。 + +### 7.5 Project File List 工程文件列表 + +Project File List 用于以列表形式显示当前工程中的文件。 + +打开方式: + +```text +View → Panels → Project File List +``` + +![工程文件列表](pictures/SourceInsight_常用窗口_ProjectWindow.png) + +#### 作用 + +Project File List 适合快速查看工程中所有文件。 + +例如: + +```text +main.c +stm32f1xx_it.c +gpio.c +usart.c +main.h +``` + +双击列表中的文件,可以直接打开对应源码文件。 + +#### 关闭方式 + +再次点击: + +```text +View → Panels → Project File List +``` + +取消勾选后,即可关闭或隐藏工程文件列表。 + +### 7.6 Symbol Window 符号窗口 + +Symbol Window 用于显示当前文件中的函数、变量、宏定义等符号。 + +打开方式: + +```text +View → Symbol Window +``` + +快捷键: + +```text +Alt + F8 +``` + +![符号窗口](pictures/SourceInsight_常用窗口_SymbolWindow.png) + +#### 作用 + +当一个源码文件内容较多时,可以通过 Symbol Window 快速定位函数或变量。 + +例如在 `main.c` 文件中,符号窗口可能会显示: + +```text +main +SystemClock_Config +MX_GPIO_Init +Error_Handler +``` + +双击符号窗口中的函数名,可以快速跳转到该函数所在位置。 + +#### 关闭方式 + +再次点击: + +```text +View → Symbol Window +``` + +或者使用快捷键: + +```text +Alt + F8 +``` + +即可关闭或隐藏符号窗口。 + +### 7.7 Project Symbol List 工程符号列表 + +Project Symbol List 用于显示整个工程中的符号信息。 + +打开方式: + +```text +View → Panels → Project Symbol List +``` + +![工程符号列表](pictures/SourceInsight_常用窗口_ProjectSymbolList.png) + +#### 作用 + +Project Symbol List 可以查看整个工程中的函数、变量、宏定义等符号。 + +适用场景: + +- 查找工程中的函数; +- 查看工程中的全局变量; +- 查看宏定义; +- 分析工程中有哪些符号。 + +#### 关闭方式 + +再次点击: + +```text +View → Panels → Project Symbol List +``` + +取消勾选后,即可关闭或隐藏工程符号列表。 + +### 7.8 Context Window 上下文窗口 + +Context Window 用于显示当前光标所在符号的上下文信息。 + +打开方式: + +```text +View → Panels → Context Window +``` + +![上下文窗口](pictures/SourceInsight_常用窗口_ContextWindow.png) + +#### 作用 + +当光标放在某个函数、变量或宏定义上时,上下文窗口可以辅助显示相关代码信息,方便快速理解当前符号的含义。 + +例如将光标放到: + +```text +SystemClock_Config +``` + +上下文窗口可能会显示该函数的定义或相关上下文内容。 + +#### 关闭方式 + +再次点击: + +```text +View → Panels → Context Window +``` + +取消勾选后,即可关闭或隐藏上下文窗口。 + +### 7.9 Relation Window 关系窗口 + +Relation Window 用于查看函数、变量或符号之间的关系。 + +打开方式: + +```text +View → Panels → Relation Window +``` + +![关系窗口](pictures/SourceInsight_常用窗口_RelationWindow.png) + +#### 作用 + +Relation Window 常用于分析函数调用关系和符号引用关系。 + +适用场景: + +- 查看某个函数被哪些函数调用; +- 查看某个变量在哪些地方被使用; +- 分析程序调用流程; +- 辅助理解嵌入式工程代码结构。 + +#### 关闭方式 + +再次点击: + +```text +View → Panels → Relation Window +``` + +取消勾选后,即可关闭或隐藏关系窗口。 + +### 7.10 Bookmark Window 书签窗口 + +Bookmark Window 用于查看和管理代码书签。 + +打开方式: + +```text +View → Panels → Bookmark Window +``` + +![书签窗口](pictures/SourceInsight_常用窗口_BookmarkWindow.png) + +#### 作用 + +书签窗口可以帮助开发人员快速记录和跳转到重要代码位置。 + +适用场景: + +- 标记需要重点查看的代码; +- 标记暂时未处理的问题; +- 快速回到某个函数或代码行。 + +#### 关闭方式 + +再次点击: + +```text +View → Panels → Bookmark Window +``` + +取消勾选后,即可关闭或隐藏书签窗口。 + +### 7.11 Overview 缩略视图 + +Overview 用于显示当前文件代码的缩略视图,方便快速定位代码位置。 + +打开方式: + +```text +View → Overview +``` + +![缩略视图](pictures/SourceInsight_常用窗口_Overview.png) + +#### 作用 + +Overview 类似代码缩略地图,可以帮助用户快速查看当前文件整体结构。 + +适用场景: + +- 当前文件代码较长; +- 需要快速滚动到文件某一位置; +- 需要从整体上查看代码分布。 + +#### 关闭方式 + +再次点击: + +```text +View → Overview +``` + +取消勾选后,即可关闭或隐藏缩略视图。 + +### 7.12 Line Numbers 行号显示 + +Line Numbers 用于显示或隐藏代码行号。 + +打开方式: + +```text +View → Line Numbers +``` + +![行号显示](pictures/SourceInsight_常用窗口_LineNumbers.png) + +#### 作用 + +显示行号后,可以更方便地定位代码位置。 + +适用场景: + +- 根据报错信息定位代码行; +- 和他人沟通某一行代码; +- 查看搜索结果对应行号。 + +#### 关闭方式 + +再次点击: + +```text +View → Line Numbers +``` + +取消勾选后,即可隐藏行号。 + +### 7.13 Full Screen 全屏显示 + +Full Screen 用于将 Source Insight 切换为全屏显示。 + +打开方式: + +```text +View → Full Screen +``` + +快捷键: + +```text +F11 +``` + +![全屏显示](pictures/SourceInsight_常用窗口_FullScreen.png) + +#### 作用 + +全屏显示可以扩大代码编辑区域,适合专注阅读或修改代码。 + +#### 关闭方式 + +再次按下: + +```text +F11 +``` + +或者再次点击: + +```text +View → Full Screen +``` + +即可退出全屏显示。 + +### 7.14 常用窗口打开 / 关闭总结 + +Source Insight 中常用窗口和工具栏主要通过 **View** 菜单控制。 + +常见操作可以简单理解为: + +```text +打开或关闭工具栏: +View → Toolbars → 选择对应工具栏 + +打开或关闭面板窗口: +View → Panels → 选择对应面板窗口 + +打开或关闭符号窗口: +View → Symbol Window + +显示或隐藏行号: +View → Line Numbers + +全屏显示: +View → Full Screen 或 F11 +``` + +常用窗口作用总结如下: + +| 功能 | 打开路径 | 主要作用 | +| ------------------- | ----------------------------------- | ------------------------------ | +| Toolbars | View → Toolbars | 打开或关闭各种工具栏 | +| Project Window | View → Panels → Project Window | 查看工程窗口 | +| Project File List | View → Panels → Project File List | 查看工程文件列表 | +| Symbol Window | View → Symbol Window | 查看当前文件中的函数、变量、宏 | +| Project Symbol List | View → Panels → Project Symbol List | 查看工程符号列表 | +| Context Window | View → Panels → Context Window | 查看当前符号上下文 | +| Relation Window | View → Panels → Relation Window | 查看函数或符号关系 | +| Bookmark Window | View → Panels → Bookmark Window | 查看和管理书签 | +| Overview | View → Overview | 显示代码缩略视图 | +| Line Numbers | View → Line Numbers | 显示或隐藏行号 | +| Full Screen | View → Full Screen | 全屏显示 | + +在嵌入式工程代码阅读中,常用组合如下: + +```text +Project Window:快速打开工程文件 +Symbol Window:快速定位当前文件中的函数 +Relation Window:查看函数调用关系 +Context Window:查看当前符号上下文 +Line Numbers:方便定位代码行 +``` +## 8. 搜索引用 + +搜索引用是 Source Insight 中非常常用的功能,用于查找某个函数、变量、宏定义在工程中的使用位置。 + +在嵌入式工程开发中,经常需要查看某个函数在哪里被调用,某个变量在哪里被赋值,或者某个宏在哪些文件中被使用。通过搜索引用功能,可以快速定位相关代码位置。 + +### 8.1 搜索引用的作用 + +搜索引用主要用于查找符号在工程中的使用情况。 + +常见用途包括: + +| 搜索对象 | 作用 | +| ---------- | ------------------------------ | +| 函数名 | 查看函数在哪些地方被调用 | +| 变量名 | 查看变量在哪些地方被使用或赋值 | +| 宏定义 | 查看宏在哪些文件中被使用 | +| 结构体成员 | 查看成员变量在哪些位置被访问 | + +例如,需要查看函数: + +```text +HAL_GPIO_WritePin +``` + +在哪些地方被调用,就可以使用搜索引用功能。 + +### 8.2 搜索引用前的准备 + +在使用搜索引用之前,建议先确认工程符号表已经同步。 + +如果工程刚创建完成,或者刚添加了新的文件,需要先同步符号表,否则搜索引用结果可能不完整。 + +操作路径一般为: + +```text +Project → Synchronize Files +``` + +或者使用 Source Insight 中的同步符号表功能。 + +![同步符号表](pictures/SourceInsight_搜索引用_同步符号表.png) + +同步完成后,再进行引用搜索,结果会更加准确。 + +### 8.3 通过右键菜单搜索引用 + +这是比较常用的一种搜索引用方式。 + +#### 操作步骤 + +1. 打开需要分析的源码文件; + +2. 找到需要搜索引用的函数、变量或宏; + + 例如: + + ```text + HAL_GPIO_WritePin + ``` + +3. 将鼠标光标放在该符号上;![img](file:///F:/%E4%BF%A1%E6%8D%B7%E7%94%B5%E6%B0%94/%E8%AE%AD%E7%BB%83%E8%90%A5/%E7%AC%AC%E4%B8%80%E5%91%A8/%E5%AD%A6%E4%B9%A0%E6%96%87%E6%A1%A3/yuwenhao/SourceInsight/pictures/SourceInsight_%E6%90%9C%E7%B4%A2%E5%BC%95%E7%94%A8_%E5%8F%B3%E9%94%AE%E8%8F%9C%E5%8D%95.png?lastModify=1783484765) + +4. 右键点击该符号; + +5. 在右键菜单中选择 **Lookup References** 或类似的引用查找选项; + + ![右键搜索引用](pictures/SourceInsight_搜索引用_右键菜单.png) + +6. Source Insight 会在工程中查找该符号的引用位置; + +7. 搜索结果会显示在搜索结果窗口中。 + + + +### 8.4 通过菜单栏搜索引用 + +除了右键菜单,也可以通过顶部菜单栏进行搜索引用。 + +#### 操作步骤 + +1. 打开源码文件; + +2. 选中或将光标放到需要搜索的符号上; + +3. 点击顶部菜单栏中的 **Search**; + +4. 选择 **Lookup References**; + +5. Source Insight 会自动搜索该符号在工程中的引用位置; + +6. 搜索结果会显示在搜索结果窗口中。 + +操作路径可以理解为: + +```text +Search → Lookup References +``` + +![菜单栏搜索引用](pictures/SourceInsight_搜索引用_菜单栏.png) + +### 8.5 查看搜索引用结果 + +执行搜索引用后,Source Insight 会在搜索结果窗口中显示匹配结果。 + +搜索结果通常包含以下信息: + +```text +文件名 +行号 +引用位置代码 +``` + +例如: + +```text +main.c 35 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); +gpio.c 58 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); +``` + +![搜索引用结果](pictures/SourceInsight_搜索引用_结果窗口.png) + +#### 跳转到引用位置 + +在搜索结果窗口中,双击某一条搜索结果,可以直接跳转到对应文件和代码行。 + +操作步骤如下: + +1. 在搜索结果窗口中查看搜索结果; +2. 找到需要查看的引用位置; +3. 点击该条结果左侧按键; +4. Source Insight 会自动打开对应文件; +5. 光标会跳转到对应代码行。 + +![跳转引用位置](pictures/SourceInsight_搜索引用_跳转引用位置.png) + +### 8.6 搜索函数引用 + +搜索函数引用可以查看某个函数在哪些地方被调用。 + +#### 示例 + +需要查看函数: + +```text +SystemClock_Config +``` + +在哪里被调用。 + +操作步骤如下: + +1. 打开包含该函数的源码文件; +2. 将光标放到 `SystemClock_Config` 上; +3. 右键选择 **Lookup References**; +4. 在搜索结果窗口中查看调用位置; +5. 点击该条结果左侧按键跳转到对应代码位置。 + +#### 作用 + +通过搜索函数引用,可以快速分析函数调用关系。 + +例如: + +```text +main 函数中调用了 SystemClock_Config +初始化函数中调用了 GPIO 配置函数 +中断函数中调用了回调函数 +``` + +### 8.7 搜索变量引用 + +搜索变量引用可以查看某个变量在哪些位置被使用或修改。 + +#### 示例 + +需要查看变量: + +```text +count +``` + +在哪些位置被使用。 + +操作步骤如下: + +1. 找到变量 `count`; +2. 将光标放到变量名上; +3. 右键选择 **Lookup References**; +4. 查看搜索结果; +5. 点击该条结果左侧按键跳转到具体代码位置。 + +#### 作用 + +通过搜索变量引用,可以分析变量的使用范围和数据变化过程。 + +例如: + +```text +变量在哪里定义 +变量在哪里赋值 +变量在哪里参与判断 +变量在哪里被函数调用使用 +``` + +### 8.8 搜索宏定义引用 + +搜索宏定义引用可以查看某个宏在哪些文件中被使用。 + +#### 示例 + +需要查看宏: + +```text +LED_PIN +``` + +在哪些位置被使用。 + +操作步骤如下: + +1. 打开包含宏定义的头文件; +2. 找到宏 `LED_PIN`; +3. 将光标放到宏名上; +4. 右键选择 **Lookup References**; +5. 在搜索结果窗口中查看引用位置; +6. 点击该条结果左侧按键跳转查看具体代码。 + +#### 作用 + +通过搜索宏定义引用,可以快速判断某个宏的影响范围。 + +例如: + +```text +查看 GPIO 引脚宏在哪些文件中使用 +查看功能开关宏是否被调用 +查看条件编译宏影响哪些代码 +``` + +### 8.9 搜索引用失败或结果不完整的原因 + +如果搜索引用时没有结果,或者搜索结果明显不完整,可能有以下原因: + +| 原因 | 说明 | +| ------------------ | -------------------------------- | +| 符号表未同步 | 新添加的文件还没有加入符号表 | +| 文件未加入工程 | Source Insight 没有管理该文件 | +| 搜索的符号拼写错误 | 选中的函数名、变量名或宏名不正确 | +| 工程路径有问题 | 文件路径变化后没有重新同步工程 | +| 搜索范围不正确 | 当前搜索没有覆盖整个工程 | + +### 8.10 解决方法 + +如果搜索引用结果不正确,可以按以下方式处理: + +1. 确认相关 `.c`、`.h` 文件已经加入 Source Insight 工程; +2. 执行符号表同步; +3. 确认搜索的函数名、变量名或宏名拼写正确; +4. 关闭并重新打开工程; +5. 必要时重新添加工程文件。 + +### 8.11 搜索引用总结 + +搜索引用可以帮助开发人员快速定位符号在工程中的使用位置。 + +常用搜索对象包括: + +| 搜索对象 | 示例 | 用途 | +| ---------- | --------------------------- | ---------------------- | +| 函数 | `main`、`HAL_GPIO_WritePin` | 查看函数调用位置 | +| 变量 | `count`、`flag` | 查看变量使用或赋值位置 | +| 宏定义 | `LED_PIN`、`GPIO_PIN_13` | 查看宏影响范围 | +| 结构体成员 | `Init.Pin`、`State` | 查看成员访问位置 | + +在嵌入式工程中,搜索引用常用于分析函数调用关系、变量变化过程和宏定义影响范围。 + +简单理解: + +```text +想知道一个函数在哪里被调用: +使用搜索引用。 + +想知道一个变量在哪里被使用: +使用搜索引用。 + +想知道一个宏影响哪些代码: +使用搜索引用。 +``` +## 9. 常见问题 + +### 9.1 添加文件后无法跳转函数 + +可能原因: + +1. 文件没有真正加入工程; +2. 符号表没有同步; +3. 文件类型没有被 SourceInsight 正确识别; +4. 工程路径或文件路径发生变化。 + +解决方法: + +1. 确认文件已经在 Project Window 中显示; +2. 执行 **Project → Synchronize Files**; +3. 重新打开工程; +4. 检查文件后缀是否正确。 + +### 9.2 搜索引用结果不完整 + +可能原因: + +1. 相关文件没有加入工程; +2. 符号表没有更新; +3. 搜索的符号名称不准确; +4. 工程代码和实际代码目录不一致。 + +解决方法: + +1. 添加缺失的源码文件和头文件; +2. 同步符号表; +3. 重新搜索引用; +4. 必要时重新建立工程。 + +### 9.3 工程中看不到新建文件 + +可能原因: + +1. 文件只是保存到了目录中,没有加入 SourceInsight 工程; +2. Project Window 没有刷新; +3. 符号表没有同步。 + +解决方法: + +1. 使用 **Project → Add and Remove Project Files** 添加文件; +2. 执行 **Project → Synchronize Files**; +3. 检查文件是否在正确目录下。 + +## 10. 总结 + +SourceInsight 主要用于代码查看、编辑和引用分析。 + +常用操作可以总结为: + +```text +工程新建/添加:用于建立代码管理环境。 + +文件新建/添加:用于把源码文件加入工程。 + +符号表同步:用于更新代码索引,保证跳转和搜索准确。 + +视图切换:用于查看不同代码信息。 + +常用窗口打开/关闭:用于辅助查看工程结构和符号关系。 + +搜索引用:用于查找函数、变量和宏的使用位置。 +``` + +在实际嵌入式代码开发中,SourceInsight 可以帮助快速理解工程结构、定位代码位置、分析函数调用关系,提高代码阅读和维护效率。 diff --git a/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_BookmarkWindow.png b/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_BookmarkWindow.png new file mode 100644 index 0000000..8a005eb Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_BookmarkWindow.png differ diff --git a/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_ContextWindow.png b/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_ContextWindow.png new file mode 100644 index 0000000..c5213ee Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_ContextWindow.png differ diff --git a/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_FullScreen.png b/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_FullScreen.png new file mode 100644 index 0000000..76f1716 Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_FullScreen.png differ diff --git a/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_LineNumbers.png b/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_LineNumbers.png new file mode 100644 index 0000000..a376cf6 Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_LineNumbers.png differ diff --git a/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_Overview.png b/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_Overview.png new file mode 100644 index 0000000..18e516d Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_Overview.png differ diff --git a/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_Panels菜单.png b/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_Panels菜单.png new file mode 100644 index 0000000..1544e35 Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_Panels菜单.png differ diff --git a/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_ProjectSymbolList.png b/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_ProjectSymbolList.png new file mode 100644 index 0000000..a01537b Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_ProjectSymbolList.png differ diff --git a/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_ProjectWindow.png b/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_ProjectWindow.png new file mode 100644 index 0000000..ed5eb50 Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_ProjectWindow.png differ diff --git a/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_RelationWindow.png b/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_RelationWindow.png new file mode 100644 index 0000000..56666b1 Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_RelationWindow.png differ diff --git a/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_SymbolWindow.png b/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_SymbolWindow.png new file mode 100644 index 0000000..66dafec Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_SymbolWindow.png differ diff --git a/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_Toolbars菜单.png b/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_Toolbars菜单.png new file mode 100644 index 0000000..d61ed69 Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_Toolbars菜单.png differ diff --git a/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_View菜单.png b/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_View菜单.png new file mode 100644 index 0000000..4b6866f Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/SourceInsight_常用窗口_View菜单.png differ diff --git a/yuwenhao/SourceInsight/pictures/SourceInsight_搜索引用_右键菜单.png b/yuwenhao/SourceInsight/pictures/SourceInsight_搜索引用_右键菜单.png new file mode 100644 index 0000000..df8c084 Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/SourceInsight_搜索引用_右键菜单.png differ diff --git a/yuwenhao/SourceInsight/pictures/SourceInsight_搜索引用_同步符号表.png b/yuwenhao/SourceInsight/pictures/SourceInsight_搜索引用_同步符号表.png new file mode 100644 index 0000000..db096bc Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/SourceInsight_搜索引用_同步符号表.png differ diff --git a/yuwenhao/SourceInsight/pictures/SourceInsight_搜索引用_结果窗口.png b/yuwenhao/SourceInsight/pictures/SourceInsight_搜索引用_结果窗口.png new file mode 100644 index 0000000..e62a6e9 Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/SourceInsight_搜索引用_结果窗口.png differ diff --git a/yuwenhao/SourceInsight/pictures/SourceInsight_搜索引用_菜单栏.png b/yuwenhao/SourceInsight/pictures/SourceInsight_搜索引用_菜单栏.png new file mode 100644 index 0000000..c9beded Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/SourceInsight_搜索引用_菜单栏.png differ diff --git a/yuwenhao/SourceInsight/pictures/SourceInsight_搜索引用_跳转引用位置.png b/yuwenhao/SourceInsight/pictures/SourceInsight_搜索引用_跳转引用位置.png new file mode 100644 index 0000000..3775736 Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/SourceInsight_搜索引用_跳转引用位置.png differ diff --git a/yuwenhao/SourceInsight/pictures/SourceInsight_视图切换_单窗口显示.png b/yuwenhao/SourceInsight/pictures/SourceInsight_视图切换_单窗口显示.png new file mode 100644 index 0000000..78ce388 Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/SourceInsight_视图切换_单窗口显示.png differ diff --git a/yuwenhao/SourceInsight/pictures/SourceInsight_视图切换_双窗口显示.png b/yuwenhao/SourceInsight/pictures/SourceInsight_视图切换_双窗口显示.png new file mode 100644 index 0000000..59a613f Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/SourceInsight_视图切换_双窗口显示.png differ diff --git a/yuwenhao/SourceInsight/pictures/SourceInsight_视图切换_垂直平铺窗口.png b/yuwenhao/SourceInsight/pictures/SourceInsight_视图切换_垂直平铺窗口.png new file mode 100644 index 0000000..db76140 Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/SourceInsight_视图切换_垂直平铺窗口.png differ diff --git a/yuwenhao/SourceInsight/pictures/SourceInsight_视图切换_层叠显示窗口.png b/yuwenhao/SourceInsight/pictures/SourceInsight_视图切换_层叠显示窗口.png new file mode 100644 index 0000000..187b6f9 Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/SourceInsight_视图切换_层叠显示窗口.png differ diff --git a/yuwenhao/SourceInsight/pictures/SourceInsight_视图切换_打开多个文件.png b/yuwenhao/SourceInsight/pictures/SourceInsight_视图切换_打开多个文件.png new file mode 100644 index 0000000..99cf058 Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/SourceInsight_视图切换_打开多个文件.png differ diff --git a/yuwenhao/SourceInsight/pictures/SourceInsight_视图切换_水平平铺窗口.png b/yuwenhao/SourceInsight/pictures/SourceInsight_视图切换_水平平铺窗口.png new file mode 100644 index 0000000..8a4f2f6 Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/SourceInsight_视图切换_水平平铺窗口.png differ diff --git a/yuwenhao/SourceInsight/pictures/SourceInsight_视图切换_窗口排列菜单.png b/yuwenhao/SourceInsight/pictures/SourceInsight_视图切换_窗口排列菜单.png new file mode 100644 index 0000000..a0f653d Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/SourceInsight_视图切换_窗口排列菜单.png differ diff --git a/yuwenhao/SourceInsight/pictures/SourceInsight_视图切换_选择窗口.png b/yuwenhao/SourceInsight/pictures/SourceInsight_视图切换_选择窗口.png new file mode 100644 index 0000000..0bffbcd Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/SourceInsight_视图切换_选择窗口.png differ diff --git a/yuwenhao/SourceInsight/pictures/同步开始.png b/yuwenhao/SourceInsight/pictures/同步开始.png new file mode 100644 index 0000000..d914de1 Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/同步开始.png differ diff --git a/yuwenhao/SourceInsight/pictures/同步符号表.png b/yuwenhao/SourceInsight/pictures/同步符号表.png new file mode 100644 index 0000000..13caefd Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/同步符号表.png differ diff --git a/yuwenhao/SourceInsight/pictures/打开工程.png b/yuwenhao/SourceInsight/pictures/打开工程.png new file mode 100644 index 0000000..fa61650 Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/打开工程.png differ diff --git a/yuwenhao/SourceInsight/pictures/打开工程2.png b/yuwenhao/SourceInsight/pictures/打开工程2.png new file mode 100644 index 0000000..9b527e3 Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/打开工程2.png differ diff --git a/yuwenhao/SourceInsight/pictures/新建工程弹窗.png b/yuwenhao/SourceInsight/pictures/新建工程弹窗.png new file mode 100644 index 0000000..4ae316c Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/新建工程弹窗.png differ diff --git a/yuwenhao/SourceInsight/pictures/新建工程弹窗源码目录.png b/yuwenhao/SourceInsight/pictures/新建工程弹窗源码目录.png new file mode 100644 index 0000000..93b8a86 Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/新建工程弹窗源码目录.png differ diff --git a/yuwenhao/SourceInsight/pictures/新建文件.png b/yuwenhao/SourceInsight/pictures/新建文件.png new file mode 100644 index 0000000..4c7b77e Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/新建文件.png differ diff --git a/yuwenhao/SourceInsight/pictures/添加文件.png b/yuwenhao/SourceInsight/pictures/添加文件.png new file mode 100644 index 0000000..55bcb6e Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/添加文件.png differ diff --git a/yuwenhao/SourceInsight/pictures/添加文件2.png b/yuwenhao/SourceInsight/pictures/添加文件2.png new file mode 100644 index 0000000..5a460f1 Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/添加文件2.png differ diff --git a/yuwenhao/SourceInsight/pictures/添加文件3.png b/yuwenhao/SourceInsight/pictures/添加文件3.png new file mode 100644 index 0000000..0f8bb3b Binary files /dev/null and b/yuwenhao/SourceInsight/pictures/添加文件3.png differ diff --git a/yuwenhao/SourceTree/SourceTree.md b/yuwenhao/SourceTree/SourceTree.md new file mode 100644 index 0000000..b7d4538 --- /dev/null +++ b/yuwenhao/SourceTree/SourceTree.md @@ -0,0 +1,1920 @@ +# 代码管理相关知识点学习文档 + +## 目录 + +- [一、Git](#一git) + - [1. Git 的概念](#1-git-的概念) + - [2. 三个区域的概念](#2-三个区域的概念) + - [3. 仓库的概念](#3-仓库的概念) + - [4. 节点的概念](#4-节点的概念) + - [5. 分支的概念](#5-分支的概念) +- [二、SourceTree](#二sourcetree) + - [1. SourceTree 的概念](#1-sourcetree-的概念) + - [2. 仓库相关操作](#2-仓库相关操作) + - [3. 节点相关操作](#3-节点相关操作) + - [4. 分支相关操作](#4-分支相关操作) + - [5. 其他常用操作](#5-其他常用操作) + - [6. 综合操作示例](#6-综合操作示例) +- [三、附加内容](#三附加内容) + - [1. 变基](#1-变基) + - [2. 创建补丁 2 种及以上](#2-创建补丁-2-种及以上) + - [3. 应用补丁 2 种及以上](#3-应用补丁-2-种及以上) +- [四、学习总结](#四学习总结) + +------ + +# 一、Git + +## 1. Git 的概念 + +Git 是一个分布式版本控制系统,主要用于管理代码版本、记录文件修改历史、支持多人协作开发。 + +使用 Git 后,每一次代码提交都会形成一个历史记录,后续可以查看修改内容、回退版本、创建分支、合并代码等。 + +简单理解: + +> Git 就是一个代码版本管理工具,可以记录代码从开始到现在的所有变化过程。 + +Git 的主要作用: + +- 记录代码修改历史; +- 支持版本回退; +- 支持多人协作开发; +- 支持分支开发; +- 方便定位问题和恢复代码。 + +常见 Git 操作包括: + +```bash +# 查看当前仓库状态 +git status + +# 添加文件到暂存区 +git add . + +# 提交代码到本地仓库 +git commit -m "提交说明" + +# 查看提交记录 +git log +``` + +------ + +## 2. 三个区域的概念 + +Git 中常说的三个区域分别是: + +| 区域 | 英文名称 | 作用 | +| -------- | -------------------- | ---------------------- | +| 工作区 | Working Directory | 实际编辑文件的地方 | +| 暂存区 | Staging Area / Index | 临时保存准备提交的修改 | +| 本地仓库 | Local Repository | 保存正式提交记录的地方 | + +### 2.1 工作区 + +工作区就是电脑中实际看到的项目文件夹,平时写代码、改文件都是在工作区完成的。 + +例如: + +```text +Project/ +├── main.c +├── README.md +└── .git/ +``` + +其中 `main.c`、`README.md` 就属于工作区中的文件。 + +### 2.2 暂存区 + +暂存区用于临时保存准备提交的文件。 + +当执行下面命令时,文件会从工作区进入暂存区: + +```bash +git add main.c +``` + +如果要把所有修改加入暂存区,可以使用: + +```bash +git add . +``` + +### 2.3 本地仓库 + +本地仓库保存的是一次次提交记录。 + +执行下面命令后,暂存区中的内容会提交到本地仓库: + +```bash +git commit -m "完成 main.c 初始化" +``` + +### 2.4 三个区域之间的关系 + +```text +工作区 --git add--> 暂存区 --git commit--> 本地仓库 +``` + +简单记法: + +- 修改文件:发生在工作区; +- `git add`:把修改放入暂存区; +- `git commit`:把暂存区内容保存到本地仓库。 + +------ + +## 3. 仓库的概念 + +Git 仓库就是被 Git 管理的项目目录。 + +一个 Git 仓库中通常包含: + +- 项目源代码; +- 提交历史; +- 分支信息; +- 标签信息; +- 远程仓库地址配置。 + +### 3.1 本地仓库 + +本地仓库是保存在自己电脑上的 Git 仓库。 + +创建本地仓库命令: + +```bash +git init +``` + +执行后,当前目录下会生成一个 `.git` 隐藏文件夹,该文件夹中保存 Git 版本管理相关信息。 + +### 3.2 远程仓库 + +远程仓库是保存在服务器上的仓库,例如 GitLab、GitHub、Gitee 等平台上的仓库。 + +远程仓库的作用: + +- 多人共享代码; +- 备份代码; +- 支持团队协作; +- 便于拉取和推送代码。 + +关联远程仓库命令: + +```bash +git remote add origin 远程仓库地址 +``` + +查看远程仓库: + +```bash +git remote -v +``` + +推送到远程仓库: + +```bash +git push origin main +``` + +从远程仓库拉取代码: + +```bash +git pull origin main +``` + +------ + +## 4. 节点的概念 + +Git 中的节点一般指一次提交记录,也就是一个 commit。 + +每一次执行 `git commit` 后,Git 都会生成一个提交节点。 + +每个提交节点通常包含: + +- 提交编号,也叫 commit hash; +- 提交作者; +- 提交时间; +- 提交说明; +- 本次提交修改的内容; +- 上一个提交节点的信息。 + +查看提交节点: + +```bash +git log --oneline +``` + +示例: + +```text +f3a12bc 修复登录问题 +9c8d123 添加用户管理功能 +3a4b567 初始化工程 +``` + +其中 `f3a12bc`、`9c8d123`、`3a4b567` 就是不同的提交节点。 + +简单理解: + +> 一个节点就是代码历史中的一个版本快照。 + +------ + +## 5. 分支的概念 + +分支是 Git 中非常重要的概念。 + +分支可以理解为代码开发的一条独立路线。不同分支之间可以互不影响地进行开发,开发完成后再进行合并。 + +常见分支: + +| 分支名称 | 作用 | +| ------------- | ---------------------------- | +| main / master | 主分支,保存稳定代码 | +| develop | 开发分支,保存正在开发的功能 | +| feature_xxx | 功能分支,用于开发某个新功能 | +| bugfix_xxx | 修复分支,用于修复问题 | +| release_xxx | 发布分支,用于版本发布前准备 | + +### 5.1 查看分支 + +```bash +git branch +``` + +### 5.2 创建分支 + +```bash +git branch feature_test +``` + +### 5.3 切换分支 + +```bash +git checkout feature_test +``` + +也可以创建并切换: + +```bash +git checkout -b feature_test +``` + +### 5.4 合并分支 + +假设当前在 `main` 分支,需要合并 `feature_test` 分支: + +```bash +git merge feature_test +``` + +### 5.5 删除分支 + +```bash +git branch -d feature_test +``` + +强制删除: + +```bash +git branch -D feature_test +``` + +------ + +# 二、SourceTree + +## 1. SourceTree 的概念 + +SourceTree 是一个 Git 图形化管理工具,可以通过图形界面完成 Git 的常用操作,例如提交、拉取、推送、创建分支、合并分支、解决冲突等。 + +简单理解: + +> SourceTree 是 Git 的图形界面工具,可以减少命令行操作,让代码管理过程更加直观。 + +SourceTree 的主要特点: + +- 可视化查看提交历史; +- 可视化查看分支关系; +- 支持提交、拉取、推送; +- 支持分支创建、切换、合并、删除; +- 支持冲突解决; +- 支持标签、贮藏、补丁等操作。 + +------ + +## 2. 仓库相关操作 + +## 2.1 创建本地仓库 + +### SourceTree 操作步骤 + +1. 打开 SourceTree; +2. 选择“创建”; +3. 选择本地项目路径; +4. 填写仓库名称; +5. 点击创建; +6. 创建完成后,该文件夹会被 Git 管理。 + +![创建本地仓库](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\创建本地仓库.png) + +### 对应 Git 命令 + +```bash +git init +``` + +### 说明 + +创建本地仓库后,项目目录下会生成 `.git` 文件夹,该文件夹用于保存 Git 版本管理信息。 + +------ + +## 2.2 打开本地仓库 + +### SourceTree 操作步骤 + +1. 打开 SourceTree; +2. 选择“添加“; +3. 选择已经存在的 Git 仓库路径; +4. 点击打开; +5. SourceTree 会加载该仓库的提交记录和分支信息。 + +![dkbdck](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\打开本地仓库.png) + +------ + +## 2.3 克隆远程仓库 + +克隆是指从远程服务器下载一份完整仓库到本地。 + +### SourceTree 操作步骤 + +1. 打开 SourceTree; +2. 选择“克隆”; +3. 输入远程仓库地址; +4. 选择本地保存路径; +5. 点击克隆; +6. 克隆完成后,本地会生成完整项目。 + +![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\克隆远程仓库.png) + +### 对应 Git 命令 + +```bash +git clone 远程仓库地址 +``` + +例如: + +```bash +git clone https:/http://gitea.xinje.cc/tangxinke/TrainCamp_yuwenhao_Modbus.git +``` + +------ + +## 2.4 获取 + +获取是指从远程仓库获取最新提交信息,但不会自动合并到当前工作分支。 + +### SourceTree 操作步骤 + +1. 点击工具栏中的“获取”或“Fetch”; +2. 选择远程仓库; +3. 点击确定; +4. SourceTree 会更新远程分支信息。 + +![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\获取.png) + +### 对应 Git 命令 + +```bash +git fetch origin +``` + +### 获取和拉取的区别 + +| 操作 | 是否下载远程信息 | 是否自动合并到当前分支 | +| ---------- | ---------------- | ---------------------- | +| Fetch 获取 | 是 | 否 | +| Pull 拉取 | 是 | 是 | + +简单理解: + +> 获取只是看看远程有没有新东西,拉取是把远程的新东西拿下来并合并到当前分支。 + +------ + +## 2.5 关联远程仓库 + +关联远程仓库是指给本地仓库添加远程地址。 + +### SourceTree 操作步骤 + +1. 打开本地仓库; +2. 进入“仓库设置”; +3. 找到“远程仓库”; +4. 点击“添加”; +5. 填写远程仓库名称,一般为 `origin`; +6. 填写远程仓库地址; +7. 保存设置。 + +![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\关联远程仓库1.png) + +![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\关联远程仓库2.png) + +### 对应 Git 命令 + +```bash +git remote add origin 远程仓库地址 +``` + +查看远程地址: + +```bash +git remote -v +``` + +修改远程地址: + +```bash +git remote set-url origin 新的远程仓库地址 +``` + +------ + +# 3. 节点相关操作 + +## 3.1 提交 + +提交是将暂存区中的修改保存为一个新的提交节点。 + +### SourceTree 操作步骤 + +1. 修改项目文件; +2. 回到 SourceTree; +3. 在“文件状态”中查看修改文件; +4. 勾选需要提交的文件,使其进入暂存区; +5. 在提交信息框中填写提交说明; +6. 点击“提交”。 + +![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\提交.png) + +### 对应 Git 命令 + +```bash +git add . +git commit -m "提交说明" +``` + +### 提交说明建议 + +提交说明要简洁清楚,例如: + +```text +添加用户登录功能 +修复串口初始化错误 +更新 README 文档 +``` + +不建议写: + +```text +修改 +改了一点 +123 +``` + +------ + +## 3.2 重置 + +重置用于将当前分支回到某个历史节点。 + +Git 中常见重置方式: + +| 类型 | 含义 | 影响 | +| ----- | -------- | ------------------------------ | +| Soft | 软重置 | 保留工作区和暂存区修改 | +| Mixed | 混合重置 | 保留工作区修改,清空暂存区 | +| Hard | 硬重置 | 工作区和暂存区都会回到指定版本 | + +### SourceTree 操作步骤 + +1. 在提交历史中选择目标提交节点; + +2. 右键该提交; + +3. 选择“重置当前分支到此次提交”; + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\重置当前分支.png) + +4. 根据需要选择 软合并、混合合并 或 强行合并; + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\重置选型png.png) + +5. 确认操作。 + +### 对应 Git 命令 + +```bash +# 软重置 +git reset --soft 提交ID + +# 混合重置 +git reset --mixed 提交ID + +# 硬重置 +git reset --hard 提交ID +``` + +### 注意 + +`git reset --hard` 会丢弃工作区未保存的修改,使用前要确认修改是否还需要保留。 + +------ + +## 3.3 回滚提交 + +回滚提交是指生成一个新的提交,用来抵消某一次历史提交的修改。 + +与重置不同,回滚不会删除历史提交记录,而是新增一个反向提交。 + +### SourceTree 操作步骤 + +1. 在提交历史中找到需要回滚的提交; + +2. 右键该提交; + +3. 选择“回滚提交”; + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\回滚提交.png) + +4. SourceTree 会生成一个新的回滚提交; + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\回滚提交2.png) + +5. 提交后,原提交的修改效果会被撤销。 + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\回滚提交3.png) + +### 对应 Git 命令 + +```bash +git revert 提交ID +``` + +### 重置和回滚的区别 + +| 操作 | 是否保留历史 | 是否新增提交 | 常用场景 | +| ----------- | ------------ | ------------ | ------------------------ | +| reset 重置 | 可能改变历史 | 否 | 本地回退、未推送代码整理 | +| revert 回滚 | 保留历史 | 是 | 已推送代码的安全撤销 | + +------ + +# 4. 分支相关操作 + +## 4.1 新建分支 + +### SourceTree 操作步骤 + +1. 点击工具栏中的“分支”按钮; + +2. 输入新分支名称,例如 `feature`; + +3. 选择指定的提交; + +4. 勾选“检出新分支”; + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\分支操作.png) + +5. 点击创建。 + +### 对应 Git 命令 + +```bash +git checkout -b feature/login +``` + +------ + +## 4.2 合并分支 + +合并分支是将一个分支上的修改合并到当前分支。 + +### SourceTree 操作步骤 + +1. 先切换到目标分支,例如 `main`; + +2. 在左侧分支列表中选择要合并的分支,例如 `feature`; + +3. 右键该分支; + +4. 选择“合并 feature 至当前分支”; + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\合并分支.png) + +5. 如果没有冲突,合并完成; + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\合并分支2.png) + +6. 如果有冲突,需要先解决冲突再提交。 + +### 对应 Git 命令 + +```bash +git checkout main +git merge feature/login +``` + +------ + +## 4.3 删除分支 + +### SourceTree 操作步骤 + +1. 确保当前不在要删除的分支上; + +2. 在左侧分支列表中找到要删除的分支; + +3. 右键该分支; + +4. 选择“删除分支”; + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\删除分支.png) + +5. 确认删除。 + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\分支删除后.png) + +### 对应 Git 命令 + +```bash +git branch -d feature +``` + +如果分支未合并,需要强制删除: + +```bash +git branch -D feature +``` + +删除远程分支: + +```bash +git push origin --delete feature +``` + +------ + +## 4.4 切换分支 + +### SourceTree 操作步骤 + +1. 在左侧分支列表中找到目标分支; +2. 双击分支名称,或者右键选择“检出”; +3. 当前工作区会切换到该分支对应的状态。 + +### 对应 Git 命令 + +```bash +git checkout 分支名 +``` + +也可以使用: + +```bash +git switch 分支名 +``` + +------ + +## 4.5 制造冲突 + +冲突通常发生在两个分支修改了同一个文件的同一部分内容,并且 Git 无法自动判断应该保留哪一份。 + +### 制造冲突示例 + +1. 在 `main` 分支中创建文件 `test.txt`: + +```text +hello main +``` +![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\hellomain.png) + +1. 提交到 `main` 分支; +2. 创建并切换到 `feature` 分支; +3. 修改 `test.txt`: + +```text +hello feature +``` +![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\hellofeature.png) + +1. 提交 `feature` 分支; + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\hellomainupdate.png) + +2. 切回 `main` 分支; + +3. 修改同一行内容: + +```text +hello main update +``` + +1. 提交 `main` 分支; + +2. 将 `feature` 合并到 `main`; + +3. 此时就会出现冲突。 + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\合并冲突.png) + +------ + +## 4.6 解决冲突 + +冲突文件中通常会出现类似内容: + +```text +<<<<<<< HEAD +hello main update +======= +hello feature +>>>>>>> feature +``` + +含义: + +| 标记 | 含义 | +| ---------------------- | ---------------------- | +| `<<<<<<< HEAD` | 当前分支中的内容开始 | +| `=======` | 分隔线 | +| `>>>>>>> feature/test` | 被合并分支中的内容结束 | + +### 解决方式 + +手动修改为最终想保留的内容,例如: + +```text +hello main update and feature +``` + +然后执行: + +```bash +git add test.txt +git commit -m "解决 test.txt 合并冲突" +``` + +### SourceTree 操作步骤 + +1. 合并分支后,SourceTree 显示存在冲突文件; + +2. 打开冲突文件; + +3. 手动编辑并删除冲突标记; + +4. 保存文件; + +5. 在 SourceTree 中将文件标记为已解决; + +6. 提交合并结果。 + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\合并完成.png) + +------ + +## 4.7 拉取 + +拉取是将远程仓库的最新代码获取到本地,并自动合并到当前分支。 + +### SourceTree 操作步骤 + +1. 点击工具栏中的“拉取”; + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\拉取.png) + +2. 选择远程仓库和远程分支; + +3. 点击确定; + +4. SourceTree 会执行拉取并合并。 + +### 对应 Git 命令 + +```bash +git pull origin 分支名 +``` + +例如: + +```bash +git pull origin main +``` + +------ + +## 4.8 推送 + +推送是将本地提交上传到远程仓库。 + +### SourceTree 操作步骤 + +1. 本地完成提交; +2. 点击工具栏中的“推送”; +3. 选择要推送的本地分支和远程分支; +4. 点击确定; +5. 推送完成后,远程仓库会更新。 + +### 对应 Git 命令 + +```bash +git push origin 分支名 +``` + +例如: + +```bash +git push origin main +``` + +首次推送新分支时,可以使用: + +```bash +git push -u origin feature/login +``` + +------ + +# 5. 其他常用操作 + +## 5.1 书写忽略文件 + +Git 忽略文件通过 `.gitignore` 配置。 + +`.gitignore` 用于告诉 Git 哪些文件不需要进行版本管理。 + +常见需要忽略的文件: + +- 编译生成文件; +- 临时文件; +- 日志文件; +- IDE 配置文件; +- 密钥、密码等敏感文件。 + +### 示例 `.gitignore` + +```gitignore +# 编译输出目录 +build/ +Debug/ +Release/ + +# 目标文件 +*.o +*.obj +*.exe +*.elf +*.hex +*.bin + +# 日志文件 +*.log + +# 临时文件 +*.tmp +*.bak + +# 系统文件 +.DS_Store +Thumbs.db + +# IDE 配置 +.vscode/ +.idea/ +``` + +### 注意 + +`.gitignore` 只能忽略还没有被 Git 跟踪的文件。 + +如果文件已经被 Git 跟踪,需要先停止跟踪。 + +------ + +## 5.2 停止跟踪 + +停止跟踪是指让 Git 不再管理某个已经被跟踪的文件,但文件仍然保留在本地。 + +![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\停止追踪.png) + +### 对应 Git 命令 + +```bash +git rm --cached 文件名 +``` + +例如: + +```bash +git rm --cached config.ini +``` + +停止跟踪整个文件夹: + +```bash +git rm -r --cached build/ +``` + +然后提交: + +```bash +git commit -m "停止跟踪 build 目录" +``` + +### 使用场景 + +例如某个编译输出目录之前已经提交到了仓库,现在想让 Git 忽略它,可以先执行停止跟踪,再写入 `.gitignore`。 + +------ +## 5.3 创建补丁 + +补丁文件用于保存代码修改内容,方便在其他分支、仓库或电脑上应用。 + +创建补丁常见有两种方式: + +1. 将**未提交的修改**创建为补丁; +2. 将**已经提交过的 commit** 创建为补丁。 + +--- + +### 5.3.1 将未提交的修改创建为补丁 + +将未提交的修改创建为补丁,是指把当前工作区或暂存区中的代码改动导出为 `.patch` 或 `.diff` 文件。 + +这种方式适用于代码已经修改,但还没有提交 commit 的情况。 + +#### 适用场景 + +- 当前修改还不想提交; +- 需要把未提交的代码修改发给别人; +- 需要把当前修改转移到其他分支; +- 需要临时保存当前工作区中的修改内容。 + +#### SourceTree 操作步骤 + +1. 打开 SourceTree,进入对应仓库; + +2. 在 **文件状态** 页面确认当前存在未提交修改; + +3. 根据需要选择是否暂存文件: + + - 如果要把全部修改都生成补丁,可以直接创建补丁; + - 如果只想把部分文件生成补丁,可以先将需要的文件加入暂存区。 + +4. 点击顶部菜单栏中的 **操作**; + +5. 选择 **创建补丁**; + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\创建一种补丁.png) + +6. 在创建补丁窗口中选择 **工作副本的变更**; + +7. 勾选需要生成补丁的文件; + +8. 选择补丁文件保存位置; + +9. 输入补丁文件名,例如: + + ```text + patch.diff + ``` + +![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\创建补丁页.png) + +## 5.4 应用补丁 1 种 + +应用补丁是指将 `.patch` 或 `.diff` 文件中保存的代码修改内容,应用到当前仓库或当前分支中。 + +应用补丁前,需要先切换到正确的目标分支,并建议保证当前工作区是干净的,避免补丁内容和本地已有修改产生冲突。 + +--- + +### 方法:使用 SourceTree 应用补丁 + +SourceTree 可以直接通过图形界面应用补丁文件,不需要手动输入 Git 命令。 + +#### 适用场景 + +- 已经有别人发来的 `.patch` 或 `.diff` 补丁文件; +- 需要把补丁中的修改应用到当前分支; +- 不想手动输入 Git 命令; +- 补丁文件是通过 SourceTree 创建出来的。 + +#### SourceTree 操作步骤 + +1. 打开 SourceTree,进入需要应用补丁的仓库; + +2. 切换到需要应用补丁的目标分支; + + 例如需要把补丁应用到 `develop` 分支,就先切换到 `develop`。 + +3. 建议先确认当前工作区是干净的,没有未提交修改; + +4. 点击顶部菜单栏中的 **操作**; + +5. 选择 **应用补丁**; + +6. 在弹出的窗口中选择需要应用的补丁文件,例如: + + ```text + patch.diff + ``` + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\应用补丁.png) + +7. 点击 **应用补丁** 或 **确定**; + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\应用补丁页.png) + +8. 应用成功后,回到 **文件状态** 页面; + +9. 查看补丁应用后产生的代码修改; + +10. 确认修改内容无误后,勾选需要提交的代码文件; + +11. 填写提交说明,例如: + + ```text + 应用补丁 patch.diff + ``` + +12. 点击 **提交**,完成补丁应用后的代码提交。 + +--- + +### 注意事项 + +- 应用补丁前,要先确认当前分支正确; +- 应用补丁前,建议保持工作区干净; +- 应用补丁时,不需要将 `.diff` 或 `.patch` 文件加入暂存区; +- `.diff` 或 `.patch` 文件只是补丁文件本身,一般不需要提交到仓库; +- 应用补丁后,真正需要提交的是补丁带来的代码修改; +- 如果补丁应用失败,通常是因为当前代码和补丁生成时的代码差异较大,产生了冲突; +- 如果补丁文件保存在仓库目录中,Git 可能会把它显示为未追踪文件,这种情况下可以不提交它,也可以把补丁文件移动到仓库外部保存。 + +--- + +### 简单理解 + +```text +补丁文件:保存代码修改内容。 + +应用补丁:把补丁文件中的修改应用到当前分支。 + +提交代码:应用成功后,提交被补丁修改过的代码文件。 +``` + +补丁文件本身不用提交。 + +应用补丁后,提交的是被补丁修改过的代码文件。 + +------ +## 5.5 贮藏 + +贮藏用于临时保存当前未提交的修改,让工作区恢复干净状态。 + +适合场景:当前正在写代码,但突然需要切换分支处理其他问题。 + +### SourceTree 操作步骤 + +1. 当前工作区存在未提交修改; + +2. 点击“仓库”; + +3. 点击“贮藏变更”; + +4. 输入贮藏说明; + +5. 确认后,当前修改会被临时保存; + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\贮藏.png) + +6. 工作区恢复到干净状态。 + +### 对应 Git 命令 + +```bash +git stash save "临时保存当前修改" +``` + +查看贮藏列表: + +```bash +git stash list +``` + +恢复最近一次贮藏: + +```bash +git stash pop +``` + +只应用但不删除贮藏: + +```bash +git stash apply +``` + +说明: + +`git stash apply` 表示将贮藏中的修改重新应用到当前工作区,但不会删除该条贮藏记录。 + +也就是说,执行后: + +- 之前临时保存的修改会恢复到工作区; +- 贮藏列表中仍然保留这条记录; +- 如果后续还需要再次恢复,可以继续使用该贮藏。 + +在 SourceTree 中,对应操作为: + +右键左侧“贮藏”列表中的某条贮藏记录,选择“应用贮藏”。 + +“应用贮藏”和“弹出贮藏”的区别如下: + +| 操作 | 作用 | +| ---- | ---- | +| 应用贮藏 | 恢复修改,但保留贮藏记录 | +| 弹出贮藏 | 恢复修改,同时删除贮藏记录 | + +因此,在不确定是否还需要该贮藏记录时,建议优先使用“应用贮藏”。 + +删除某个贮藏: + +```bash +git stash drop stash@{0} +``` +------ + +## 5.6 丢弃 + +丢弃用于放弃当前工作区中未提交的修改,使文件恢复到上一次提交时的状态。 + +简单理解: +如果某个文件修改错了,并且不想保留这次修改,就可以使用“丢弃”操作。 + +注意:丢弃操作一般用于**未暂存文件**。如果文件已经暂存,需要先取消暂存,再进行丢弃。 + +### 适合场景 + +- 文件修改错误,不想保留当前改动; +- 当前修改只是临时测试代码; +- 想让文件恢复到上一次提交时的状态; +- 不需要把当前修改提交到仓库。 + +### SourceTree 操作步骤 + +1. 在文件状态区域选中需要放弃修改的文件; + +2. 右键该文件; + +3. 点击“恢复文件改动”; + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\丢弃操作.png) + +4. 在弹出的确认窗口中确认; + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\丢弃.png) + +5. 文件会恢复到上一次提交时的状态。 + +注意:“恢复文件改动”相当于丢弃当前未提交修改,操作后当前修改会被删除。 + +### 对应 Git 命令 + +丢弃某个未暂存文件的修改: + +```bash +git restore 文件名 +``` + +------ + +## 5.7 移除 + +移除是指从 Git 仓库中删除文件。 + +### SourceTree 操作步骤 + +1. 在文件状态区域选中需要移除的文件; + +2. 右键该文件; + +3. 点击“移除”; + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\移除.png) + +4. 在弹出的确认窗口中确认; + +5. 文件会从本地工作区删除,并在 SourceTree 中显示为删除状态; + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\删除状态.png) + +6. 点击暂存所有; + +7. 点击“提交”,Git 会记录该文件被删除; + +8. 如果需要同步到远程仓库,再点击“推送”。 + +------ + +## 5.8 创建标签 + +标签用于给某个提交节点打上版本标记,常用于版本发布。 + +例如: + +```text +v1.0.0 +v1.1.0 +v2.0.0 +``` + +### SourceTree 操作步骤 + +1. 在提交历史中选择一个提交节点; + +2. 右键该提交; + +3. 选择“标签”; + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\标签.png) + +4. 输入标签名称,例如 `v1.0.0`; + +5. 确认创建。 + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\标签2.png) + +### 对应 Git 命令 + +```bash +git tag v1.0.0 +``` + +给指定提交创建标签: + +```bash +git tag v1.0.0 提交ID +``` + +推送标签到远程: + +```bash +git push origin v1.0.0 +``` + +推送所有标签: + +```bash +git push origin --tags +``` + +------ + +## 5.9 删除标签 + +### 删除本地标签 + +```bash +git tag -d v1.0.0 +``` + +### 删除远程标签 + +```bash +git push origin --delete v1.0.0 +``` + +### SourceTree 操作步骤 + +1. 在左侧标签列表中找到目标标签; +2. 右键标签; +3. 选择删除; +4. 如果需要删除远程标签,需要推送删除操作。 + +------ + +# 6. 综合操作示例 + +## 6.1 一系列操作后最终状态 + +下面通过一个完整流程说明 Git 和 SourceTree 的基本使用过程。 + +### 操作流程 + +1. 创建本地仓库 `GitStudy`; +2. 新建文件 `README.md`; +3. 提交初始版本; +4. 创建分支 `feature/add-doc`; +5. 在分支中修改 `README.md`; +6. 提交修改; +7. 切换回 `main` 分支; +8. 合并 `feature/add-doc`; +9. 创建标签 `v1.0.0`; +10. 推送 `main` 分支和标签到远程仓库。 + +### 对应 Git 命令 + +```bash +mkdir GitStudy +cd GitStudy + +git init + +echo "# GitStudy" > README.md + +git add README.md +git commit -m "初始化 README 文档" + +git checkout -b feature/add-doc + +echo "学习 Git 和 SourceTree" >> README.md + +git add README.md +git commit -m "补充 Git 学习说明" + +git checkout main +git merge feature/add-doc + +git tag v1.0.0 + +git remote add origin 远程仓库地址 +git push -u origin main +git push origin v1.0.0 +``` + +### 最终状态说明 + +| 内容 | 最终状态 | +| -------------------- | ------------------------ | +| 当前分支 | main | +| README.md | 包含初始化内容和新增说明 | +| feature/add-doc 分支 | 已合并到 main | +| 标签 | 已创建 v1.0.0 | +| 远程仓库 | 已推送 main 分支和标签 | +| 工作区 | 干净,无未提交修改 | + +查看最终状态: + +```bash +git status +``` + +正常情况下会显示类似: + +```text +nothing to commit, working tree clean +``` + +------ + +# 三、附加内容 + +## 1. 变基 + +变基英文是 Rebase,是 Git 中整理提交历史的一种方式。 + +变基可以把当前分支的提交移动到另一个分支的最新提交之后,使提交历史看起来更加线性。 + +### 1.1 变基和合并的区别 + +| 操作 | 特点 | 提交历史 | +| ----------- | ------------------------ | ---------------------- | +| merge 合并 | 保留真实分支合并记录 | 可能出现分叉和合并节点 | +| rebase 变基 | 将提交移动到目标分支后面 | 历史更加线性 | + +### 1.2 变基示意 + +变基前: + +```text +A---B---C main + \ + D---E feature +``` + +在 `feature` 分支执行: + +```bash +git rebase main +``` + +变基后: + +```text +A---B---C---D'---E' feature +``` + +说明: + +`D` 和 `E` 会被重新应用到 `C` 后面,并形成新的提交 `D'` 和 `E'`。 + +### 1.3 SourceTree 中变基操作 + +1. 切换到需要变基的分支,例如 `bianji`; + +2. 在左侧分支中选择目标分支,例如 `main`; + +3. 右键目标分支; + +4. 选择“变基当前变更到 main”; + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\bianji2.png) + +5. 如果有冲突,需要解决冲突后继续变基。 + + 变基前![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\bianjiqian.png) + 变基后![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\bianjihou.png) + +### 1.4 对应 Git 命令 + +```bash +git checkout feature +git rebase main +``` + +如果出现冲突,解决冲突后执行: + +```bash +git add 冲突文件 +git rebase --continue +``` + +放弃变基: + +```bash +git rebase --abort +``` + +### 1.5 注意事项 + +已经推送到远程并被别人使用的公共分支,不建议随意变基。 + +原因是变基会改变提交历史,可能影响其他人的开发进度。 + +------ + +## 2. 创建补丁 2 种及以上 + +补丁文件用于保存代码修改内容,方便在其他分支、仓库或电脑上重新应用这些修改。 + +在 SourceTree 中,创建补丁常见可以分为以下几种情况: + +1. 将**未提交的修改**创建为补丁; +2. 将**已经提交过的单个 commit** 创建为补丁; +3. 将**多个 commit 或一段提交范围**创建为补丁; +4. 将**部分文件的修改**创建为补丁。 + +### 2.1 将未提交的修改创建为补丁 + +将未提交的修改创建为补丁,是指把当前工作区或暂存区中的代码改动导出为 `.patch` 或 `.diff` 文件。 + +这种方式适用于代码已经修改,但还没有提交 commit 的情况。 + +#### 适用场景 + +- 当前修改还不想提交; +- 需要把未提交的代码修改发给别人; +- 需要把当前修改转移到其他分支; +- 需要临时保存当前工作区中的修改内容。 + +#### SourceTree 操作步骤 + +1. 参考二、5.3 + + +#### 注意事项 + +- 创建补丁不一定需要先暂存文件; +- 如果是修改已有文件,一般可以直接创建补丁; +- 如果是新建文件,建议先将新文件加入暂存区; +- 如果新建文件为空,补丁中可能看不到该文件,因为空文件没有实际代码差异; +- 补丁文件一般不需要加入 Git 追踪,也不需要提交到仓库中。 + +### 2.2 将已经提交过的单个 commit 创建为补丁 + +将单个 commit 创建为补丁,是指把某一次已经提交过的代码修改导出为补丁文件。 + +这种方式适用于代码已经 commit,但不方便直接 push,或者需要把某次提交发送给别人使用的情况。 + +#### 适用场景 + +- 代码已经提交,但不方便直接推送到远程仓库; +- 需要把某一次提交发给别人; +- 需要把某一次提交应用到其他分支; +- 需要保留该次提交对应的修改内容。 + +#### SourceTree 操作步骤 + +1. 打开 SourceTree,进入对应仓库; + +2. 找到需要创建补丁的 commit; + +3. 选中该 commit; + +4. 点击顶部菜单栏中的 **操作**; + +5. 选择 **创建补丁**; + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\操作创建补丁.png) + +6. 切换到 **日志 / 历史** 页面; + +7. 在创建补丁窗口中切换到 **日志 / 历史**; + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\创建补丁日志历史.png) + +8. 确认选中的 commit 是否正确; + +9. 在 **补丁文件** 一栏中选择补丁保存位置和文件名,例如: + + ```text + fixbug.diff + ``` + +10. 点击 **创建补丁**; + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\选中创建补丁.png) + +11. 创建完成后,会生成一个对应的补丁文件。 + +#### 说明 + +这种方式创建的补丁来源于已经提交过的 commit。 + +相比未提交修改创建的补丁,这种补丁更适合用于传递某一次完整的提交修改。 + +### 2.3 将多个 commit 或一段提交范围创建为补丁 + +将多个 commit 创建为补丁,是指把连续或多个已经提交过的提交记录一起导出为补丁文件。 + +这种方式适用于需要把一组相关修改整体转移到其他分支或仓库的情况。 + +#### 适用场景 + +- 一个功能由多个 commit 组成; +- 一个问题修复涉及多次提交; +- 需要把某一段提交记录整体发给别人; +- 需要把某个分支上的一组提交迁移到另一个分支。 + +#### SourceTree 操作步骤 + +1. 打开 SourceTree,进入对应仓库; + +2. 点击顶部菜单栏中的 **操作**; + +3. 选择 **创建补丁**; + +4. 创建补丁窗口中切换到 **日志 / 历史** 页面; + +5. 找到需要导出的多个 commit; + + 可以根据实际情况选择单个 commit、多个 commit,或者一段连续的提交范围。 + +6. 按住 ”ctrl“ 选中需要创建补丁的提交记录; + +7. 确认需要导出的 commit 范围是否正确; + +8. 在 **补丁文件** 一栏中选择补丁保存位置和文件名,例如: + + ```text + feature_update.diff + ``` + +9. 点击 **创建补丁**; + +10. 创建完成后,会生成包含这些提交修改内容的补丁文件。 + +#### 注意事项 + +- 多个 commit 创建补丁时,要确认提交顺序和提交范围是否正确; +- 如果多个提交之间有关联,应用补丁时也需要保证目标分支的代码基础一致; +- 如果目标分支代码和补丁生成时差异较大,应用补丁时可能会失败或产生冲突。 + +### 2.4 将部分文件的修改创建为补丁 + +将部分文件创建为补丁,是指当前修改了多个文件,但只想把其中几个文件的修改导出为补丁。 + +这种方式本质上仍然属于“未提交修改创建补丁”,只是只选择其中一部分文件。 + +#### 适用场景 + +- 当前修改了很多文件,但只想导出其中几个文件; +- 有些修改还不想给别人; +- 想把一个大修改拆成多个小补丁; +- 想单独保存某几个文件的修改内容。 + +#### SourceTree 操作步骤 + +1. 打开 SourceTree,进入对应仓库; + +2. 进入 **文件状态** 页面; + +3. 查看当前所有修改文件; + +4. 如果只想导出部分文件,可以先将需要的文件加入暂存区; + +5. 点击顶部菜单栏中的 **操作**; + +6. 选择 **创建补丁**; + +7. 在创建补丁窗口中选择 **工作副本的变更**; + +8. 只勾选需要生成补丁的文件; + +9. 在 **补丁文件** 一栏中选择补丁保存位置和文件名,例如: + + ```text + part_update.patch + ``` + +10. 点击 **创建补丁**; + +11. 创建完成后,补丁文件中只会包含所选文件的修改内容。 + +### 2.5 补丁文件保存位置 + +创建补丁时,补丁文件保存在哪里,取决于 **补丁文件** 一栏中填写的路径。 + +例如: + +```text +F:\信捷电气\训练营\代码\StageTwo\patch.diff +``` + +表示补丁文件保存在: + +```text +F:\信捷电气\训练营\代码\StageTwo\ +``` + +文件名为: + +```text +patch.diff +``` + +如果补丁文件保存在 Git 仓库目录中,SourceTree 可能会将它显示为未追踪文件。 + +一般情况下,补丁文件不需要提交到仓库中,可以将补丁文件保存到仓库外部,避免误提交。 + +### 2.6 几种创建补丁方式的区别 + +| 创建方式 | 来源 | 是否已经提交 | 适用情况 | +| -------------------- | -------------- | ------------ | --------------------------------------- | +| 未提交修改创建补丁 | 工作区或暂存区 | 未提交 | 当前修改还没有 commit,需要导出修改内容 | +| 单个 commit 创建补丁 | 某一次提交记录 | 已提交 | 需要导出某一次提交 | +| 多个 commit 创建补丁 | 多次提交记录 | 已提交 | 需要导出一组相关提交 | +| 部分文件创建补丁 | 部分文件修改 | 不一定 | 只想导出某几个文件的修改 | + +### 2.7 简单理解 + +```text +代码还没有提交: +从“工作副本的变更”创建补丁。 + +代码已经提交: +从“日志 / 历史”中的 commit 创建补丁。 + +只想导出部分文件: +在创建补丁窗口中只勾选需要的文件。 + +补丁文件本身: +一般不用提交到 Git 仓库。 +``` + + + + +------ + +## 3. 应用补丁 2 种及以上 + +## 3.1 方法一:使用 `git apply` 应用补丁 + +适用于 `git diff` 生成的普通补丁。 + +检查补丁是否能应用: + +```bash +git apply --check update.patch +``` + +应用补丁: + +```bash +git apply update.patch +``` + +应用后需要手动提交: + +```bash +git add . +git commit -m "应用 update.patch 补丁" +``` + +特点: + +- 只应用代码差异; +- 不会自动生成提交; +- 不保留原提交作者和提交说明。 + +------ + +## 3.2 方法二:使用 `git am` 应用补丁 + +适用于 `git format-patch` 生成的补丁。 + +```bash +git am 0001-xxx.patch +``` + +如果有多个补丁文件: + +```bash +git am *.patch +``` + +特点: + +- 会自动生成提交; +- 保留原提交作者、时间和提交说明; +- 适合正式补丁合入。 + +如果应用失败,可以放弃: + +```bash +git am --abort +``` + +解决冲突后继续: + +```bash +git add 冲突文件 +git am --continue +``` + +------ + +## 3.3 方法三:使用 SourceTree 应用补丁 + +一般操作步骤: + +1. 打开目标仓库; + +2. 找到“操作”; + +3. 选择“应用补丁”; + + ![](F:\信捷电气\训练营\第一周\学习文档\yuwenhao\SourceTree\pictures\操作.png) + +4. 选择补丁文件; + +5. 如果没有冲突,补丁会被应用到当前工作区; + +6. 检查修改内容; + +7. 提交修改。 + +注意: + +- 普通 diff 补丁通常应用后需要手动提交; +- format-patch 补丁如果通过命令行 `git am` 应用,会自动形成提交。 + +------ + +# 四、学习总结 + +通过本次学习,掌握了 Git 和 SourceTree 的基础知识以及常用操作。 + +## 1. Git 核心知识总结 + +| 知识点 | 说明 | +| -------- | ---------------------------- | +| Git | 分布式版本控制系统 | +| 工作区 | 实际修改文件的地方 | +| 暂存区 | 临时保存准备提交的修改 | +| 本地仓库 | 保存提交历史的地方 | +| 远程仓库 | 服务器上的共享仓库 | +| 节点 | 一次提交记录 | +| 分支 | 独立开发路线 | +| 合并 | 把一个分支内容合入另一个分支 | +| 变基 | 整理提交历史,使历史更线性 | +| 标签 | 给某个提交打版本标记 | + +## 2. SourceTree 核心操作总结 + +| 操作 | 作用 | +| ------------ | ---------------------------- | +| 创建本地仓库 | 初始化一个 Git 仓库 | +| 打开本地仓库 | 使用 SourceTree 管理已有仓库 | +| 克隆远程仓库 | 从服务器下载代码 | +| 获取 | 获取远程更新但不自动合并 | +| 拉取 | 获取远程更新并合并 | +| 推送 | 上传本地提交到远程仓库 | +| 提交 | 保存一次代码版本 | +| 重置 | 回到某个历史节点 | +| 回滚提交 | 用新提交撤销旧提交 | +| 新建分支 | 创建独立开发路线 | +| 合并分支 | 合并不同分支代码 | +| 解决冲突 | 处理不同分支中重复修改的问题 | +| 贮藏 | 临时保存未提交修改 | +| 丢弃 | 放弃未提交修改 | +| 标签 | 标记版本节点 | +| 补丁 | 导出或应用代码修改 | + +## 3. 常用命令汇总 + +```bash +# 初始化仓库 +git init + +# 克隆仓库 +git clone 远程仓库地址 + +# 查看状态 +git status + +# 添加到暂存区 +git add . + +# 提交 +git commit -m "提交说明" + +# 查看日志 +git log --oneline + +# 查看分支 +git branch + +# 创建并切换分支 +git checkout -b 分支名 + +# 切换分支 +git checkout 分支名 + +# 合并分支 +git merge 分支名 + +# 拉取 +git pull origin 分支名 + +# 推送 +git push origin 分支名 + +# 创建标签 +git tag 标签名 + +# 贮藏 +git stash + +# 恢复贮藏 +git stash pop + +# 创建普通补丁 +git diff > update.patch + +# 应用普通补丁 +git apply update.patch + +# 创建提交补丁 +git format-patch -1 HEAD + +# 应用提交补丁 +git am 0001-xxx.patch +``` + +## 4. 个人学习体会 + +Git 的核心是理解工作区、暂存区、本地仓库和远程仓库之间的关系。SourceTree 作为图形化工具,可以帮助我们更加直观地理解分支、提交节点和代码合并过程。 + +在实际开发中,应养成以下习惯: + +- 修改代码前先拉取最新代码; +- 每次提交只完成一个明确功能; +- 提交说明要清楚; +- 不要随意提交编译生成文件; +- 合并代码前先确认分支状态; +- 遇到冲突时先理解差异,再决定保留内容; +- 对公共分支谨慎使用重置和变基。 + +------ + diff --git a/yuwenhao/SourceTree/pictures/bianji.png b/yuwenhao/SourceTree/pictures/bianji.png new file mode 100644 index 0000000..70ad484 Binary files /dev/null and b/yuwenhao/SourceTree/pictures/bianji.png differ diff --git a/yuwenhao/SourceTree/pictures/bianji2.png b/yuwenhao/SourceTree/pictures/bianji2.png new file mode 100644 index 0000000..0a7b9a9 Binary files /dev/null and b/yuwenhao/SourceTree/pictures/bianji2.png differ diff --git a/yuwenhao/SourceTree/pictures/bianjihou.png b/yuwenhao/SourceTree/pictures/bianjihou.png new file mode 100644 index 0000000..6ce8341 Binary files /dev/null and b/yuwenhao/SourceTree/pictures/bianjihou.png differ diff --git a/yuwenhao/SourceTree/pictures/bianjiqian.png b/yuwenhao/SourceTree/pictures/bianjiqian.png new file mode 100644 index 0000000..0985dea Binary files /dev/null and b/yuwenhao/SourceTree/pictures/bianjiqian.png differ diff --git a/yuwenhao/SourceTree/pictures/hellofeature.png b/yuwenhao/SourceTree/pictures/hellofeature.png new file mode 100644 index 0000000..2d7607c Binary files /dev/null and b/yuwenhao/SourceTree/pictures/hellofeature.png differ diff --git a/yuwenhao/SourceTree/pictures/hellomain.png b/yuwenhao/SourceTree/pictures/hellomain.png new file mode 100644 index 0000000..1dc31c0 Binary files /dev/null and b/yuwenhao/SourceTree/pictures/hellomain.png differ diff --git a/yuwenhao/SourceTree/pictures/hellomainupdate.png b/yuwenhao/SourceTree/pictures/hellomainupdate.png new file mode 100644 index 0000000..554cddf Binary files /dev/null and b/yuwenhao/SourceTree/pictures/hellomainupdate.png differ diff --git a/yuwenhao/SourceTree/pictures/丢弃.png b/yuwenhao/SourceTree/pictures/丢弃.png new file mode 100644 index 0000000..d25da20 Binary files /dev/null and b/yuwenhao/SourceTree/pictures/丢弃.png differ diff --git a/yuwenhao/SourceTree/pictures/丢弃操作.png b/yuwenhao/SourceTree/pictures/丢弃操作.png new file mode 100644 index 0000000..270acc2 Binary files /dev/null and b/yuwenhao/SourceTree/pictures/丢弃操作.png differ diff --git a/yuwenhao/SourceTree/pictures/停止追踪.png b/yuwenhao/SourceTree/pictures/停止追踪.png new file mode 100644 index 0000000..907eb0b Binary files /dev/null and b/yuwenhao/SourceTree/pictures/停止追踪.png differ diff --git a/yuwenhao/SourceTree/pictures/克隆远程仓库.png b/yuwenhao/SourceTree/pictures/克隆远程仓库.png new file mode 100644 index 0000000..1a9290c Binary files /dev/null and b/yuwenhao/SourceTree/pictures/克隆远程仓库.png differ diff --git a/yuwenhao/SourceTree/pictures/关联远程仓库1.png b/yuwenhao/SourceTree/pictures/关联远程仓库1.png new file mode 100644 index 0000000..dda552a Binary files /dev/null and b/yuwenhao/SourceTree/pictures/关联远程仓库1.png differ diff --git a/yuwenhao/SourceTree/pictures/关联远程仓库2.png b/yuwenhao/SourceTree/pictures/关联远程仓库2.png new file mode 100644 index 0000000..f97cb9f Binary files /dev/null and b/yuwenhao/SourceTree/pictures/关联远程仓库2.png differ diff --git a/yuwenhao/SourceTree/pictures/分支删除后.png b/yuwenhao/SourceTree/pictures/分支删除后.png new file mode 100644 index 0000000..6a3c8ca Binary files /dev/null and b/yuwenhao/SourceTree/pictures/分支删除后.png differ diff --git a/yuwenhao/SourceTree/pictures/分支操作.png b/yuwenhao/SourceTree/pictures/分支操作.png new file mode 100644 index 0000000..2c29658 Binary files /dev/null and b/yuwenhao/SourceTree/pictures/分支操作.png differ diff --git a/yuwenhao/SourceTree/pictures/创建一种补丁.png b/yuwenhao/SourceTree/pictures/创建一种补丁.png new file mode 100644 index 0000000..20b9c3d Binary files /dev/null and b/yuwenhao/SourceTree/pictures/创建一种补丁.png differ diff --git a/yuwenhao/SourceTree/pictures/创建本地仓库.png b/yuwenhao/SourceTree/pictures/创建本地仓库.png new file mode 100644 index 0000000..cff9b0a Binary files /dev/null and b/yuwenhao/SourceTree/pictures/创建本地仓库.png differ diff --git a/yuwenhao/SourceTree/pictures/创建补丁日志历史.png b/yuwenhao/SourceTree/pictures/创建补丁日志历史.png new file mode 100644 index 0000000..bd02b58 Binary files /dev/null and b/yuwenhao/SourceTree/pictures/创建补丁日志历史.png differ diff --git a/yuwenhao/SourceTree/pictures/创建补丁页.png b/yuwenhao/SourceTree/pictures/创建补丁页.png new file mode 100644 index 0000000..a331e45 Binary files /dev/null and b/yuwenhao/SourceTree/pictures/创建补丁页.png differ diff --git a/yuwenhao/SourceTree/pictures/删除分支.png b/yuwenhao/SourceTree/pictures/删除分支.png new file mode 100644 index 0000000..fd6f580 Binary files /dev/null and b/yuwenhao/SourceTree/pictures/删除分支.png differ diff --git a/yuwenhao/SourceTree/pictures/删除状态.png b/yuwenhao/SourceTree/pictures/删除状态.png new file mode 100644 index 0000000..b345398 Binary files /dev/null and b/yuwenhao/SourceTree/pictures/删除状态.png differ diff --git a/yuwenhao/SourceTree/pictures/合并冲突.png b/yuwenhao/SourceTree/pictures/合并冲突.png new file mode 100644 index 0000000..ae1785f Binary files /dev/null and b/yuwenhao/SourceTree/pictures/合并冲突.png differ diff --git a/yuwenhao/SourceTree/pictures/合并分支.png b/yuwenhao/SourceTree/pictures/合并分支.png new file mode 100644 index 0000000..db3e02d Binary files /dev/null and b/yuwenhao/SourceTree/pictures/合并分支.png differ diff --git a/yuwenhao/SourceTree/pictures/合并分支2.png b/yuwenhao/SourceTree/pictures/合并分支2.png new file mode 100644 index 0000000..77c04c7 Binary files /dev/null and b/yuwenhao/SourceTree/pictures/合并分支2.png differ diff --git a/yuwenhao/SourceTree/pictures/合并完成.png b/yuwenhao/SourceTree/pictures/合并完成.png new file mode 100644 index 0000000..ce2ef12 Binary files /dev/null and b/yuwenhao/SourceTree/pictures/合并完成.png differ diff --git a/yuwenhao/SourceTree/pictures/回滚提交.png b/yuwenhao/SourceTree/pictures/回滚提交.png new file mode 100644 index 0000000..6b81a7f Binary files /dev/null and b/yuwenhao/SourceTree/pictures/回滚提交.png differ diff --git a/yuwenhao/SourceTree/pictures/回滚提交2.png b/yuwenhao/SourceTree/pictures/回滚提交2.png new file mode 100644 index 0000000..611529f Binary files /dev/null and b/yuwenhao/SourceTree/pictures/回滚提交2.png differ diff --git a/yuwenhao/SourceTree/pictures/回滚提交3.png b/yuwenhao/SourceTree/pictures/回滚提交3.png new file mode 100644 index 0000000..ff8c860 Binary files /dev/null and b/yuwenhao/SourceTree/pictures/回滚提交3.png differ diff --git a/yuwenhao/SourceTree/pictures/应用补丁.png b/yuwenhao/SourceTree/pictures/应用补丁.png new file mode 100644 index 0000000..f2f35e5 Binary files /dev/null and b/yuwenhao/SourceTree/pictures/应用补丁.png differ diff --git a/yuwenhao/SourceTree/pictures/应用补丁页.png b/yuwenhao/SourceTree/pictures/应用补丁页.png new file mode 100644 index 0000000..b497927 Binary files /dev/null and b/yuwenhao/SourceTree/pictures/应用补丁页.png differ diff --git a/yuwenhao/SourceTree/pictures/打开本地仓库.png b/yuwenhao/SourceTree/pictures/打开本地仓库.png new file mode 100644 index 0000000..b469d7a Binary files /dev/null and b/yuwenhao/SourceTree/pictures/打开本地仓库.png differ diff --git a/yuwenhao/SourceTree/pictures/拉取.png b/yuwenhao/SourceTree/pictures/拉取.png new file mode 100644 index 0000000..5b80c4e Binary files /dev/null and b/yuwenhao/SourceTree/pictures/拉取.png differ diff --git a/yuwenhao/SourceTree/pictures/提交.png b/yuwenhao/SourceTree/pictures/提交.png new file mode 100644 index 0000000..1ed8269 Binary files /dev/null and b/yuwenhao/SourceTree/pictures/提交.png differ diff --git a/yuwenhao/SourceTree/pictures/操作.png b/yuwenhao/SourceTree/pictures/操作.png new file mode 100644 index 0000000..0986e58 Binary files /dev/null and b/yuwenhao/SourceTree/pictures/操作.png differ diff --git a/yuwenhao/SourceTree/pictures/操作创建补丁.png b/yuwenhao/SourceTree/pictures/操作创建补丁.png new file mode 100644 index 0000000..4b0d90e Binary files /dev/null and b/yuwenhao/SourceTree/pictures/操作创建补丁.png differ diff --git a/yuwenhao/SourceTree/pictures/标签.png b/yuwenhao/SourceTree/pictures/标签.png new file mode 100644 index 0000000..38c3924 Binary files /dev/null and b/yuwenhao/SourceTree/pictures/标签.png differ diff --git a/yuwenhao/SourceTree/pictures/标签2.png b/yuwenhao/SourceTree/pictures/标签2.png new file mode 100644 index 0000000..207a4c0 Binary files /dev/null and b/yuwenhao/SourceTree/pictures/标签2.png differ diff --git a/yuwenhao/SourceTree/pictures/移除.png b/yuwenhao/SourceTree/pictures/移除.png new file mode 100644 index 0000000..513eb97 Binary files /dev/null and b/yuwenhao/SourceTree/pictures/移除.png differ diff --git a/yuwenhao/SourceTree/pictures/获取.png b/yuwenhao/SourceTree/pictures/获取.png new file mode 100644 index 0000000..65c2dcd Binary files /dev/null and b/yuwenhao/SourceTree/pictures/获取.png differ diff --git a/yuwenhao/SourceTree/pictures/贮藏.png b/yuwenhao/SourceTree/pictures/贮藏.png new file mode 100644 index 0000000..ba4a312 Binary files /dev/null and b/yuwenhao/SourceTree/pictures/贮藏.png differ diff --git a/yuwenhao/SourceTree/pictures/选中创建补丁.png b/yuwenhao/SourceTree/pictures/选中创建补丁.png new file mode 100644 index 0000000..3cda547 Binary files /dev/null and b/yuwenhao/SourceTree/pictures/选中创建补丁.png differ diff --git a/yuwenhao/SourceTree/pictures/重置当前分支.png b/yuwenhao/SourceTree/pictures/重置当前分支.png new file mode 100644 index 0000000..b3a118e Binary files /dev/null and b/yuwenhao/SourceTree/pictures/重置当前分支.png differ diff --git a/yuwenhao/SourceTree/pictures/重置选型png.png b/yuwenhao/SourceTree/pictures/重置选型png.png new file mode 100644 index 0000000..7a0251d Binary files /dev/null and b/yuwenhao/SourceTree/pictures/重置选型png.png differ diff --git a/yuwenhao/VisualStudio/VisualStudio.md b/yuwenhao/VisualStudio/VisualStudio.md new file mode 100644 index 0000000..e69de29