Compare commits

...

No commits in common. '阚星宇' and 'master' have entirely different histories.

共有 100 個文件被更改,包括 405 次插入197 次删除
分割檢視
  1. +330
    -144
      IAR/IAR.md
  2. 二進制
      IAR/Pictures/image-20250708131909282.png
  3. 二進制
      IAR/Pictures/image-20250708131945592.png
  4. 二進制
      IAR/Pictures/image-20250708132254972.png
  5. 二進制
      IAR/Pictures/image-20250708132546212.png
  6. 二進制
      IAR/Pictures/image-20250708133238110.png
  7. 二進制
      IAR/Pictures/image-20250708135420393.png
  8. 二進制
      IAR/Pictures/image-20250708135958571.png
  9. 二進制
      IAR/Pictures/image-20250708140541188.png
  10. 二進制
      IAR/Pictures/image-20250708141257388.png
  11. 二進制
      IAR/Pictures/image-20250708142245783.png
  12. 二進制
      IAR/Pictures/image-20250708142455122.png
  13. 二進制
      IAR/Pictures/image-20250708142616060.png
  14. 二進制
      IAR/Pictures/image-20250708142932221.png
  15. 二進制
      IAR/Pictures/image-20250708143112548.png
  16. 二進制
      IAR/Pictures/image-20250708144035699.png
  17. 二進制
      IAR/Pictures/image-20250708150820220.png
  18. 二進制
      IAR/Pictures/image-20250708151057158.png
  19. 二進制
      IAR/Pictures/image-20250708152500923.png
  20. 二進制
      IAR/Pictures/image-20250708152756370.png
  21. 二進制
      IAR/Pictures/image-20250708152951214.png
  22. 二進制
      IAR/Pictures/image-20250708153108132.png
  23. 二進制
      IAR/Pictures/image-20250708153204889.png
  24. 二進制
      IAR/Pictures/image-20250708153257586.png
  25. 二進制
      IAR/Pictures/image-20250708153531949.png
  26. 二進制
      IAR/Pictures/image-20250708153851629.png
  27. 二進制
      IAR/Pictures/image-20250709180547755.png
  28. 二進制
      IAR/Pictures/image-20250709180618391.png
  29. 二進制
      IAR/Pictures/image-20250709180905530.png
  30. 二進制
      IAR/Pictures/image-20250709181010911.png
  31. 二進制
      IAR/Pictures/image-20250709181230566.png
  32. 二進制
      IAR/Pictures/image-20250710125750078.png
  33. 二進制
      IAR/Pictures/image-20250710125826600.png
  34. 二進制
      IAR/Pictures/image-20250710135821708.png
  35. 二進制
      IAR/Pictures/image-20250710140023223.png
  36. 二進制
      IAR/Pictures/image-20250710142954145.png
  37. 二進制
      IAR/Pictures/image-20250710153852360.png
  38. 二進制
      IAR/Pictures/image-20250710153915835.png
  39. 二進制
      IAR/Pictures/image-20250710155713655.png
  40. 二進制
      IAR/Pictures/image-20250710155748226.png
  41. 二進制
      IAR/Pictures/image-20250710155750585.png
  42. 二進制
      IAR/Pictures/image-20250710161708689.png
  43. 二進制
      IAR/Pictures/image-20250711130022399.png
  44. 二進制
      IAR/Pictures/image-20250711130039902.png
  45. 二進制
      IAR/pictures/image-20250709093244205.png
  46. 二進制
      IAR/pictures/image-20250709093728548.png
  47. 二進制
      IAR/pictures/image-20250709093806148.png
  48. 二進制
      IAR/pictures/image-20250709093908974.png
  49. 二進制
      IAR/pictures/image-20250709094027152.png
  50. 二進制
      IAR/pictures/image-20250709094122539.png
  51. 二進制
      IAR/pictures/image-20250709094340738.png
  52. 二進制
      IAR/pictures/image-20250709094428732.png
  53. 二進制
      IAR/pictures/image-20250709095356988.png
  54. 二進制
      IAR/pictures/image-20250709095422368.png
  55. 二進制
      IAR/pictures/image-20250709095459265.png
  56. 二進制
      IAR/pictures/image-20250709095532506.png
  57. 二進制
      IAR/pictures/image-20250709095637552.png
  58. 二進制
      IAR/pictures/image-20250709095718033.png
  59. 二進制
      IAR/pictures/image-20250709095759245.png
  60. 二進制
      IAR/pictures/image-20250709100111787.png
  61. 二進制
      IAR/pictures/image-20250709100328867.png
  62. 二進制
      IAR/pictures/image-20250709100429885.png
  63. 二進制
      IAR/pictures/image-20250709100507410.png
  64. 二進制
      IAR/pictures/image-20250709100552114.png
  65. 二進制
      IAR/pictures/image-20250709100834748.png
  66. 二進制
      IAR/pictures/image-20250709100837880.png
  67. 二進制
      IAR/pictures/image-20250709101836850.png
  68. 二進制
      IAR/pictures/image-20250709103631255.png
  69. 二進制
      IAR/pictures/image-20250709104442792.png
  70. 二進制
      IAR/pictures/image-20250709105019076.png
  71. 二進制
      IAR/pictures/image-20250709105314139.png
  72. 二進制
      IAR/pictures/image-20250709105420224.png
  73. 二進制
      IAR/pictures/image-20250709105851015.png
  74. 二進制
      IAR/pictures/image-20250709185406199.png
  75. 二進制
      IAR/pictures/image-20250709185505451.png
  76. 二進制
      IAR/pictures/image-20250709185622450.png
  77. 二進制
      IAR/pictures/image-20250709185659142.png
  78. 二進制
      IAR/pictures/image-20250709185744113.png
  79. 二進制
      IAR/pictures/image-20250709185831020.png
  80. 二進制
      IAR/pictures/image-20250709185833195.png
  81. 二進制
      IAR/pictures/image-20250709185922441.png
  82. 二進制
      IAR/pictures/image-20250709190002503.png
  83. 二進制
      IAR/pictures/image-20250709190439295.png
  84. 二進制
      IAR/pictures/image-20250709191149273.png
  85. 二進制
      IAR/pictures/image-20250709191214143.png
  86. 二進制
      IAR/pictures/image-20250709191239821.png
  87. 二進制
      IAR/pictures/image-20250715122856333.png
  88. 二進制
      IAR/pictures/image-20250715131503129.png
  89. 二進制
      IAR/pictures/image-20250715135308980.png
  90. 二進制
      IAR/pictures/image-20250715135342485.png
  91. 二進制
      IAR/pictures/image-20250715154300102.png
  92. 二進制
      IAR/pictures/image-20250715154324734.png
  93. 二進制
      IAR/pictures/image-20250715154356144.png
  94. +75
    -53
      Library/Library.md
  95. 二進制
      Library/Pictures/image-20250708195734251.png
  96. 二進制
      Library/Pictures/image-20250708195750876.png
  97. 二進制
      Library/Pictures/image-20250710125750078.png
  98. 二進制
      Library/Pictures/image-20250710125826600.png
  99. 二進制
      Library/Pictures/image-20250710135821708.png
  100. 二進制
      Library/Pictures/image-20250710140023223.png

