400行程序写一个实时操作系统(五):本系列教程的基本思想

本文章笔者继续唠嗑本系列教程的基本思想。

可能会有读者觉得,文章已经更到了第五篇,但笔者依旧没有教读者如何一行行开始写RTOS,反而是谈了一堆云里雾里的东西,这不是浪费时间吗?

说实话,笔者也感觉自己有点过于啰嗦了。

但是,坦白来说,写一个RTOS并不是一件简单的事情,没有一些思考与体会,仅仅只是“抄”出一个RTOS来,是没有任何用处的,所以,请允许笔者继续讲一些 “废话” 。

接下来介绍本系列教程将会如何教大家写一个RTOS。

如果读者阅读过Sparrow的源码,就会发现里面除了c语言,还有一大堆汇编和二进制,这些奇奇怪怪的符号,光是看着就让人感觉头疼了,难道学习写RTOS之前自己必须去学习汇编吗?还是说教程中会引入一大堆古老的汇编语言,但是学习这种老旧的汇编语言有什么用呢?

笔者认为:不用担心这个问题!本系列教程只要有c语言基础即可,不过剩下深入的内容需要读者自己去发掘。

封装思想

为了避免杂乱的汇编影响读者写RTOS的体验,笔者将会简单介绍封装思想。

封装,简单理解就是将一些程序看作是一个个的黑匣子,不去关心它内部的实现细节,而将重点放在它能实现的功能上。

应用软件下是操作系统,操作系统下是指令集,而指令集又不过是硬件提供的接口。如果我们在面对问题时不使用封装思想,这样一层又一层下去,你怎么可能学得会呢?

所以,如果读者没有学过汇编,也不想为了写RTOS而花费精力学习汇编语言,那么面对汇编与各种奇怪的地址,请使用封装思想!不需要去关注其内部实现的具体细节,而应当把重点放在它实现的功能上。

当然,考虑大家不同的基础与需求,笔者也是会给出大部分汇编语言的具体解释的,精确到每一行指令到底干了什么事情。但笔者不会放在本系列教程中,因为笔者之前有一些分析RTOS内部汇编的博客,例如对SVC、PendSV上下文切换内部的每一条指令的解释。当讲到有关汇编的程序时,笔者会介绍其封装实现的功能,同时给出具体分析汇编指令的链接,以供有兴趣的读者阅读。

面向对象思想

一个RTOS,内部必然是复杂的,所以我们需要有模块化的思想,面向对象就是一种很好的模块化思想。

简单介绍一下面向对象。

面向对象,就是将软件设计为由多个“对象”组成来简化代码的开发和维护。

打个比方,A让B去帮她拿一本书。在这里,A、B就是两个不同的对象,”拿一本书“是B的一个方法,A让B去做事情,这是A的一个方法。

这样一看,原本混乱的逻辑顿时有了条理,我们可以发现,任何程序都可以看成是不同对象相互作用的结果,这有助于我们开发模块化的程序,例如,如果这句话变成了:A让B去帮她拿书包。我们不必重新描述这个过程,只需要在B的方法里面添加“拿书包 ”这个方法,而不用改动A。

笔者讲一讲FreeRTOS,它是采用面向过程的思想进行开发的,内部的程序各种嵌套,可谓是让人眼花缭乱。当我们跳转进一个又一个的函数,相信我们早已经迷失了目标,此时,我们才会感受到模块化开发的好处,所以,笔者推荐使用面向对象的思想看待内核中的各个部分,这样才能让我们不迷失方向,也能帮助我们写出更加健壮、维护性更好的程序。

程序 = 数据结构 + 算法

程序 = 数据结构 + 算法,这句话相信很多读者都听过。其实读者发现没有,如果你把数据结构看成对象,把算法看成方法,这是不是与面向对象思想有一些接近?

笔者建议,读者在编写程序时,可以尽可能的对结构体进行封装,可以将各种数据结构看出对象,基本的算法(例如增删查改)都可以看作这个对象的方法。

其实链表是一个很好的理解 程序 = 数据结构 + 算法 的素材,不过笔者的Sparrow以小巧和简洁为目标,所以没有使用链表,因为使用后肯定会远远超过400行代码了,实在是负担不起,而且也没这个必要。

结语

笔者简单介绍了本系列教程的基本思想,这些都需要读者细细体会。下一篇博客,笔者将会带领大家开始写第一行程序了。

第一个开始的部分,是动态内存管理部分,笔者将会教大家写一个更适合单片机体质的内存管理算法,类似于c语言中的malloc和free函数(> <)。

上一篇:Unity游戏通用框架——UI的管理和加载-使用


下一篇:key形式和key/value形式二叉树