Просмотр исходного кода

lint: 修正笔记中英文标题/路径为中文,统一代码路径格式

OpenCode 2 дней назад
Родитель
Сommit
6574e546c4
16 измененных файлов с 235 добавлено и 235 удалено
  1. 7 7
      X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/01-实时操作系统基础.md
  2. 15 15
      X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/02-任务调度与状态管理.md
  3. 8 8
      X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/03-FreeRTOS移植指南.md
  4. 9 9
      X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/04-数据类型命名与配置详解.md
  5. 17 17
      X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/05-任务创建与删除.md
  6. 11 11
      X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/06-任务挂起与恢复.md
  7. 32 32
      X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/07-中断管理与临界段.md
  8. 11 11
      X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/08-时间片调度与延时管理.md
  9. 12 12
      X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/09-任务状态查询与运行时统计.md
  10. 13 13
      X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/10-消息队列.md
  11. 27 27
      X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/11-信号量机制.md
  12. 13 13
      X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/12-队列集.md
  13. 13 13
      X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/13-事件标志组.md
  14. 19 19
      X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/14-任务通知.md
  15. 18 18
      X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/15-软件定时器与Tickless低功耗.md
  16. 10 10
      X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/16-内存管理.md

+ 7 - 7
X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/01-实时操作系统基础.md

@@ -13,7 +13,7 @@ created: 2026-07-17
 
 ## 操作系统介绍
 
-### Basic concept
+### 基本概念
 
 **裸机开发**指在没有操作系统支持的情况下直接操作硬件,开发者需要亲自管理 CPU、内存和 I/O 资源。STM32 单片机的基础开发都属于裸机开发。
 
@@ -22,13 +22,13 @@ created: 2026-07-17
 - **操作系统**:介于硬件与应用之间的控制程序,负责资源分配与调度
 - **应用程序**:通过 OS 提供的 API 获取资源完成任务
 
-### Bare metal vs OS development
+### 裸机 vs 操作系统
 
 裸机开发的问题在于,所有逻辑都写在 main 函数的 while(1) 大循环中。当功能增多时,代码会变得难以维护——你要手动计算每个任务的执行时序,确保 LED 闪烁的同时还能响应按键、处理传感器数据。一旦需求变化,你可能需要重写整个循环结构。
 
 操作系统则将应用拆分为多个独立任务,每个任务只管自己的逻辑。操作系统负责"什么时候该运行哪个任务",开发者不用再操心时序问题。
 
-### General OS vs RTOS
+### 通用OS vs RTOS
 
 **通用操作系统**(Linux、Windows、macOS)优先保障系统流畅运行,公平调度所有程序,但无法保证某个任务在确定时间内完成。它们追求的是"平均响应好",而不是"最坏情况有保证"。
 
@@ -40,13 +40,13 @@ created: 2026-07-17
 
 ## FreeRTOS 简介
 
-### Basic concept
+### 基本概念
 
 FreeRTOS 是市场占有率最高的嵌入式实时操作系统,由美国的 **Richard Barry** 于 **2003 年**发布。2017 年被亚马逊收购,更名为 **AWS FreeRTOS**。
 
 采用 MIT 开源许可,每 170 秒就有一次下载。适用于微控制器和小型微处理器,突出**可靠性和易用性**。
 
-### Working principle
+### 工作原理
 
 FreeRTOS 作为一个小型 RTOS 内核,提供以下核心功能:
 
@@ -56,7 +56,7 @@ FreeRTOS 作为一个小型 RTOS 内核,提供以下核心功能:
 - **定时器与中断处理**:软件定时器和可靠的中断响应
 - **高可移植性**:支持多种芯片架构,移植只需替换 portable 层文件
 
-## Core API Reference Table
+## 核心函数速查表
 
 FreeRTOS 基础 API 分类概览(本章仅作了解,后续章节详细展开):
 
@@ -68,7 +68,7 @@ FreeRTOS 基础 API 分类概览(本章仅作了解,后续章节详细展开
 | 任务挂起 | `vTaskSuspend()` | 挂起任务 |
 | 任务恢复 | `vTaskResume()` | 恢复任务 |
 
-## Common Issues & Pitfalls
+## 常见问题与避坑
 
 - **不要把 RTOS 当成万能的**:RTOS 解决的是任务调度问题,不解决算法效率问题。一个低效的算法在任何系统上都是低效的。
 - **裸机思维转换**:从裸机转向 RTOS 时,不要试图在任务中手动控制时序——让调度器帮你做,用 `vTaskDelay` 代替 `HAL_Delay`。

+ 15 - 15
X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/02-任务调度与状态管理.md

@@ -13,7 +13,7 @@ created: 2026-07-17
 
 ## 多任务处理
 
-### Basic concept
+### 基本概念
 
 **内核**是操作系统的核心组件。多任务操作系统通过任务之间的快速切换,在单核处理器上制造出"并发执行"的假象。
 
@@ -28,13 +28,13 @@ created: 2026-07-17
 
 ## 任务调度
 
-### Working principle
+### 工作原理
 
 **调度器**是内核中负责决定"下一时刻运行哪个任务"的组件。**调度策略**是决定算法。
 
 FreeRTOS 默认使用**固定优先级的抢占式调度策略**,对同等优先级任务执行**时间片轮询**。
 
-### Scheduling modes
+### 调度模式
 
 | 模式 | 说明 | 适用场景 |
 |------|------|---------|
@@ -47,13 +47,13 @@ FreeRTOS 默认使用**固定优先级的抢占式调度策略**,对同等优
 
 ![时间片轮询调度](./assets/scheduling_timeslice.png)
 
-### Cooperative scheduling
+### 协程式调度
 
 除了抢占式调度,FreeRTOS 也支持协程式调度(configUSE_PREEMPTION = 0 时启用)。在协程式调度下,任务不会被强制打断,只有当任务主动调用 `taskYIELD()` 或阻塞等待时,调度器才会切换任务。协程式调度实时性较弱,一般不推荐使用。
 
 ## 任务状态
 
-### Four task states
+### 四种任务状态
 
 FreeRTOS 中任务共存在 4 种状态:
 
@@ -64,7 +64,7 @@ FreeRTOS 中任务共存在 4 种状态:
 | **阻塞态**(Blocked) | 等待延时或外部事件 | vTaskDelay、等待队列/信号量等 | 延时到、事件发生 |
 | **挂起态**(Suspended) | 类似暂停 | vTaskSuspend() | vTaskResume() 解挂 |
 
-### State transitions
+### 状态转换
 
 只有就绪态可以转变为运行态。其他状态的任务想要运行,必须先转变为就绪态。
 
@@ -72,7 +72,7 @@ FreeRTOS 中任务共存在 4 种状态:
 
 ## 滴答计数器
 
-### Working principle
+### 工作原理
 
 FreeRTOS 实时内核通过**滴答计数变量**(Tick Count)测量时间。SysTick 定时器中断以固定频率递增滴答数,每次中断称为一个 **RTOS 滴答**。
 
@@ -82,7 +82,7 @@ FreeRTOS 实时内核通过**滴答计数变量**(Tick Count)测量时间。
 
 ## 上下文切换
 
-### Basic concept
+### 基本概念
 
 **上下文**是任务执行时使用的所有处理器资源(寄存器、堆栈等)的集合。
 
@@ -91,13 +91,13 @@ FreeRTOS 实时内核通过**滴答计数变量**(Tick Count)测量时间。
 ![上下文切换——保存](./assets/context_switch_save.png)
 ![上下文切换——恢复](./assets/context_switch_restore.png)
 
-### Three triggers for context switch
+### 上下文切换的三种触发时机
 
 1. **RTOS 滴答中断**:处理就绪列表,判断是否抢占或时间片轮转
 2. **任务执行完毕**:任务函数返回时自动切换
 3. **主动让出**:调用 `taskYIELD()` 主动触发
 
-### PendSV mechanism
+### PendSV 机制
 
 实际的上下文切换在 **PendSV** 中断服务函数中完成。PendSV 被设置为**最低中断优先级**,这样上下文切换不会影响其他关键 ISR。
 
@@ -105,7 +105,7 @@ FreeRTOS 实时内核通过**滴答计数变量**(Tick Count)测量时间。
 
 ## 空闲任务
 
-### Basic concept
+### 基本概念
 
 调度器启动时**自动创建空闲任务**,以最低优先级创建,确保至少有一个任务可运行。
 
@@ -119,7 +119,7 @@ FreeRTOS 实时内核通过**滴答计数变量**(Tick Count)测量时间。
 
 ## 就绪列表
 
-### Ready list structure
+### 就绪列表结构
 
 就绪列表是 `pxReadyTasksLists[x]` 数组,其中 x 代表任务优先级(0 ~ configMAX_PRIORITIES-1)。
 
@@ -133,16 +133,16 @@ FreeRTOS 实时内核通过**滴答计数变量**(Tick Count)测量时间。
 
 调度器始终在所有就绪列表中选择**最高优先级**的任务来执行。
 
-## Core API Reference Table
+## 核心函数速查表
 
-| Function | Parameters | Return | Description |
+| 函数 | 参数 | 返回值 | 功能简述 |
 |----------|-----------|--------|-------------|
 | `vTaskStartScheduler()` | void | void | 启动任务调度器 |
 | `vTaskSuspend()` | TaskHandle_t | void | 挂起指定任务 |
 | `vTaskResume()` | TaskHandle_t | void | 恢复被挂起的任务 |
 | `taskYIELD()` | void | void | 主动请求任务切换 |
 
-## Common Issues & Pitfalls
+## 常见问题与避坑
 
 - **避免死循环占用 CPU**:任务循环中必须包含阻塞操作(vTaskDelay、等待队列等),否则同优先级或低优先级任务无法运行。
 - **优先级反转**:高优先级任务等待低优先级任务持有的资源时,可通过互斥信号量的优先级继承机制缓解。

+ 8 - 8
X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/03-FreeRTOS移植指南.md

@@ -13,7 +13,7 @@ created: 2026-07-17
 
 ## FreeRTOS 源码结构
 
-### Basic concept
+### 基本概念
 
 FreeRTOS 源码包顶层结构:
 
@@ -72,7 +72,7 @@ portable 目录是连接 FreeRTOS 与硬件的桥梁,包含两部分:
 
 ## HAL 库移植步骤
 
-### Step 1: 目录添加源码文件
+### 步骤1:目录添加源码文件
 
 1. 在工程根目录新建 `FreeRTOS/` 文件夹,其下创建 `portable/` 和 `source/`
 2. 复制 `FreeRTOS/Source/` 下的 **7 个 .c 文件**(tasks.c, queue.c, timers.c, event_groups.c, croutine.c, list.c, stream_buffer.c)到 `source/`
@@ -90,7 +90,7 @@ portable 目录是连接 FreeRTOS 与硬件的桥梁,包含两部分:
 2. 添加头文件路径:`FreeRTOS/include/` 和 `FreeRTOS/portable/RVDS/ARM_CM3/`
 3. `FreeRTOSConfig.h` 在 `Core/Inc/`(该路径通常已有)
 
-### Step 3: 修改 FreeRTOSConfig.h
+### 步骤3:修改 FreeRTOSConfig.h
 
 在 `FreeRTOSConfig.h` 中添加:
 
@@ -100,7 +100,7 @@ portable 目录是连接 FreeRTOS 与硬件的桥梁,包含两部分:
 #define INCLUDE_xTaskGetSchedulerState   1
 ```
 
-### Step 4: 修改 stm32f1xx_it.c
+### 步骤4:修改 stm32f1xx_it.c
 
 1. 添加头文件:
 ```c
@@ -134,7 +134,7 @@ void SysTick_Handler(void)
 }
 ```
 
-### Step 5: 解决 HAL + SysTick 冲突
+### 步骤5:解决 HAL + SysTick 冲突
 
 HAL 库默认使用 SysTick 作为时基。FreeRTOS 也依赖 SysTick 作为系统滴答。
 
@@ -160,15 +160,15 @@ void SysTick_Handler(void)
 }
 ```
 
