25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

21 KiB

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

1.3新建/打开工程

工作区新建/打开完成后,选择上方的Project,选择Create New project选择创建类型并命名和存档后完成新建工程。

打开工程选择Add。

tupian

1.4工作区中导入/添加工程

选择上方的Project,点击Add Existing Project,便可以添加项目。

1

1.5新建分组

右键项目名称,选择Add Group,新建分组

1

1.6新建/打开文件

右键项目名称,选择Add File,新建文件。

1

1.7工程目录与文件目录的关系

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

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

2.工程配置

2.1设备配置

右键工程文件,选择Options,进入工程配置,选择需要的单片机设备型号。

1

3.编译配置

3.1优化等级

右键Options,选择C/C++ --> Optimizations ,进行优化等级配置。

1

  1. None (-O0)
    • 特点:不进行优化,编译速度最快。
    • 应用场景:调试阶段,便于跟踪源代码与机器码的对应关系。
    • 缺点:生成的代码体积大、执行慢。
  2. Low (-O1)
    • 特点:基本优化,主要减少代码大小。
    • 优化内容:
      • 消除未使用的变量和函数。
      • 简化常量表达式(如计算 2+35)。
      • 执行基本的循环优化(如循环展开小迭代次数的循环)。
    • 应用场景:需要平衡代码大小和编译时间的场景。
  3. Medium (-O2)
    • 特点:中度优化,兼顾代码大小和执行速度。
    • 优化内容:
      • 执行更激进的循环优化(如循环不变代码外提)。
      • 函数内联(对小函数)。
      • 寄存器分配优化。
    • 应用场景:大多数生产环境的默认选择。
  4. High (-O3)
    • 特点:最高级优化,侧重执行速度。
    • 优化内容:
      • 激进的函数内联(包括较大的函数)。
      • 循环展开和向量化(适用于 DSP 等架构)。
      • 全局变量和内存访问优化。
    • 缺点:可能增加代码体积,编译时间显著延长。
    • 应用场景:对性能要求极高的代码(如算法核心、中断处理)。

3.2硬件浮点

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

1

硬件浮点单元通过专用电路加速浮点数运算,显著提升了嵌入式系统的计算能力、能效比和开发效率。对于需要处理复杂算法、高精度数据或实时响应的应用,FPU 几乎是必备组件。

3.3预处理

右键Options,选择C/C++ --> Preprocessor ,Defined symbols进行预处理。

1

  • 硬件资源的抽象映射(如寄存器地址)。
  • 代码的灵活配置与优化。
  • 跨平台兼容性支持。
  • 调试与生产版本的快速切换。

3.4链接文件

Linker页面设置链接文件。

1

作用:

  • 定义物理内存布局(如 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

3.6输出文件配置

选择Output页面,然后设置输出文件位置。

1

  1. .hex文件:十六进制文件。
  2. .bin文件:二进制文件。
  3. .txt文件:文本格式文件。
  4. .srec文件:SREC(也称为 S-Record、S-File)是一种 ASCII 文本格式,将二进制数据编码为可读字符串,便于在不同系统间传输和存储。
  5. .sim:通常指用于仿真(Simulation)的配置文件或结果文件。

3.7输出文件路径

打开Option,选择General,选择output进行配置。

1

4.调试器配置

打开Option,选择Debug进行配置

1

选项 功能描述
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

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(局部监视) 主要用于跟踪程序中局部变量的变化 查看局部函数内的局部变量 自动

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

想要查看变量信息,可以通过添加取址符号&进行查看。

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。