+ 330
- 144
IAR/IAR.md 查看文件

@@ -1,258 +1,444 @@
## IAR相关知识点
# IAR相关知识点



### 1.工程操作
## 工程操作

#### 1.1各类型文件含义
### **各类型文件含义**

##### 1.1.1工程核心文件
| 文件后缀 | 其意义 |
| :-------: | :----------------------------------------------------------: |
| `.eww` | 工作空间文件,包含多个项目的索引信息 |
| `.ewp` | 项目文件,包含项目的设置和配置 |
| `.ewd` | 调试配置文件,用于调试设置 |
| `.ewt` | (嵌入式工作台模板文件) 用于存储工程或文件的模板配置,方便快速创建具有相同设置的新项目。 |
| `.c` | 源代码文件,包含C语言代码 |
| `.h` | 头文件,包含函数声明和宏定义 |
| `.s/.asm` | 汇编文件 |
| `.map` | 单片机地址映射文件 |
| `.hex` | 烧录到芯片的十六进制文件 |

| 扩展名 | 名称 | 作用 |
| :----: | :------------------: | :----------------------------------------------------------: |
| .ewp | IAR 工程文件 | 存储工程配置(编译器选项、链接器设置、包含路径等) |
| .ewt | 嵌入式工作台模板文件 | 用于存储工程或文件的模板配置,方便快速创建具有相同设置的新项目。 |
| .eww | IAR 工作空间文件 | 管理多个工程(.ewp)的集合,方便同时打开多个关联工程 |
| .dep | 依赖文件 | 自动生成,记录源文件的依赖关系(如头文件引用),用于增量编译 |

##### 1.1.2源代码文件

| 扩展名 | 名称 | 作用 |
| --------- | :-------: | :-------------------------------------------------: |
| .c | C源文件 | 主程序代码 |
| .cpp/.cxx | c++源文件 | c++程序代码 |
| .h | 头文件 | 函数声明、宏定义、类型声明 |
| .s/.asm | 汇编文件 | 底层硬件操作或高性能代码 |
| .icf | 链接脚本 | 控制内存分配(Flash/ROM、RAM 布局)关键硬件相关文件 |
### **新建/打开工作区**

##### 1.1.3编译输出文件
#### 新建工作区

| 扩展名 | 名称 | 作用 |
| ------ | :--------------: | :---------------------------------------------------------: |
| .out | ELF 格式输出文件 | 包含调试信息的可执行文件(用于下载和调试) |
| .hex | Intel HEX 文件 | 烧录到芯片的标准十六进制格式 |
| .bin | 二进制镜像 | 裸机烧录文件(无地址信息,需配合烧录工具指定地址) |
| .map | 内存映射文件 | 详细展示代码/数据在内存中的分布(分析栈溢出、内存占用必看) |
| .lst | 列表文件 | 汇编与源码混合视图(用于优化和调试) |
![image-20250709093244205](./pictures/image-20250709093244205.png)

##### 1.1.4调试相关文件
#### **打开工作区**

| 扩展名 | 名称 | 作用 |
| -------- | :--------------: | :----------------------------------------: |
| .cspybat | C-SPY 批处理文件 | 自动化调试脚本(初始化寄存器、批量设断点) |
| .ddf | 设备描述文件 | 定义芯片寄存器(用于调试器外设视图) |
| .board | 开发板描述文件 | 配置板级硬件(时钟、引脚复用等) |
| .mac | 调试宏文件 | 扩展调试器功能(如自定义内存填充检测) |
![image-20250709093728548](./pictures/image-20250709093728548.png)

##### 1.1.5配置与中间文件
### **新建/打开工程**

| 扩展名 | 名称 | 作用 |
| --------------- | :----------: | :----------------------------------: |
| .custom_argvars | 环境变量配置 | 存储用户自定义环境变量(如编译路径) |
| .settings | IDE 设置文件 | 保存编辑器偏好(字体、颜色方案等) |
| .o/.obj | 目标文件 | 单个源文件的编译结果(链接时合并) |
| .d | 依赖信息文件 | Makefile 使用的依赖规则 |
#### 新建工程

##### 1.1.6特殊工具文件
![image-20250709093806148](./pictures/image-20250709093806148.png)

| 扩展名 | 名称 | 作用 |
| ------ | :--------------: | :--------------------------------------: |
| .xcl | XLINK 链接器配置 | 高级链接控制(段重命名、优化选项) |
| .i | 预处理输出文件 | 展开宏和头文件后的源码(排查宏错误必备) |
| .sbr | 浏览信息文件 | 用于代码导航(函数调用关系) |
#### **打开工程**

#### 1.2新建/打开工作区
![image-20250709093908974](./pictures/image-20250709093908974.png)

软件左上角File菜单内点击New workspace即可创建新的工作区,如需要打开选择Open即可。
### **工作区导入/添加工程**

<img src=".\Pictures\image-20250708131909282.png" alt="image-20250708131909282" style="zoom:50%;" />
![image-20250709094027152](./pictures/image-20250709094027152.png)

#### 1.3新建/打开工程
### **新建分组**

工作区新建/打开完成后,选择上方的Project,选择Create New project选择创建类型并命名和存档后完成新建工程。
![image-20250709094122539](./pictures/image-20250709094122539.png)

打开工程选择Add。
### **新建/打开文件**

<img src=".\Pictures\image-20250708131945592.png" alt="image-20250708131945592" style="zoom:50%;" />
#### 新建文件

#### 1.4工作区中导入/添加工程
![image-20250709094340738](./pictures/image-20250709094340738.png)

选择上方的Project,点击Add Existing Project,便可以添加项目。
#### 打开文件

<img src=".\Pictures\image-20250708132254972.png" alt="image-20250708132254972" style="zoom:50%;" />
![image-20250709094428732](./pictures/image-20250709094428732.png)

#### 1.5新建分组
### **工程目录与文件目录的关系**

右键项目名称,选择Add Group,新建分组
- 工程目录主要负责项目配置和构建控制,而文件目录则是源代码的物理存储位置。两者通过工程文件中的引用关系连接起来,形成完整的开发环境结构。

<img src=".\Pictures\image-20250708132546212.png" alt="image-20250708132546212" style="zoom:50%;" />
## 工程配置

#### 1.6新建/打开文件
### **设备配置**

右键项目名称,选择Add File,新建文件。
#### 选择芯片型号

<img src=".\Pictures\image-20250708133238110.png" alt="image-20250708133238110" style="zoom:50%;" />
![image-20250709095356988](./pictures/image-20250709095356988.png)

#### 1.7工程目录与文件目录的关系
![image-20250709095422368](./pictures/image-20250709095422368.png)

工程目录是文件目录的容器,通过相对路径引用文件目录中的资源。

工程目录主要负责项目配置和构建控制,而文件目录则是源代码的物理存储位置。两者通过工程文件中的引用关系连接起来,形成完整的开发环境结构。

