(1)从1开始写一个操作系统

第一章

前言

偶然间使用到了RTX51-tiny做一些东西,它是keil自带的51操作系统,以小巧占用资源少著称,这里不细谈它是如何实现的,反正是一个真正的基于时间片的多任务系统。

往往我们在使用单片机做一些东西的时候都比较喜欢前后台的框架,这个方法好处就是整体逻辑简单,就是按循序执行,然后处理中断。缺点就是编程时无法使用任务的思想来划分功能,只能按照逻辑来实现功能,而且对于复杂功能就有点捉襟见肘了。好在使用单片机实现的任务一般都不会太过复杂,这也是单片机上没有推广操作系统的一个原因,还有一个原因就是单片机本身的资源十分有限。

但是这毫不影响我们对操作系统的好奇和使用热情。当我使用RTX51编程的时候,那种面向任务的设计思想能够使我更好的划分功能实现的逻辑。

突然就冒出了一个想法。。。。。。

操作系统是怎么实现的?我想自己写一个试试。

其实在早先看过ucos和rt-thread的一些源码,对于操作系统的实现基本都有了解,但是那些都是在至少是arm上实现的,虽然ucos有人移植到了51上,但是也只有基本功能,而且效率不高。Arm对于51来说简直就是一个质的飞跃,从资源上就已经没有了可比性,在ram上使用操作系统也是理所当然的事情。但是在之前学习其他的操作系统时,即使是看了源码也只是知其然,而不知其所以然。所以没有真真正正的自己亲手写一个,学习的知识只能算作纸上谈兵。

接下来我打算这正的练练兵,我会一点一点的实现一个比较完整的操作系统,同时把自己的代码和心得写下来,留给需要它的初学者一个敲门砖。

为什么我的文章说从1开始呢?不是从0呢?因为我打算把更多的精力放到软件层面上是如何实现一个操作系统的,但是软件就必有硬件平台的支持,我并不打算在硬件上多费口舌,所以需要初读此文的同学自备硬件相关知识,包括后面所使用的芯片的寄存器知识,这些就是需要自备的“0”。

目标

在开始学习之前需要一个目标,就是我们最后要实现一个什么样子的系统,最次要实现哪些功能。

  1. 首先我们需要一个支持时间片和优先级的抢占式实时系统
  2. 我们需要系统支持动态内存,作为一个系统如果不能提供内存管理,这个系统是不完整的
  3. 我们需要这个系统支持任务间通讯,至少要支持信号量,最好能够支持消息队列和共享内存,并且最好能提供一种广播方式
  4. 最好能够提供一个友好的shell工具,这个我在之前已经写过一个,这里可以做一个移植的工作,练练手

好了,目标我们制定完成之后就是选择硬件平台的过程,由于这个是以学习为目的,所以我们需要选择一个简单,易懂,大众化的cpu来作为教学平台,同时还要考虑资源尽可能的多。

我手头刚好有一个STC15W56S4的板子,也是之前做小东西时留下的,这个cpu是8051的内核增强型,有着与8051兼容的寄存器,会51基本就会这个,而且有4k ram和56k rom,对于我们编写操作系统也有好处。而且STC还提供了外设的库,我们可以直接拿来作为bsp使用。

软件首选就是keil了,我使用的是keil5,之后的代码,不管是仿真还是编译都是在keil5的环境下进行。

我们也需要一些好的文章来帮助我们扩展思路。下面几个是我这次学习的主要参考

《构建属于自己的AVR操作系统》——黄建昌

《一起来学RTT系列连载教程》——RTT论坛

《嵌入式实时操作系统μCOS-II原理及应用》——任哲

《ucos教学》——卢友亮

《自己动手写嵌入式操作系统》——蓝枫叶

还有网上许许多多的文章,等讲到相关内容的时候我们在列出

好了,下一章我们开始进行操作系统的正式实践学习。

在以下的讲解中我会尽量全部使用c语言实现,主要是为了方便理解,其实我们为了提高效率往往使用汇编来编写任务切换部分的代码。

如果你是跟着我一章一章进行学习的话可能会发现在后面章节中前面的代码有变更,这是因为我也是一点一点边写代码边写文档,所以导致在后面写代码时发现前面的bug,做了修正。但是可以保证每章的代码都能正常运行。

等我的章节全部完成后我会上传一份源码,同时也会在git上同步更新

先放上git地址:https://github.com/RTplay/RT-OSforSTC15W

完整代码压缩包在这里:https://download.csdn.net/download/andylauren/11800701

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章