FreeRTOS 入门实战:30 分钟在 QEMU 里跑通你的第一个多任务应用
【免费下载链接】FreeRTOS'Classic' FreeRTOS distribution. Started as Git clone of FreeRTOS SourceForge SVN repo. Submodules the kernel.项目地址: https://gitcode.com/GitHub_Trending/fr/FreeRTOS
FreeRTOS 是一款轻量级实时操作系统(RTOS),用任务调度、队列通信、信号量同步和软件定时器帮你把"顺序执行的裸机代码"变成"多任务并发程序"。它 MIT 授权、商业免费,覆盖 ARM、RISC-V、MSP430、PIC 等 40 多种架构,是物联网设备、传感器节点、工业控制器最常见的内核选择。无论你是第一次接触 RTOS 的初学者,还是想给新项目选型的老工程师,这个仓库都值得一读。
🚀三步跑通你的第一个 FreeRTOS 演示
官方推荐的入门路径不是啃源码,而是先跑通一个现成演示(FreeRTOS/README.md 原话:从预配置好的 Demo 项目开始,再逐步替换成自己的代码)。本仓库附带两类"零硬件"入口:
- Windows + MinGW:Demo/WIN32-MingW/ 目录自带 Makefile,编译出
RTOSDemo.exe,任务调度直接跑在桌面系统上,方便打断点看任务切换; - RISC-V + QEMU:Demo/RISC-V-Qemu-virt_GCC/ 用 QEMU 的 virt 机型模拟 RISC-V 板子,串口输出跑在终端里,最接近真实嵌入式环境。
在本地克隆仓库后,按下面的步骤操作:
# 1. 克隆仓库(内核等子模块会一并拉取) git clone --recurse-submodules https://gitcode.com/GitHub_Trending/fr/FreeRTOS cd FreeRTOS # 2. Windows + MinGW:编译演示程序并运行 cd FreeRTOS/Demo/WIN32-MingW make ./build/RTOSDemo.exeRISC-V 路线同理:进入FreeRTOS/Demo/RISC-V-Qemu-virt_GCC,先make生成RTOSDemo.axf,再用 QEMU 加载运行(Makefile 头部注释里写明了交叉工具链前缀CROSS的覆盖方式)。两个演示都内置了 blinky 和 full 两种模式:full 模式会创建一批任务,展示队列收发、信号量、定时器、事件组等全部核心功能,是理解内核行为的"活教材"。
📦仓库导览:150 个平台演示 + 固定版本的内核
这是一份"经典发行版"仓库:内核本体FreeRTOS-Kernel以及 coreMQTT、FreeRTOS-Plus-TCP 等组件都以 git 子模块挂载进来,根目录的 manifest.yml 记录了每个子模块被锁定的版本,保证整包可复现。
FreeRTOS/ ├── FreeRTOS/ # 内核 + 官方演示 │ ├── Source/ # FreeRTOS-Kernel 子模块挂载点(tasks.c/queue.c 等) │ ├── Demo/ # 150+ 个平台的演示项目 │ │ └── Common/ # 所有演示共用的测试任务源码 │ └── Test/ # CBMC / CMock / VeriFast / Target 测试 ├── FreeRTOS-Plus/ # TCP、CLI、Reliance-Edge 等附加组件 ├── tools/ # AWS 证书配置、CMock 构建脚本等辅助工具 └── manifest.yml # 子模块清单与固定版本| 目录 | 职责 | 什么时候看它 |
|---|---|---|
| FreeRTOS/Source/ | 内核公共代码 + 各架构移植层 + 5 种堆 | 想搞懂调度与中断处理时 |
| FreeRTOS/Demo/ | 按"平台_工具链"命名的演示,如CORTEX_STM32F103_Keil | 选模板,按你硬件对号入座 |
| FreeRTOS/Test/ | 形式化验证、单元与集成测试 | 看官方如何验证内核正确性 |
| FreeRTOS-Plus/ | TCP、CLI、Reliance-Edge 数据库、AWS IoT 组件 | 做联网/物联网产品时 |
每个演示目录的命名规律是架构_芯片_工具链,例如CORTEX_M0_STM32F0518_IAR、RX700_RX72N_EnvisionKit_GCC_e2studio。找不到你的板子?先看 FreeRTOS/Demo/readme.md——社区维护的演示在 ThirdParty 子模块里,另有模板目录教你怎么加一个新演示。
🧩核心机制速查:调度、通信、堆
1)任务与优先级抢占
演示项目默认开启抢占(configUSE_PREEMPTION 1)。创建任务、延时、切换优先级是最高频的三件事:
#include "FreeRTOS.h" #include "task.h" static void prvBlinkTask(void *pvParameters) { TickType_t xLastWakeTime = xTaskGetTickCount(); const TickType_t xPeriod = pdMS_TO_TICKS(500); /* 500ms */ for (;;) { /* 翻转 LED 的硬件代码在这里 */ vTaskDelayUntil(&xLastWakeTime, xPeriod); /* 相对延时,无漂移 */ } } /* xTaskCreate(prvBlinkTask, "Blink", 128, NULL, 2, NULL); */| 场景 | 常用 API | 一句话说明 |
|---|---|---|
| 创建/删除任务 | xTaskCreate/vTaskDelete | 删除后由空闲任务回收动态资源 |
| 精确周期执行 | vTaskDelayUntil | 传上次唤醒时间,避免累积漂移 |
| 一次性等待 | vTaskDelay | 以调用时刻为起点,只适合"睡一会儿" |
| 优先级控制 | vTaskPrioritySet/uxTaskPriorityGet | 高优先级任务立即抢占低优先级 |
2)任务间通信
内核提供队列、事件组、任务通知、信号量、流缓冲五类设施,FreeRTOS/Demo/Common/下每个文件就是一个最小示例(EventGroupsDemo.c、TaskNotify.c、TimerDemo.c等)。RISC-V QEMU 演示的main_blinky.c里,发送任务每 1s 往长度为 1 的队列写数据,接收任务以更高优先级立即被抢占出来消费——这是理解"队列 + 抢占"配合方式的最好样本。
| 设施 | 典型用途 | 演示参考文件 |
|---|---|---|
| 队列 | 传有结构的消息/指针 | Demo/Common/Minimal/blocktim.c |
| 互斥量 / 递归互斥 | 保护共享外设 | Demo/Common/Minimal/recmutex.c |
| 任务通知 | 轻量级事件唤醒,替代"队列长度1" | Demo/Common/Minimal/TaskNotify.c |
| 软件定时器 | 周期/单次延时回调 | Demo/Common/Minimal/TimerDemo.c |
3)五选一:堆策略
| 堆 | 能否释放 | 特点 | 适用 |
|---|---|---|---|
| heap_1 | 否 | 静态池,只分配 | 需求固定的极简应用 |
| heap_2 | 是 | 不合并碎片 | 中等复杂度 |
| heap_3 | 是 | 直接转发标准库malloc | 有完整 C 运行时 |
| heap_4 | 是 | 分配/释放时合并相邻块 | 多数演示的默认选择 |
| heap_5 | 是 | 支持物理上非连续的 RAM 段 | 内存分散的芯片 |
⚙️FreeRTOSConfig.h 调优清单
每个演示目录都有一个 FreeRTOSConfig.h,它是内核行为的总开关。以 RISC-V QEMU 演示为例:configTICK_RATE_HZ (1000)、configMAX_PRIORITIES (7)、configMINIMAL_STACK_SIZE (512)、configTOTAL_HEAP_SIZE (64500)。改配置时建议:
- Tick 频率:1000Hz 通常足够;降到 100Hz 可省电,但所有
vTaskDelay精度跟着变粗; - 优先级数:按实际用到的优先级设 7~16 即可,不必顶格;
- 栈大小:
configMINIMAL_STACK_SIZE只影响空闲/定时器任务,应用任务按各自最深层调用链估算;把configCHECK_FOR_STACK_OVERFLOW设为 2 并实现vApplicationStackOverflowHook(QEMU 演示里有现成实现,会打印出栈溢出的任务名); - 堆:开启
configUSE_MALLOC_FAILED_HOOK,堆耗尽时第一时间定位; - 钩子函数:
vApplicationIdleHook、vApplicationTickHook内严禁调用任何会阻塞的 API——前者在空闲任务里、后者在中断上下文中执行,只能用FromISR后缀的接口。
❓新手 FAQ
Q1:没有开发板也能学吗?能。上面两个"零硬件"演示(Windows MinGW、RISC-V QEMU)就能覆盖任务/队列/定时器的全部概念,QEMU 路线还额外练了交叉编译。
Q2:内核源码具体在哪?FreeRTOS/Source/是FreeRTOS-Kernel子模块的挂载点:公共代码(tasks.c、queue.c、list.c、timers.c、event_groups.c)、各架构portable/移植层、portable/MemMang/下的堆都在这里。
Q3:许可证是什么?能用在商业产品里吗?MIT 许可证(见 LICENSE.md),无版权费用,商用友好。
Q4:这份发行版的"版本"如何理解?manifest.yml锁定了内核及各子模块的版本(本包对应 202212.00 发行版),整包行为可复现;想换内核版本,需同步更新子模块引用。
🎯下一步行动清单
- 克隆仓库,用 WIN32-MingW 或 RISC-V QEMU 演示跑起来;
- 通读你演示目录里的
FreeRTOSConfig.h,逐项对照上文调优清单; - 在
main_full演示基础上删掉一个测试任务,换成自己的任务; - 打开
FreeRTOS/Test/的 README,看看官方如何用 CBMC、CMock 验证内核; - 需要联网能力时,再去看
FreeRTOS-Plus/里的 TCP 与 coreMQTT 演示。
提示:
FreeRTOS/Demo/Common/是所有演示共用的"功能样本库",读懂它五个演示文件,就等于把内核公共 API 过了一遍——不要重复造轮子,先站在这些现成示例的肩膀上。
【免费下载链接】FreeRTOS'Classic' FreeRTOS distribution. Started as Git clone of FreeRTOS SourceForge SVN repo. Submodules the kernel.项目地址: https://gitcode.com/GitHub_Trending/fr/FreeRTOS
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考