### 2.工程配置
### **编译配置**

#### 2.1设备配置
#### 优化等级

右键工程文件,选择Options,进入工程配置,选择需要的单片机设备型号。
![image-20250709095459265](./pictures/image-20250709095459265.png)

<img src=".\Pictures\image-20250708135420393.png" alt="image-20250708135420393" style="zoom:50%;" />
**四个优化等级(None、Low、Medium、High)的一般区别:**

### 3.编译配置
| 优化等级 | 主要特征 | 适用场景 |
| ---------- | ------------------------------------------------------------ | ---------------------------------------------- |
| **None** | 不做任何优化,编译器生成的代码基本直译源代码,编译速度最快,代码体积和运行效率都最低。 | 调试阶段,方便调试,代码易读,能快速定位问题。 |
| **Low** | 进行少量优化,基本减少明显的低效代码,稍微提升执行速度和代码大小,但编译时间较短。 | 开发早期,性能不是关键时,调试还能较方便。 |
| **Medium** | 平衡优化,既关注性能提升,也适度控制代码大小,编译时间较长。 | 一般发布版本,适合大多数应用场景。 |
| **High** | 激进优化,最大限度提升执行速度和代码大小的压缩,可能会改变代码行为(比如改变指令顺序、内联函数)。 | 性能要求极高的发布版本,代码难以调试。 |

#### 3.1优化等级
IAR 编译器在 High 优化级别下的下拉框提供了三种优化策略:

右键Options,选择C/C++ --> Optimizations ,进行优化等级配置。
| 选项 | 含义 | 适用场景 |
| ------------ | -------------------------------- | -------------------------------- |
| **Size** | 优化代码体积,减小生成二进制大小 | 适合内存受限的嵌入式系统 |
| **Speed** | 优化运行速度,提高代码执行效率 | 适合对性能要求较高的应用 |
| **Balanced** | 代码大小和执行速度折中 | 兼顾体积和速度,适合一般应用需求 |

<img src="./Pictures/image-20250709180547755.png" alt="image-20250709180547755" style="zoom:50%;" />
#### 硬件浮点

#### 3.2硬件浮点
![image-20250709095532506](./pictures/image-20250709095532506.png)

General Options 界面,选择32bit或64bit,选择fpu功能是否开启。
#### 预处理

<img src=".\Pictures\image-20250708140541188.png" alt="image-20250708140541188" style="zoom:50%;" />
![image-20250709100328867](./pictures/image-20250709100328867.png)

#### 3.3预处理
#### 链接文件

右键Options,选择C/C++ --> Preprocessor ,Defined symbols进行预处理
ICF是告诉编译器:你的程序、变量、代码应该放到芯片哪一块内存里的“地图”文件

<img src="./Pictures/image-20250709180618391.png" alt="image-20250709180618391" style="zoom:50%;" />
| 功能 | ICF 术语 |
| ------------- | ----------------------------------- |
| 定义内存 | `define region` |
| 放置代码/数据 | `place in region` |
| 放中断表 | `place at start of ROM { .intvec }` |
| 特殊变量段 | `.noinit` |

#### 3.4链接文件
```
/* 定义芯片的内存结构 */
define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
define symbol __ICFEDIT_region_ROM_end__ = 0x0803FFFF;

Linker页面设置链接文件。
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__ = 0x20007FFF;

<img src=".\Pictures\image-20250708142245783.png" alt="image-20250708142245783" style="zoom:50%;" />
/* 创建实际使用的内存区域(ROM 和 RAM) */
define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];

#### 3.5文件路径位置
/* 定义堆和栈的大小 */
define symbol __ICFEDIT_size_cstack__ = 0x0400; /* 1KB Stack */
define symbol __ICFEDIT_size_heap__ = 0x0400; /* 1KB Heap */

在Option页面C/C++设置文件路径位置,包括头文件位置。
/* 为 IAR 系统定义符号,用于 startup 文件 */
define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__;
define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__;

<img src=".\Pictures\image-20250708142455122.png" alt="image-20250708142455122" style="zoom:50%;" />
/* 开始放置内容 */
initialize by copy { readwrite };
do not initialize { section .noinit }; /* .noinit 不初始化 */

#### 3.6输出文件配置
/* Flash(ROM)放置策略 */
place at start of ROM_region { readonly section .intvec }; /* 中断向量表 */
place in ROM_region { readonly }; /* 代码和常量 */

选择Output页面,然后设置输出文件位置。
/* SRAM(RAM)放置策略 */
place in RAM_region { readwrite, /* 初始化变量 */
block HEAP, /* 堆 */
block CSTACK, /* 栈 */
section .noinit }; /* 不初始化区 */

<img src=".\Pictures\image-20250708142616060.png" alt="image-20250708142616060" style="zoom:50%;" />
```

#### 3.7输出文件路径
(.icf链接脚本控制内存分配(Flash/ROM、RAM 布局)关键硬件相关文件)

打开Option,选择General,选择output进行配置。
![image-20250709095718033](./pictures/image-20250709095718033.png)

<img src=".\Pictures\image-20250708142932221.png" alt="image-20250708142932221" style="zoom:50%;" />

### 4.调试器配置

打开Option,选择Debug进行配置
### 文件路径配置

<img src=".\Pictures\image-20250708143112548.png" alt="image-20250708143112548" style="zoom:50%;" />
![image-20250709095759245](./pictures/image-20250709095759245.png)

### 5.库相关配置
### 输出文件路径

设置库文件相关位置,同时在程序内include头文件,使用库。
![image-20250709100111787](./pictures/image-20250709100111787.png)

<img src="./Pictures/image-20250710142954145.png" alt="image-20250710142954145" style="zoom:50%;" />
### 输出文件配置

### 6.静态库的封装和调用
![image-20250709100429885](./pictures/image-20250709100429885.png)

新建项目,同时设置.h和.c文件,进行内部程序的编写。注意减少外部依赖,能够直接移植调用。写完之后点击option进行设置,选择General,OutPut选择library,然后make编译生成.lib文件,使用时复制.lib文件到项目内,并在option内进行配置,然后选择Linker -- > Library,将静态库.lib文件添加,返回工程重新编译。
### 调试器配置

<img src=".\Pictures\image-20250708144035699.png" alt="image-20250708144035699" style="zoom:50%;" />
![image-20250709100507410](./pictures/image-20250709100507410.png)

<img src="./Pictures/image-20250709181230566.png" alt="image-20250709181230566" style="zoom:50%;" />
![image-20250715131503129](./pictures/image-20250715131503129.png)

### 7.工程调试
| 选项 | 作用 | 建议使用情况 |
| ------------------- | ------------------------------------------------------------ | ---------------------- |
| Verify Download | 自动读取芯片内容并与主机上的HEX/ELF文件进行比对,确保数据一致,防止烧录出错。 | 需要确保下载成功时开启 |
| Suppress Download | 调试器连接后,只进行仿真或断点分析,不实际烧录代码。 | 只想调试已有程序时开启 |
| Use Flash Loader(s) | Flash Loader 文件将程序写入芯片的内部或外部 Flash 存储器。 | 编程内部闪存时勾选 |

