diff --git a/IAR/IAR.md b/IAR/IAR.md index 089206a..cef37fd 100644 --- a/IAR/IAR.md +++ b/IAR/IAR.md @@ -80,6 +80,23 @@ ![image-20250709095459265](./pictures/image-20250709095459265.png) +**四个优化等级(None、Low、Medium、High)的一般区别:** + +| 优化等级 | 主要特征 | 适用场景 | +| ---------- | ------------------------------------------------------------ | ---------------------------------------------- | +| **None** | 不做任何优化,编译器生成的代码基本直译源代码,编译速度最快,代码体积和运行效率都最低。 | 调试阶段,方便调试,代码易读,能快速定位问题。 | +| **Low** | 进行少量优化,基本减少明显的低效代码,稍微提升执行速度和代码大小,但编译时间较短。 | 开发早期,性能不是关键时,调试还能较方便。 | +| **Medium** | 平衡优化,既关注性能提升,也适度控制代码大小,编译时间较长。 | 一般发布版本,适合大多数应用场景。 | +| **High** | 激进优化,最大限度提升执行速度和代码大小的压缩,可能会改变代码行为(比如改变指令顺序、内联函数)。 | 性能要求极高的发布版本,代码难以调试。 | + +IAR 编译器在 High 优化级别下的下拉框提供了三种优化策略: + +| 选项 | 含义 | 适用场景 | +| ------------ | -------------------------------- | -------------------------------- | +| **Size** | 优化代码体积,减小生成二进制大小 | 适合内存受限的嵌入式系统 | +| **Speed** | 优化运行速度,提高代码执行效率 | 适合对性能要求较高的应用 | +| **Balanced** | 代码大小和执行速度折中 | 兼顾体积和速度,适合一般应用需求 | + #### 硬件浮点 ![image-20250709095532506](./pictures/image-20250709095532506.png) @@ -94,6 +111,23 @@ ![image-20250709095718033](./pictures/image-20250709095718033.png) +在 `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**)用于定义程序的内存布局,包括代码、数据、堆栈等在内存中的分布。 @@ -120,9 +154,7 @@ c __no_init uint8_t my_buffer[1024] @ ".mydata"; // IAR语法 ``` ------- -## ### 文件路径配置 @@ -140,10 +172,27 @@ __no_init uint8_t my_buffer[1024] @ ".mydata"; // IAR语法 ![image-20250709100507410](./pictures/image-20250709100507410.png) +![image-20250715131503129](./pictures/image-20250715131503129.png) + +| 选项 | 作用 | 建议使用情况 | +| ------------------- | ------------------------ | ---------------------- | +| Verify Download | 下载后自动校验程序正确性 | 需要确保下载成功时开启 | +| Suppress Download | 禁止下载程序 | 只想调试已有程序时开启 | +| Use Flash Loader(s) | 使用特定Flash烧录程序 | 编程内部闪存时勾选 | + +`.board` 文件是IAR Embedded Workbench中用来描述目标硬件板(开发板)配置的文件。 +- 它包含调试器接口信息(如JTAG/SWD设置)、时钟配置、芯片类型、连接参数等硬件相关的设定。 +- IDE通过 `.board` 文件知道如何与目标板正确通信和调试。 + + **Mass Erase** 指的是对目标芯片整个闪存区域进行**全部擦除**的操作。 +- 该选项开启后,调试器在烧写程序前,会先对芯片内部所有闪存区域执行一次彻底擦除,确保没有残留旧数据。 + ### 库相关配置 ![image-20250709100552114](./pictures/image-20250709100552114.png) + + ### 静态库的封装 1. ![image-20250709185406199](./pictures/image-20250709185406199.png) @@ -193,6 +242,14 @@ __no_init uint8_t my_buffer[1024] @ ".mydata"; // IAR语法 ![image-20250709104442792](./pictures/image-20250709104442792.png) +#### 数据断点 + +![image-20250715135308980](./pictures/image-20250715135308980.png) + +![image-20250715135342485](./pictures/image-20250715135342485.png) + +选择数据断点,可以选择是读触发还是写触发,同时可以结合条件断点使用。 + ### 监控信息 ![image-20250709101836850](./pictures/image-20250709101836850.png) @@ -201,6 +258,80 @@ __no_init uint8_t my_buffer[1024] @ ".mydata"; // IAR语法 ![image-20250709105019076](./pictures/image-20250709105019076.png) + + +| 寄存器 | 名称 | 类型 | 说明 | +| ------------ | ------------------------------------- | ------------ | ------------------------------------------------------------ | +| **`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:参数 / 返回值 / 临时变量** + +- 函数参数通过 R0~R3 传递(最多 4 个参数); +- 函数返回值一般通过 R0(或 R0~R1); +- 调用者需要保存这些值(Caller-saved); + +``` +c复制编辑int add(int a, int b) { + return a + b; // a→R0,b→R1,结果→R0 +} +``` + + + +**R4–R11:局部变量 / 被调用者保存** + +- 通常用于函数内部的变量或数据; +- 调用函数前由被调用者负责保存(Callee-saved); +- 在嵌套调用中保持数据完整性。 + +``` +c复制编辑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`)。 + #### 内存信息 ![image-20250709105314139](./pictures/image-20250709105314139.png) @@ -246,4 +377,33 @@ __no_init uint8_t my_buffer[1024] @ ".mydata"; // IAR语法 | 跳出 | Step Out | `StepOut` 或 `SR` | `Shift + F11` | 执行当前函数剩余代码并跳出,返回到调用该函数的位置。 | | 复位 | Reset | `Reset` | *无默认快捷键* | 让 MCU 从复位向量重新启动程序执行(从 `main()` 或初始化开始)。 | +![image-20250715122856333](./pictures/image-20250715122856333.png) + + + +| 序号 | 英文 | 作用 | +| :--: | :---------------------: | :----------------------------------------------------------: | +| 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** | ❌ | ❌ | 已在调试中 | ✅ | ✅ | + [**参考文献**](https://blog.csdn.net/ideal121/article/details/118675124?fromshare=blogdetail&sharetype=blogdetail&sharerId=118675124&sharerefer=PC&sharesource=2301_81415726&sharefrom=from_link) \ No newline at end of file diff --git a/IAR/pictures/image-20250715122856333.png b/IAR/pictures/image-20250715122856333.png new file mode 100644 index 0000000..1c76550 Binary files /dev/null and b/IAR/pictures/image-20250715122856333.png differ diff --git a/IAR/pictures/image-20250715131503129.png b/IAR/pictures/image-20250715131503129.png new file mode 100644 index 0000000..2d7dea8 Binary files /dev/null and b/IAR/pictures/image-20250715131503129.png differ diff --git a/IAR/pictures/image-20250715135308980.png b/IAR/pictures/image-20250715135308980.png new file mode 100644 index 0000000..ec387a1 Binary files /dev/null and b/IAR/pictures/image-20250715135308980.png differ diff --git a/IAR/pictures/image-20250715135342485.png b/IAR/pictures/image-20250715135342485.png new file mode 100644 index 0000000..c8d5274 Binary files /dev/null and b/IAR/pictures/image-20250715135342485.png differ diff --git a/SourceInSight/SourceInSight.md b/SourceInSight/SourceInSight.md index 4bbbcd6..d824f24 100644 --- a/SourceInSight/SourceInSight.md +++ b/SourceInSight/SourceInSight.md @@ -117,6 +117,25 @@ - **缺点**: - 找不到跨文件定义、不支持跳转到符号 +![image-20250715142824280](./pictures/image-20250715142824280.png) + +| 选项 | 作用 | 典型用法/说明 | +| ----------------------- | ---------------------------- | ------------------------------------------------- | +| Case Sensitive | 区分大小写匹配 | 精确匹配变量名或关键字大小写 | +| Use Regular Expressions | 使用正则表达式匹配 | 复杂模式搜索,比如匹配数字、特定格式字符串 | +| Wrap Around | 搜索到文件末尾后从头继续搜索 | 循环全文搜索,避免漏掉匹配项 | +| Select When Found | 搜索到匹配文本时自动选中 | 方便复制、替换操作 | +| Whole Words Only | 只匹配完整单词 | 避免匹配单词内部字符串,如避免 `int` 匹配 `print` | + +| 设置 | 效果说明 | +| --------------------- | -------------------------------- | +| Forward + Whole File | 从当前位置往下搜索,直到文件结尾 | +| Backward + Whole File | 从当前位置往上搜索,直到文件开头 | +| Forward + Selection | 在选中的代码块中,从上往下查找 | +| Backward + Selection | 在选中的代码块中,从下往上查找 | + + + ## 全局搜索(Search → Find in Files) - **快捷键**:`Ctrl + Shift + F` @@ -129,6 +148,30 @@ - **常用于**: - 搜索日志宏 `LOG_ERR`、关键字 `#define` 等 +| 序号 | 选项名称 | 中文含义 | 功能说明 | 常用场景示例 | +| ---- | --------------------------- | -------------- | ---------------------------------------------------------- | --------------------------------------- | +| 1 | **Project Wide** | 项目范围搜索 | 在整个项目中的所有文件进行搜索,仅对已加入项目的文件生效。 | 搜索项目中某变量或函数的所有引用 | +| 2 | **Include Subdirectories** | 包括子目录 | 搜索指定文件夹时,递归进入子目录一并搜索。 | 搜索多层文件夹下的所有 `.c/.h` 文件内容 | +| 3 | **Case Sensitive** | 区分大小写 | 搜索时大小写敏感,严格匹配字母大小写。 | 精确查找区分大小写的变量名,如 `MyVar` | +| 4 | **Use Regular Expressions** | 使用正则表达式 | 启用正则表达式语法,支持复杂模式匹配。 | 查找函数调用:`foo\(`,匹配 `foo()` | +| 5 | **Find Non-Matching** | 查找不匹配项 | 仅显示不包含搜索关键词的文件或行。 | 找出没使用某宏或函数的文件 | +| 6 | **Whole Words Only** | 全字匹配 | 仅匹配完整单词,避免匹配词语中的一部分。 | 搜索 `int` 不匹配 `print` | +| 7 | **Skip Inactive Code** | 跳过无效代码 | 不在条件编译屏蔽掉的代码中搜索(如 `#if 0`)。 | 排除死代码,聚焦于当前编译路径 | +| 8 | **Skip Comments** | 跳过注释 | 不在注释中搜索,只搜索真正代码部分。 | 查找实际代码逻辑,排除注释中的说明 | +| 9 | **Search Only Comments** | 仅搜索注释内容 | 只在注释中查找,不搜索代码。 | 搜索 `TODO`、`FIXME`、版权信息等 | + + + +| 序号 | 选项名称 | 中文含义 | 功能说明 | 常用场景示例 | +|--------|--------------|-------------|---|-----| +| 1 | **Search Project** | 搜索整个项目 | 在当前 Source Insight 项目的所有文件中执行搜索(不包括未加入项目的文件)。 | 查找整个项目中函数或宏的定义、引用等。 | +| 2 | **Case Sensitive** | 区分大小写 | 只匹配大小写完全相同的内容(例如 `MyVar` ≠ `myvar`)。 | 精确搜索变量、函数名,防止误匹配。 | +| 3 | **Whole Words Only** | 全字匹配 | 只匹配完整单词,不匹配单词的一部分(`int` 不会匹配 `print`)。 | 搜索关键字、类型名、变量名时避免误匹配。 | +| 4 | **Skip Inactive Code** | 跳过无效代码 | 不搜索被 `#if 0`、`#ifdef` 等条件屏蔽的代码块。 | 避免搜索到未编译的旧代码或无效代码。 | +| 5 | **Skip Comments** | 跳过注释 | 忽略注释内容,仅在代码主体中搜索。 | 搜索变量或调用语句,排除说明性文字。 | +| 6 | **Search Only Comments** | 仅搜索注释 | 只搜索注释区域,忽略代码区域。 | 查找 `TODO`、`FIXME`、文档注释等信息。 | +| 7 | **Smart Reference Matching** | 智能引用匹配 | 更智能地匹配标识符引用,考虑语言结构(仅对支持语义分析的工程有效)。 | 查找函数、变量等引用时更精准(推荐勾选)。 | +| 8 | **Touch Files and Cause Recompile** | 修改文件触发重编译 | 搜索中访问的文件会被标记为“已改动”,可能导致重新编译(小心使用)。 | 不常用,仅在希望通过搜索触发某些构建系统行为时用 | ## 符号查找(Search → Lookup Symbol) - **快捷键**:`Ctrl + /` @@ -150,3 +193,28 @@ ![image-20250712182757921](./pictures/image-20250712182757921.png) +## 备份 + +**手动备份** + +![image-20250715141704451](./pictures/image-20250715141704451.png) + +**自动备份** + +![image-20250715141757054](./pictures/image-20250715141757054.png) + +**打开备份文件** + +![image-20250715141829212](./pictures/image-20250715141829212.png) + +## 文件比较 + +![image-20250715142335298](./pictures/image-20250715142335298.png) + + + + + +![image-20250715142428985](./pictures/image-20250715142428985.png) + +![image-20250715142305916](./pictures/image-20250715142305916.png) diff --git a/SourceInSight/pictures/image-20250715141704451.png b/SourceInSight/pictures/image-20250715141704451.png new file mode 100644 index 0000000..c0d98f4 Binary files /dev/null and b/SourceInSight/pictures/image-20250715141704451.png differ diff --git a/SourceInSight/pictures/image-20250715141757054.png b/SourceInSight/pictures/image-20250715141757054.png new file mode 100644 index 0000000..4d6395b Binary files /dev/null and b/SourceInSight/pictures/image-20250715141757054.png differ diff --git a/SourceInSight/pictures/image-20250715141829212.png b/SourceInSight/pictures/image-20250715141829212.png new file mode 100644 index 0000000..f260cf9 Binary files /dev/null and b/SourceInSight/pictures/image-20250715141829212.png differ diff --git a/SourceInSight/pictures/image-20250715142305916.png b/SourceInSight/pictures/image-20250715142305916.png new file mode 100644 index 0000000..5001f64 Binary files /dev/null and b/SourceInSight/pictures/image-20250715142305916.png differ diff --git a/SourceInSight/pictures/image-20250715142335298.png b/SourceInSight/pictures/image-20250715142335298.png new file mode 100644 index 0000000..2ea9b66 Binary files /dev/null and b/SourceInSight/pictures/image-20250715142335298.png differ diff --git a/SourceInSight/pictures/image-20250715142428985.png b/SourceInSight/pictures/image-20250715142428985.png new file mode 100644 index 0000000..5acbc31 Binary files /dev/null and b/SourceInSight/pictures/image-20250715142428985.png differ diff --git a/SourceInSight/pictures/image-20250715142824280.png b/SourceInSight/pictures/image-20250715142824280.png new file mode 100644 index 0000000..60b40a2 Binary files /dev/null and b/SourceInSight/pictures/image-20250715142824280.png differ