## IAR相关知识点 ### 1.工程操作 #### 1.1各类型文件含义 ##### 1.1.1工程核心文件 | 扩展名 | 名称 | 作用 | | :----: | :------------------: | :----------------------------------------------------------: | | .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即可。 ![tupian](./Pictures/image-20250708131909282.png) #### 1.3新建/打开工程 工作区新建/打开完成后,选择上方的Project,选择Create New project选择创建类型并命名和存档后完成新建工程。 打开工程选择Add。 ![tupian](./Pictures/image-20250708131945592.png) #### 1.4工作区中导入/添加工程 选择上方的Project,点击Add Existing Project,便可以添加项目。 ![1](.\Pictures\image-20250708132254972.png) #### 1.5新建分组 右键项目名称,选择Add Group,新建分组 ![1](.\Pictures\image-20250708132546212.png) #### 1.6新建/打开文件 右键项目名称,选择Add File,新建文件。 ![1](.\Pictures\image-20250708133238110.png) #### 1.7工程目录与文件目录的关系 工程目录是文件目录的容器,通过相对路径引用文件目录中的资源。 工程目录主要负责项目配置和构建控制,而文件目录则是源代码的物理存储位置。两者通过工程文件中的引用关系连接起来,形成完整的开发环境结构。 ### 2.工程配置 #### 2.1设备配置 右键工程文件,选择Options,进入工程配置,选择需要的单片机设备型号。 ![1](.\Pictures\image-20250708135420393.png) ### 3.编译配置 #### 3.1优化等级 右键Options,选择C/C++ --> Optimizations ,进行优化等级配置。 ![1](./Pictures/image-20250709180547755.png) 1. **None (-O0)** - **特点**:不进行优化,编译速度最快。 - **应用场景**:调试阶段,便于跟踪源代码与机器码的对应关系。 - **缺点**:生成的代码体积大、执行慢。 2. **Low (-O1)** - **特点**:基本优化,主要减少代码大小。 - 优化内容: - 消除未使用的变量和函数。 - 简化常量表达式(如计算 `2+3` 为 `5`)。 - 执行基本的循环优化(如循环展开小迭代次数的循环)。 - **应用场景**:需要平衡代码大小和编译时间的场景。 3. **Medium (-O2)** - **特点**:中度优化,兼顾代码大小和执行速度。 - 优化内容: - 执行更激进的循环优化(如循环不变代码外提)。 - 函数内联(对小函数)。 - 寄存器分配优化。 - **应用场景**:大多数生产环境的默认选择。 4. **High (-O3)** - **特点**:最高级优化,侧重执行速度。 - 优化内容: - 激进的函数内联(包括较大的函数)。 - 循环展开和向量化(适用于 DSP 等架构)。 - 全局变量和内存访问优化。 - **缺点**:可能增加代码体积,编译时间显著延长。 - **应用场景**:对性能要求极高的代码(如算法核心、中断处理)。 #### 3.2硬件浮点 General Options 界面,选择32bit或64bit,选择fpu功能是否开启。 ![1](.\Pictures\image-20250708140541188.png) 硬件浮点单元通过专用电路加速浮点数运算,显著提升了嵌入式系统的计算能力、能效比和开发效率。对于需要处理复杂算法、高精度数据或实时响应的应用,FPU 几乎是必备组件。 #### 3.3预处理 右键Options,选择C/C++ --> Preprocessor ,Defined symbols进行预处理。 ![1](./Pictures/image-20250709180618391.png) - 硬件资源的抽象映射(如寄存器地址)。 - 代码的灵活配置与优化。 - 跨平台兼容性支持。 - 调试与生产版本的快速切换。 STM32F103xB文件的作用: 核心作用:通过条件编译启用设备特定代码。 包含正确的设备头文件,启用外设驱动和内存映射 #### 3.4链接文件 Linker页面设置链接文件。 ![1](.\Pictures\image-20250708142245783.png) 作用: - 定义物理内存布局(如 Flash、RAM 的起始地址和大小)。 - 指定代码段(.text)、数据段(.data)、BSS 段(.bss)等如何分配到物理内存。 - 控制栈(Stack)和堆(Heap)的大小与位置。 - 支持复杂的内存分区(如将关键代码放在特定 Flash 区域)。 - .stack:栈区域,用于局部变量和函数调用。 - .heap:堆区域,用于动态内存分配(如`malloc()`)。 **关键段说明**: - **.intvec**:中断向量表,包含系统启动和中断处理函数的地址,必须位于 Flash 起始位置(0x08000000)。 - **.text**:程序代码段,包含编译后的指令。 - **.data**:已初始化的全局变量和静态变量(如 `int a = 10;`)。 - **.bss**:未初始化的全局变量和静态变量(如 `int b;`),不占用 Flash 空间,运行时自动初始化为 0。 - **.stack**:栈区域,由编译器自动管理,用于存储局部变量和函数调用上下文。 - **.heap**:堆区域,用于动态内存分配(如 `malloc()`、`free()`)。 #### 3.5文件路径位置 在Option页面C/C++设置文件路径位置,包括头文件位置。 ![1](.\Pictures\image-20250708142455122.png) #### 3.6输出文件配置 选择Output页面,然后设置输出文件位置。 ![1](.\Pictures\image-20250708142616060.png) 1. .hex文件:十六进制文件。 2. .bin文件:二进制文件。 3. .txt文件:文本格式文件。 4. .srec文件:SREC(也称为 S-Record、S-File)是一种 ASCII 文本格式,将二进制数据编码为可读字符串,便于在不同系统间传输和存储。 5. .sim:通常指用于仿真(Simulation)的配置文件或结果文件。 #### 3.7输出文件路径 打开Option,选择General,选择output进行配置。 ![1](.\Pictures\image-20250708142932221.png) ### 4.调试器配置 打开Option,选择Debug进行配置 ![1](.\Pictures\image-20250708143112548.png) | 选项 | 功能描述 | | ---------------------------------------- | ------------------------------------------------------------ | | **Core Reset** | 是指针对微控制器(MCU)内核(如 ARM Cortex-M 系列)的复位操作,**软件触发**:通过写入特定寄存器触发 | | **System(default) Reset** | 上电复位 | | **Software Reset** | 通过写入 SCB_AIRCR 寄存器触发软件系统复位(SYSRESETREQ)。 | | **Hardware Reset** | 通过控制 NRST 引脚触发硬件复位。 | | **Connect During Reset(复位期间连接)** | 允许调试器在目标设备复位期间建立并保持连接 | | 操作 | 功能描述 | 适用场景 | | ----------------------- | --------------------------------------- | ------------------ | | **Debug Download** | 下载程序并启动调试会话 | 开发阶段调试代码 | | **Production Download** | 仅下载程序,不启动调试(如 Flash 编程) | 生产环境烧录固件 | | **Run to main()** | 下载后自动运行到 `main()` 函数入口 | 跳过冗长的启动代码 | | **Load Symbol File** | 仅加载符号表(不下载程序) | 附加到已运行的程序 | jlink:提供了高效的硬件调试、Flash 编程和性能分析功能。 stlink:ST-Link 是意法半导体(STMicroelectronics)为其 STM32 系列微控制器开发的官方调试工具,用于程序下载、调试和系统开发。它集成了 JTAG/SWD 接口和 USB 通信功能 ijet:**iJet** 是德国 Lauterbach 公司开发的高性能调试工具,专为复杂嵌入式系统设计,尤其适用于对调试深度、实时性和性能要求极高的场景 | 工具 | 优势 | 劣势 | | ----------- | ---------------------------------------- | ------------------------ | | **iJet** | 超高性能追踪、多处理器支持、全系统可见性 | 价格昂贵,适用于高端场景 | | **J-Link** | 功能全面、性价比高 | 追踪能力较 iJet 有限 | | **ST-Link** | 低成本、官方支持 | 仅支持 STM32 系列 | ### 5.库相关配置 设置库文件相关位置,同时在程序内include头文件,使用库。 | 选项 | 功能描述 | | ------ | ------------------------------------------------------------ | | none | 不链接任何标准库,适合资源受限的环境。 | | normal | 链接标准 C 库的常规版本,平衡了代码大小和运行速度。 | | full | 链接标准 C 库的完整版本,包含所有功能和调试信息,适合调试阶段。 | | custom | 允许用户自定义库配置,可选择性地包含或排除某些库功能,用于优化代码大小。 | | libc++ | 链接 C++ 标准库,适用于 C++ 开发。 | ![1](./Pictures/image-20250710142954145.png) CMSIS提供 Cortex-M 处理器内核的底层访问接口,包括: - 寄存器定义(如 NVIC、SCB、SysTick)。 - 中断处理函数接口。 - 系统时钟配置函数。 ### 6.静态库的封装和调用 1. 新建项目,同时设置.h和.c文件,进行内部程序的编写。注意减少外部依赖,能够直接移植调用。 2. 写完之后点击option进行设置,选择General,OutPut选择library,然后make编译生成.lib文件,使用时复制.lib文件到项目内。 3. 在option内进行配置,然后选择Linker -- > Library,将静态库.lib文件添加,同时添加头文件,返回工程重新编译。 4. 可以发现静态库的函数可以在工程里面进行调用。 image-20250708144035699 image-20250709181230566 ### 7.工程调试 #### 7.1断点 ##### 7.1.1设置断点 左侧标红设置断点 image-20250708150820220 ##### 7.1.2禁用断点 鼠标右键点击,disable breakpoints。 image-20250708151057158 ##### 7.1.3启用断点 鼠标右键点击,disable breakpoints。 ##### 7.1.4取消断点 鼠标左键点击断点即可取消。 ##### 7.1.5条件断点 鼠标右键想要断点处,选择Edit Breakpoint,将条件写入即可。 image-20250708152500923 ### 8.监控信息 选择view,找到watch,找到想要监视的信息,将其拖到watch窗口即可。 image-20250708152756370 | 类型 | 特点 | 适用场景 | 更新方式 | | | | --------------------------- | --------------------------------------------------------- | ------------------------ | -------------- | ---- | ---- | | **Watch Window** | 手动添加、持续跟踪 | 长期监视关键变量 | 自动(暂停时) | | | | **Quick Watch** | 临时查看、即时计算 | 快速验证单个变量 | 手动触发 | | | | **Auto Watch** | 自动跟踪当前上下文 | 快速了解局部变量状态 | 自动(执行时) | | | | **Memory Watch** | 直接访问内存地址 | 调试内存相关问题 | 自动(暂停时) | | | | **Register Watch** | 监控硬件寄存器 | 底层硬件调试 | 自动(执行时) | | | | **断点条件 Watch** | 条件触发与监视结合 | 捕获特定状态 | 条件满足时 | | | | **Live Watch** | 允许在程序运行过程中实时跟踪变量值,而无需暂停 CPU 执行。 | 实时系统调试 | 自动 | | | | **Local Watch(局部监视)** | 主要用于跟踪程序中**局部变量**的变化 | 查看局部函数内的局部变量 | 自动 | | | | **Statics Watch** | 监视程序内的静态窗口 | | | | | ### 9.寄存器信息 打开view的registers窗口即可查看寄存器信息。 image-20250708152951214 **r0~r3**: 主要用于子程序间传递参数。 **r4~r11** :主要用于保存局部变量,但在 Thumb 程序中,通常只能使用 r4~r7 来保存局部变量。 **r12** :用作子程序间scratch 寄存器,即 ip 寄存器。 **r13**: 通常用做栈指针,即 sp。 **r14**: 寄存器又被称为连接寄存器(lr),用于保存子程序以及中断的返回地址。 **r15** :用作程序计数器(pc),由于 ARM 采用了流水线机制,当正确读取了 PC 的值后,该值为当前指令地址加 8 个字节,即 PC 指向当前指令的下两条指令地址。 CPSR和SPSR都是程序状态寄存器,其中SPSR是用来保存中断前的CPSR中的值,以便在中断返回之后恢复处理器程序状态。s ### 10.内存信息 打开view的memory窗口即可查看寄存器信息 ![image-20250708153108132](.\Pictures\image-20250708153108132.png) 想要查看变量信息,可以通过添加取址符号&进行查看。 ### 11.栈信息 打开view的stack窗口即可查看栈信息 image-20250708153204889 ### 12.汇编信息 打开view的disassembly窗口可以查看汇编信息 image-20250708153257586 ### 13.调用堆栈信息 打开view的call Stack窗口可以查看堆栈信息 image-20250708153531949 **堆栈的解释:**是内存中的一块连续区域,遵循 **后进先出(LIFO)** 原则。 - 核心作用: - 保存函数调用时的上下文(如返回地址、寄存器值)。 - 存储局部变量和函数参数。 - 支持中断处理和异常响应。 | **特性** | **堆栈(Stack)** | **堆(Heap)** | | -------------- | -------------------------- | --------------------------------- | | **管理方式** | 由 CPU 自动管理(SP 指针) | 由程序员手动分配(如 `malloc()`) | | **分配效率** | 快(直接移动 SP) | 慢(需动态查找空闲内存块) | | **空间大小** | 固定(由链接脚本指定) | 动态(受限于剩余内存) | | **数据生存期** | 与函数调用周期绑定 | 由程序员控制(`free()`) | | **生长方向** | 通常向下(低地址) | 向上(高地址) | | **内存碎片** | 不存在 | 可能产生(多次分配 / 释放) | ### 14.单步调试 #### 14.1逐过程调试 菜单栏Step over。 image-20250708153851629 | 序号 | 英文 | 作用 | | ---- | ----------------------- | ------------------------------------------------------------ | | 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()` 或初始化开始)。 | #### 14.2逐语句调试 菜单栏Step into。 #### 14.3 复位 菜单栏Restart。 #### 14.4跳出 菜单栏step out。