-## Core API Reference Table
+## 核心函数速查表
 
-| Function | Parameters | Return | Description |
+| 函数 | 参数 | 返回值 | 功能简述 |
 |----------|-----------|--------|-------------|
 | `vTaskStartScheduler()` | void | void | 启动调度器 |
 | `xTaskGetSchedulerState()` | void | BaseType_t | 获取调度器状态(NOT_STARTED / RUNNING / SUSPENDED) |
 | `xPortSysTickHandler()` | void | void | 滴答中断处理函数(在 SysTick_Handler 中调用) |
 
-## Common Issues & Pitfalls
+## 常见问题与避坑
 
 - **PendSV_Handler 被注释掉了吗?**:FreeRTOS 接管了 PendSV_Handler,必须在 `stm32f1xx_it.c` 中注释掉原有的空函数,否则链接时冲突。
 - **SysTick 冲突卡死**:HAL 与 FreeRTOS 都默认使用 SysTick。启动调度器后,HAL 的 HAL_Delay 会失效甚至卡死。记得将 HAL 时基换到其他定时器。

+ 9 - 9
X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/04-数据类型命名与配置详解.md

@@ -13,7 +13,7 @@ created: 2026-07-17
 
 ## FreeRTOS 数据类型
 
-### Basic concept
+### 基本概念
 
 FreeRTOS 针对每个移植平台定义了四种核心数据类型,保证代码在不同架构间可移植。
 
@@ -34,11 +34,11 @@ FreeRTOS 针对每个移植平台定义了四种核心数据类型,保证代
 
 ## FreeRTOS 命名规范
 
-### Basic concept
+### 基本概念
 
 FreeRTOS 采用**匈牙利命名法**与**驼峰命名法**的结合。通过变量或函数的前缀就可以推测出返回类型和所属模块。
 
-### Variable prefixes
+### 变量名前缀
 
 | 前缀 | 含义 | 示例 |
 |------|------|------|
@@ -54,7 +54,7 @@ FreeRTOS 采用**匈牙利命名法**与**驼峰命名法**的结合。通过变
 | `p` | 指针(追加在其他前缀前) | `pucBuffer`(`uint8_t*`) |
 | `pc` | `char*`(指向 ASCII 字符串) | `pcTaskName` |
 
-### Function prefixes
+### 函数名前缀
 
 函数命名格式:`{返回类型前缀}{文件名}{功能}`
 
@@ -68,7 +68,7 @@ FreeRTOS 采用**匈牙利命名法**与**驼峰命名法**的结合。通过变
 
 例如 `vTaskDelay`:`v` → 返回 void,`Task` → 定义在 `tasks.c`,`Delay` → 功能是延时。
 
-### Macro naming
+### 宏命名规范
 
 | 规则 | 说明 | 示例 |
 |------|------|------|
@@ -76,7 +76,7 @@ FreeRTOS 采用**匈牙利命名法**与**驼峰命名法**的结合。通过变
 | 大写 + 下划线 | 可读性 | `pdTRUE`、`pdPASS`、`portMAX_DELAY` |
 | `pd` 前缀 | Protocol Define(协议定义) | `pdTRUE`、`pdFALSE`、`pdPASS`、`pdFAIL` |
 
-### Handle suffix
+### 句柄后缀
 
 | 后缀 | 含义 | 示例 |
 |------|------|------|
@@ -85,7 +85,7 @@ FreeRTOS 采用**匈牙利命名法**与**驼峰命名法**的结合。通过变
 
 ## FreeRTOSConfig.h 配置详解
 
-### Basic concept
+### 基本概念
 
 `FreeRTOSConfig.h` 是 FreeRTOS 的工程配置文件。它是一个纯头文件,在编译阶段确定内核行为。用户通过修改宏定义来裁剪内核功能,减少 ROM/RAM 占用。
 
@@ -190,7 +190,7 @@ FreeRTOS 采用**匈牙利命名法**与**驼峰命名法**的结合。通过变
 
 调试阶段建议开启 `configASSERT`,在参数错误时能快速定位问题。发布版本可关闭以减小代码体积。
 
-## Core API Reference Table
+## 核心函数速查表
 
 | API 类型 | 使能宏 | 功能 |
 |----------|--------|------|
@@ -201,7 +201,7 @@ FreeRTOS 采用**匈牙利命名法**与**驼峰命名法**的结合。通过变
 | `vTaskResume` | `INCLUDE_vTaskSuspend` | 恢复任务 |
 | `eTaskGetState` | `INCLUDE_eTaskGetState` | 获取任务状态 |
 
-## Common Issues & Pitfalls
+## 常见问题与避坑
 
 - **`INCLUDE_` 宏未定义导致链接错误**:调用某个 API 函数但对应的 `INCLUDE_` 宏为 0 或未定义时,编译可通过但链接会报 undefined reference。先确认 FreeRTOSConfig.h 中的使能配置。
 - **`configASSERT` 在发布版中应关闭**:断言会增加代码体积和运行开销,调试完功能后记得改为 0 或注释掉。

+ 17 - 17
X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/05-任务创建与删除.md

@@ -11,16 +11,16 @@ created: 2026-07-17
 
 > **用生活理解**:公司招人(创建任务)需要分配工位(栈)和建立档案(TCB);人员可以按编制内(静态)或外聘(动态)两种方式入职;裁员(删除任务)时需清理工位和档案。
 
-## Concept
+## 概念介绍
 
-### Basic concept
+### 基本概念
 
 FreeRTOS 中,一个**任务(Task)**包含三要素:
 - **任务函数**:用户编写的无限循环函数
 - **堆栈(Stack)**:保存任务上下文(寄存器、局部变量)
 - **TCB(Task Control Block)**:任务控制块,记录任务状态、优先级等信息
 
-### Working principle
+### 工作原理
 
 FreeRTOS 创建任务时:
 1. 分配栈空间和 TCB 内存
@@ -37,11 +37,11 @@ FreeRTOS 创建任务时:
 
 删除任务时使用 `vTaskDelete()`,任务被删除后不会再次运行,任务占用的资源会被释放。
 
-### Core API
+### 核心API
 
 #### 动态创建:xTaskCreate
 
-| Function | Params | Description |
+| 函数 | 参数 | 功能简述 |
 |----------|--------|-------------|
 | `xTaskCreate` | `pvTaskCode`, `pcName`, `usStackDepth`, `pvParameters`, `uxPriority`, `pxCreatedTask` | 动态创建一个新任务 |
 | | `pvTaskCode` | 任务函数指针 |
@@ -55,7 +55,7 @@ FreeRTOS 创建任务时:
 
 #### 静态创建:xTaskCreateStatic
 
-| Function | Params | Description |
+| 函数 | 参数 | 功能简述 |
 |----------|--------|-------------|
 | `xTaskCreateStatic` | `pvTaskCode`, `pcName`, `ulStackDepth`, `pvParameters`, `uxPriority`, `puxStackBuffer`, `pxTaskBuffer` | 静态创建一个新任务 |
 | | `puxStackBuffer` | 用户预先分配的栈空间 |
