外观
一个RTOS内核通常由哪些部分组成
约 2318 字大约 8 分钟
2026-11-10
很多人在使用RTOS的时候,每天都在调用各种API来完成创建任务、获取信号量等操作。如果使用多个不同的RTOS,会发现这些RTOS虽然提供的API不同,但是基本功能却是类似的。
那么,一个RTOS内核里面到底有哪些东西?这些东西各自负责什么? 在这篇文章中将进行简要说明,从而帮助你对RTOS的组成和功能有整体理解。将来无论用到哪种具体的RTOS,都能做到心中有数。
此外,如果你想真正搞懂RTOS,甚至想自己写一个,也需要搞清楚这个问题。
一、RTOS内核的常见组成
简单来说,一个完整的RTOS内核通常至少由以下五个部分组成。

接下来,让我们分别来看每个部分的作用。
调度器
可以说,调度器是RTOS内核的核心,即整个系统的"心脏"。
它的主要工作是负责决定当前应该让哪个任务占用CPU运行,以及什么时候切换到另一个任务。
调度器的核心是调度算法,不同RTOS可能采用不同的调度算法,常见的调度算法有:优先级调度、时间片轮转等等。不同的RTOS可能同时采用多种不同的调度算法。
例如,RT-Thread采用的是优先级抢占式调度加同优先级时间片轮转的混合调度策略。具体来说,当一个高优先级任务就绪时,它会立即抢占当前正在运行的低优先级任务。

而对于相同优先级的多个任务,则按照时间片轮流执行,每个任务用完自己的时间片后,调度器就会切换到下一个同优先级任务。

每当有任务状态发生变化,或者系统时钟中断到来时,调度器就会运行一次,根据算法选出下一个要运行的任务,然后触发上下文切换。
任务管理
任务管理负责管理所有任务的生命周期,包括任务的创建、删除、挂起、恢复等等。
任务管理通过一个叫做**任务控制块(TCB)**的数据结构,来维护每个任务的状态、优先级、栈指针、寄存器现场等信息。在前面的文章中,我们已经看到过RTOS通常采用特定的结构体来描述任务控制块。
在RTOS内部,不同的任务往往会根据其运行状态,被组织成多条不同的队列,例如就绪队列和延时队列。

可以说,任务管理是调度器的基础,因为调度器需要知道有哪些任务、每个任务处于什么状态,才能做出正确的调度决策。
任务间通信与同步
虽然任务之间是独立运行的,但是,任务之间往往需要交换数据、共享资源、协调执行顺序。为了解决这种需求,RTOS提供了任务通信与同步机制。
例如,在RT-Thread中,提供了信号量、互斥锁、事件、邮箱、消息队列等多种IPC机制,每种机制适用于不同的场景。

常见任务通信与同步机制包括信号量、互斥锁、消息队列、事件标志等等。
例如,当两个任务需要共享一个硬件资源时,就可以用互斥锁来保证同一时间只有一个任务访问。而如果一个任务需要等另一个任务完成某些工作后再继续运行,就可以用信号量来同步。如果两个任务之间需要传递数据,可以使用消息队列机制进行通信。
时间管理
RTOS的时间管理以系统时钟Tick为基础,提供任务延时、软件定时器、时间片轮转等功能。
系统每隔固定的时间(比如1毫秒)产生一次时钟中断,时间管理机制就在这个中断里更新系统时间、检查延时是否到期、触发定时器回调等等。
可以说,时间管理是整个RTOS的"脉搏"。
内存管理
在实际应用中,不仅任务创建时需要分配栈空间,创建信号量、消息队列等内核对象时也需要分配内存,任务本身可能也要动态分配内存来完成具体的工作。
内存管理就是负责这些动态内存的分配和回收。常见的内存管理方式有两种:一种是通用的堆管理,类似于C语言的malloc和free。另一种是定长内存块管理,预先划分好固定大小的内存块,分配和回收都很快,而且不会产生碎片。
在RT-Thread中,通常同时提供了以上两种不同的管理方式。例如,堆管理使用rt_malloc和rt_free接口,内部根据内存大小自动选择小内存管理算法或slab算法;而内存池则使用rt_mp_create创建,通过rt_mp_alloc和rt_mp_free进行分配和回收。
/* 堆管理:分配任意大小 */
void *buf = rt_malloc(128);
if (buf != RT_NULL) {
rt_free(buf);
}
/* 内存池:分配固定大小的块 */
static rt_uint8_t pool_buf[1024];
struct rt_mempool *mp = rt_mp_create("test_mp", pool_buf, 1024, 64);
void *block = rt_mp_alloc(mp, RT_WAITING_FOREVER);
if (block != RT_NULL) {
rt_mp_free(block);
}二、RTOS的其它组件
除了内核本身外,很多RTOS还提供了丰富的可选组件,这些组件不属于内核的核心部分,但是,用户可以根据项目需要选择性地引入,从而快速构建完整的应用系统。
以RT-Thread为例,它提供了一个分层的组件架构:

这些组件的作用和特点各不相同:
- 文件系统(DFS):提供统一的文件操作接口,支持FatFS、DevFS等多种文件系统,让开发者可以像在PC上一样操作文件和目录。
- 命令行(FinSH):提供一个交互式的命令行终端,可以通过输入命令来查看系统状态、调用函数、调试问题。
- 网络协议栈(LwIP):提供TCP/IP协议栈,支持Socket、HTTP、MQTT等网络功能。
- 设备驱动框架:提供PIN、I2C、SPI、UART、ADC、PWM等标准化的设备驱动接口。
- 电源管理(PM):提供低功耗管理功能,支持空闲休眠、深度睡眠、唤醒源配置等。
为了面向不同的应用需求,这些组件都是可选的,用户可以根据项目的实际需求和资源限制,来决定引入哪些组件。
引入这些组件有助于快速获得成熟的功能,避免重复造轮子;不过,会增加代码体积、内存占用和系统的复杂度。
因此,在资源受限的场景中,只需要内核本身就够了;而在功能丰富、资源富裕的网产品中,则可以引入更多组件来加速开发。
三、总结
综上所述,RTOS内核通常由调度器、任务管理、任务间通信与同步、时间管理、内存管理这五个部分组成。
除了内核之外,很多RTOS还提供了文件系统、命令行、网络协议栈、设备驱动框架等可选组件,开发者可以根据项目需求选择性引入。
如果你想进一步理解这五个部分在底层到底是如何实现的,甚至想亲手把它们一个个写出来,那么从空白工程开始手写一个RTOS内核,会是最直接有效的方式。当你亲手实现了调度算法、任务切换、消息队列这些功能之后,RTOS对你来说就不再是一个黑盒了。
如果你希望系统地学习RTOS底层原理,可以了解我的《RTOS开发与实战》课程。
课程不是简单地讲解FreeRTOS API的使用,而是带你从零开始编写一个RTOS内核,逐步实现任务管理、任务调度、上下文切换、同步与通信等核心机制,并通过一个远程温湿度监控设备项目,将操作系统原理应用到实际嵌入式开发中。
适合希望深入理解RTOS工作原理、提升嵌入式底层开发能力的同学。
