文件后缀 | 其意义 |
---|---|
.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链接脚本控制内存分配(Flash/ROM、RAM 布局)关键硬件相关文件)
在 IAR
编译环境下,__section_start("name")
是一个 内置宏,它返回指定段(section)name
的起始地址。通常用于获取某个内存段的起始地址,比如某个代码段、数据段、或者自己定义的特殊段。
举例
extern unsigned int __section_start("MY_SECTION");
void func() {
unsigned int *ptr = (unsigned int *)__section_start("MY_SECTION");
// 现在 ptr 指向 MY_SECTION 段的起始地址,可以用来操作该内存区域
}
这里 __section_start("MY_SECTION")
返回的是链接器脚本中 MY_SECTION
段的起始地址。
IAR ICF 文件(.icf)的了解及变量如何分配内存区域
ICF(IAR Linker Configuration File)用于定义程序的内存布局,包括代码、数据、堆栈等在内存中的分布。
变量分配到特定内存区域的方法:
你可以通过修改 .icf
文件中的 define block
和 place in
语句来控制变量在内存中的分布。
示例(将某段变量放到特定内存区域):
icf复制编辑define region MY_RAM = mem:[from 0x20010000 to 0x20010FFF];
define block my_section with alignment = 8 { section .mydata };
place in MY_RAM { block my_section };
然后在代码中定义变量时,使用 __attribute__((section(".mydata")))
或 IAR 的 __section
:
c
复制编辑
__no_init uint8_t my_buffer[1024] @ ".mydata"; // IAR语法
选项 | 作用 | 建议使用情况 |
---|---|---|
Verify Download | 下载后自动校验程序正确性 | 需要确保下载成功时开启 |
Suppress Download | 禁止下载程序 | 只想调试已有程序时开启 |
Use Flash Loader(s) | 使用特定Flash烧录程序 | 编程内部闪存时勾选 |
.board
文件是IAR Embedded Workbench中用来描述目标硬件板(开发板)配置的文件。
.board
文件知道如何与目标板正确通信和调试。Mass Erase 指的是对目标芯片整个闪存区域进行全部擦除的操作。
设置断点(点击代码行左侧,出现红色圆圈)
禁用断点(右键红色圆圈,Enable/disable)
启用断点(右键红色圆圈,Enable/disable)
删除断点(再次点击代码行左侧,红色圆圈消失)
条件断点(可以设置一个条件,当条件满足时,断点生效)
选择数据断点,可以选择是读触发还是写触发,同时可以结合条件断点使用。
寄存器 | 名称 | 类型 | 说明 |
---|---|---|---|
R0–R3 |
通用寄存器 | 通用 | 用于函数参数传递、临时数据处理等。R0 通常作为函数返回值寄存器。 |
R4–R11 | 通用寄存器 | 被调用者保存 | 用于本地变量、长生命周期数据。函数调用后,值需由被调用函数负责保存。 |
R12 | Intra-Procedure-call scratch register | 特定用途 | 通常由编译器用于中间值,调用过程临时数据,不保证保存。 |
R13 (SP) | Stack Pointer | 特殊 | 栈指针,指向当前栈顶。用于局部变量、函数调用等。可分为 MSP/PSP。 |
R14 (LR) | Link Register | 特殊 | 链接寄存器,存储函数返回地址。调用 BL 指令时保存返回点。 |
R15 (PC) | Program Counter | 特殊 | 程序计数器,存储当前指令地址。控制程序执行流程。 |
R0–R3:参数 / 返回值 / 临时变量
c复制编辑int add(int a, int b) {
return a + b; // a→R0,b→R1,结果→R0
}
R4–R11:局部变量 / 被调用者保存
c复制编辑void foo() {
int x = 10; // 可能保存在 R4~R11 中
}
R12:临时 scratch 寄存器
R13(SP):栈指针 Stack Pointer
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)中提供,它展示了函数调用的顺序列表。
中文名称 | 英文名称 | 缩写/简称 | 快捷键 | 含义说明 |
---|---|---|---|---|
逐语句 | 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() 或初始化开始)。 |
指令 | 编译 | 下载 | 进入调试 | 从头开始运行 | 是否保留断点 |
---|---|---|---|---|---|
Download and Debug | ✅ | ✅ | ✅ | ✅ | ✅ |
Make & Restart Debugger | ✅ | ❌(默认不下载) | ✅ | ✅ | ✅ |
Restart Debugger | ❌ | ❌ | 已在调试中 | ✅ | ✅ |