@@ -65,7 +65,7 @@ FreeRTOS 创建任务时:
 
 #### 删除任务:vTaskDelete
 
-| Function | Params | Description |
+| 函数 | 参数 | 功能简述 |
 |----------|--------|-------------|
 | `vTaskDelete` | `xTask` | 删除指定任务 |
 | | `xTask` | 待删除任务句柄;传 NULL 表示删除自身 |
@@ -75,23 +75,23 @@ FreeRTOS 创建任务时:
 
 当 `configSUPPORT_STATIC_ALLOCATION = 1` 时,必须提供以下两个钩子函数:
 
-| Function | Description |
+| 函数 | 功能简述 |
 |----------|-------------|
 | `vApplicationGetIdleTaskMemory` | 提供空闲任务的 TCB 和栈缓冲区 |
 | `vApplicationGetTimerTaskMemory` | 提供定时器任务的 TCB 和栈缓冲区 |
 
-## Experiment
+## 实验
 
-### Requirements
+### 需求描述
 
 - P01:动态创建 3 个任务,task1 翻转 LED1,task2 翻转 LED2,task3 检测按键删除 task1
 - P02:使用静态创建实现同样功能,并提供空闲任务和定时器任务的内存
 
-### Code Implementation
+### 代码实现
 
 #### P01:动态创建
 
-**File: 01_任务创建与删除_CubeMX/Core/Src/freertos_demo.c**
+**代码来源:**03_代码/01_动态创建任务和删除/Core/Src/freertos_demo.c
 
 ```c
 #include "freertos_demo.h"
@@ -231,7 +231,7 @@ void task3(void *pvParameters)
 
 #### P02:静态创建
 
-**File: 02_任务创建与删除_静态创建/Core/Src/freertos_demo.c**
+**代码来源:**03_代码/02_静态创建任务和删除/Core/Src/freertos_demo.c
 
 ```c
 #include "freertos_demo.h"
@@ -334,7 +334,7 @@ void start_task(void *pvParameters)
 /* task1/task2/task3 与动态创建版本相同 */
 ```
 
-### Key Config
+### 关键配置
 
 **P01 FreeRTOSConfig.h**(默认配置,无需特殊设置):
 
@@ -353,9 +353,9 @@ void start_task(void *pvParameters)
 #define configTIMER_TASK_STACK_DEPTH     256  // 定时器任务栈大小
 ```
 
-## Core API Reference Table
+## 核心函数速查表
 
-| Function | Parameters | Return | Description |
+| 函数 | 参数 | 返回值 | 功能简述 |
 |----------|-----------|--------|-------------|
 | `xTaskCreate` | pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask | BaseType_t | 动态创建任务 |
 | `xTaskCreateStatic` | pvTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, puxStackBuffer, pxTaskBuffer | TaskHandle_t | 静态创建任务 |
@@ -364,7 +364,7 @@ void start_task(void *pvParameters)
 | `vApplicationGetIdleTaskMemory` | ppxIdleTaskTCBBuffer, ppxIdleTaskStackBuffer, pulIdleTaskStackSize | void | 提供空闲任务内存(静态分配时) |
 | `vApplicationGetTimerTaskMemory` | ppxTimerTaskTCBBuffer, ppxTimerTaskStackBuffer, pulTimerTaskStackSize | void | 提供定时器任务内存(静态分配时) |
 
-## Common Issues & Pitfalls
+## 常见问题与避坑
 
 1. **栈溢出**:栈大小设置不当会导致任务异常。调试时可设置 `configCHECK_FOR_STACK_OVERFLOW` 为 1 或 2,并实现 `vApplicationStackOverflowHook()`。
 2. **删除后句柄未置空**:删除任务后其句柄仍指向原 TCB 地址,后续误用会导致崩溃。应在删除后立即将句柄置 `NULL`。

+ 11 - 11
X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/06-任务挂起与恢复.md

@@ -11,16 +11,16 @@ created: 2026-07-17
 
 > **用生活理解**:挂起任务就像把员工暂时调离岗位(保留工位和编制),不需要时让他歇着;恢复就像把他叫回来上班。而挂起调度器则像是整个公司暂停运转,所有员工原地待命。
 
-## Concept
+## 概念介绍
 
-### Basic concept
+### 基本概念
 
 **挂起(Suspend)** 将任务置于挂起态(Suspended State):
 - 任务暂停运行,调度器不再分配 CPU 时间给该任务
 - 任务在挂起态不会就绪,需要通过 `vTaskResume()` 手动恢复
 - 与阻塞态不同,挂起不存在超时机制,只能由外部显式恢复
 
-### Working principle
+### 工作原理
 
 FreeRTOS 提供两套挂起/恢复机制:
 
@@ -48,9 +48,9 @@ FreeRTOS 提供两套挂起/恢复机制:
 | 资源释放 | ❌ | ❌ | ✅ |
 | 恢复方式 | 手动 resume | 超时/事件触发 | 需重新创建 |
 
-## Experiment
+## 实验
 
-### Requirements
+### 需求描述
 
 - 创建 3 个任务,task1/task2 各自翻转到 LED,task3 检测按键:
   - KEY1 → `vTaskSuspend(task1)` 挂起 task1
@@ -59,9 +59,9 @@ FreeRTOS 提供两套挂起/恢复机制:
   - KEY4 → `xTaskResumeAll()` 恢复调度器
   - 每次按键后调用 `vTaskList()` 打印所有任务状态
 
-### Code Implementation
+### 代码实现
 
-**File: 03_任务挂起与恢复/Core/Src/freertos_demo.c**
+**代码来源:**03_代码/03_任务挂起与恢复/Core/Src/freertos_demo.c
 
 ```c
 #include "freertos_demo.h"
@@ -198,7 +198,7 @@ void task3(void *pvParameters)
 }
 ```
 
-### Key Config
+### 关键配置
 
 **FreeRTOSConfig.h**(启用任务状态跟踪功能):
 
@@ -212,9 +212,9 @@ void task3(void *pvParameters)
 #define configUSE_STATS_FORMATTING_FUNCTIONS   1
 ```
 
-## Core API Reference Table
+## 核心函数速查表
 
-| Function | Parameters | Return | Description |
+| 函数 | 参数 | 返回值 | 功能简述 |
 |----------|-----------|--------|-------------|
 | `vTaskSuspend` | xTaskToSuspend | void | 挂起指定任务,使其进入挂起态 |
 | `vTaskResume` | xTaskToResume | void | 恢复指定任务,使任务就绪 |
@@ -223,7 +223,7 @@ void task3(void *pvParameters)
 | `xTaskResumeAll` | 无 | BaseType_t | 恢复调度器,返回 pdTRUE 表示有挂起的切换 |
 | `vTaskList` | pcWriteBuffer | void | 将任务状态写入字符串缓冲区 |
 
-## Common Issues & Pitfalls
+## 常见问题与避坑
 
 1. **挂起调度器时不得调用 FreeRTOS API**:`vTaskSuspendAll()` 之后调用 `vTaskDelay()`、`xQueueSend()` 等会导致断言失败。只在临界代码段中使用。
 2. **挂起任务与调度器挂起的区别**:`vTaskSuspend()` 只针对单个任务,其余任务正常运行;`vTaskSuspendAll()` 影响所有任务,常用于保护短代码段。

+ 32 - 32
X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/07-中断管理与临界段.md

@@ -6,14 +6,13 @@ author: "尚硅谷研究院"
 date: 2026-07-17
 created: 2026-07-17
 ---
-
 # 中断管理与临界段
 
 > **用生活理解**:中断就像领导突然敲门安排紧急任务——你得先把手头工作保存好(保存上下文),处理完紧急任务再回来继续。临界区则像"开会时手机静音"——某些关键时刻不允许被打断。
 
-## Concept
+## 概念介绍
 
-### Basic concept
+### 基本概念
 
 FreeRTOS 需要管理中断以确保系统的实时性和确定性。其核心思路是:
 
@@ -21,31 +20,32 @@ FreeRTOS 需要管理中断以确保系统的实时性和确定性。其核心
 - **BASEPRI 优先级屏蔽**:只屏蔽优先级低于阈值的中断,高优先级中断仍可响应
 - **中断安全 API(FromISR 后缀)**:可在中断服务函数中安全调用的 API 版本
 
-### Working principle
+### 工作原理
 
 FreeRTOS 提供两个层次的中断控制:
 
 **1. 临界段保护(完整中断屏蔽)**
 
-| API | 描述 |
-|-----|------|
-| `taskENTER_CRITICAL()` | 进入临界区,关闭所有中断(有嵌套计数) |
-| `taskEXIT_CRITICAL()` | 退出临界区,恢复之前的中断状态 |
-| `taskENTER_CRITICAL_FROM_ISR()` | 从中断中进入临界区 |
-| `taskEXIT_CRITICAL_FROM_ISR()` | 从中断中退出临界区 |
+| API                               | 描述                                   |
+| --------------------------------- | -------------------------------------- |
+| `taskENTER_CRITICAL()`          | 进入临界区,关闭所有中断(有嵌套计数) |
+| `taskEXIT_CRITICAL()`           | 退出临界区,恢复之前的中断状态         |
+| `taskENTER_CRITICAL_FROM_ISR()` | 从中断中进入临界区                     |
+| `taskEXIT_CRITICAL_FROM_ISR()`  | 从中断中退出临界区                     |
 
 任务级临界区内部维护一个嵌套计数器(uxCriticalNesting):
+
 - 第一次进入时关闭中断
 - 嵌套进入时仅增加计数
 - 每次退出递减计数,减到 0 时恢复中断
 
 **2. 中断开关(直接操作)**
 
-| API | 描述 |
-|-----|------|
-| `portDISABLE_INTERRUPTS()` | 直接关闭所有中断 |
-| `portENABLE_INTERRUPTS()` | 直接打开所有中断 |
-| 注意:无嵌套保护,不推荐用于临界段 |
+| API                                | 描述             |
+| ---------------------------------- | ---------------- |
+| `portDISABLE_INTERRUPTS()`       | 直接关闭所有中断 |
+| `portENABLE_INTERRUPTS()`        | 直接打开所有中断 |
+| 注意:无嵌套保护,不推荐用于临界段 |                  |
 
 **3. BASEPRI 优先级屏蔽**
 
@@ -63,18 +63,18 @@ configMAX_SYSCALL_INTERRUPT_PRIORITY = 5 << 4    // API可调用的最高中断
 
 在 ISR 中只做最少的处理(记录事件、发送信号量/消息到队列),将耗时逻辑推迟到任务中执行。这是 RTOS 中推荐的中断处理模式。
 
-## Experiment
+## 实验
 
-### Requirements
+### 需求描述
 
 - task1 检测按键:
   - KEY1 → `portDISABLE_INTERRUPTS()` 关闭中断(LED1 停止响应)
   - KEY2 → `portENABLE_INTERRUPTS()` 打开中断(LED1 恢复)
 - 对比 `vTaskDelay()` 和 `HAL_Delay()` 的行为差异
 
-### Code Implementation
+### 代码实现
 
-**File: 04_中断管理/Core/Src/freertos_demo.c**
+代码来源:04_中断管理/Core/Src/freertos_demo.c
 
 ```c
 #include "freertos_demo.h"
