云计算百科
云计算领域专业知识百科平台

FreeRTOS 第一课:初识 FreeRTOS 学习笔记

FreeRTOS 第一课:初识 FreeRTOS 学习笔记

嵌入式学习笔记 · FreeRTOS 第 1 课

今天开始学习 FreeRTOS:它是什么、有什么用、是谁发明的,以及它的核心概念(任务、调度器、通信机制),整理成文方便复习。

文章目录

  • FreeRTOS 第一课:初识 FreeRTOS 学习笔记
    • 一、FreeRTOS 是什么
    • 二、FreeRTOS 的作用(举例子)
      • 1. 先看裸机开发的痛点
      • 2. FreeRTOS 怎么解决
      • 3. 举例:智能小车
      • 4. 裸机 vs FreeRTOS 对比(示意)
    • 三、FreeRTOS 的发明者:Richard Barry
    • 四、FreeRTOS 的核心概念(初识版)
      • 1. 任务(Task)和任务状态机
      • 2. 调度器(Scheduler)
      • 3. 任务间通信与同步机制
    • 五、小结速查表

一、FreeRTOS 是什么

FreeRTOS = Free Real-Time Operating System,一个开源免费的实时操作系统内核,专门为嵌入式单片机(MCU)设计。

  • Free:开源免费,可以随意用于商业项目;
  • RTOS:Real-Time Operating System,实时操作系统,能在规定时间内响应外部事件;
  • 内核(Kernel):只提供操作系统最核心的功能(任务调度、任务通信等),不包含文件系统、网络协议栈等"外挂"组件(需要可自行移植添加)。
特性说明
开源许可 内核 MIT 许可,商用免费
调度方式 基于优先级的抢占式调度 + 时间片轮转
代码规模 精简可裁剪,内核约几千行 C 代码
硬件需求 很低,几 KB RAM/Flash 即可运行
架构支持 40+ 种处理器架构(ARM Cortex-M、RISC-V、AVR 等)
开发语言 纯 C 语言,可移植性好

记忆:FreeRTOS = 给单片机用的"迷你操作系统",任务想跑几个跑几个,还能按优先级抢 CPU。

二、FreeRTOS 的作用(举例子)

1. 先看裸机开发的痛点

很多同学(包括我)最开始写的单片机程序都是"前后台系统":

int main(void)
{
/* 初始化 */
while (1)
{
Read_Sensor(); // 1. 读传感器(可能要等几十 ms)
Process_Data(); // 2. 处理数据(计算量大)
Update_Display(); // 3. 刷新屏幕
Scan_Key(); // 4. 扫描按键
}
}

问题来了:这是一个死循环,只能一个函数一个函数地顺序执行。如果"读传感器"要等很久(比如等 I2C 应答、等 ADC 转换),后面"刷新屏幕""扫描按键"全部被卡住,实时性很差。

裸机痛点后果
主循环顺序执行 慢任务卡住所有快任务
中断里做太多事 中断服务函数太长,影响系统响应
多个"同时要做的活" 只能手动用标志位/定时器轮询切换,代码乱

2. FreeRTOS 怎么解决

FreeRTOS 把程序拆成多个独立的任务(Task),每个任务各干各的,由调度器决定谁先运行:

void Task_Sensor(void *arg) { while (1) { Read_Sensor(); vTaskDelay(10); } }
void Task_Display(void *arg) { while (1) { Update_Display(); vTaskDelay(20); } }
void Task_Key(void *arg) { while (1) { Scan_Key(); vTaskDelay(5); } }

  • 三个任务"看起来"在同时运行(宏观并行,微观上由调度器快速切换);
  • 传感器任务阻塞等待时,CPU 立刻让给显示任务、按键任务;
  • 每个任务都可以有自己的优先级,紧急的任务可以抢占不紧急的任务。

3. 举例:智能小车

功能裸机写法FreeRTOS 写法
超声波测距 在主循环里排队等 40ms 回波 独立"测距任务",vTaskDelay 等待
OLED 显示 刷新一屏要几 ms,阻塞其他 独立"显示任务",优先级最低
电机调速 定时器中断里做 独立"电机任务" + 队列接收指令
按键响应 主循环轮询,可能被卡住 独立"按键任务",高优先级立刻响应

4. 裸机 vs FreeRTOS 对比(示意)

裸机 vs FreeRTOS 调度对比(示意)

图解析:这是我绘制的调度对比示意图。

  • 上半部分(裸机):while(1) 大循环里"传感器 → 处理 → 显示 → 按键"依次执行;一旦某个慢任务(如传感器等待)耗时过长,整个循环被卡住,其他任务全部排队等待;
  • 下半部分(FreeRTOS):任务按优先级和时间片快速切换,"传感器/处理/显示/按键/空闲"交错运行;慢任务阻塞时 CPU 立即让给其他就绪任务,空闲时进入空闲任务省电。

一句话:裸机是一列火车排队过桥,RTOS 是立交桥,各走各的车道。

