wsk 2 дней назад
Родитель
Сommit
566e1ebda1
13 измененных файлов: 230 добавлений и 2 удалений
  1. +162
    -2
      IAR/IAR.md
  2. Двоичные данные
      IAR/pictures/image-20250715122856333.png
  3. Двоичные данные
      IAR/pictures/image-20250715131503129.png
  4. Двоичные данные
      IAR/pictures/image-20250715135308980.png
  5. Двоичные данные
      IAR/pictures/image-20250715135342485.png
  6. +68
    -0
      SourceInSight/SourceInSight.md
  7. Двоичные данные
      SourceInSight/pictures/image-20250715141704451.png
  8. Двоичные данные
      SourceInSight/pictures/image-20250715141757054.png
  9. Двоичные данные
      SourceInSight/pictures/image-20250715141829212.png
  10. Двоичные данные
      SourceInSight/pictures/image-20250715142305916.png
  11. Двоичные данные
      SourceInSight/pictures/image-20250715142335298.png
  12. Двоичные данные
      SourceInSight/pictures/image-20250715142428985.png
  13. Двоичные данные
      SourceInSight/pictures/image-20250715142824280.png

+ 162
- 2
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)

Двоичные данные
IAR/pictures/image-20250715122856333.png Просмотреть файл

До После
Ширина: 471  |  Высота: 99  |  Размер: 13 KiB

Двоичные данные
IAR/pictures/image-20250715131503129.png Просмотреть файл

До После
Ширина: 836  |  Высота: 731  |  Размер: 94 KiB

Двоичные данные
IAR/pictures/image-20250715135308980.png Просмотреть файл

До После
Ширина: 931  |  Высота: 902  |  Размер: 172 KiB

Двоичные данные
IAR/pictures/image-20250715135342485.png Просмотреть файл

До После
Ширина: 1047  |  Высота: 965  |  Размер: 115 KiB

+ 68
- 0
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)

Двоичные данные
SourceInSight/pictures/image-20250715141704451.png Просмотреть файл

До После
Ширина: 464  |  Высота: 761  |  Размер: 55 KiB

Двоичные данные
SourceInSight/pictures/image-20250715141757054.png Просмотреть файл

До После
Ширина: 729  |  Высота: 919  |  Размер: 58 KiB

Двоичные данные
SourceInSight/pictures/image-20250715141829212.png Просмотреть файл

До После
Ширина: 452  |  Высота: 730  |  Размер: 48 KiB

Двоичные данные
SourceInSight/pictures/image-20250715142305916.png Просмотреть файл

До После
Ширина: 1176  |  Высота: 639  |  Размер: 69 KiB

Двоичные данные
SourceInSight/pictures/image-20250715142335298.png Просмотреть файл

До После
Ширина: 856  |  Высота: 959  |  Размер: 104 KiB

Двоичные данные
SourceInSight/pictures/image-20250715142428985.png Просмотреть файл

До После
Ширина: 726  |  Высота: 503  |  Размер: 20 KiB

Двоичные данные
SourceInSight/pictures/image-20250715142824280.png Просмотреть файл

До После
Ширина: 697  |  Высота: 395  |  Размер: 18 KiB

Загрузка…
Отмена
Сохранить