@@ -158,7 +158,7 @@ void task1(void *pvParameters)
 }
 ```
 
-### Key Config
+### 关键配置
 
 **FreeRTOSConfig.h**(中断优先级配置):
 
@@ -176,20 +176,20 @@ void task1(void *pvParameters)
 #define configMAX_API_CALL_INTERRUPT_PRIORITY configMAX_SYSCALL_INTERRUPT_PRIORITY
 ```
 
-## Core API Reference Table
+## 核心函数速查表
 
-| Function | Parameters | Return | Description |
-|----------|-----------|--------|-------------|
-| `taskENTER_CRITICAL()` | 无 | void | 进入临界区(支持嵌套) |
-| `taskEXIT_CRITICAL()` | 无 | void | 退出临界区(嵌套计数减一) |
-| `taskENTER_CRITICAL_FROM_ISR()` | 无 | uint32_t | 从中断进入临界区,返回中断屏蔽状态 |
-| `taskEXIT_CRITICAL_FROM_ISR(ux)` | uxSavedMaskStatus | void | 从中断退出临界区,恢复中断状态 |
-| `portDISABLE_INTERRUPTS()` | 无 | void | 直接关闭所有中断 |
-| `portENABLE_INTERRUPTS()` | 无 | void | 直接打开所有中断 |
-| `portDISABLE_INTERRUPTS_FROM_ISR()` | 无 | UBaseType_t | ISR中关闭中断 |
-| `portENABLE_INTERRUPTS_FROM_ISR(ux)` | uxSavedStatus | void | ISR中恢复中断 |
+| 函数                                   | 参数              | 返回值      | 功能简述                           |
+| -------------------------------------- | ----------------- | ----------- | ---------------------------------- |
+| `taskENTER_CRITICAL()`               | 无                | void        | 进入临界区(支持嵌套)             |
+| `taskEXIT_CRITICAL()`                | 无                | void        | 退出临界区(嵌套计数减一)         |
+| `taskENTER_CRITICAL_FROM_ISR()`      | 无                | uint32_t    | 从中断进入临界区,返回中断屏蔽状态 |
+| `taskEXIT_CRITICAL_FROM_ISR(ux)`     | uxSavedMaskStatus | void        | 从中断退出临界区,恢复中断状态     |
+| `portDISABLE_INTERRUPTS()`           | 无                | void        | 直接关闭所有中断                   |
+| `portENABLE_INTERRUPTS()`            | 无                | void        | 直接打开所有中断                   |
+| `portDISABLE_INTERRUPTS_FROM_ISR()`  | 无                | UBaseType_t | ISR中关闭中断                      |
+| `portENABLE_INTERRUPTS_FROM_ISR(ux)` | uxSavedStatus     | void        | ISR中恢复中断                      |
 
-## Common Issues & Pitfalls
+## 常见问题与避坑
 
 1. **HAL_Delay 在中断关闭后卡死**:`HAL_Delay()` 依赖 SysTick 中断更新 uwTick 变量。如果通过 `portDISABLE_INTERRUPTS()` 关闭了中断,SysTick 无法触发,`HAL_Delay` 将永远死等。
 2. **临界区内不要执行耗时操作**:临界区内所有中断被屏蔽,包括 SysTick。长时间停留在临界区内会破坏系统的实时性。

+ 11 - 11
X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/08-时间片调度与延时管理.md

@@ -11,7 +11,7 @@ created: 2026-07-17
 
 > **用生活理解**:时间片调度就像自助餐厅的取餐规则——同等级的人轮流取菜,每人吃一口就轮到下一位(Round-Robin)。vTaskDelay 相当于"我过一会儿再来排队",vTaskDelayUntil 则是"以后每周二下午三点我来,雷打不动"。
 
-## Concept
+## 概念介绍
 
 ### Time slice scheduling
 
@@ -24,7 +24,7 @@ created: 2026-07-17
 
 时间片 = 1 个 Tick = 1 / configTICK_RATE_HZ 秒
 
-### Working principle
+### 工作原理
 
 **抢占式调度 + 时间片调度**:
 
@@ -60,9 +60,9 @@ created: 2026-07-17
 → 无论任务执行多久,周期始终为 500ms
 ```
 
-## Experiment
+## 实验
 
-### Requirements
+### 需求描述
 
 **P05(时间片调度)**:
 - 2 个同优先级任务(优先级均为 2),各自进入临界区打印计数后退出
@@ -73,11 +73,11 @@ created: 2026-07-17
 - task1:使用 `vTaskDelay(500)` + `HAL_Delay(20)` 模拟工作 → 演示漂移
 - task2:使用 `vTaskDelayUntil(&pxPreviousWakeTime, 500)` + `HAL_Delay(20)` → 演示固定周期
 
-### Code Implementation
+### 代码实现
 
 #### P05:时间片调度
 
-**File: 05_时间片调度/Core/Src/freertos_demo.c**
+**代码来源:**03_代码/05_时间片调度/Core/Src/freertos_demo.c
 
 ```c
 #include "freertos_demo.h"
@@ -169,7 +169,7 @@ void task2(void *pvParameters)
 
 #### P08:延时函数对比
 
-**File: 08_延时函数/Core/Src/freertos_demo.c**
+**代码来源:**03_代码/08_时间延时函数/Core/Src/freertos_demo.c
 
 ```c
 #include "freertos_demo.h"
@@ -249,7 +249,7 @@ void task2(void *pvParameters)
 }
 ```
 
-### Key Config
+### 关键配置
 
 **P05 FreeRTOSConfig.h**(降低 Tick 频率便于观察时间片):
 
@@ -259,9 +259,9 @@ void task2(void *pvParameters)
 #define configUSE_PREEMPTION       1     // 启用抢占式调度(必须)
 ```
 
-## Core API Reference Table
+## 核心函数速查表
 
-| Function | Parameters | Return | Description |
+| 函数 | 参数 | 返回值 | 功能简述 |
 |----------|-----------|--------|-------------|
 | `vTaskDelay` | xTicksToDelay | void | 相对延时,从调用时开始计时 |
 | `vTaskDelayUntil` | pxPreviousWakeTime, xTimeIncrement | BaseType_t | 绝对延时,固定周期 |
@@ -270,7 +270,7 @@ void task2(void *pvParameters)
 | `configUSE_TIME_SLICING` | 宏定义 | — | 启用/禁用的时间片调度 |
 | `HAL_Delay` | Delay | void | HAL 库忙等待延时(阻塞 CPU) |
 
-## Common Issues & Pitfalls
+## 常见问题与避坑
 
 1. **vTaskDelay 的漂移累积**:如果任务内部的执行时间不固定,`vTaskDelay` 会导致周期逐渐漂移。对周期有严格要求的场景必须使用 `vTaskDelayUntil`。
 2. **vTaskDelayUntil 的初次使用**:`vTaskDelayUntil` 要求 `pxPreviousWakeTime` 初始化为 `xTaskGetTickCount()`,且在每次调用后会被 API 自动更新。

+ 12 - 12
X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/09-任务状态查询与运行时统计.md

@@ -11,9 +11,9 @@ created: 2026-07-17
 
 > **用生活理解**:任务状态查询就像给公司做一次全面盘点——有多少员工(任务数)、每个员工的职级(优先级)、当前在干嘛(运行/就绪/阻塞)、堆栈压力(水位线)一目了然。运行时统计则像月底看考勤——每个员工干了多少活,一目了然。
 
-## Concept
+## 概念介绍
 
-### Basic concept
+### 基本概念
 
 FreeRTOS 提供一套丰富的 API 用于查询任务运行时信息,包括:
 
@@ -25,7 +25,7 @@ FreeRTOS 提供一套丰富的 API 用于查询任务运行时信息,包括:
 - **任务列表**:以可读文本格式输出所有任务信息
 - **运行时统计**:需要额外硬件定时器,统计各任务占用 CPU 的百分比
 
-### Working principle
+### 工作原理
 
 **运行时统计(Run Time Stats)** 需要额外的硬件定时器作为时钟源:
 
@@ -47,9 +47,9 @@ task2          9876        36.1
 IDLE           5120        18.7
 ```
 