#### 7.1断点
`.board` 文件是IAR Embedded Workbench中用来描述目标硬件板(开发板)配置的文件。

##### 7.1.1设置断点
- 它包含调试器接口信息(如JTAG/SWD设置)、时钟配置、芯片类型、连接参数等硬件相关的设定。
- IDE通过 `.board` 文件知道如何与目标板正确通信和调试。

左侧标红设置断点
**Mass Erase** 指的是对目标芯片整个闪存区域进行**全部擦除**的操作。
- 该选项开启后,调试器在烧写程序前,会先对芯片内部所有闪存区域执行一次彻底擦除,确保没有残留旧数据。

<img src=".\Pictures\image-20250708150820220.png" alt="image-20250708150820220" style="zoom:50%;" />

##### 7.1.2禁用断点

鼠标右键点击,disable breakpoints。
| 项目 | **J-Link (`SEGGER`)** | **ST-Link (ST官方)** | **i-Jet (`IAR Systems`)** |
| :------------------: | :--------------------------------: | :-------------------------: | :----------------------------: |
| **主要用途** | 通用 `ARM MCU` 调试/烧录 | `STM32` 专用调试器 | `IAR` 用户的高端调试器 |
| **支持芯片范围** | 多厂商 `ARM Cortex-M/R/A` | 仅 `STM32` 系列 | 多厂商 |
| **连接线数 (`SWD`)** | 最少 4 根,推荐 5~6 根 | 最少 4 根,推荐 5~6 根 | 最少 4 根,推荐 5~6 根 |
| **烧录/调试速度** | 快速(`Plus 15MHz+`) | `v2` 较慢,`v3` 提升明显 | 极快 |
| **实时调试功能** | ✅ 支持 `RTT`、`SWO`、`Trace` | ❌ `RTT`,支持 `SWO`(部分) | ✅ 高级 `trace`、功耗分析 |
| **串口/调试打印** | `RTT` / `SWO` | `SWO`(支持 `printf`) | `SWO`/` Trace`(集成于 `IAR`) |
| **兼容 IDE** | `Keil`,` IAR`,` VSCode`,` CubeIDE` | `CubeIDE`,` Keil`,` IAR` | ✅ 最佳支持 `IAR`(专用设计) |
| **授权限制** | `EDU` 版限非商业用途 | 无限制(开发板自带免费) | 商用授权,一般随 `IAR` 捆绑 |
| **价格** | 中等 | 较低 | 较高 |

<img src=".\Pictures\image-20250708151057158.png" alt="image-20250708151057158" style="zoom:50%;" />

##### 7.1.3启用断点

鼠标右键点击,disable breakpoints。
### 库相关配置

##### 7.1.4取消断点
![image-20250709100552114](./pictures/image-20250709100552114.png)

鼠标左键点击断点即可取消。

##### 7.1.5条件断点

鼠标右键想要断点处,选择Edit Breakpoint,将条件写入即可。
### 静态库的封装

<img src=".\Pictures\image-20250708152500923.png" alt="image-20250708152500923" style="zoom:50%;" />
1. ![image-20250709185406199](./pictures/image-20250709185406199.png)

### 8.监控信息
2. ![image-20250709185505451](./pictures/image-20250709185505451.png)

选择view,找到watch,找到想要监视的信息,将其拖到watch窗口即可。
3. ![image-20250709185622450](./pictures/image-20250709185622450.png)

<img src=".\Pictures\image-20250708152756370.png" alt="image-20250708152756370" style="zoom:50%;" />
4. 屏蔽不用编译的文件

### 9.寄存器信息
![image-20250709185744113](./pictures/image-20250709185744113.png)

打开view的registers窗口即可查看寄存器信息。
![image-20250709185833195](./pictures/image-20250709185833195.png)

<img src=".\Pictures\image-20250708152951214.png" alt="image-20250708152951214" style="zoom:50%;" />
5. 编译

### 10.内存信息
### 静态库的调用

打开view的memory窗口即可查看寄存器信息
1. ![image-20250709185922441](./pictures/image-20250709185922441.png)
2. ![image-20250709190002503](./pictures/image-20250709190002503.png)
3. 将之前的.c文件删除
4. 编译执行

![image-20250708153108132](.\Pictures\image-20250708153108132.png)
## 工程调试

### 11.栈信息
### 断点

打开view的stack窗口即可查看栈信息
#### 设置断点

<img src=".\Pictures\image-20250708153204889.png" alt="image-20250708153204889" style="zoom:50%;" />
设置断点(点击代码行左侧,出现红色圆圈)

### 12.汇编信息
#### 禁用断点

打开view的disassembly窗口可以查看汇编信息
禁用断点(右键红色圆圈,Enable/disable)

<img src=".\Pictures\image-20250708153257586.png" alt="image-20250708153257586" style="zoom:50%;" />
#### 启用断点

### 13.调用堆栈信息
启用断点(右键红色圆圈,Enable/disable)

打开view的call Stack窗口可以查看堆栈信息
#### 删除断点

<img src=".\Pictures\image-20250708153531949.png" alt="image-20250708153531949" style="zoom:50%;" />
删除断点(再次点击代码行左侧,红色圆圈消失)

### 14.单步调试
#### 条件断点

#### 14.1逐过程调试
条件断点(可以设置一个条件,当条件满足时,断点生效)

菜单栏Step over。
![image-20250709104442792](./pictures/image-20250709104442792.png)

<img src=".\Pictures\image-20250708153851629.png" alt="image-20250708153851629" style="zoom:50%;" />
#### 数据断点

#### 14.2逐语句调试
![image-20250715135308980](./pictures/image-20250715135308980.png)

菜单栏Step into。
![image-20250715135342485](./pictures/image-20250715135342485.png)

#### 14.3 复位
选择数据断点,可以选择是读触发还是写触发,同时可以结合条件断点使用。

菜单栏Restart。
| 类型 | 触发条件 | 用途 |
| ------------ | ----------------------------------------- | ------------------ |
| **数据断点** | **变量的值或地址被访问(读/写)** 时触发 | 监控变量的读写 |
| **条件断点** | **满足特定条件时(如变量值==10)** 才中断 | 控制断点的触发时机 |

#### 14.4跳出
### 数据断点的功能作用:

菜单栏step out。
- 监控内存某个地址的**读写行为**
- 追踪变量在哪被意外修改
- 调试“野指针”或“内存越界”问题

### 监控信息

![image-20250709101836850](./pictures/image-20250709101836850.png)

#### 寄存器信息

![image-20250709105019076](./pictures/image-20250709105019076.png)



