目标:将尚硅谷 FreeRTOS 教程 V1.0.3(17 章笔记 + 22 个代码项目 + 48 张图片)转换为 16 篇结构化 Markdown 笔记 目标目录:
X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/设计规范:docs/superpowers/specs/2026-07-17-freertos-silicon-valley-ingest-design.md工作流参考:docs/如何将他人文档整理为LLM-Wiki笔记.md
X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/assets/ 下的旧图片(全部删除后重建)| 内容 | 路径 |
|---|---|
| 完整笔记 | F:\Baidu\尚硅谷\尚硅谷嵌入式技术之FreeRTOS实时操作系统\01_笔记\尚硅谷嵌入式技术之FreeRTOS实时操作系统1.0.3.md |
| 原始图片 | F:\Baidu\尚硅谷\尚硅谷嵌入式技术之FreeRTOS实时操作系统\01_笔记\images\media\(48 张 PNG) |
| 代码项目 | F:\Baidu\尚硅谷\尚硅谷嵌入式技术之FreeRTOS实时操作系统\03_代码\代码\(解压到临时目录) |
| 原理图 | F:\Baidu\尚硅谷\尚硅谷嵌入式技术之FreeRTOS实时操作系统\02_资料\02_按键案例\SCH_ZET6开发板_1_2024-07-01.pdf |
Expand-Archive -LiteralPath "F:\Baidu\尚硅谷\尚硅谷嵌入式技术之FreeRTOS实时操作系统\03_代码\代码.zip" -DestinationPath "C:\Users\Administrator\AppData\Local\Temp\opencode\freertos_code" -Force
每个笔记的撰写流程如下:
尚硅谷嵌入式技术之FreeRTOS实时操作系统1.0.3.md 读取相关章节内容Core/Src/freertos_demo.c 和 Core/Inc/FreeRTOSConfig.himages/media/ 中找出与该笔记相关的图片,筛选保留有用的,重命名后复制到 assets/X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/图片视觉验证命令模板(用于验证图片内容):
# 调用视觉 API 验证图片内容
function Test-Img {
param($path, $question)
$b64 = [Convert]::ToBase64String([IO.File]::ReadAllBytes($path))
$body = @{ model = "qwen3.5-9b-uncensored-nothink"
messages = @(@{ role = "user"; content = @(
@{ type = "text"; text = $question }
@{ type = "image_url"; image_url = @{ url = "data:image/png;base64,$b64" } }
)})
max_tokens = 60 } | ConvertTo-Json -Depth 10
$r = Invoke-RestMethod -Uri "https://api.1808366.xyz/v1/chat/completions" ...
return $r.choices[0].message.content
}
X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/| 编号 | 文件名 | 来源章节 | 代码项目 |
|---|---|---|---|
| 01 | 01-实时操作系统基础.md |
第 1 章 | — |
| 02 | 02-任务调度与状态管理.md |
第 2 章 | — |
| 03 | 03-FreeRTOS移植指南.md |
第 3 章(移植 + 源码结构) | 00_HAL_Key |
| 04 | 04-数据类型命名与配置详解.md |
第 3 章(数据类型 + 命名 + 配置) | — |
| 05 | 05-任务创建与删除.md |
第 4 章 | 01, 02 |
| 06 | 06-任务挂起与恢复.md |
第 5 章 | 03 |
| 07 | 07-中断管理与临界段.md |
第 6 章 | 04 |
| 08 | 08-时间片调度与延时管理.md |
第 7 章 + 第 9 章 | 05, 08 |
| 09 | 09-任务状态查询与运行时统计.md |
第 8 章 | 06, 07 |
| 10 | 10-消息队列.md |
第 10 章 | 09 |
| 11 | 11-信号量机制.md |
第 11 章 | 10, 11, 12, 13 |
| 12 | 12-队列集.md |
第 12 章 | 14 |
| 13 | 13-事件标志组.md |
第 13 章 | 15 |
| 14 | 14-任务通知.md |
第 14 章 | 16, 17, 18 |
| 15 | 15-软件定时器与Tickless低功耗.md |
第 15 章 + 第 16 章 | 19, 20 |
| 16 | 16-内存管理.md |
第 17 章 | 21 |
X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/assets/ — 精选图片(15~25 张)wiki/source-freertos.md — 重写资料摘要页wiki/index.md — 更新 FreeRTOS 章节wiki/log.md — 追加变更日志$srcImages = "F:\Baidu\尚硅谷\尚硅谷嵌入式技术之FreeRTOS实时操作系统\01_笔记\images\media"
$tmp = "C:\Users\Administrator\AppData\Local\Temp\opencode\freertos_images"
New-Item -ItemType Directory -Path $tmp -Force
Copy-Item "$srcImages\*.png" $tmp
使用视觉 API 验证每张图片内容。48 张图片的预期内容分类:
| 图片编号 | 预期内容 | 保留? | 建议文件名 |
|---|---|---|---|
| image1 | 感知并发 vs 实际多任务图 | 保留 | multitasking_concurrent_vs_actual.png |
| image2 | 抢占式调度示意图 | 保留 | scheduling_preemption.png |
| image3 | 时间片轮转调度图 | 保留 | scheduling_timeslice.png |
| image4 | 任务状态转换图(运行/就绪/阻塞/挂起) | 保留 | task_state_diagram.png |
| image5 | 就绪列表位图 | 保留 | ready_list_bitmap.png |
| image6 | 同优先级就绪列表 | 保留 | ready_list_same_priority.png |
| image7 | 上下文切换步骤图(保存上下文) | 保留 | context_switch_save.png |
| image8 | 上下文切换步骤图(恢复上下文) | 保留 | context_switch_restore.png |
| image9 | FreeRTOS 官网下载页面截图 | 删除 | — |
| image10 | GitHub 下载页面截图 | 删除 | — |
| image11 | RVDS 文件夹结构截图 | 删除(可文字描述) | — |
| image12 | heap 文件列表截图 | 删除(可文字描述) | — |
| image13~image27 | Keil 工程添加文件步骤截图 | 全部删除(IDE 操作截图) | — |
| image28~image29 | 寄存器版 Keil 添加截图 | 全部删除(IDE 操作截图) | — |
| image30~image43 | 配置截图/CubeMX 截图 | 全部删除(IDE 操作截图) | — |
| image44 | 队列结构图 | 保留 | queue_structure.png |
| image45 | 事件标志组位结构图 | 保留 | event_group_bits.png |
| image46 | 定时器状态切换图 | 保留 | timer_state_diagram.png |
| image47 | STM32 低功耗模式图 | 保留 | stm32_low_power_modes.png |
| image48 | 三种 heap 算法结构对比 | 保留 | heap_comparison.png |
筛选后预计保留约 14 张图片,其余 34 张删除。
$target = "X-Knowledge-Base/raw/Joplin/嵌入式+Linux/FreeRTOS学习笔记/assets"
New-Item -ItemType Directory -Path $target -Force
# 保留的图片按映射命名复制
Copy-Item "$tmp\image1.png" "$target\multitasking_concurrent_vs_actual.png"
Copy-Item "$tmp\image2.png" "$target\scheduling_preemption.png"
Copy-Item "$tmp\image3.png" "$target\scheduling_timeslice.png"
Copy-Item "$tmp\image4.png" "$target\task_state_diagram.png"
Copy-Item "$tmp\image5.png" "$target\ready_list_bitmap.png"
Copy-Item "$tmp\image6.png" "$target\ready_list_same_priority.png"
Copy-Item "$tmp\image7.png" "$target\context_switch_save.png"
Copy-Item "$tmp\image8.png" "$target\context_switch_restore.png"
Copy-Item "$tmp\image44.png" "$target\queue_structure.png"
Copy-Item "$tmp\image45.png" "$target\event_group_bits.png"
Copy-Item "$tmp\image46.png" "$target\timer_state_diagram.png"
Copy-Item "$tmp\image47.png" "$target\stm32_low_power_modes.png"
Copy-Item "$tmp\image48.png" "$target\heap_comparison.png"
来源章节:源笔记第 1 章(操作系统介绍 = 什么是裸机开发/什么是操作系统/通用OS/RTOS/FreeRTOS简介/发展历史/优势/特点)
代码项目:无
图片:无
---
tags: [source-summary]
type: source
source: "尚硅谷嵌入式技术之FreeRTOS实时操作系统 V1.0.3 — 第1章:操作系统介绍 + FreeRTOS简介"
author: "尚硅谷研究院"
date: 2026-07-17
created: 2026-07-17
---
# 实时操作系统基础
> **用生活理解**:如果把单片机比作一个厨师——裸机开发就像厨师必须自己记住每道菜的所有步骤,亲力亲为;RTOS 就像是给厨师配了一个帮厨团队——帮厨(操作系统)负责管理炒菜顺序、准备材料、分配时间,厨师(应用程序)只需专注于做菜本身。
## 什么是裸机开发
### 基本概念
...
无 API 速查表。本笔记以概念为主。
来源章节:源笔记第 2 章(多任务处理/任务调度/任务状态/滴答/上下文切换/空闲任务)
代码项目:无(概念篇)
图片:image1~image8
pxReadyTasksLists[x] 位图索引,32 位变量代表 0-31 优先级