-## Experiment
+## 实验
 
-### Requirements
+### 需求描述
 
 **P06(状态查询 API)**:
 - task2 一次性调用所有状态查询 API 并打印结果:
@@ -65,11 +65,11 @@ IDLE           5120        18.7
 - task2 每隔 500ms 打印 `vTaskGetRunTimeStats()` 结果
 - 需要 TIM6 提供高频计时
 
-### Code Implementation
+### 代码实现
 
 #### P06:任务状态查询
 
-**File: 06_任务状态查询/Core/Src/freertos_demo.c**
+**代码来源:**03_代码/06_任务状态查询/Core/Src/freertos_demo.c
 
 ```c
 #include "freertos_demo.h"
@@ -212,7 +212,7 @@ void task2(void *pvParameters)
 
 #### P07:运行时统计
 
-**File: 07_任务运行时间统计/Core/Src/freertos_demo.c**
+**代码来源:**03_代码/07_任务时间统计/Core/Src/freertos_demo.c
 
 ```c
 #include "freertos_demo.h"
@@ -290,7 +290,7 @@ void task2(void *pvParameters)
 }
 ```
 
-### Key Config
+### 关键配置
 
 **P06 FreeRTOSConfig.h**(启用查询功能):
 
@@ -316,9 +316,9 @@ extern volatile unsigned long ulHighFrequencyTimerTicks;  // 高频定时器计
 #define configUSE_STATS_FORMATTING_FUNCTIONS   1
 ```
 
-## Core API Reference Table
+## 核心函数速查表
 
-| Function | Parameters | Return | Description |
+| 函数 | 参数 | 返回值 | 功能简述 |
 |----------|-----------|--------|-------------|
 | `uxTaskPriorityGet` | xTask | UBaseType_t | 获取任务优先级 |
 | `vTaskPrioritySet` | xTask, uxNewPriority | void | 设置任务优先级 |
@@ -332,7 +332,7 @@ extern volatile unsigned long ulHighFrequencyTimerTicks;  // 高频定时器计
 | `vTaskList` | pcWriteBuffer | void | 将任务列表格式化输出为可读字符串 |
 | `vTaskGetRunTimeStats` | pcWriteBuffer | void | 获取任务运行时统计信息 |
 
-## Common Issues & Pitfalls
+## 常见问题与避坑
 
 1. **configUSE_TRACE_FACILITY 必须开启**:`vTaskList()`、`uxTaskGetSystemState()`、`eTaskGetState()` 等函数都需要此宏为 1。
 2. **configUSE_STATS_FORMATTING_FUNCTIONS 与 vTaskList**:`vTaskList()` 需要同时开启 `configUSE_TRACE_FACILITY` 和 `configUSE_STATS_FORMATTING_FUNCTIONS`。

+ 13 - 13
X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/10-消息队列.md

@@ -11,9 +11,9 @@ created: 2026-07-17
 
 > **用生活理解**:消息队列就像快递柜。寄件人(发送任务)把包裹放进柜子,收件人(接收任务)从柜子里取走。柜子有固定数量的格子(队列长度),格子满了寄件人就得排队等空位,格子空了收件人就得等新包裹。每个格子只放固定尺寸的物品(数据拷贝),而不是放一把钥匙让你自己去取(传指针)。
 
-## Concept
+## 概念介绍
 
-### Basic concept
+### 基本概念
 
 队列(Queue)是 FreeRTOS 中任务间通信的主要形式,用于在**任务之间**以及**中断和任务之间**发送消息。
 
@@ -22,7 +22,7 @@ created: 2026-07-17
 - **阻塞操作**:队列满时发送方可阻塞等待,队列空时接收方可阻塞等待
 - **传值而非传指针**:数据被拷贝到队列中(对于大数据可传指针优化)
 
-### Working principle
+### 工作原理
 
 队列内部结构包含:
 - **环形缓冲区**:存储实际数据
@@ -31,9 +31,9 @@ created: 2026-07-17
 
 当队列有空间时,最高优先级的等待发送任务将解除阻塞;当队列有数据时,最高优先级的等待接收任务将解除阻塞。
 
-### Core API
+### 核心API
 
-| Function | Params | Description |
+| 函数 | 参数 | 功能简述 |
 |----------|--------|-------------|
 | `xQueueCreate()` | `uxQueueLength`, `uxItemSize` | 动态创建队列 |
 | `xQueueSend()` | `xQueue`, `pvItemToQueue`, `xTicksToWait` | 尾部写入消息 |
@@ -43,9 +43,9 @@ created: 2026-07-17
 | `xQueuePeek()` | 同上 | 头部读取消息(不删除) |
 | `xQueueOverwrite()` | `xQueue`, `pvItemToQueue` | 覆写(仅队列长度=1时可用) |
 
-## Experiment
+## 实验
 
-### Requirements
+### 需求描述
 
 学习使用 FreeRTOS 队列相关函数,包括创建队列、入队和出队操作:
 
@@ -53,9 +53,9 @@ created: 2026-07-17
 - **task2**:从 `queue1` 读取消息并打印键值
 - **task3**:从 `big_queue` 读取大数据地址,通过地址访问数据
 
-### Code Implementation
+### 代码实现
 
-**File: P09/09_消息队列/Core/Src/freertos_demo.c**
+**代码来源:**03_代码/09_消息队列/Core/Src/freertos_demo.c
 
 ```c
 #include "queue.h"                          /* 队列操作头文件 */
@@ -207,16 +207,16 @@ void Task3(void *pvParameters)
 }
 ```
 
-### Key Config
+### 关键配置
 
 ```c
 /* FreeRTOSConfig.h */
 #define configQUEUE_REGISTRY_SIZE   8   /* 可注册的队列/信号量个数 */
 ```
 
-## Core API Reference Table
+## 核心函数速查表
 
-| Function | Parameters | Return | Description |
+| 函数 | 参数 | 返回值 | 功能简述 |
 |----------|-----------|--------|-------------|
 | `QueueHandle_t xQueueCreate(uxQueueLength, uxItemSize)` | 队列长度, 每项字节数 | NULL=失败, 非NULL=句柄 | 动态创建队列 |
 | `BaseType_t xQueueSend(xQueue, pvItemToQueue, xTicksToWait)` | 队列句柄, 数据指针, 超时ticks | pdPASS/errQUEUE_FULL | 尾部写入 |
@@ -226,7 +226,7 @@ void Task3(void *pvParameters)
 | `BaseType_t xQueueOverwrite(xQueue, pvItemToQueue)` | 队列句柄, 数据指针 | pdPASS | 覆写(长度须为1) |
 | `UBaseType_t uxQueueMessagesWaiting(xQueue)` | 队列句柄 | 当前消息数 | 查询队列中消息数量 |
 
-## Common Issues & Pitfalls
+## 常见问题与避坑
 
 1. **队列项大小与发送不匹配**:`xQueueCreate` 的 `uxItemSize` 必须与发送数据大小一致。传结构体时特别注意大小。
 2. **队列满导致死等**:发送时若 `xTicksToWait = portMAX_DELAY` 且队列始终无空位,任务将永久阻塞。建议设计时确保接收方及时取走数据。

+ 27 - 27
X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/11-信号量机制.md

@@ -11,9 +11,9 @@ created: 2026-07-17
 
 > **用生活理解**:信号量就像动车上的卫生间指示灯。二值信号量 = 一个卫生间,有人/无人两种状态(0/1);计数信号量 = 一排卫生间,有几个空闲就给几个"可用"标志;互斥信号量 = 带"插队保护"的卫生间——如果一个大佬(高优先级任务)在等,正占用卫生间的人会临时获得"VIP卡"(优先级提升),赶紧用完让位。
 
-## Concept
+## 概念介绍
 
-### Basic concept
+### 基本概念
 
 信号量(Semaphore)是 FreeRTOS 中用于任务间同步和资源管理的机制,底层基于队列实现。
 
@@ -21,7 +21,7 @@ created: 2026-07-17
 - **计数信号量**:可取 0~N,本质是长度为 N 的队列。用于资源计数
 - **互斥信号量**:特殊的二值信号量,具有**优先级继承**特性,解决优先级翻转问题
 
-### Working principle
+### 工作原理
 
 信号量操作只有两个:**Give(释放)**和 **Take(获取)**。
 - Take 成功减 1,Give 成功加 1
@@ -36,9 +36,9 @@ created: 2026-07-17
 - 低优先级任务持有互斥信号量时,若有高优先级任务在等待,低优先级任务被**临时提升**到高优先级任务的优先级
 - 释放后恢复原优先级,中优先级任务无法再抢占
 
-### Core API
+### 核心API
 
