文件后缀 | 其意义 |
---|---|
.eww |
工作空间文件,包含多个项目的索引信息 |
.ewp |
项目文件,包含项目的设置和配置 |
.ewd |
调试配置文件,用于调试设置 |
.ewt |
(嵌入式工作台模板文件) 用于存储工程或文件的模板配置,方便快速创建具有相同设置的新项目。 |
.c |
源代码文件,包含C语言代码 |
.h |
头文件,包含函数声明和宏定义 |
.s/.asm |
汇编文件 |
.map |
单片机地址映射文件 |
.hex |
烧录到芯片的十六进制文件 |
四个优化等级(None、Low、Medium、High)的一般区别:
优化等级 | 主要特征 | 适用场景 |
---|---|---|
None | 不做任何优化,编译器生成的代码基本直译源代码,编译速度最快,代码体积和运行效率都最低。 | 调试阶段,方便调试,代码易读,能快速定位问题。 |
Low | 进行少量优化,基本减少明显的低效代码,稍微提升执行速度和代码大小,但编译时间较短。 | 开发早期,性能不是关键时,调试还能较方便。 |
Medium | 平衡优化,既关注性能提升,也适度控制代码大小,编译时间较长。 | 一般发布版本,适合大多数应用场景。 |
High | 激进优化,最大限度提升执行速度和代码大小的压缩,可能会改变代码行为(比如改变指令顺序、内联函数)。 | 性能要求极高的发布版本,代码难以调试。 |
IAR 编译器在 High 优化级别下的下拉框提供了三种优化策略:
选项 | 含义 | 适用场景 |
---|---|---|
Size | 优化代码体积,减小生成二进制大小 | 适合内存受限的嵌入式系统 |
Speed | 优化运行速度,提高代码执行效率 | 适合对性能要求较高的应用 |
Balanced | 代码大小和执行速度折中 | 兼顾体积和速度,适合一般应用需求 |
ICF是告诉编译器:你的程序、变量、代码应该放到芯片哪一块内存里的“地图”文件。
功能 | ICF 术语 |
---|---|
定义内存 | define region |
放置代码/数据 | place in region |
放中断表 | place at start of ROM { .intvec } |
特殊变量段 | .noinit |
/* 定义芯片的内存结构 */
define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
define symbol __ICFEDIT_region_ROM_end__ = 0x0803FFFF;
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__ = 0x20007FFF;
/* 创建实际使用的内存区域(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__];
/* 定义堆和栈的大小 */
define symbol __ICFEDIT_size_cstack__ = 0x0400; /* 1KB Stack */
define symbol __ICFEDIT_size_heap__ = 0x0400; /* 1KB Heap */
/* 为 IAR 系统定义符号,用于 startup 文件 */
define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__;
define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__;
/* 开始放置内容 */
initialize by copy { readwrite };
do not initialize { section .noinit }; /* .noinit 不初始化 */
/* Flash(ROM)放置策略 */
place at start of ROM_region { readonly section .intvec }; /* 中断向量表 */
place in ROM_region { readonly }; /* 代码和常量 */
/* SRAM(RAM)放置策略 */
place in RAM_region { readwrite, /* 初始化变量 */
block HEAP, /* 堆 */
block CSTACK, /* 栈 */
section .noinit }; /* 不初始化区 */
(.icf链接脚本控制内存分配(Flash/ROM、RAM 布局)关键硬件相关文件)
选项 | 作用 | 建议使用情况 |
---|---|---|
Verify Download | 自动读取芯片内容并与主机上的HEX/ELF文件进行比对,确保数据一致,防止烧录出错。 | 需要确保下载成功时开启 |
Suppress Download | 调试器连接后,只进行仿真或断点分析,不实际烧录代码。 | 只想调试已有程序时开启 |
Use Flash Loader(s) | Flash Loader 文件将程序写入芯片的内部或外部 Flash 存储器。 | 编程内部闪存时勾选 |
.board
文件是IAR Embedded Workbench中用来描述目标硬件板(开发板)配置的文件。
.board
文件知道如何与目标板正确通信和调试。Mass Erase 指的是对目标芯片整个闪存区域进行全部擦除的操作。
项目 | 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 捆绑 |
价格 | 中等 | 较低 | 较高 |
设置断点(点击代码行左侧,出现红色圆圈)
禁用断点(右键红色圆圈,Enable/disable)
启用断点(右键红色圆圈,Enable/disable)
删除断点(再次点击代码行左侧,红色圆圈消失)
条件断点(可以设置一个条件,当条件满足时,断点生效)
选择数据断点,可以选择是读触发还是写触发,同时可以结合条件断点使用。
类型 | 触发条件 | 用途 |
---|---|---|
数据断点 | 变量的值或地址被访问(读/写) 时触发 | 监控变量的读写 |
条件断点 | 满足特定条件时(如变量值==10) 才中断 | 控制断点的触发时机 |
寄存器 | 名称 | 类型 | 说明 |
---|---|---|---|
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
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 = 0x08001234
)。调用堆栈窗口通常在IDE(如Visual Studio)中提供,它展示了函数调用的顺序列表。
勾选 Enable stack usage analysis
打开 .map文件,搜索STACK USAGE
中文名称 | 英文名称 | 缩写/简称 | 快捷键 | 含义说明 |
---|---|---|---|---|
逐语句 | 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() 或初始化开始)。 |