| 寄存器 | 名称 | 类型 | 说明 |
| :------------: | :-----------------------------------: | :----------: | :----------------------------------------------------------: |
| **`R0–R3`** | 通用寄存器 | 通用 | 用于函数参数传递、临时数据处理等。R0 通常作为函数返回值寄存器。 |
| **`R4–R11`** | 通用寄存器 | 被调用者保存 | 用于本地变量、长生命周期数据。函数调用后,值需由被调用函数负责保存。 |
| **`R12`** | Intra-Procedure-call scratch register | 特定用途 | 通常由编译器用于中间值,调用过程临时数据,不保证保存。 |
| **`R14(LR)`** | Link Register | 特殊 | 链接寄存器,存储函数返回地址。调用 `BL` 指令时保存返回点。 |
| **`R15 (PC)`** | Program Counter | 特殊 | 程序计数器,存储当前指令地址。控制程序执行流程。 |

**`R0–R3`:参数 / 返回值 / 临时变量**

- 函数参数通过 `R0~R3` 传递(最多 4 个参数);
- 函数返回值一般通过 `R0`(或` R0~R1`);
- 调用者需要保存这些值;

```
int add(int a, int b) {
return a + b; // a→R0,b→R1,结果→R0
}
```



**`R4–R11`:局部变量 / 被调用者保存**

- 通常用于函数内部的变量或数据;
- 调用函数前由被调用者负责保存;
- 在嵌套调用中保持数据完整性。

```
void foo() {
int x = 10; // 可能保存在 R4~R11 中
}
```



**`R12`:临时 scratch 寄存器**

- 用于子程序中临时使用;
- 不由任何函数负责保存;
- 调用嵌套函数或执行复杂表达式时使用;



**`R13(SP)`:栈指针 `Stack Pointer`**

- 指向当前栈顶地址;
- 控制函数调用/返回、局部变量压栈;
- Cortex-M 支持两种 SP:
- `MSP(Main Stack Pointer)`— 默认上电使用;
- `PSP(Process Stack Pointer)`— `RTOS` 多线程任务使用;
- 使用 `MSR` 和 `MRS` 指令读写切换。



**`R14(LR)`:链接寄存器 Link Register**

- 存放函数返回地址;
- 执行 `BL`(Branch with Link)时,PC 会跳转到函数地址,当前 PC 会保存到 LR;
- 函数返回时使用 `BX LR` 指令返回;

**注意**:异常发生时,LR 也可能用于标记返回类型。



**`R15(PC)`:程序计数器 Program Counter**

- 保存当前执行指令地址;
- 所有分支、跳转指令都会修改 PC;
- 可以通过修改 PC 实现跳转(例如 `PC = 0x08001234`)。

#### 内存信息

![image-20250709105314139](./pictures/image-20250709105314139.png)

#### 栈信息

![image-20250709105420224](./pictures/image-20250709105420224.png)

#### 汇编信息

![image-20250709105851015](./pictures/image-20250709105851015.png)

#### 调用堆栈信息

调用堆栈窗口通常在IDE(如Visual Studio)中提供,它展示了函数调用的顺序列表。

![image-20250709190439295](./pictures/image-20250709190439295.png)



![image-20250715154324734](./pictures/image-20250715154324734.png)

勾选 Enable stack usage analysis

![image-20250715154356144](./pictures/image-20250715154356144.png)

打开 .map文件,搜索STACK USAGE

![image-20250715154300102](./pictures/image-20250715154300102.png)

### 单步调试

#### 逐过程

![image-20250709191214143](./pictures/image-20250709191214143.png)

#### 逐语句

![image-20250709191149273](./pictures/image-20250709191149273.png)

#### 复位

![image-20250709103631255](./pictures/image-20250709103631255.png)

#### 跳出

![image-20250709191239821](./pictures/image-20250709191239821.png)

## IAR 调试常用操作对照表(含英文缩写、快捷键和含义)

| 中文名称 | 英文名称 | 缩写/简称 | 快捷键 | 含义说明 |
| -------- | --------- | ------------------ | -------------- | ------------------------------------------------------------ |
| 逐语句 | Step Into | `StepIn` 或 `SI` | `F11` | 执行当前语句,若为函数调用,则进入函数内部逐句调试。 |
| 逐过程 | Step Over | `StepOver` 或 `SO` | `F10` | 执行当前语句,若为函数调用,则跳过函数体,直接执行下一行。 |
| 跳出 | Step Out | `StepOut` 或 `SR` | `Shift + F11` | 执行当前函数剩余代码并跳出,返回到调用该函数的位置。 |
| 复位 | Reset | `Reset` | *无默认快捷键* | 让 MCU 从复位向量重新启动程序执行(从 `main()` 或初始化开始)。 |

![image-20250715122856333](./pictures/image-20250715122856333.png)



| 序号 | 英文 | 作用 |
| :--: | :---------------------: | :----------------------------------------------------------: |
| 1 | compile | 编译当前页 |
| 2 | make | 编译全部文件 |
| 3 | toggle Breakpoint | 切换断点 |
| 4 | Make & Restart Debugger | 重新启动调试器并从头开始调试程序 |
| 5 | Restart Debugger | 重新开始调试,但不做代码更改或重新编译 |
| 6 | stop Debugger | 退出调试模式,返回到编辑器状态,释放调试器资源。 |
| 7 | step over | 逐过程调试 |
| 8 | step into | 逐语句调试 |
| 9 | step out | 跳出 |
| 10 | Next Statement | **不执行当前行**,将程序的执行位置**强制跳转**到下一条语句。用于控制程序流程,但不会影响变量或硬件状态。 |
| 11 | Run to Cursor | 程序从当前停止的位置开始**连续运行**,直到光标所在的那一行,然后**暂停执行**。 |
| 12 | Go | 在调试状态下,让程序从当前暂停位置**继续运行**,直到遇到断点、出错或程序结束。 |
| 13 | Break | **在程序运行过程中强制暂停执行**,进入调试状态,查看当前执行位置、变量状态等。 |
| 14 | Reset | 让 MCU 从复位向量重新启动程序执行(从 `main()` 或初始化开始)。 |