-| Function | Params | Description |
+| 函数 | 参数 | 功能简述 |
 |----------|--------|-------------|
 | `xSemaphoreCreateBinary()` | 无 | 动态创建二值信号量 |
 | `xSemaphoreCreateCounting()` | `uxMaxCount`, `uxInitialCount` | 动态创建计数信号量 |
@@ -47,23 +47,23 @@ created: 2026-07-17
 | `xSemaphoreTake()` | `xSemaphore`, `xTicksToWait` | 获取信号量 |
 | `uxSemaphoreGetCount()` | `xSemaphore` | 获取当前计数值 |
 
-### Comparison Table
+### 对比表
 
-| Feature | Binary | Counting | Mutex |
-|---------|--------|----------|-------|
-| Initial Value | 0 | User specified | 1 |
-| Max Value | 1 | User specified | 1 |
-| Priority Inheritance | No | No | Yes |
-| Recursive | No | No | Configurable |
-| Use Case | Event notification | Resource counting | Mutual exclusion |
+| 特性 | 二值信号量 | 计数信号量 | 互斥信号量 |
+|------|-----------|-----------|-----------|
+| 初始值 | 0 | 用户指定 | 1 |
+| 最大值 | 1 | 用户指定 | 1 |
+| 优先级继承 | 否 | 否 | 有 |
+| 递归获取 | 否 | 否 | 可配置 |
+| 适用场景 | 事件通知 | 资源计数 | 互斥访问 |
 
-## Experiment
+## 实验
 
-### Experiment 1: 二值信号量 (P10)
+### 实验1:二值信号量 (P10)
 
-**Requirements**: KEY1 释放信号量 → task2 获取信号量并打印。
+**需求**:KEY1 释放信号量 → task2 获取信号量并打印。
 
-**File: P10/10_二值信号量/Core/Src/freertos_demo.c**
+**代码来源:**03_代码/10_二值信号量/Core/Src/freertos_demo.c
 
 ```c
 #include "semphr.h"                         /* 信号量操作头文件 */
@@ -127,11 +127,11 @@ void Task2(void *pvParameters)
 }
 ```
 
-### Experiment 2: 计数型信号量 (P11)
+### 实验2:计数型信号量 (P11)
 
 **Requirements**: KEY1 释放计数信号量,task2 每秒获取一次并打印计数值。
 
-**File: P11/11_计数型信号量/Core/Src/freertos_demo.c**
+**代码来源:**03_代码/11_计数型信号量/Core/Src/freertos_demo.c
 
 ```c
 #include "semphr.h"
@@ -188,11 +188,11 @@ void Task2(void *pvParameters)
 }
 ```
 
-### Experiment 3: 优先级翻转 (P12)
+### 实验3:优先级翻转 (P12)
 
 **Requirements**: 模拟优先级翻转场景,观察使用二值信号量时的"倒反天罡"现象。
 
-**File: P12/12_优先级翻转/Core/Src/freertos_demo.c**
+**代码来源:**03_代码/12_优先级翻转/Core/Src/freertos_demo.c
 
 ```c
 #include "semphr.h"
@@ -260,11 +260,11 @@ void Task3(void *pvParameters)
 }
 ```
 
-### Experiment 4: 互斥信号量 (P13)
+### 实验4:互斥信号量 (P13)
 
 **Requirements**: 与 P12 相同实验场景,但使用互斥信号量 `xSemaphoreCreateMutex()` 观察优先级继承解决翻转。
 
-**File: P13/13_互斥信号量/Core/Src/freertos_demo.c**
+**代码来源:**03_代码/13_互斥信号量/Core/Src/freertos_demo.c
 
 ```c
 #include "semphr.h"
@@ -328,7 +328,7 @@ void Task3(void *pvParameters)
 }
 ```
 
-### Key Config
+### 关键配置
 
 ```c
 /* FreeRTOSConfig.h */
@@ -337,9 +337,9 @@ void Task3(void *pvParameters)
 #define configUSE_RECURSIVE_MUTEXES     1   /* 使能递归互斥信号量 */
 ```
 
-## Core API Reference Table
+## 核心函数速查表
 
-| Function | Parameters | Return | Description |
+| 函数 | 参数 | 返回值 | 功能简述 |
 |----------|-----------|--------|-------------|
 | `SemaphoreHandle_t xSemaphoreCreateBinary()` | 无 | NULL=失败 | 创建二值信号量(初始0) |
 | `SemaphoreHandle_t xSemaphoreCreateCounting(uxMaxCount, uxInitialCount)` | 最大计数值, 初始值 | NULL=失败 | 创建计数信号量 |
@@ -350,7 +350,7 @@ void Task3(void *pvParameters)
 | `UBaseType_t uxSemaphoreGetCount(xSemaphore)` | 信号量句柄 | 当前计数值 | 查询当前计数 |
 | `BaseType_t xSemaphoreCreateRecursiveMutex()` | 无 | 句柄/NULL | 创建递归互斥信号量 |
 
-## Common Issues & Pitfalls
+## 常见问题与避坑
 
 1. **二值信号量初始值为 0**:创建后需先 Give 一次才能被 Take。常见错误是忘记初始 Give 导致第一个 Take 永远阻塞。
 2. **互斥信号量不能在中断中使用**:因为优先级继承机制依赖任务上下文。ISR 中使用 `xSemaphoreGiveFromISR()` 仅对二值/计数信号量有效。

+ 13 - 13
X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/12-队列集.md

@@ -11,9 +11,9 @@ created: 2026-07-17
 
 > **用生活理解**:队列集就像医院的叫号系统。你去挂号(注册队列),然后在候诊区等待。不管是哪个科室(队列/信号量)叫号,你都能听到(统一通知)。不用每个科室门口都去排队看。
 
-## Concept
+## 概念介绍
 
-### Basic concept
+### 基本概念
 
 队列集(Queue Set)是 FreeRTOS 中用于管理多个队列/信号量的数据结构。它解决了"一个任务需要等待多个队列或信号量"的问题。
 
@@ -21,7 +21,7 @@ created: 2026-07-17
 - **统一等待**:任务调用 `xQueueSelectFromSet()` 阻塞等待任一注册成员有数据
 - **单出接口**:哪个成员有数据,返回该成员的句柄;任务再对该成员执行读操作
 
-### Working principle
+### 工作原理
 
 1. 创建队列集(指定可容纳的成员数量)
 2. 创建队列、信号量等成员
@@ -33,9 +33,9 @@ created: 2026-07-17
 - 队列集中的成员不能独立删除(必须先移出集再删除)
 - 队列集的大小在创建时固定
 
-### Core API
+### 核心API
 
-| Function | Params | Description |
+| 函数 | 参数 | 功能简述 |
 |----------|--------|-------------|
 | `xQueueCreateSet()` | `uxEventQueueLength` | 创建队列集 |
 | `xQueueAddToSet()` | `xQueueOrSemaphore`, `xQueueSet` | 注册成员到队列集 |
@@ -43,18 +43,18 @@ created: 2026-07-17
 | `xQueueSelectFromSet()` | `xQueueSet`, `xTicksToWait` | 等待队列集中任一成员有数据 |
 | `xQueueSelectFromSetFromISR()` | `xQueueSet` | 中断中查询就绪成员 |
 
-## Experiment
+## 实验
 
-### Requirements
+### 需求描述
 
 学习使用 FreeRTOS 队列集:
 
 - **task1**:KEY1 → 往队列写入数据;KEY2 → 释放二值信号量
 - **task2**:从队列集中等待,根据返回的成员句柄执行对应操作
 
-### Code Implementation
+### 代码实现
 
-**File: P14/14_队列集/Core/Src/freertos_demo.c**
+**代码来源:**03_代码/14_队列集/Core/Src/freertos_demo.c
 
 ```c
 #include "queue.h"                          /* 队列操作头文件 */
@@ -179,16 +179,16 @@ void Task2(void *pvParameters)
 }
 ```
 
-### Key Config
+### 关键配置
 
 ```c
 /* FreeRTOSConfig.h */
 #define configUSE_QUEUE_SETS    1   /* 使能队列集功能 */
 ```
 
-## Core API Reference Table
+## 核心函数速查表
 
-| Function | Parameters | Return | Description |
+| 函数 | 参数 | 返回值 | 功能简述 |
 |----------|-----------|--------|-------------|
 | `QueueSetHandle_t xQueueCreateSet(uxEventQueueLength)` | 事件队列长度 | NULL=失败 | 创建队列集 |
 | `BaseType_t xQueueAddToSet(xQueueOrSemaphore, xQueueSet)` | 成员句柄, 队列集句柄 | pdPASS/pdFAIL | 注册成员 |
@@ -196,7 +196,7 @@ void Task2(void *pvParameters)
 | `QueueSetMemberHandle_t xQueueSelectFromSet(xQueueSet, xTicksToWait)` | 队列集句柄, 超时 | NULL=超时 | 等待就绪成员 |
 | `QueueSetMemberHandle_t xQueueSelectFromSetFromISR(xQueueSet)` | 队列集句柄 | NULL=无就绪 | ISR中查询就绪成员 |
 
-## Common Issues & Pitfalls
+## 常见问题与避坑
 
 1. **队列集大小需足够**:`xQueueCreateSet(N)` 的 N 必须 ≥ 注册的成员总数,否则注册可能失败。
 2. **已注册成员不可独立删除**:必须先 `xQueueRemoveFromSet()` 再删除,否则行为未定义。

+ 13 - 13
X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/13-事件标志组.md

