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 分钟前
【MARL】深入理解多智能体近端策略优化(MAPPO)算法与调参
人工智能·python·算法·机器学习·强化学习
Mr_Xuhhh9 分钟前
重生之我在学环境变量
linux·运维·服务器·前端·chrome·算法
Ajiang28247353041 小时前
对于C++中stack和queue的认识以及priority_queue的模拟实现
开发语言·c++
盼海1 小时前
排序算法(五)--归并排序
数据结构·算法·排序算法
幽兰的天空1 小时前
Python 中的模式匹配:深入了解 match 语句
开发语言·python
Theodore_10224 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
网易独家音乐人Mike Zhou5 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
----云烟----6 小时前
QT中QString类的各种使用
开发语言·qt
lsx2024066 小时前
SQL SELECT 语句:基础与进阶应用
开发语言
开心工作室_kaic7 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端