原创 设计自己的嵌入式操作系统内核之一 --开篇与总结

2011-8-1 19:41 3420 5 9 分类: MCU/ 嵌入式
一、开篇说明
? 差不多一年前的时候,我买了一本《自己动手写操作系统》的书,由此萌发了对写操作系统的兴趣。记得当时好几天没日没夜的面对着 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的问题进行讨论。

文章评论4条评论)

登录后参与讨论

用户4239 2009-8-22 19:06

O(∩_∩)O谢谢

tengjingshu_112148725 2009-8-18 21:33

难得啊,向博主学习:)

用户1475518 2009-8-18 18:40

想学学,看看先

用户518079 2009-8-18 14:25

严重支持!
相关推荐阅读
用户403611 2014-01-20 07:28
与TKScope仿真器同行(1) - 看门狗会让你无法调试
  前几日,中矿龙科的李工向我反映了一个有意思的问题: 在使用TKScope仿真器(型号AK100pro)调试STM32时,出现了一个非常奇怪的现像。在Keil环境中的源代码设置了一...
用户403611 2013-02-27 13:41
ARM指令仿真项目经历纪录一
这两天接了个新项目-ARM指令仿真项目,开发时间预期在两个月左右。这次将继承沿续自己以前做Cortex-A8、A9内核仿真项目时的方法,用日志纪录在开发过程中的各种问题解决方案和体会。限于某些原因...
用户403611 2013-02-27 13:39
电子工程师应尝试产品经理的角色
做技术两三年了,发现自己一直陷入到技术细节当中,而从来没有尝试跳出来去从整个产品的角度进行观察。这其中可能是因为需要了解的技术细节太多,没有闲暇去关注技术之外的东西。另一方面也与个人的视野不够开阔...
用户403611 2011-11-13 20:05
EDNChina的博客已经改得面目全面了
 之前有些日子没去ENDChina了。从08年起,断断续续地在这上面写一些技术类的Blog,到现在已经有快4年,虽然文章写的不多,但挺有感情的。   这两天回去看看,访问http://blog...
用户403611 2011-10-14 22:02
TKScope仿真器使用入门视频教程
  相对来说,看视频肯定要比看PDF文档要容易的多吧。部门之前仅在网上发布了TKScope仿真器使用的PDF文档。虽然文档写的很详细,但实际真正愿意去看的不多。前些日子自己录制了TKScope仿真AR...
用户403611 2011-09-18 23:00
尝试建立一个部门内部的知识库站点
前些天有事直接去找了下戚工反映TKScope仿真器方面的几个问题。问题解决之后闲聊了几句,其中就提及了建立一个共享的内部网络站点。当时我听了很兴奋,因为这个想法与我的不谋而合。早在刚进入这个部门不久,...
我要评论
4
5
关闭 站长推荐上一条 /3 下一条