我写的新书《嵌入式操作系统内核调度》已经出版,可以在京东购买,链接为http://item.jd.com/11651316.html#none
本书配套代码可以在我的论坛下载:http://bbs.ifreecoding.com/forum.php?mod=viewthread&tid=25&fromuid=1
本书代码演示视频可以在 http://bbs.ifreecoding.com/forum.php?mod=viewthread&tid=26&extra=page=1观看
现在有很多介绍操作系统的书籍,介绍操作系统的概念、原理以及用法等,这些书籍对读者学习操作系统有一定的帮助,但也会有不足之处。我一直认为,介绍一种技术的书籍,首先要以最简单的方式让读者明白原理,“哦,原来是这么回事。”然后,再结合例子加以演示,最好可以让读者亲自操作,让读者明白,“哦,原来这么用就可以了。”
一些介绍操作系统的书籍介绍的内容非常多,其中每一个功能都可以写成一本书来介绍,因此,读这样的书只能大概了解,无法深入本质;或者这些书会假设你具备了非常多的知识,否则你根本就不知道这书是在讲什么,如果你是希望入门的读者,那么这个要求就太高了。
本手册正好相反,介绍的内容不多,你看不到操作系统多种功能的介绍,当然,阅读本手册你也会学习到从其他书籍学习不到的知识。本手册只介绍嵌入式操作系统最核心的功能——任务调度功能,非常适合入门学习。这不需要你具备很多有关操作系统的知识,你只要具有程序员的基本功就可以了,只需要你会用C语言,如果对汇编语言和处理器也有那么一点了解就更好了,剩下的事情就交给我,我将和你一起将C语言和一小部分汇编语言组装成操作系统程序,我们一起运行这段程序,一步步实现与操作系统任务调度有关的多个功能。本手册的目的不是推广手册中的操作系统商用,而是让读者能更好地了解操作系统的基本原理,能够灵活应用。
本手册将按照下面的顺序编写:
◆ 第1章举例说明不使用操作系统编程会遇到的困难,然后介绍操作系统的分类、功能。
◆第2章介绍编写操作系统任务调度所需要具备的基本知识,介绍本手册所使用的几条汇编指令以及所使用的处理器结构。
◆第3章开始编写操作系统代码,介绍任务调度原理,并使用C语言和汇编语言编程,实现2个固定任务间的切换,之后再扩展到任意多个任务间的切换,最后再增加一些基本功能,完成Wanlix操作系统的编写。作为本章的结束,将使用Wanlix操作系统编写一个交通红绿灯控制系统。
◆第4章开始编写实时嵌入式操作系统Mindows,介绍实时嵌入式操作系统的调度原理,编写任务钩子、任务删除、信号量、队列等最基本的功能程序。作为本章的结束,将使用Mindows操作系统编写一个俄罗斯方块游戏。
◆第5章继续完善Mindows操作系统的功能,增加任务优先级继承、任务轮转调度、栈异常打印、栈统计、CPU占有率统计等功能,这些功能都是可裁剪的。作为本章的结束,将使用Mindows操作系统编写一个嵌入式软件平台。
◆第6章将分别在Mindows、μCos、Windows和Linux操作系统下编写任务调度程序,采用相同的程序结构。
◆ 第7章简单介绍进程机制,并使用线程模拟多进程。
本手册每增加一个功能,会先对该功能的原理作一番介绍,然后进行结构设计并编写代码实现该功能,最后使用一个例子演示该功能。例子可以在开发板上运行,通过串口和LCD显示屏观察该功能的运行效果。在一些章节的最后,还会编写几个嵌入式应用程序,应用编写的操作系统。
通过本手册,不但可以了解嵌入式操作系统的原理并一步步编码实现它,还可以通过本手册中丰富的例子学习操作系统的使用方法,学习在一个项目中如何设计和应用它。
另外,需要说明,我在编写本手册时参考的是其他操作系统的应用层功能,然后自己再反过来设计并实现操作系统内核层功能,因此本手册所实现的操作系统任务调度功能与其他操作系统在细节上可能会有些差异。
由于本人能力有限,工作之余写书,其中疏忽、错误在所难免。编码不易,写书不易,如有问题请读者反馈给我,我将尽力修正,还请大家多多支持!
声明:本人提供Wanlix和Mindows操作系统的源码,可以免费使用,可以到网站获取相关的资料,但如果因使用本手册中的代码而带来损失,本人将不承担责任。
本手册介绍实时嵌入式操作系统内核任务调度的实现方法及相关知识。
部分介绍操作系统的书籍只是从应用的角度讲解操作系统,有些可能连译者自己都没搞清楚,就更不要说让读者明白了,有些甚至是直接翻译操作系统的用户手册就出书了,这样的书籍对于学习操作系统原理来说意义不大。本手册最大的特点是从操作系统结构设计、编写操作系统的角度讲述操作系统内核的调度原理,并结合多个例子演示一个一边设计、一边编码、一边写书的过程,记录了操作系统从无到有的过程,讲解了实现操作系统的基本原理,读者只要了解C语言,再对汇编语言和处理器结构稍微有所了解便能看懂本手册。
2005年4月,经历了漫长的学生时代,我终于参加工作了。进入公司后,我选择了做软件,直至今天。刚入公司时软件基础太差,学校里学的知识也仅使我知道一点C语言的概念,几乎从来没编写过代码。好在当时所做的项目已过了编码阶段,我的工作就是学习别人的代码并帮助测试、修改问题。现在回想起来,在这平淡的工作过程中有三点对我至关重要:①正是在这段时间培养了我比较扎实的C语言基础,虽不能说学到了很多,但是让我明白了很多最基本的概念,知道了学习的方法;②正是在这段时间我接触了项目开发的一些流程,参与到历时几年几百人协作的项目开发中,经历了大项目的开发过程,接触到了很多在学校里永远不会接触到的事物,这些经验对我至关重要,虽然只是冰山一角;③正是在这段时间让我有机会接触到嵌入式操作系统——VxWorks,尽管只是嵌入式操作系统的一些应用层用法。
工作一年半后我换到了一个小部门,从原有部门做大系统的冰山一角到做麻雀虽小五脏俱全的整个小型嵌入式系统,各有各的难处,但也各有各的好处,这也为我编写本手册提供了必要条件。
在做小系统时有一个问题一直困扰着我:我所做的下位机设备需要与上位机设备通信,上位机下发的消息需要下位机实时回应,并且下位机可能会同时处理多条消息,这样看来,如果有一个嵌入式操作系统解决任务调度问题,那么下位机的设计就会比较方便。但由于我们的小型嵌入式系统硬件资源受到一些限制,主频低、存储空间少,很难找到一款合适的嵌入式操作系统。当时的一些符合硬件资源条件的操作系统要么需要收费,要么不提供源码又没有可靠的服务保障,最不能接受的是资料不全,使用起来非常不方便,因此我在做这些小系统时一直是“裸奔”。“裸奔”是可以搞定一切,但对于系统设计、维护来说代价也是不小的。
后来在一个项目中我放弃了原有的51单片机,使用了一款ARM7处理器。随着反复查看ARM处理器手册并在项目开发过程中对ARM7处理器的逐步了解,我意识到实现一个简单的操作系统任务调度功能并没有想象的那么困难,原以为实现操作系统任务调度功能需要深入了解编译器的知识,但我发现只需要使用标准的C语言、一些汇编语言和处理器知识就可以实现。
整理一下我当时所处的境况:
(1) 迫切需要一个适合小系统的嵌入式操作系统,但没有合适的。
(2) 了解了嵌入式操作系统的一些应用层概念。
(3) 掌握了ARM7处理器的结构、C语言和汇编语言知识。
(4) 找不到一本可以较好地介绍操作系统内核调度的书籍,希望能让更多的人了解嵌入
式操作系统内核调度的基本原理,而不仅仅是如何使用。
既然如此,那么我们就开始一起编写具有任务调度功能的两个嵌入式操作系统内核——Wanlix和Mindows。
Wanlix是一个内核非常小的嵌入式操作系统,只有1KB左右(大小与编译器、编译选项等因素有关),功能也非常少,只提供任务切换功能,而且需要主动调用函数切换任务。但是,它确实可以实现任务调度功能,最难能可贵的是它的小巧,非常适合资源特别少但又需要任务切换的小项目。在这个源码开放的时代,Linux、Unix遍地生根,考虑到我姓王,因此我将它叫作Wanlix。
Windows是一种大型PC机操作系统,它是分时操作系统,是PC机通用操作系统,而我们将要编写的Mindows则是一种小型操作系统,是实时的,是用在嵌入式设备上的实时嵌入式操作系统,一切都是与Windows相反的,因此这个操作系统就叫作Mindows!Mindows具有较多的功能,支持多优先级任务抢占,可以实现任务实时切换,具有信号量、队列等机制,并且可以裁剪掉不需要的功能。
本手册只讲解Wanlix和Mindows操作系统的内核调度,至于其他的文件系统、内存管理等,由于内容过于庞杂,本人没有能力也没有精力实现,只是在某些章节会作一些浅显的介绍。这两个操作系统提供了源码,有兴趣的读者可以在此基础上自己试着实现其他功能,与他人讨论、交流,共同提高,在此我为大家提供3个网址:
大家可以登录这些网站下载本手册的源代码、演示录像及参考资料、开发工具等,并可在论坛进行交流。
本手册主要由王奇负责编写,湖南大学谷志茹博士、大连海事大学姜日凡博士参与了部分章节的编写工作。感谢在华为工作时的同事郑朝晖、时峰、马继彬、潘玉园、赵峰、贾国昌、何斌、王继松、赵虎、李佳、张婷婷等对本手册提出了许多宝贵的意见,感谢我的主管张键、袁震等给予工作上的支持,感谢姜英华、曹昌平、喻妍等参与了本书部分文字录入及校对工作。
最后,向那些无偿提供知识的兄弟姐妹们表示敬意!在编写操作系统过程中,确实遇到了一些问题,正是你们贡献出的宝贵经验才让我得以完成此手册的编写工作。
作者
2015年1月
第1章 操作系统基础知识
1.1 为什么要使用操作系统
1.2 操作系统的嵌入性和实时性
1.3 操作系统功能介绍
第2章 编写操作系统前的预备知识
2.1 Cortex-M3内核的基本结构
2.2 Thumb-2汇编语言简介
2.3 函数间调用标准
2.4 开发环境介绍
第3章 编写Wanlix操作系统
3.1 Wanlix的文件组织结构
3.2 两个固定任务间的切换
3.2.1 原理介绍
3.2.2 程序设计及编码实现
3.2.3 功能验证
3.3 多个任务间的切换
3.3.1 原理介绍
3.3.2 程序设计及编码实现
3.3.3 功能验证
3.4 用户程序入口--根任务
3.4.1 原理介绍
3.4.2 程序设计及编码实现
3.4.3 功能验证
3.5 增加任务入口参数
3.5.1 原理介绍
3.5.2 程序设计及编码实现
3.5.3 功能验证
3.6 发布Wanlix操作系统
3.7 编写交通路口红绿灯控制系统
3.7.1 功能介绍
3.7.2 程序设计及编码实现
3.7.3 功能演示
第4章 编写Mindows操作系统
4.1 Mindows的文件组织结构
4.2 定时器触发的实时抢占调度
4.2.1 原理介绍
4.2.2 程序设计及编码实现
4.2.3 功能验证
4.3 实时事件触发的实时抢占调度
4.3.1 原理介绍
4.3.2 程序设计及编码实现
4.3.3 功能验证
4.4 任务切换钩子函数
4.4.1 原理介绍
4.4.2 程序设计及编码实现
4.4.3 功能验证
4.5 任务创建和任务删除钩子函数
4.5.1 原理介绍
4.5.2 程序设计及编码实现
4.5.3 功能验证
4.6 任务自结束
4.6.1 原理介绍
4.6.2 程序设计及编码实现
4.6.3 功能验证
4.7 从堆申请任务栈
4.7.1 原理介绍
4.7.2 程序设计及编码实现
4.7.3 功能验证
4.8 二进制信号量
4.8.1 原理介绍
4.8.2 程序设计及编码实现
4.8.3 功能验证
4.9 计数信号量
4.9.1 原理介绍
4.9.2 程序设计及编码实现
4.9.3 功能验证
4.10 互斥信号量
4.10.1 原理介绍
4.10.2 程序设计及编码实现
4.10.3 功能验证
4.11 队列
4.11.1 原理介绍
4.11.2 程序设计及编码实现
4.11.3 功能验证
4.12 在Mindows上编写俄罗斯方块游戏
4.12.1 功能介绍
4.12.2 程序设计及编码实现
4.12.3 功能演示
第5章 Mindows可裁剪的功能
5.1 任务优先级继承
5.1.1 原理介绍
5.1.2 程序设计及编码实现
5.1.3 功能验证
5.2 同等优先级任务轮转调度
5.2.1 原理介绍
5.2.2 程序设计及编码实现
5.2.3 功能验证
5.3 记录任务切换信息
5.3.1 原理介绍
5.3.2 程序设计及编码实现
5.3.3 功能验证
5.4 任务栈统计
5.4.1 原理介绍
5.4.2 程序设计及编码实现
5.4.3 功能验证
5.5 CPU占有率
5.5.1 原理介绍
5.5.2 程序设计及编码实现
5.5.3 功能验证
5.6 发布Mindows操作系统
5.7 编写基于Mindows的嵌入式软件平台
5.7.1 嵌入式软件系统结构
5.7.2 结构设计
5.7.3 应用实例
第6章 使用不同操作系统编写多任务程序
6.1 程序结构介绍
6.2 使用Mindows操作系统编写程序
6.3 使用μCos操作系统编写程序
6.4 使用Windows操作系统编写程序
6.5 使用Linux操作系统编写程序
第7章 浅析进程
7.1 单进程工作原理
7.2 使用单进程模拟多进程
7.3 多进程工作原理
附录 AWanlix操作系统接口函数
A.1 接口函数列表
A.2 接口函数说明
附录 BMindows操作系统接口函数
B.1 接口函数列表
B.2 接口函数说明
参考文献