来源章节:源笔记第 3 章(源码结构 + HAL 库移植 + 寄存器移植)
代码项目:00_HAL_Key(无 FreeRTOS 的纯 HAL 基础工程)
使用文字描述代替 IDE 操作截图。可引用一张源码结构示意图(如有),但大多数 IDE 截图删除。
移植检查清单:
| 步骤 | 检查项 | 是否完成 |
|---|---|---|
| 1 | FreeRTOS/Source 包含 7 个 .c | □ |
| 2 | FreeRTOS/portable/RVDS/ARM_CM3 有 port.c + portmacro.h | □ |
| 3 | MemMang 包含 heap_4.c | □ |
| 4 | FreeRTOS/include 全部头文件 | □ |
| 5 | FreeRTOSConfig.h 已修改 | □ |
| 6 | stm32f1xx_it.c 中 SVC/PendSV 已注释 | □ |
| 7 | SysTick_Handler 已添加 xPortSysTickHandler 调用 | □ |
| 8 | HAL 定时器源已切换(避免与 FreeRTOS 冲突) | □ |
来源章节:源笔记第 3 章后半(数据类型/命名规范/FreeRTOSConfig.h 配置说明)
代码项目:无
| 类型 | 描述 | 默认定义 | 配置决定 |
|---|---|---|---|
| TickType_t | 滴答计数值 | uint32_t | configUSE_16_BIT_TICKS |
| BaseType_t | 最自然类型 | uint32_t(Cortex-M3) | 架构相关 |
| StackType_t | 堆栈单位 | uint32_t | 架构相关 |
| 前缀 | 含义 | 示例 |
|---|---|---|
| v | 返回 void | vTaskDelete |
| x | 返回 BaseType_t 或非 void 结构体 | xQueueCreate |
| ux | 返回 UBaseType_t | uxTaskGetNumberOfTasks |
| pv | 返回 void* | pvPortMalloc |
| h | 句柄类型后缀 | TaskHandle_t |
| pd | 协议定义(projdefs.h) | pdTRUE, pdPASS |
来源章节:源笔记第 4 章(任务创建和删除)
代码项目:01(动态创建删除)、02(静态创建删除)
xTaskCreate 自动分配 vs xTaskCreateStatic 预先分配freertos_demo.c(作为通用模板参考)vApplicationGetIdleTaskMemory 和 vApplicationGetTimerTaskMemory 钩子从 03_代码/01_动态创建任务和删除/Core/Src/freertos_demo.c 提取:
freertos_start() 函数(创建 start_task + vTaskStartScheduler)start_task() 函数(taskENTER_CRITICAL → 创建 3 个任务 → vTaskDelete(NULL) → taskEXIT_CRITICAL)task1() LED 切换 + task2() LED 切换 + task3() 按键检测删除 task1从 03_代码/02_静态创建任务和删除/Core/Src/freertos_demo.c 提取:
xTaskCreateStatic 的差异点vApplicationGetIdleTaskMemory 和 vApplicationGetTimerTaskMemory 钩子实现// 静态分配需要开启
#define configSUPPORT_STATIC_ALLOCATION 1
// 软件定时器任务配置(静态创建需要)
#define configUSE_TIMERS 1
#define configTIMER_TASK_PRIORITY 4
#define configTIMER_QUEUE_LENGTH 5
#define configTIMER_TASK_STACK_DEPTH 256
来源章节:源笔记第 5 章(任务挂起与恢复)
代码项目:03(任务挂起与恢复)
vTaskSuspend() / vTaskResume()vTaskSuspendAll() / xTaskResumeAll()提取 03_代码/03_任务挂起与恢复/Core/Src/freertos_demo.c:
来源章节:源笔记第 6 章(中断管理)
代码项目:04(中断管理)
taskENTER_CRITICAL() / taskEXIT_CRITICAL() — 嵌套计数器portDISABLE_INTERRUPTS() / portENABLE_INTERRUPTS()FromISR 版本(如 xQueueSendFromISR)configMAX_SYSCALL_INTERRUPT_PRIORITY:FreeRTOS 可管理的中断优先级阈值提取 03_代码/04_中断管理/Core/Src/freertos_demo.c:
#define configKERNEL_INTERRUPT_PRIORITY (15 << 4)
#define configMAX_SYSCALL_INTERRUPT_PRIORITY (5 << 4)
来源章节:源笔记第 7 章(时间片调度)+ 第 9 章(时间管理/延时函数)
代码项目:05(时间片调度)、08(延时函数对比)
configUSE_TIME_SLICING 控制开关vTaskDelay() — 相对延时(从调用开始算,可能漂移)vTaskDelayUntil() — 绝对延时(从上次唤醒算,固定周期)HAL_Delay() vs vTaskDelay() 区别:前者忙等(不释放 CPU),后者阻塞(让出 CPU)提取 03_代码/05_时间片调度/Core/Src/freertos_demo.c:
提取 03_代码/08_时间延时函数/Core/Src/freertos_demo.c:
// 项目 05 将滴答频率降低到 50ms 方便观察时间片
#define configTICK_RATE_HZ 20
#define configUSE_TIME_SLICING 1
来源章节:源笔记第 8 章(任务相关 API 函数)
代码项目:06(任务状态查询)、07(运行时统计)
uxTaskPriorityGet() / vTaskPrioritySet()uxTaskGetNumberOfTasks()uxTaskGetSystemState() / vTaskGetInfo()xTaskGetCurrentTaskHandle() / xTaskGetHandle()uxTaskGetStackHighWaterMark()eTaskGetState()vTaskList()提取 03_代码/06_任务状态查询/Core/Src/freertos_demo.c:
提取 03_代码/07_任务时间统计/Core/Src/freertos_demo.c:
vTaskGetRunTimeStats()#define configUSE_TRACE_FACILITY 1
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
#define configGENERATE_RUN_TIME_STATS 1
来源章节:源笔记第 10 章(消息队列)
代码项目:09(消息队列)
xQueueCreate() 参数说明提取 03_代码/09_消息队列/Core/Src/freertos_demo.c:
queue1 = xQueueCreate(2, sizeof(uint8_t)) — 按键值队列big_queue = xQueueCreate(1, sizeof(char*)) — 大字符串指针队列#define configQUEUE_REGISTRY_SIZE 8
来源章节:源笔记第 11 章(信号量 — 二值/计数/优先级翻转/互斥)
代码项目:10(二值信号量)、11(计数信号量)、12(优先级反转)、13(互斥信号量)
| 特性 | 二值信号量 | 计数信号量 | 互斥量 |
|---|---|---|---|
| 初始值 | 0 | 用户指定 | 1 |
| 最大值 | 1 | 用户指定 | 1 |
| 优先级继承 | 无 | 无 | 有 |
| 递归获取 | 否 | 否 | 可配置 |
| 适用场景 | 事件通知 | 资源计数 | 互斥访问 |
提取 03_代码/10_二值信号量/Core/Src/freertos_demo.c:
提取 03_代码/12_优先级翻转/Core/Src/freertos_demo.c:
提取 03_代码/13_互斥信号量/Core/Src/freertos_demo.c:
xSemaphoreCreateMutex() 替代 vSemaphoreCreateBinary()#define configUSE_COUNTING_SEMAPHORES 1
#define configUSE_MUTEXES 1
#define configUSE_RECURSIVE_MUTEXES 1
来源章节:源笔记第 12 章(队列集)
代码项目:14(队列集)
提取 03_代码/14_队列集/Core/Src/freertos_demo.c:
xQueueCreateSet(queue_set_size) — 集合大小 = 成员项数之和xQueueAddToSet(queue1, queue_set_handle) — 注册队列xQueueAddToSet(sem_handle, queue_set_handle) — 注册信号量xQueueSelectFromSet(queue_set_handle, portMAX_DELAY) — 等待任一成员#define configUSE_QUEUE_SETS 1
来源章节:源笔记第 13 章(事件标志组)
代码项目:15(事件标志组)
xEventGroupWaitBits() 中的等待逻辑:AND(全部满足)vs OR(任一满足)提取 03_代码/15_事件标志组/Core/Src/freertos_demo.c:
event_group_handle = xEventGroupCreate()xEventGroupSetBits(event_group_handle, EVENTBIT_0)xEventGroupSetBits(event_group_handle, EVENTBIT_1)xEventGroupWaitBits(handle, BIT0|BIT1, pdTRUE, pdTRUE, portMAX_DELAY) — 等两个位都置1
来源章节:源笔记第 14 章(任务通知)
代码项目:16(通知模拟信号量)、17(通知模拟消息队列)、18(通知模拟事件标志组)
xTaskNotifyGive() / ulTaskNotifyTake() — 计数值累加/递减xTaskNotify(handle, value, eSetValueWithOverwrite) — 覆写通知值xTaskNotify(handle, bits, eSetBits) — 按位或置位提取 03_代码/16_任务通知模拟信号量/Core/Src/freertos_demo.c:
xTaskNotifyGive(task2_handle)ulTaskNotifyTake(pdFALSE, portMAX_DELAY) — 计数值递减提取 03_代码/17_任务通知模拟消息队列/Core/Src/freertos_demo.c:
xTaskNotify(task2_handle, key_value, eSetValueWithOverwrite)xTaskNotifyWait(ulBitsToClearOnEntry, ulBitsToClearOnExit, ¬ification_value, portMAX_DELAY)提取 03_代码/18_任务通知模拟事件标志组/Core/Src/freertos_demo.c:
xTaskNotify(task2_handle, EVENTBIT_0, eSetBits)xTaskNotify(task2_handle, EVENTBIT_1, eSetBits)xTaskNotifyWait(0, ULONG_MAX, ¬ify_val, portMAX_DELAY) 并检查位来源章节:源笔记第 15 章(软件定时器)+ 第 16 章(Tickless 低功耗模式)
代码项目:19(软件定时器)、20(Tickless 低功耗)
configUSE_TICKLESS_IDLE:开启/关闭configPRE_SLEEP_PROCESSING(x) 和 configPOST_SLEEP_PROCESSING(x) — 用户在休眠前后执行的自定义操作configEXPECTED_IDLE_TIME_BEFORE_SLEEP(太短则不休眠)提取 03_代码/19_软件定时器/Core/Src/freertos_demo.c:
timer1 = xTimerCreate("timer1", 500, pdFALSE, NULL, timer1_callback) — 一次性timer2 = xTimerCreate("timer2", 1000, pdTRUE, NULL, timer2_callback) — 周期性xTimerStart(),KEY2 → xTimerStop()提取 03_代码/20_低功耗模式/Core/Src/freertos_demo.c:
configPRE_SLEEP_PROCESSING(x) → 休眠前关 GPIO 时钟configPOST_SLEEP_PROCESSING(x) → 唤醒后开 GPIO 时钟// 软件定时器
#define configUSE_TIMERS 1
#define configTIMER_TASK_PRIORITY 4
#define configTIMER_QUEUE_LENGTH 5
#define configTIMER_TASK_STACK_DEPTH 256
// Tickless
#define configUSE_TICKLESS_IDLE 1