[**参考文献**](https://blog.csdn.net/ideal121/article/details/118675124?fromshare=blogdetail&sharetype=blogdetail&sharerId=118675124&sharerefer=PC&sharesource=2301_81415726&sharefrom=from_link)

二進制
IAR/Pictures/image-20250708131909282.png 查看文件

Before After
Width: 811  |  Height: 481  |  Size: 58 KiB

二進制
IAR/Pictures/image-20250708131945592.png 查看文件

Before After
Width: 715  |  Height: 403  |  Size: 37 KiB

二進制
IAR/Pictures/image-20250708132254972.png 查看文件

Before After
Width: 810  |  Height: 450  |  Size: 61 KiB

二進制
IAR/Pictures/image-20250708132546212.png 查看文件

Before After
Width: 1074  |  Height: 562  |  Size: 42 KiB

二進制
IAR/Pictures/image-20250708133238110.png 查看文件

Before After
Width: 1470  |  Height: 765  |  Size: 122 KiB

二進制
IAR/Pictures/image-20250708135420393.png 查看文件

Before After
Width: 966  |  Height: 635  |  Size: 80 KiB

二進制
IAR/Pictures/image-20250708135958571.png 查看文件

Before After
Width: 865  |  Height: 682  |  Size: 109 KiB

二進制
IAR/Pictures/image-20250708140541188.png 查看文件

Before After
Width: 935  |  Height: 553  |  Size: 90 KiB

二進制
IAR/Pictures/image-20250708141257388.png 查看文件

Before After
Width: 1345  |  Height: 949  |  Size: 185 KiB

二進制
IAR/Pictures/image-20250708142245783.png 查看文件

Before After
Width: 1047  |  Height: 754  |  Size: 129 KiB

二進制
IAR/Pictures/image-20250708142455122.png 查看文件

Before After
Width: 981  |  Height: 641  |  Size: 195 KiB

二進制
IAR/Pictures/image-20250708142616060.png 查看文件

Before After
Width: 787  |  Height: 610  |  Size: 67 KiB

二進制
IAR/Pictures/image-20250708142932221.png 查看文件

Before After
Width: 585  |  Height: 613  |  Size: 51 KiB

二進制
IAR/Pictures/image-20250708143112548.png 查看文件

Before After
Width: 645  |  Height: 680  |  Size: 48 KiB

二進制
IAR/Pictures/image-20250708144035699.png 查看文件

Before After
Width: 682  |  Height: 656  |  Size: 53 KiB

二進制
IAR/Pictures/image-20250708150820220.png 查看文件

Before After
Width: 625  |  Height: 337  |  Size: 8.9 KiB

二進制
IAR/Pictures/image-20250708151057158.png 查看文件

Before After
Width: 579  |  Height: 264  |  Size: 12 KiB

二進制
IAR/Pictures/image-20250708152500923.png 查看文件

Before After
Width: 838  |  Height: 576  |  Size: 46 KiB

二進制
IAR/Pictures/image-20250708152756370.png 查看文件

Before After
Width: 665  |  Height: 578  |  Size: 23 KiB

二進制
IAR/Pictures/image-20250708152951214.png 查看文件

Before After
Width: 388  |  Height: 672  |  Size: 53 KiB

二進制
IAR/Pictures/image-20250708153108132.png 查看文件

Before After
Width: 1114  |  Height: 226  |  Size: 16 KiB

二進制
IAR/Pictures/image-20250708153204889.png 查看文件

Before After
Width: 366  |  Height: 294  |  Size: 20 KiB

二進制
IAR/Pictures/image-20250708153257586.png 查看文件

Before After
Width: 352  |  Height: 555  |  Size: 39 KiB

二進制
IAR/Pictures/image-20250708153531949.png 查看文件

Before After
Width: 364  |  Height: 333  |  Size: 14 KiB

二進制
IAR/Pictures/image-20250708153851629.png 查看文件

Before After
Width: 638  |  Height: 162  |  Size: 11 KiB

二進制
IAR/Pictures/image-20250709180547755.png 查看文件

Before After
Width: 878  |  Height: 514  |  Size: 116 KiB

二進制
IAR/Pictures/image-20250709180618391.png 查看文件

Before After
Width: 805  |  Height: 439  |  Size: 105 KiB

二進制
IAR/Pictures/image-20250709180905530.png 查看文件

Before After
Width: 858  |  Height: 474  |  Size: 107 KiB

二進制
IAR/Pictures/image-20250709181010911.png 查看文件

Before After
Width: 862  |  Height: 540  |  Size: 97 KiB

二進制
IAR/Pictures/image-20250709181230566.png 查看文件

Before After
Width: 985  |  Height: 580  |  Size: 131 KiB

二進制
IAR/Pictures/image-20250710125750078.png 查看文件

Before After
Width: 982  |  Height: 368  |  Size: 94 KiB

二進制
IAR/Pictures/image-20250710125826600.png 查看文件

Before After
Width: 814  |  Height: 241  |  Size: 53 KiB

二進制
IAR/Pictures/image-20250710135821708.png 查看文件

Before After
Width: 1504  |  Height: 761  |  Size: 77 KiB

二進制
IAR/Pictures/image-20250710140023223.png 查看文件

Before After
Width: 913  |  Height: 324  |  Size: 25 KiB

二進制
IAR/Pictures/image-20250710142954145.png 查看文件

Before After
Width: 1040  |  Height: 590  |  Size: 233 KiB

二進制
IAR/Pictures/image-20250710153852360.png 查看文件

Before After
Width: 740  |  Height: 207  |  Size: 16 KiB

二進制
IAR/Pictures/image-20250710153915835.png 查看文件

Before After
Width: 1230  |  Height: 353  |  Size: 38 KiB

二進制
IAR/Pictures/image-20250710155713655.png 查看文件

Before After
Width: 719  |  Height: 242  |  Size: 21 KiB

二進制
IAR/Pictures/image-20250710155748226.png 查看文件

Before After
Width: 809  |  Height: 389  |  Size: 32 KiB

二進制
IAR/Pictures/image-20250710155750585.png 查看文件

Before After
Width: 809  |  Height: 389  |  Size: 32 KiB

二進制
IAR/Pictures/image-20250710161708689.png 查看文件

Before After
Width: 1281  |  Height: 538  |  Size: 74 KiB

二進制
IAR/Pictures/image-20250711130022399.png 查看文件

Before After
Width: 685  |  Height: 208  |  Size: 14 KiB

二進制
IAR/Pictures/image-20250711130039902.png 查看文件

Before After
Width: 915  |  Height: 306  |  Size: 13 KiB

二進制
IAR/pictures/image-20250709093244205.png 查看文件

Before After
Width: 335  |  Height: 602  |  Size: 61 KiB

二進制
IAR/pictures/image-20250709093728548.png 查看文件

Before After
Width: 370  |  Height: 604  |  Size: 63 KiB

二進制
IAR/pictures/image-20250709093806148.png 查看文件

Before After
Width: 302  |  Height: 904  |  Size: 92 KiB

二進制
IAR/pictures/image-20250709093908974.png 查看文件

Before After
Width: 297  |  Height: 617  |  Size: 58 KiB

二進制
IAR/pictures/image-20250709094027152.png 查看文件

Before After
Width: 426  |  Height: 541  |  Size: 64 KiB

二進制
IAR/pictures/image-20250709094122539.png 查看文件

Before After
Width: 416  |  Height: 345  |  Size: 43 KiB

二進制
IAR/pictures/image-20250709094340738.png 查看文件

Before After
Width: 346  |  Height: 269  |  Size: 36 KiB

二進制
IAR/pictures/image-20250709094428732.png 查看文件

Before After
Width: 369  |  Height: 339  |  Size: 45 KiB

二進制
IAR/pictures/image-20250709095356988.png 查看文件

Before After
Width: 482  |  Height: 327  |  Size: 31 KiB

二進制
IAR/pictures/image-20250709095422368.png 查看文件

Before After
Width: 822  |  Height: 804  |  Size: 94 KiB

二進制
IAR/pictures/image-20250709095459265.png 查看文件

Before After
Width: 797  |  Height: 785  |  Size: 114 KiB

二進制
IAR/pictures/image-20250709095532506.png 查看文件

Before After
Width: 786  |  Height: 772  |  Size: 108 KiB

二進制
IAR/pictures/image-20250709095637552.png 查看文件

Before After
Width: 824  |  Height: 780  |  Size: 144 KiB

二進制
IAR/pictures/image-20250709095718033.png 查看文件

Before After
Width: 832  |  Height: 804  |  Size: 94 KiB

二進制
IAR/pictures/image-20250709095759245.png 查看文件

Before After
Width: 752  |  Height: 745  |  Size: 143 KiB

二進制
IAR/pictures/image-20250709100111787.png 查看文件

Before After
Width: 810  |  Height: 769  |  Size: 89 KiB

二進制
IAR/pictures/image-20250709100328867.png 查看文件

Before After
Width: 856  |  Height: 767  |  Size: 169 KiB

二進制
IAR/pictures/image-20250709100429885.png 查看文件

Before After
Width: 854  |  Height: 777  |  Size: 77 KiB

二進制
IAR/pictures/image-20250709100507410.png 查看文件

Before After
Width: 864  |  Height: 799  |  Size: 97 KiB

二進制
IAR/pictures/image-20250709100552114.png 查看文件

Before After
Width: 869  |  Height: 789  |  Size: 144 KiB

二進制
IAR/pictures/image-20250709100834748.png 查看文件

Before After
Width: 743  |  Height: 698  |  Size: 118 KiB

二進制
IAR/pictures/image-20250709100837880.png 查看文件

Before After
Width: 743  |  Height: 698  |  Size: 118 KiB

二進制
IAR/pictures/image-20250709101836850.png 查看文件

Before After
Width: 514  |  Height: 824  |  Size: 128 KiB

二進制
IAR/pictures/image-20250709103631255.png 查看文件

Before After
Width: 257  |  Height: 136  |  Size: 14 KiB

二進制
IAR/pictures/image-20250709104442792.png 查看文件

Before After
Width: 1239  |  Height: 1009  |  Size: 229 KiB

二進制
IAR/pictures/image-20250709105019076.png 查看文件

Before After
Width: 1296  |  Height: 846  |  Size: 254 KiB

二進制
IAR/pictures/image-20250709105314139.png 查看文件

Before After
Width: 904  |  Height: 1005  |  Size: 208 KiB

二進制
IAR/pictures/image-20250709105420224.png 查看文件

Before After
Width: 1832  |  Height: 954  |  Size: 255 KiB

二進制
IAR/pictures/image-20250709105851015.png 查看文件

Before After
Width: 1497  |  Height: 896  |  Size: 301 KiB

二進制
IAR/pictures/image-20250709185406199.png 查看文件

Before After
Width: 504  |  Height: 242  |  Size: 34 KiB

二進制
IAR/pictures/image-20250709185505451.png 查看文件

Before After
Width: 669  |  Height: 391  |  Size: 65 KiB

二進制
IAR/pictures/image-20250709185622450.png 查看文件

Before After
Width: 781  |  Height: 440  |  Size: 48 KiB

二進制
IAR/pictures/image-20250709185659142.png 查看文件

Before After
Width: 456  |  Height: 279  |  Size: 30 KiB

二進制
IAR/pictures/image-20250709185744113.png 查看文件

Before After
Width: 575  |  Height: 267  |  Size: 36 KiB

二進制
IAR/pictures/image-20250709185831020.png 查看文件

Before After
Width: 649  |  Height: 472  |  Size: 45 KiB

二進制
IAR/pictures/image-20250709185833195.png 查看文件

Before After
Width: 649  |  Height: 472  |  Size: 45 KiB

二進制
IAR/pictures/image-20250709185922441.png 查看文件

Before After
Width: 1389  |  Height: 767  |  Size: 134 KiB

二進制
IAR/pictures/image-20250709190002503.png 查看文件

Before After
Width: 729  |  Height: 701  |  Size: 100 KiB

二進制
IAR/pictures/image-20250709190439295.png 查看文件

Before After
Width: 442  |  Height: 425  |  Size: 54 KiB

二進制
IAR/pictures/image-20250709191149273.png 查看文件

Before After
Width: 339  |  Height: 199  |  Size: 15 KiB

二進制
IAR/pictures/image-20250709191214143.png 查看文件

Before After
Width: 249  |  Height: 202  |  Size: 13 KiB

二進制
IAR/pictures/image-20250709191239821.png 查看文件

Before After
Width: 340  |  Height: 219  |  Size: 15 KiB

二進制
IAR/pictures/image-20250715122856333.png 查看文件

Before After
Width: 471  |  Height: 99  |  Size: 13 KiB

二進制
IAR/pictures/image-20250715131503129.png 查看文件

Before After
Width: 836  |  Height: 731  |  Size: 94 KiB

二進制
IAR/pictures/image-20250715135308980.png 查看文件

Before After
Width: 931  |  Height: 902  |  Size: 172 KiB

二進制
IAR/pictures/image-20250715135342485.png 查看文件

Before After
Width: 1047  |  Height: 965  |  Size: 115 KiB

二進制
IAR/pictures/image-20250715154300102.png 查看文件

Before After
Width: 784  |  Height: 279  |  Size: 7.4 KiB

二進制
IAR/pictures/image-20250715154324734.png 查看文件

Before After
Width: 569  |  Height: 536  |  Size: 60 KiB

二進制
IAR/pictures/image-20250715154356144.png 查看文件

Before After
Width: 902  |  Height: 636  |  Size: 92 KiB

+ 75
- 53
Library/Library.md 查看文件

@@ -1,105 +1,127 @@
## Library相关知识点
#相关知识点

## 静态库

### 1.静态库
### 静态库的基本概念

#### 1.1静态库的基本概念
静态库是指在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得
所需的代码 ,复制到生成的可执行文件中的这种库。在程序编译时会被整合到最终的可执行文件中,这意味着编译后的程序可以独立运行,无需外部库。

静态库是**编译期绑定**的代码复用方案,适合:
#### 静态库的优点

- 追求**部署简单性**的场景
- 对**运行时环境控制严格**的系统
- **性能敏感**且**无需热更新**的模块
加载速度快,因为库的代码已经被包含在程序中,以及发布程序时无需提供静态库文件,便于移植。

#### 1.2静态库的生成
#### 静态库的缺点

第一,创建新项目,选择静态库
相同的库文件可能在内存中被加载多次,消耗系统资源;此外,每当库文件更新时,都需要重新编译整个项目以生成新的可执行文件,这会浪费时间

第二,添加.c文件,同时编写.h和.c文件进行编写,编写完成后进行编译,生成.lib格式的静态库文件。
#### 静态库的生成

#### 1.3静态库的调用
![image-20250710102658220](./pictures/image-20250710102658220.png)

##### 1.3.1在工程配置中调用
![image-20250710102736776](./pictures/image-20250710102736776.png)

**静态库调用有三种方式**:
#### 静态库的调用

**第一**,在工程中调用静态库需要静态库路径,首先include,“内填写路径,并最后写.h文件名”,其次需要
- 在工程配置中调用

#pragma comment进行静态库声明,然后就可以在函数内使用静态库。
1. 头文件的引用

<img src="./Pictures/image-20250708195734251.png" alt="image-20250708195734251" style="zoom:50%;" />
方案一:设置头文件目录

<img src="./Pictures/image-20250708195750876.png" alt="image-20250708195750876" style="zoom:50%;" />
将头文件复制到我们的工程文件中。

**第二**,在项目属性 -- > 链接器 --> 常规 --> 附加库中添加静态库.lib文件的地址,并在输入页面附加依赖项中添加.lib文件。
方案二:

**第三**,直接将lib文件添加到项目中。
![image-20250710103535872](./pictures/image-20250710103535872.png)

以上三种方法都需要添加.h文件到项目。
2. 库文件的引用

##### 1.3.2在代码中语句加载lib调用
方案一:连接器设置库文件目录![image-20250710103348996](./pictures/image-20250710103348996.png)

程序内可以使用相对路径也可以使用绝对路径,相对路径时需要将静态库文件复制到工程文件内。
方案二:

参考上一项。
![image-20250710105104029](./pictures/image-20250710105104029.png)

### 2.动态库
将lib添加到资源文件中

#### 2.1动态库的基本概念
- 在代码中语句加载lib调用

动态库(Dynamic Link Library, DLL / Shared Object, SO)是一种**在程序运行时才被加载的代码库**,允许多个程序共享同一份内存中的库副本
使用`#pragma comment(lib, "creat_static_lib.lib")`指令

#### 2.2动态库的生成
## 动态库
#### 动态库的基本概念

##### 2.2.1通过导出语句生成
动态库是一种在程序运行时才被加载的库文件,它包含了函数和数据,可以被多个程序共享。

通过dllimport与dllexport导出语句生成动态库,新建空白项目,添加头文件源文件进行编写,在头文件中添加导出语句即可,然后将方案属性选择动态库,生成解决方案即可导出动态库。如图所示。
#### 动态库的优点

<img src="./../VisualStudio/Pictures/image-20250709103933102.png" alt="image-20250709103933102" style="zoom:50%;" />
可以实现不同进程间的资源共享,升级简单,只需替换库文件而无需重新编译应用程序,以及可以控制库的加载时机,不调用库函数时库不会被加载。

下图是动态库导出的文件夹状态。
#### 动态库的缺点

![image-20250709104007991](./../VisualStudio/Pictures/image-20250709104007991.png)
其加载速度比静态库慢,且发布程序时需要提供依赖的动态库文件。

##### 2.2.2通过模块文件生成
#### 动态库的生成

通过def文件进行生成动态库。生成前需要添加def文件,然后添加代码进行生成操作。
- 通过导出语句生成

<img src="./Pictures/image-20250710125750078.png" alt="image-20250710125750078" style="zoom:50%;" />
1. 先宏定义MATHLIBRARY_EXPORTS

<img src="./Pictures/image-20250710125826600.png" alt="image-20250710125826600" style="zoom:50%;" />
2. 写导出语句

#### 2.3动态库的调用
![image-20250710133121032](./pictures/image-20250710133121032.png)

##### 2.3.1在工程配置中调用
3. .C文件正常编写需要封装函数的逻辑

动态库的调用分为隐性和显性调用两种。
- 通过模块文件生成

第一,隐性调用,需要将动态库生成的.lib、.h和.dll文件添加到项目文件下,其次在项目工程中,通过属性-->链接器-->输入-->添加依赖项.lib文件,同时工程内添加.h头文件,然后可以进行调用了。
![image-20250710133513492](./pictures/image-20250710133513492.png)

<img src="./../VisualStudio/Pictures/image-20250709104635329.png" alt="image-20250709104635329" style="zoom:50%;" />
![image-20250710133559788](./pictures/image-20250710133559788.png)

<img src="./../VisualStudio/Pictures/image-20250709104647954.png" alt="image-20250709104647954" style="zoom:50%;" />
![image-20250710133741106](./pictures/image-20250710133741106.png)

第二,显性调用
#### 动态库的调用

定义函数指针,并声明函数指针变量,然后通过程序动态加载dll文件到内存中(HINSTANCE hModule = LoadLibrary("TestDll.dll");),并获取指针地址,最后调用函数。
在工程配置中调用

<img src="./../VisualStudio/Pictures/image-20250709104909662.png" alt="image-20250709104909662" style="zoom:50%;" />
导入头文件,引用

<img src="./../VisualStudio/Pictures/image-20250709104930529.png" alt="image-20250709104930529" style="zoom:50%;" />
![image-20250710133846878](./pictures/image-20250710133846878.png)

##### 2.3.2在代码中语句加载lib调用
~~在代码中语句加载lib调用~~

#pragma comment (lib,地址),地址可以选择绝对地址或者相对地址。
`#pragma comment(lib, "creat_static_lib.lib")`

<img src="./Pictures/image-20250708195734251.png" alt="image-20250708195734251" style="zoom:50%;" />
在代码中语句加载`dll`调用

##### 2.3.3在代码中语句加载dll调用
将`dll`文件复制到`dbug`下面,使用以下程序指令动态加载

HINSTANCE hDll = LoadLibrary(TEXT("DLLTest.dll"));
```
#include <Windows.h>
HINSTANCE Dll = LoadLibrary(L"test.dll");
if (Dll == NULL) {
std::cerr << "无法加载DLL! 错误码: " << GetLastError() << std::endl;
return 1;
}
typedef void (*Func)(); // 定义函数指针类型
Func add = (Func)GetProcAddress(Dll, "fun1");
add();
FreeLibrary(Dll);
return 0;
```

<img src="./../IAR/Pictures/image-20250710153852360.png" alt="image-20250710153852360" style="zoom:50%;" />

<img src="./../IAR/Pictures/image-20250710153915835.png" alt="image-20250710153915835" style="zoom:50%;" />

![image-20250715145914567](./pictures/image-20250715145914567.png)





![image-20250715145953621](./pictures/image-20250715145953621.png)

![image-20250715145825247](./pictures/image-20250715145825247.png)

二進制
Library/Pictures/image-20250708195734251.png 查看文件

Before After
Width: 974  |  Height: 394  |  Size: 23 KiB

二進制
Library/Pictures/image-20250708195750876.png 查看文件

Before After
Width: 690  |  Height: 267  |  Size: 15 KiB

二進制
Library/Pictures/image-20250710125750078.png 查看文件

Before After
Width: 982  |  Height: 368  |  Size: 94 KiB

二進制
Library/Pictures/image-20250710125826600.png 查看文件

Before After
Width: 814  |  Height: 241  |  Size: 53 KiB

二進制
Library/Pictures/image-20250710135821708.png 查看文件

Before After
Width: 1504  |  Height: 761  |  Size: 77 KiB

二進制
Library/Pictures/image-20250710140023223.png 查看文件

Before After
Width: 913  |  Height: 324  |  Size: 25 KiB

部分文件因文件數量過多而無法顯示

Loading…
取消
儲存