一、开篇说明
? 差不多一年前的时候,我买了一本《自己动手写操作系统》的书,由此萌发了对写操作系统的兴趣。记得当时好几天没日没夜的面对着 X86 的虚拟机,GCC, Makefile,虽然很累,但依然干劲十足。由于自身知识储备的不足,最终半途而废。写一个自己的系统便成了未完的梦想。
? 在兴趣的推动下,自己买了本操作系统原理的书来看,虽然抽像,最终还是慢慢的啃了一大半。后重新拿起了单片机的教材,到电子市场买回 51,电阻,按键这类的一大包元件,在万用板上焊电路,在 keil 上写代码,从汇编开始,逐渐过渡到C。慢慢的,由 51 过渡到? (ARM7) 并且在学习嵌入式系统导论课时,? 。 自行阅读了 ucos 源码, 并移植到 AVR,S3C44BOXS3C44BOX 。
? 正因为有以上的基础,才让我确定自己有能力写一个简单的嵌入式操作系统。
? 对于这样的一个系统,我首先参考的是 uc/os。因为我对操作系统内核的理解目前只局限于 uc/os 和操作系统原理的教材。所以,这个系统是对 uc/os 的仿制,本身谈不上有什么创新。我也无力于一开始就高呼“做国人自己的操作系统”。这个系统太简单了,运行效率太低了,只能做为自己业余的作品。我的目的是借助自己写代码这一过程,加深对原理的理解,并且提高下自己的编程能力。至此之前,还没有写过上 1K 行的代码。就最后的结果来看,这一过程算是达到了,整个代码的行数 4K 多点,其中包含注释。对系统原理及数据结构的理解也加深了。
二、设计目标
1) 、任务管理:按优先级对任务调度,同一优先级的任务间按时间片调度。每个优先级不限定任务数量.。允许任务的创建,删除,挂起。
2)提供任务的延时、等待事件的挂起.
2)、任务同步与通信::实现信号量及基本操作,允放任务间互发消息,允许任务间发
送信号,提供互斥体机制。
3) 、能够比较容易的移植到其它平台上。如ARM7。
4) 、提供方便的 eos配置功能。
5)、良好的代码编写风络与比较规范的文档。
四、开发工具
? 软件:winavr20071221 GCC 编译器等
? IDE 环境与汇编支持
? AVR studio 4.14.589
? AVR 单片机仿真环境,提供OS应用的测试
? Protues 7.1Sp2
? 语言: C 语言 + 汇编
? 硬件:Atmega32 核心板 及包含若干LED,键盘等的接口电路板。
? jtag ice 调试器
? 实际上,Atmega32 上 2K 的 RAM 有些少了,最终的内核代码写好后,一般只能最多运行少于 10 个任务。
? 注意软件的版本一致。若不一致,可能会出现一些意外的问题。
五、关于文档、代码的说明
? 包含本篇文章在内,一共八篇文章,是对 eos 实现的整体说明,按模块进行叙述。其中会包含一些总结或总结性的东西。限于本人的写作水平,可能包含一些难以理解的文字。其中的一些问题,可以通过读源代码得到解决。有关操作系统原理性的东西,不会提及,毕竟这不是写教材,我也写不来!
? 这个内核的代码出自一业余的、 未经过有效训练人之手, 因而代码的质量不作任务保证 ,可读性、可维护性都不会太好。当然,对我而言,这并不是问题。
六、设计与实现总结
? 整个过程大概经历三个月时间,其中对代码经过多次反复的修改。特别是在设计队列结构、其它模块的支持函数时花去了较多的时间,大的修改有好几次。其它模块的实现相对要简单些。 就整体而言, 整个系统类似于 uc/os, 但细节部分还是有较大的不同。 因为只读过uc/os源码,所以在最开始实现时,我就力图避免有太多的内核结构和 uc/os 一致。从现在看来,对于同一种机制,如果实现的策略不同,那么其结构也就不一样了。比如存储管理模块,同为基于定长存储块管理, 但eos 进行存储分配的接口、 功能不同, 使得整个代码设计就与 uc/os的完全不一样。
? 读代码和自己重新写一个的感觉还真不一样。即便是去实现一个同 uc/os 结构完全一样的东西,自己写代码时,就需要考虑到很多细节性的东西了。有时才会理解作者为什么要那样设计,一些看似简单的代码,实际的功能要过读代码时理解的要更复杂些。相比一般的在Linux/windows 上写单线程的程序,因为有多任务的运行,嵌入式操作系统内核代码更难于编写,必须考虑多任务存在的影响。有时出了问题,非常难于调试。有句话: “纸上得来终觉浅,觉知此事要躬行”。
? 需要特别说明的是,如果某位之前没有读过内核代码,甚至于没有操作系统原理的基础知识,那么请不要试图去阅读这些文章和代码。坚持这样做没有任何好处!如果想理解内核的运行原理,请阅读 uc/os 的源码和 uc/os 相关的书,这类的内核能有效的让你理解内核!当然,如果某位想自己也写一个内核的话,我的这个可以作为参考,也欢迎与我就一些问题进行交流。已经说明,这只是一个嵌入式操作系统的内核,所以包含的功能很少,而且也不像在 X86 上跑的操作系统一样,这个系统运行在单片机上!
源码及PDF文档:
https://static.assets-stash.eet-china.com/album/old-resources/2009/8/18/2480bd03-a37f-4767-aa69-098236caeb66.rar
该内核是我在学习ucos源码后写的,其中很大程度上受益于<<嵌入式实时操作系统 uc/os ii>>.整个内核的框架和ucos的差不多,一些数据结构和算法也参考了ucos。虽然,这个内核只能称得是一个“仿制品”,并且还有很多bug,但对我而言,做到目前这种程度已足矣。需要特别指出的是,这个内核还显得非常稚嫩,还不足以用来做实际的应用,只能作为一点参考。限于目前的水平,本人无法再做进一步的优化。如果有朋友对嵌入式os有兴趣但不了解os,千万不要读我的这些代码,去参考ucos吧。我的代码只能作为自己学习设计时的一个参考。
? 最初写这个代码时,只是想深入理解下os的原理。将之前在操作系统原理书上和嵌入式系统课上学到的知识实践化。就现在的情况而言,目的已经到达,甚为高兴。非常愿意与您就自行设计嵌入式os的问题进行讨论。
用户4239 2009-8-22 19:06
tengjingshu_112148725 2009-8-18 21:33
用户1475518 2009-8-18 18:40
用户518079 2009-8-18 14:25