@@ -11,9 +11,9 @@ created: 2026-07-17
 
 > **用生活理解**:事件标志组就像任务清单上的多个"待办事项"打勾。你可以等"所有事项都完成"(AND逻辑)才行动,也可以等"任意一个完成"(OR逻辑)就行动。打勾后还可以选择"自动擦掉"(自动清除)或"留着标记"(手动清除)。
 
-## Concept
+## 概念介绍
 
-### Basic concept
+### 基本概念
 
 事件标志组(Event Group)是 FreeRTOS 中用于任务间事件通知和同步的轻量级机制。每个标志位代表一个特定的状态或事件。
 
@@ -23,7 +23,7 @@ created: 2026-07-17
 - **自动清除**:等待成功后自动清零标志位
 - **手动清除**:等待成功后标志位保持不变,需手动 `xEventGroupClearBits()`
 
-### Working principle
+### 工作原理
 
 事件标志组中的所有事件位存储在 `EventBits_t` 类型的单个无符号整数变量中。位 0 存储事件 0,位 1 存储事件 1,以此类推。
 
@@ -37,9 +37,9 @@ created: 2026-07-17
 | 每个位代表不同事件 | 计数器表示可用资源数量 |
 | 任务可等待多个位同时/任一个发生 | 任务等待计数值 > 0 |
 
-### Core API
+### 核心API
 
-| Function | Params | Description |
+| 函数 | 参数 | 功能简述 |
 |----------|--------|-------------|
 | `xEventGroupCreate()` | 无 | 动态创建事件标志组 |
 | `xEventGroupSetBits()` | `xEventGroup`, `uxBitsToSet` | 设置事件标志位 |
@@ -48,18 +48,18 @@ created: 2026-07-17
 | `xEventGroupSync()` | `xEventGroup`, `uxBitsToSet`, `uxBitsToWaitFor`, `xTicksToWait` | 设置并等待(原子操作) |
 | `xEventGroupGetBits()` | `xEventGroup` | 获取当前事件标志位值 |
 
-## Experiment
+## 实验
 
-### Requirements
+### 需求描述
 
 学习使用 FreeRTOS 事件标志组:
 
 - **task1**:KEY1 → 置位 EVENTBIT_0;KEY2 → 置位 EVENTBIT_1
 - **task2**:等待 EVENTBIT_0 和 EVENTBIT_1 **都**置位后打印,自动清除
 
-### Code Implementation
+### 代码实现
 
-**File: P15/15_事件标志组/Core/Src/freertos_demo.c**
+**代码来源:**03_代码/15_事件标志组/Core/Src/freertos_demo.c
 
 ```c
 #include "event_groups.h"                   /* 事件标志组头文件 */
@@ -162,15 +162,15 @@ void Task2(void *pvParameters)
 }
 ```
 
-### Key Config
+### 关键配置
 
 ```c
 /* FreeRTOSConfig.h — 无额外配置,事件标志组默认使能 */
 ```
 
-## Core API Reference Table
+## 核心函数速查表
 
-| Function | Parameters | Return | Description |
+| 函数 | 参数 | 返回值 | 功能简述 |
 |----------|-----------|--------|-------------|
 | `EventGroupHandle_t xEventGroupCreate()` | 无 | NULL=失败 | 动态创建事件标志组 |
 | `EventBits_t xEventGroupSetBits(xEventGroup, uxBitsToSet)` | 句柄, 待置位掩码 | 设置后的值 | 设置事件位 |
@@ -180,7 +180,7 @@ void Task2(void *pvParameters)
 | `EventBits_t xEventGroupGetBits(xEventGroup)` | 句柄 | 当前值 | 获取当前所有位值 |
 | `BaseType_t xEventGroupSetBitsFromISR(xEventGroup, uxBitsToSet, pxHigherPriorityTaskWoken)` | 句柄, 置位掩码, 唤醒标记 | pdPASS/pdFAIL | ISR中设置位 |
 
-## Common Issues & Pitfalls
+## 常见问题与避坑
 
 1. **只有 24 个可用位**:32 位系统中高 8 位被内核占用。`EVENTBIT_23` 是最大可用位。
 2. **AND 与 OR 的区别**:`xWaitForAllBits = pdTRUE` 是 AND(等待所有),`pdFALSE` 是 OR(等待任一)。初学时容易混淆。

+ 19 - 19
X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/14-任务通知.md

@@ -11,9 +11,9 @@ created: 2026-07-17
 
 > **用生活理解**:任务通知就像同事直接走到你工位前告诉你一件事,不需要通过公司广播(队列)、公告栏(信号量)或旗语系统(事件标志组)。直接、高效,但因为是一对一,没法同时通知所有人。
 
-## Concept
+## 概念介绍
 
-### Basic concept
+### 基本概念
 
 任务通知(Task Notification)是 FreeRTOS V8.2.0 引入的轻量级任务间通信机制。每个 TCB 中内置了一个 **32 位通知值**和 **8 位通知状态**,无需创建额外的内核对象。
 
@@ -21,7 +21,7 @@ created: 2026-07-17
 - **约 45% 更快**:比队列/信号量省去了创建和操作中间对象的时间
 - **一对一**:每个任务只有一个通知值,不能一对多广播
 
-### Working principle
+### 工作原理
 
 任务通知支持 3 种使用模式:
 
@@ -31,9 +31,9 @@ created: 2026-07-17
 | **消息邮箱模式** | `xTaskNotify(handle, value, eSetValueWithOverwrite)` | `xTaskNotifyWait()` | 直接覆盖通知值,模拟消息邮箱 |
 | **事件标志组模式** | `xTaskNotify(handle, bits, eSetBits)` | `xTaskNotifyWait()` | 按位 OR,模拟事件标志组 |
 
-### Core API
+### 核心API
 
-| Function | Params | Description |
+| 函数 | 参数 | 功能简述 |
 |----------|--------|-------------|
 | `xTaskNotifyGive()` | `xTaskToNotify` | 发送通知(信号量模式),通知值 +1 |
 | `ulTaskNotifyTake()` | `xClearCountOnExit`, `xTicksToWait` | 接收通知(信号量模式),返回通知值 |
@@ -42,13 +42,13 @@ created: 2026-07-17
 | `xTaskNotifyFromISR()` | 同上+ISR 版本 | 中断中发送通知 |
 | `vTaskNotifyGiveFromISR()` | `xTaskToNotify`, `pxHigherPriorityTaskWoken` | 中断中发送(信号量模式) |
 
-## Experiment
+## 实验
 
-### Experiment 1: 任务通知模拟信号量 (P16)
+### 实验1:任务通知模拟信号量 (P16)
 
-**Requirements**: KEY1 → `xTaskNotifyGive(task2)`,task2 通过 `ulTaskNotifyTake()` 接收。
+**需求**:KEY1 → `xTaskNotifyGive(task2)`,task2 通过 `ulTaskNotifyTake()` 接收。
 
-**File: P16/16_任务通知模拟信号量/Core/Src/freertos_demo.c**
+**代码来源:**03_代码/16_任务通知模拟信号量/Core/Src/freertos_demo.c**
 
 ```c
 /* task1:KEY1按下,发送任务通知(信号量模式) */
@@ -82,11 +82,11 @@ void Task2(void *pvParameters)
 }
 ```
 
-### Experiment 2: 任务通知模拟消息邮箱 (P17)
+### 实验2:任务通知模拟消息邮箱 (P17)
 
-**Requirements**: KEY1/KEY2 → `xTaskNotify(task2, key, eSetValueWithOverwrite)`,task2 通过 `xTaskNotifyWait()` 接收并处理。
+**需求**:KEY1/KEY2 → `xTaskNotify(task2, key, eSetValueWithOverwrite)`,task2 通过 `xTaskNotifyWait()` 接收并处理。
 
-**File: P17/17_任务通知模拟消息邮箱/Core/Src/freertos_demo.c**
+**代码来源:**03_代码/17_任务通知模拟消息队列/Core/Src/freertos_demo.c
 
 ```c
 /* task1:扫描按键,通过任务通知发送键值 */
@@ -132,11 +132,11 @@ void Task2(void *pvParameters)
 }
 ```
 
-### Experiment 3: 任务通知模拟事件标志组 (P18)
+### 实验3:任务通知模拟事件标志组 (P18)
 
-**Requirements**: KEY1 → 置 EVENTBIT_0,KEY2 → 置 EVENTBIT_1,task2 等待两个位都置位。
+**需求**:KEY1 → 置 EVENTBIT_0,KEY2 → 置 EVENTBIT_1,task2 等待两个位都置位。
 
-**File: P18/18_任务通知模拟事件标志组/Core/Src/freertos_demo.c**
+**代码来源:**03_代码/18_任务通知模拟事件标志组/Core/Src/freertos_demo.c**
 
 ```c
 #define EVENTBIT_0  (1 << 0)
@@ -185,7 +185,7 @@ void Task2(void *pvParameters)
 }
 ```
 
-### Key Config
+### 关键配置
 
 ```c
 /* FreeRTOSConfig.h */
@@ -193,9 +193,9 @@ void Task2(void *pvParameters)
 #define configTASK_NOTIFICATION_ARRAY_ENTRIES 1 /* 通知数组大小,默认1 */
 ```
 
-## Core API Reference Table
+## 核心函数速查表
 