三、FreeRTOS 的发明者:Richard Barry

  • Richard Barry(理查德·巴里)是 FreeRTOS 的创始人和主要开发者;
  • 2003 年,他开发并开源了 FreeRTOS,最初用于自己的项目,后来免费向全世界发布;
  • 因为开源免费 + 轻量可靠,FreeRTOS 迅速成为嵌入式领域使用最广的 RTOS 之一;
  • 2017 年,亚马逊 AWS 收购 FreeRTOS,并将其与云服务结合,推出 Amazon FreeRTOS(现在叫 AWS IoT 相关的 FreeRTOS 版本);
  • 目前 FreeRTOS 内核在 GitHub 上持续维护更新,依然是 MIT 开源许可。
时间事件
2003 Richard Barry 开发并发布 FreeRTOS
~2010s 成为嵌入式市场占有率最高的 RTOS 之一
2017 被亚马逊 AWS 收购,推出 Amazon FreeRTOS
至今 内核在 GitHub 开源维护,MIT 许可

记忆:FreeRTOS = Richard Barry 2003 年送给大家的"免费实时操作系统礼物",后来被亚马逊收养。

四、FreeRTOS 的核心概念(初识版)

1. 任务(Task)和任务状态机

FreeRTOS 中,每个"干活的小函数"就是一个任务。任务有四种状态:

状态含义什么时候进入
运行(Running) 正在占用 CPU 执行 调度器选中它时
就绪(Ready) 想运行,但 CPU 被更高优先级占着 一切就绪,等待调度
阻塞(Blocked) 在等某件事(延时/队列/信号量) 调用 vTaskDelay、等待消息等
挂起(Suspended) 被暂停,不参与调度 调用 vTaskSuspend()

FreeRTOS 任务状态机(示意)

图解析:这是我绘制的任务状态转换示意图。

  • 运行 → 就绪:时间片用完或被更高优先级任务抢占,CPU 让出;
  • 就绪 → 运行:调度器选中,获得 CPU;
  • 运行/就绪 → 阻塞:等待事件(延时、队列、信号量);
  • 阻塞 → 就绪:等待的事件发生;
  • 运行/就绪 → 挂起:调用 vTaskSuspend();
  • 挂起 → 就绪:调用 vTaskResume();
  • 同一优先级的就绪任务之间按时间片轮转(每个任务分到一小段 CPU 时间)。

2. 调度器(Scheduler)

调度器是 FreeRTOS 的"大脑",负责决定"下一个该谁跑":

  • 抢占式调度(默认开启):高优先级任务就绪时,立刻打断低优先级任务;
  • 时间片轮转:同优先级任务轮流运行,每人分一个时间片(默认 1ms 量级);
  • 空闲任务(Idle Task):所有任务都阻塞时,运行最低优先级的空闲任务(可在此休眠省电)。

3. 任务间通信与同步机制

多任务之间需要"传数据、打招呼、互相等",FreeRTOS 提供了多种机制:

机制作用类比
队列(Queue) 任务间传递数据(先进先出) 传纸条的邮箱
信号量(Semaphore) 资源计数 / 事件通知 停车场空位计数
互斥量(Mutex) 保护共享资源,带优先级继承 厕所门锁(排队优先)
事件组(Event Group) 多个事件"与/或"组合等待 等好几个快递都到
软件定时器(Timer) 周期性回调函数 闹钟
内存管理(heap_1~5) 动态分配/释放任务栈等 内存仓库

FreeRTOS 内核组成(示意)

图解析:这是我绘制的内核组成示意图。中心蓝色的是内核(Kernel),负责任务调度器和时间管理;周围绿色的是内核提供的功能组件:任务、队列、信号量、互斥量、事件组、软件定时器、内存管理(heap_1~5)。任务之间通过队列、信号量等机制通信与同步,这正是 RTOS 与裸机最大的不同——任务不再是孤岛,可以安全地协作。

五、小结速查表

问题答案
FreeRTOS 是什么 开源免费的嵌入式实时操作系统内核
发明者 Richard Barry,2003 年开发
现在归谁维护 亚马逊 AWS(Amazon FreeRTOS),GitHub 开源
许可协议 MIT(免费商用)
调度方式 优先级抢占 + 时间片轮转
任务状态 运行 / 就绪 / 阻塞 / 挂起
通信机制 队列、信号量、互斥量、事件组
内存管理 heap_1 ~ heap_5 五种方案
支持架构 40+ 种(Cortex-M、RISC-V 等)

记忆口诀:

  • FreeRTOS = 免费的实时操作系统,专治裸机 while(1) 卡顿。
  • 任务四态:运行、就绪、阻塞、挂起——谁就绪谁上,高优先级插队。
  • 任务之间靠队列传数据、信号量打招呼、互斥量上锁。

  • 本文为 FreeRTOS 第一课学习笔记,配图为自绘示意图,如有错误欢迎评论区指正。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » FreeRTOS 第一课:初识 FreeRTOS 学习笔记
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!