|
@@ -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 | 列表文件 | 汇编与源码混合视图(用于优化和调试) | |
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
##### 1.1.4调试相关文件 |
|
|
|
|
|
|
|
|
#### **打开工作区** |
|
|
|
|
|
|
|
|
| 扩展名 | 名称 | 作用 | |
|
|
|
|
|
| -------- | :--------------: | :----------------------------------------: | |
|
|
|
|
|
| .cspybat | C-SPY 批处理文件 | 自动化调试脚本(初始化寄存器、批量设断点) | |
|
|
|
|
|
| .ddf | 设备描述文件 | 定义芯片寄存器(用于调试器外设视图) | |
|
|
|
|
|
| .board | 开发板描述文件 | 配置板级硬件(时钟、引脚复用等) | |
|
|
|
|
|
| .mac | 调试宏文件 | 扩展调试器功能(如自定义内存填充检测) | |
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
##### 1.1.5配置与中间文件 |
|
|
|
|
|
|
|
|
### **新建/打开工程** |
|
|
|
|
|
|
|
|
| 扩展名 | 名称 | 作用 | |
|
|
|
|
|
| --------------- | :----------: | :----------------------------------: | |
|
|
|
|
|
| .custom_argvars | 环境变量配置 | 存储用户自定义环境变量(如编译路径) | |
|
|
|
|
|
| .settings | IDE 设置文件 | 保存编辑器偏好(字体、颜色方案等) | |
|
|
|
|
|
| .o/.obj | 目标文件 | 单个源文件的编译结果(链接时合并) | |
|
|
|
|
|
| .d | 依赖信息文件 | Makefile 使用的依赖规则 | |
|
|
|
|
|
|
|
|
#### 新建工程 |
|
|
|
|
|
|
|
|
##### 1.1.6特殊工具文件 |
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
| 扩展名 | 名称 | 作用 | |
|
|
|
|
|
| ------ | :--------------: | :--------------------------------------: | |
|
|
|
|
|
| .xcl | XLINK 链接器配置 | 高级链接控制(段重命名、优化选项) | |
|
|
|
|
|
| .i | 预处理输出文件 | 展开宏和头文件后的源码(排查宏错误必备) | |
|
|
|
|
|
| .sbr | 浏览信息文件 | 用于代码导航(函数调用关系) | |
|
|
|
|
|
|
|
|
#### **打开工程** |
|
|
|
|
|
|
|
|
#### 1.2新建/打开工作区 |
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
软件左上角File菜单内点击New workspace即可创建新的工作区,如需要打开选择Open即可。 |
|
|
|
|
|
|
|
|
### **工作区导入/添加工程** |
|
|
|
|
|
|
|
|
<img src=".\Pictures\image-20250708131909282.png" alt="image-20250708131909282" style="zoom:50%;" /> |
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
#### 1.3新建/打开工程 |
|
|
|
|
|
|
|
|
### **新建分组** |
|
|
|
|
|
|
|
|
工作区新建/打开完成后,选择上方的Project,选择Create New project选择创建类型并命名和存档后完成新建工程。 |
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
打开工程选择Add。 |
|
|
|
|
|
|
|
|
### **新建/打开文件** |
|
|
|
|
|
|
|
|
<img src=".\Pictures\image-20250708131945592.png" alt="image-20250708131945592" style="zoom:50%;" /> |
|
|
|
|
|
|
|
|
#### 新建文件 |
|
|
|
|
|
|
|
|
#### 1.4工作区中导入/添加工程 |
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
选择上方的Project,点击Add Existing Project,便可以添加项目。 |
|
|
|
|
|
|
|
|
#### 打开文件 |
|
|
|
|
|
|
|
|
<img src=".\Pictures\image-20250708132254972.png" alt="image-20250708132254972" style="zoom:50%;" /> |
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
#### 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%;" /> |
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
#### 1.7工程目录与文件目录的关系 |
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
工程目录是文件目录的容器,通过相对路径引用文件目录中的资源。 |
|
|
|
|
|
|
|
|
|
|
|
工程目录主要负责项目配置和构建控制,而文件目录则是源代码的物理存储位置。两者通过工程文件中的引用关系连接起来,形成完整的开发环境结构。 |
|
|
|
|
|
|
|
|
|
|
|
### 2.工程配置 |
|
|
|
|
|
|
|
|
### **编译配置** |
|
|
|
|
|
|
|
|
#### 2.1设备配置 |
|
|
|
|
|
|
|
|
#### 优化等级 |
|
|
|
|
|
|
|
|
右键工程文件,选择Options,进入工程配置,选择需要的单片机设备型号。 |
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
<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硬件浮点 |
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
General Options 界面,选择32bit或64bit,选择fpu功能是否开启。 |
|
|
|
|
|
|
|
|
#### 预处理 |
|
|
|
|
|
|
|
|
<img src=".\Pictures\image-20250708140541188.png" alt="image-20250708140541188" style="zoom:50%;" /> |
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
#### 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进行配置。 |
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
<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%;" /> |
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
### 5.库相关配置 |
|
|
|
|
|
|
|
|
### 输出文件路径 |
|
|
|
|
|
|
|
|
设置库文件相关位置,同时在程序内include头文件,使用库。 |
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
<img src="./Pictures/image-20250710142954145.png" alt="image-20250710142954145" style="zoom:50%;" /> |
|
|
|
|
|
|
|
|
### 输出文件配置 |
|
|
|
|
|
|
|
|
### 6.静态库的封装和调用 |
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
新建项目,同时设置.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%;" /> |
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
<img src="./Pictures/image-20250709181230566.png" alt="image-20250709181230566" style="zoom:50%;" /> |
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
### 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取消断点 |
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
鼠标左键点击断点即可取消。 |
|
|
|
|
|
|
|
|
|
|
|
##### 7.1.5条件断点 |
|
|
|
|
|
|
|
|
|
|
|
鼠标右键想要断点处,选择Edit Breakpoint,将条件写入即可。 |
|
|
|
|
|
|
|
|
### 静态库的封装 |
|
|
|
|
|
|
|
|
<img src=".\Pictures\image-20250708152500923.png" alt="image-20250708152500923" style="zoom:50%;" /> |
|
|
|
|
|
|
|
|
1.  |
|
|
|
|
|
|
|
|
### 8.监控信息 |
|
|
|
|
|
|
|
|
2.  |
|
|
|
|
|
|
|
|
选择view,找到watch,找到想要监视的信息,将其拖到watch窗口即可。 |
|
|
|
|
|
|
|
|
3.  |
|
|
|
|
|
|
|
|
<img src=".\Pictures\image-20250708152756370.png" alt="image-20250708152756370" style="zoom:50%;" /> |
|
|
|
|
|
|
|
|
4. 屏蔽不用编译的文件 |
|
|
|
|
|
|
|
|
### 9.寄存器信息 |
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
打开view的registers窗口即可查看寄存器信息。 |
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
<img src=".\Pictures\image-20250708152951214.png" alt="image-20250708152951214" style="zoom:50%;" /> |
|
|
|
|
|
|
|
|
5. 编译 |
|
|
|
|
|
|
|
|
### 10.内存信息 |
|
|
|
|
|
|
|
|
### 静态库的调用 |
|
|
|
|
|
|
|
|
打开view的memory窗口即可查看寄存器信息 |
|
|
|
|
|
|
|
|
1.  |
|
|
|
|
|
2.  |
|
|
|
|
|
3. 将之前的.c文件删除 |
|
|
|
|
|
4. 编译执行 |
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
## 工程调试 |
|
|
|
|
|
|
|
|
### 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。 |
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
<img src=".\Pictures\image-20250708153851629.png" alt="image-20250708153851629" style="zoom:50%;" /> |
|
|
|
|
|
|
|
|
#### 数据断点 |
|
|
|
|
|
|
|
|
#### 14.2逐语句调试 |
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
菜单栏Step into。 |
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
#### 14.3 复位 |
|
|
|
|
|
|
|
|
选择数据断点,可以选择是读触发还是写触发,同时可以结合条件断点使用。 |
|
|
|
|
|
|
|
|
菜单栏Restart。 |
|
|
|
|
|
|
|
|
| 类型 | 触发条件 | 用途 | |
|
|
|
|
|
| ------------ | ----------------------------------------- | ------------------ | |
|
|
|
|
|
| **数据断点** | **变量的值或地址被访问(读/写)** 时触发 | 监控变量的读写 | |
|
|
|
|
|
| **条件断点** | **满足特定条件时(如变量值==10)** 才中断 | 控制断点的触发时机 | |
|
|
|
|
|
|
|
|
#### 14.4跳出 |
|
|
|
|
|
|
|
|
### 数据断点的功能作用: |
|
|
|
|
|
|
|
|
菜单栏step out。 |
|
|
|
|
|
|
|
|
- 监控内存某个地址的**读写行为** |
|
|
|
|
|
- 追踪变量在哪被意外修改 |
|
|
|
|
|
- 调试“野指针”或“内存越界”问题 |
|
|
|
|
|
|
|
|
|
|
|
### 监控信息 |
|
|
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
|
|
#### 寄存器信息 |
|
|
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 寄存器 | 名称 | 类型 | 说明 | |
|
|
|
|
|
| :------------: | :-----------------------------------: | :----------: | :----------------------------------------------------------: | |
|
|
|
|
|
| **`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`)。 |
|
|
|
|
|
|
|
|
|
|
|
#### 内存信息 |
|
|
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
|
|
#### 栈信息 |
|
|
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
|
|
#### 汇编信息 |
|
|
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
|
|
#### 调用堆栈信息 |
|
|
|
|
|
|
|
|
|
|
|
调用堆栈窗口通常在IDE(如Visual Studio)中提供,它展示了函数调用的顺序列表。 |
|
|
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
|
|
勾选 Enable stack usage analysis |
|
|
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
|
|
打开 .map文件,搜索STACK USAGE |
|
|
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
|
|
### 单步调试 |
|
|
|
|
|
|
|
|
|
|
|
#### 逐过程 |
|
|
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
|
|
#### 逐语句 |
|
|
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
|
|
#### 复位 |
|
|
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
|
|
#### 跳出 |
|
|
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
|
|
## IAR 调试常用操作对照表(含英文缩写、快捷键和含义) |
|
|
|
|
|
|
|
|
|
|
|
| 中文名称 | 英文名称 | 缩写/简称 | 快捷键 | 含义说明 | |
|
|
|
|
|
| -------- | --------- | ------------------ | -------------- | ------------------------------------------------------------ | |
|
|
|
|
|
| 逐语句 | Step Into | `StepIn` 或 `SI` | `F11` | 执行当前语句,若为函数调用,则进入函数内部逐句调试。 | |
|
|
|
|
|
| 逐过程 | Step Over | `StepOver` 或 `SO` | `F10` | 执行当前语句,若为函数调用,则跳过函数体,直接执行下一行。 | |
|
|
|
|
|
| 跳出 | Step Out | `StepOut` 或 `SR` | `Shift + F11` | 执行当前函数剩余代码并跳出,返回到调用该函数的位置。 | |
|
|
|
|
|
| 复位 | Reset | `Reset` | *无默认快捷键* | 让 MCU 从复位向量重新启动程序执行(从 `main()` 或初始化开始)。 | |
|
|
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 序号 | 英文 | 作用 | |
|
|
|
|
|
| :--: | :---------------------: | :----------------------------------------------------------: | |
|
|
|
|
|
| 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) |