400行程序写一个实时操作系统(二):sparrow与FreeRTOS的对比

sparrow是笔者开发的一款极小型RTOS,代码仅有400行,但是作为一个RTOS内核,笔者认为它是合格的,读者可以将它看成是一个mini版本的FreeRTOS内核,它实现了动态内存管理、阻塞延时、多线程、临界区、优先级、低功耗空闲任务等功能,与FreeRTOS内核相比,它的遗憾是同优先级(时间片)没有实现。

可能读者有些难以置信,要知道FreeRTOS仅仅包括内核和队列、信号量这些应用就有两万行左右的代码,单把内核拿出来,里面的一个tasks.c文件就有五六千行,甚至不说多线程了,光一个heap4.c文件实现动态内存管理就远远超过400行了。sparrow单凭400行代码完成动态内存都够呛,怎么可能完成这一庞大的任务呢?

请听笔者细细解释,FreeRTOS作为一个开源且被大量商用的RTOS,可不仅仅是实现功能就够了,它还要根据不同的应用场景选择同一种功能的不同形式,例如:创建任务就包括动态内存创建任务和静态内存创建任务。更别说,为了提供足够的稳定性,FreeRTOS更是在大量的关键代码处添加assert(断言)来判断一些内存溢出问题或者其他问题,例如在我们使用pvPortMalloc时,它还要判断传入pvPortMalloc的申请值是否大于0,这是为了稳定性而做出的让必要牺牲。

但是,笔者的Sparrow作为一个学习用途的极微型RTOS,它的目的是为了方便读者学习RTOS内核的本质,学习操作系统、arm架构以及gnu c等知识,所以它的要求就是实现基本的功能,以及:能跑就行!

不过极度的简洁是有代价的,要知道实现一个链表以及基本的增删查改操作,就要超过四百行代码了,为此,笔者决定直接放弃链表,所以,同优先级的时间片是无法实现了。

现在笔者将sparrow和FreeRTOS内核进行对比:

FreeRTOS内核基本功能:多线程、多优先级、临界区、自定义空闲任务、阻塞延时、动态内存管理、同优先级下的时间片

sparrow基本任务:多线程、多优先级、临界区、自定义空闲任务(默认是进入低功耗模式)、阻塞延时、动态内存管理

现在对各个子模块功能进行对比:

多线程:sparrow最大支持32个线程,FreeRTOS可自定义最大个数,且远远超过sparrow。

多优先级:sparrow使用arm架构提供的指令获得最高优先级,只有一种调度算法,而且依赖于arm架构,FreeRTOS提供多种调度算法查找最高优先级,不依赖具体架构。

临界区:FreeRTOS内核的临界区有多种版本,例如带中断保护版本和不带中断保护版本,Sparrow只有一种,使用方法与FreeRTOS带中断保护版本相同,但是在临界区代码中加入了一层保护。因为FreeRTOS的临界区并不是强制性的原子操作,有被打断的风险,甚至临界区的建立都可能被打断。Sparrow的创建临界区的代码执行是原子性的,但是临界区的区域与FreeRTOS相同,是可选择性屏蔽中断的。

自定义空闲任务:该任务是RTOS无其他任务就绪时才运行的任务,两种RTOS的空闲任务都是可自定义的,所以没什么区别。

阻塞延时:sparrow在任务查找任务延时是否到时间,选择的是遍历全部优先级,而FreeRTOS只对加入延时列表的任务进行遍历,更加灵活。

动态内存管理:sparrow的内存管理算法与FreeRTOS的heap4.c采用的策略是一模一样的,都是小内存管理算法。FreeRTOS因为加入大量assert防止内存溢出等等问题,更加稳定。

任务的挂载:FreeRTOS采用链表挂载任务控制块,而sparrow使用数组并使用任务优先级作为数组下标查找任务,更加简洁。

以上就是两者对比,其实也没啥可比性, 因为sparrow的简洁性和可学习性才是首要目标,而不是功能性。

sparrow源码地址:skaiui2/SKRTOS_sparrow at source (github.com)

相关推荐
马优晨7 分钟前
JAVA 中 VO 实体类是什么意思,为什么要做这个
java·开发语言·状态模式·java vo·java vo是什么
55873生态系统手记11 分钟前
三足鼎立,文明永续:55873 全域文明生态系统的架构师分工、十三套子大典与 Web4 技术底座拆解
架构
Aurorar0rua15 分钟前
CS50 x 2024 Notes Python - 01
开发语言·python·学习方法
026d2317 分钟前
状态信号只知“其然”不知“其所以然”:变工况机械故障诊断的物理盲区
算法
姜鱼问生35 分钟前
备份和服务器在同一台机器上,等于没备份
算法·架构
搜狐技术产品小编202335 分钟前
MVI + Compose 架构实战:从状态混乱到单向数据流
架构
姜鱼问生42 分钟前
别再 chmod 777 了,用 ACL 给它开一扇窗
后端·算法·架构
特立独行的猫a1 小时前
仓颉语言UI开发实战:我用仓颉写了个桌面版力扣
算法·leetcode·ui·tauri·仓颉·cj-tarui
茉莉玫瑰花茶1 小时前
GO [ 标准库 ]
开发语言·后端·golang
y1su1 小时前
Leetcode 动态规划 模板
java·数据结构·算法·leetcode·动态规划