-| Function | Parameters | Return | Description |
+| 函数 | 参数 | 返回值 | 功能简述 |
 |----------|-----------|--------|-------------|
 | `BaseType_t xTaskNotifyGive(xTaskToNotify)` | 目标任务句柄 | pdPASS/pdFAIL | 发送通知(信号量模式,通知值+1) |
 | `uint32_t ulTaskNotifyTake(xClearCountOnExit, xTicksToWait)` | 退出时清零?, 超时 | 通知值 | 接收通知(信号量模式,阻塞) |
@@ -212,7 +212,7 @@ void Task2(void *pvParameters)
 - `eSetValueWithOverwrite`:无条件覆写
 - `eSetValueWithoutOverwrite`:仅当接收方未读取时覆写(否则返回 pdFAIL)
 
-## Common Issues & Pitfalls
+## 常见问题与避坑
 
 1. **任务通知只能一对一**:一个任务只有一个通知值。不能像事件标志组那样多个任务等待同一个事件。
 2. **ISR 不可接收通知**:没有 `xTaskNotifyWaitFromISR()` 函数。接收任务通知只能在任务上下文中进行。

+ 18 - 18
X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/15-软件定时器与Tickless低功耗.md

@@ -13,7 +13,7 @@ created: 2026-07-17
 
 ## 软件定时器
 
-### Basic concept
+### 基本概念
 
 FreeRTOS 软件定时器是一种基于 Tick 计数的轻量级时间管理工具,完全由软件实现,不依赖硬件定时器资源。
 
@@ -27,7 +27,7 @@ FreeRTOS 软件定时器是一种基于 Tick 计数的轻量级时间管理工
 
 定时器回调函数在**定时器服务任务**(Timer Service Task)的上下文中执行,因此回调函数中**不能调用会导致阻塞的 API 函数**(如 vTaskDelay、xQueueReceive 等)。
 
-### Working principle
+### 工作原理
 
 软件定时器完全基于系统 Tick 中断计数实现。所有对定时器的操作(启动、停止、复位等)都通过**定时器命令队列**发送消息给定时器服务任务,由该任务统一处理。
 
@@ -55,7 +55,7 @@ FreeRTOS 软件定时器是一种基于 Tick 计数的轻量级时间管理工
 | 单次 (One-shot) | pdFALSE | 到期执行一次回调后停止 |
 | 周期 (Periodic) | pdTRUE | 每到期一次执行一次回调,循环往复 |
 
-### Core API
+### 核心API
 
 | 函数 | 描述 |
 |------|------|
@@ -74,11 +74,11 @@ FreeRTOS 软件定时器是一种基于 Tick 计数的轻量级时间管理工
 
 ## Tickless 低功耗模式
 
-### Basic concept
+### 基本概念
 
 Tickless 模式是 FreeRTOS 的一种特殊运行模式,用于最小化系统时钟中断频率以降低功耗。在 Tickless 模式下,当所有任务都处于阻塞或挂起状态时,空闲任务会让 MCU 进入低功耗模式(通常是睡眠模式),并暂停 SysTick 中断,直到有事件需要处理才唤醒。
 
-### Working principle
+### 工作原理
 
 ```
 所有任务阻塞 → 空闲任务运行
@@ -116,19 +116,19 @@ Tickless 默认使用**睡眠模式**(通过 `__WFI` 指令),任何中断
 | `configPRE_SLEEP_PROCESSING(x)` | 进入低功耗前执行的操作(关闭外设时钟) |
 | `configPOST_SLEEP_PROCESSING(x)` | 退出低功耗后执行的操作(恢复外设时钟) |
 
-## Experiment
+## 实验
 
-### Experiment 1: 软件定时器
+### 实验1:软件定时器
 
-#### Requirements
+#### 需求描述
 
 - 创建单次定时器 timer1(500 ticks)和周期定时器 timer2(1000 ticks)
 - KEY1 → 启动两个定时器,KEY2 → 停止两个定时器
 - 观察回调函数的执行次数
 
-#### Code Implementation
+#### 代码实现
 
-**File: 19_软件定时器/Core/Src/freertos_demo.c**
+**代码来源:**03_代码/19_软件定时器/Core/Src/freertos_demo.c
 
 ```c
 #include "freertos_demo.h"
@@ -244,7 +244,7 @@ void timer2_callback(TimerHandle_t xTimer)
 }
 ```
 
-#### Key Config
+#### 关键配置
 
 ```c
 // FreeRTOSConfig.h 软件定时器相关配置
@@ -254,17 +254,17 @@ void timer2_callback(TimerHandle_t xTimer)
 #define configTIMER_TASK_STACK_DEPTH  256         // 定时器服务任务栈大小(128 * 2)
 ```
 
-### Experiment 2: Tickless 低功耗
+### 实验2:Tickless 低功耗
 
-#### Requirements
+#### 需求描述
 
 - 基于二值信号量实验(task1 按键释放信号量 → task2 获取信号量)
 - 使能 Tickless 模式,编写睡眠前/后处理函数
 - 对比功耗变化
 
-#### Code Implementation
+#### 代码实现
 
-**File: 20_Tickless低功耗/Core/Src/freertos_demo.c**
+**代码来源:**03_代码/20_低功耗模式/Core/Src/freertos_demo.c
 
 ```c
 #include "freertos_demo.h"
@@ -306,7 +306,7 @@ void POST_SLEEP_PROCESSING()
 
 完整任务代码与前文信号量实验相同,增加了 `configUSE_TICKLESS_IDLE` 使能和睡眠前/后处理函数。
 
-#### Key Config
+#### 关键配置
 
 ```c
 // FreeRTOSConfig.h Tickless 相关配置
@@ -318,7 +318,7 @@ void POST_SLEEP_PROCESSING()
 
 `configEXPECTED_IDLE_TIME_BEFORE_SLEEP` 默认值 2,表示空闲时间超过 2 个 Tick 才进入低功耗。
 
-## Core API Reference Table
+## 核心函数速查表
 
 ### 软件定时器 API
 
@@ -330,7 +330,7 @@ void POST_SLEEP_PROCESSING()
 | `xTimerReset(xTimer, blockTime)` | 同上 | 复位定时器(从头计时) |
 | `xTimerChangePeriod(xTimer, newPeriod, blockTime)` | newPeriod=新周期 | 更改定时周期 |
 
-### Tickless 配置 API
+### Tickless 配置参考
 
 | 配置宏 | 说明 |
 |--------|------|

+ 10 - 10
X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/16-内存管理.md

@@ -11,9 +11,9 @@ created: 2026-07-17
 
 > **用生活理解**:动态内存像租房子——heap_1 是只租不退的宿舍(简单粗暴),heap_2 是随意退租但不打扫的房间(会碎片),heap_4 是退租时帮你合并相邻空房的管家(推荐),heap_5 是能跨多个不同地段管理房源的大中介。
 
-## Concept
+## 概念介绍
 
-### Basic concept
+### 基本概念
 
 FreeRTOS 在创建任务、队列、信号量等内核对象时,支持**动态创建**和**静态创建**两种方式。动态方式更灵活(调用 `pvPortMalloc` 自动从堆中分配),静态方式则需要用户预先分配内存。
 
@@ -35,7 +35,7 @@ FreeRTOS 在创建任务、队列、信号量等内核对象时,支持**动态
 | **heap_4** | 首次适应(First-fit)+合并相邻块 | ✅ | 碎片少 | **默认推荐** |
 | **heap_5** | 同 heap_4 | ✅ | 碎片少 | 多个非连续 RAM 区域 |
 
-### Working principle
+### 工作原理
 
 **heap_1**:最简单的实现。一个大数组作为堆空间,每次分配从空闲位置递增指针。不允许释放,因此不会产生碎片。适用于系统启动时一次性创建所有内核对象、永不删除的场景。
 
@@ -47,7 +47,7 @@ FreeRTOS 在创建任务、队列、信号量等内核对象时,支持**动态
 
 **heap_5**:算法与 heap_4 完全相同,区别在于支持**跨多个非连续 RAM 区域**的堆。适用于内存地址不连续的复杂硬件场景(如外扩 SRAM + 内部 SRAM 并存)。
 
-### Core API
+### 核心API
 
 | API | 描述 |
 |-----|------|
@@ -55,16 +55,16 @@ FreeRTOS 在创建任务、队列、信号量等内核对象时,支持**动态
 | `void vPortFree(void *pv)` | 释放内存 |
 | `size_t xPortGetFreeHeapSize(void)` | 获取当前空闲堆大小 |
 
-## Experiment
+## 实验
 
-### Requirements
+### 需求描述
 
 - task1 按键扫描:KEY1 → `pvPortMalloc(20)` 申请 20 字节,KEY2 → `vPortFree()` 释放
 - 每次操作后打印剩余堆大小 `xPortGetFreeHeapSize()`
 
-### Code Implementation
+### 代码实现
 
-**File: 21_内存管理/Core/Src/freertos_demo.c**
+**代码来源:**03_代码/21_内存管理/Core/Src/freertos_demo.c
 
 ```c
 #include "freertos_demo.h"
@@ -136,7 +136,7 @@ void task1(void *pvParameters)
 }
 ```
 
-### Key Config
+### 关键配置
 
 ```c
 // FreeRTOSConfig.h 内存相关配置
@@ -145,7 +145,7 @@ void task1(void *pvParameters)
 
 注意:实际使用 heap_4 时 `configTOTAL_HEAP_SIZE` 决定了 `ucHeap[]` 数组大小,所有动态创建的任务、队列、信号量等对象都从这片空间分配。
 
-## Core API Reference Table
+## 核心函数速查表
 
 | API | 参数 | 返回值 | 说明 |
 |-----|------|--------|------|