来源章节:源笔记第 17 章(内存管理 — heap_1~5)
代码项目:21(内存管理)
| 算法 | 分配策略 | 释放 | 碎片 | 适用场景 |
|---|---|---|---|---|
| heap_1 | 简单数组分配 | 不支持释放 | 无 | 不删除任务/队列 |
| heap_2 | 最佳匹配链表 | 支持释放 | 有 | 随意分配释放 |
| heap_3 | 包装 malloc/free | 标准 C 库 | 取决于 C 库 | 线程安全需要 |
| heap_4 | 首序匹配 + 合并 | 合并相邻空闲块 | 优干 heap_2 | 默认推荐 |
| heap_5 | 同 heap_4 | 跨非连续 RAM 区域 | 同 heap_4 | 多 RAM 区域 |
pvPortMalloc() / vPortFree() / xPortGetFreeHeapSize()提取 03_代码/21_内存管理/Core/Src/freertos_demo.c:
buff = pvPortMalloc(20) → 打印 xPortGetFreeHeapSize()vPortFree(buff) → 打印堆大小
wiki/source-freertos.mdwiki/index.mdwiki/log.md## 2026-07-17
- `lint`: 重构 FreeRTOS raw 笔记(16 篇)
- 旧 11 篇笔记 → 新 16 篇笔记,按课程章节一对一/合并映射
- 代码来源:22 个正式 Keil 项目
- 图片精选:48 张 → 约 14 张(删除 IDE/Keil 配置截图)
- 每篇标准结构:frontmatter + 生活类比 + 概念 + 实验代码 + API 速查表 + 避坑
- 遵循设计规范:`docs/superpowers/specs/2026-07-17-freertos-silicon-valley-ingest-design.md`
新笔记列表:
- 01 ~ 16 覆盖:实时操作系统基础/任务调度与状态管理/移植指南/数据类型命名与配置/任务创建删除/挂起恢复/中断管理临界段/时间片调度延时管理/任务状态查询运行时统计/消息队列/信号量机制/队列集/事件标志组/任务通知/软件定时器与Tickless低功耗/内存管理
更新 `wiki/source-freertos.md`、`wiki/index.md`、`wiki/log.md`
> **用生活理解**: 类比wiki/source-freertos.md 已更新wiki/index.md 已更新wiki/log.md 已追加