底层工作者手册之嵌入式操作系统内核57.pdf
《底层工作者手册之嵌入式操作系统内核57.pdf》由会员分享,可在线阅读,更多相关《底层工作者手册之嵌入式操作系统内核57.pdf(219页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、提供源码,讲述原理从无到有,和你一起一步步编写实时嵌入式操作系统内核操作系统内核也许并没有像你想象的那么神秘底层工作者手册底层工作者手册之嵌入式操作系统内核嵌入式操作系统内核Wanlix 操作系统内核Mindows 操作系统内核我在写本手册前没有任何有关操作系统内核的知识,有的仅仅是简单的使用过 2 个操作系统的经验,也仅限于对操作系统应用层一些功能的简单了解。我在写操作系统内核时也只能从这些应用经验出发,参考一些资料,更多的是自己想办法用最顺其自然的代码实现操作系统的这些内核功能。因此,你要相信,既然我能在此基础上写出这个操作系统内核那么你一定也能看明白。本手册不仅仅是从应用的角度介绍操作系
2、统如何使用,更重要的是从原理的角度对操作系统的功能做了分析、设计,从无到有循序渐进一点点的增加操作系统的功能,并且每增加一个功能便配以一个例子加以演示,让读者能立刻看到代码运行的结果。本手册记录了我从对操作系统内核不了解到写出操作系统内核的过程,这样的一个过程对你来说应该也是一个最好的学习过程。如果你有一定的 C 语言基础,并且对硬件也有稍微的了解,那么我相信你一定会看明白本手册!也一定可以随心所欲的修改、扩展你需要的操作系统功能!书并不只是简单的翻译文档书可以写的让人看得更明白1前言前言目前我所见的绝大部分介绍操作系统的书籍只是从应用的角度告诉读者应该如何使用操作系统,而且相当一部分书籍只是
3、把原有的用户手册整理了一下便出书了,这样的书籍只能当做一本使用手册去查,从学习的角度来说意义不大,一不介绍实现背景、原理,二不介绍应用例子,无法让读者深刻体会操作系统的用法。本手册最大特点是从操作系统的结构设计、编码的角度讲述操作系统内核原理。本手册不是在操作系统写完后才写的,而是一边设计一边编码一边编写,记录了操作系统从无到有的过程,讲解了操作系统实现的原理,只要读者了解 C 语言,再对汇编语言和硬件稍微有所了解便能看懂本手册。05 年 4 月,经历了漫长的学生时代我终于参加工作了!在学校里接触了少的可怜的硬件开发,由于无人指导再加上本人做和尚撞钟,因此所调试的单板问题百出。进入公司后,当我
4、可在硬件与底层软件之间选择时我毫不犹豫的选择了软件,直至走到今天。最开始被分配到做微码,后来又阴错阳差的搞起了 C 语言底层软件开发。我刚入公司时可谓软件基础太差,学校里学的知识也使我仅知道一点 C 语言的概念,从来没有实战过。好在当时所作的项目编码阶段已经结束,我的工作就是学习别人的代码并帮助测试、修改问题,当然,做的也并不好。现在回想起来,在这平淡的工作过程中有三点对我至关重要,一、正是在这段时间培养起我比较扎实的 C 语言基础,不能说学到了很多,但绝对是让我明白了很多最基本的概念,让我知道了学习的方法。二、正是在这段时间我接触了项目的开发,让我参与到历时几年几百人相互协助的项目开发中,看
5、到大项目的开发过程,接触到了很多在学校里永远不会接触到的事物,这些经验对我今后至关重要,虽然只是冰山一角。三、正是在这段时间让我有机会第一次接触了嵌入式操作系统vxworks,虽然仅仅是嵌入式操作系统的一些应用层概念。由于我基础较差再加上我是慢热型,当时工作的并不好,一年半后几经周折我换到了一个小部门。以前几百人的开发团队不见了,众多的技术专家、牛人不见了,一二十层、几个、几十个 CPU 的板子不见了,取而代之的是巴掌大的单板,所谓专家就是我,我一个人就可以是整个项目的全部软件开发人员,设计软件结构、编写从驱动层到业务层的所有代码。以前所做的工作是冰山一角,只知功能不识业务,现如今则需要我承担
6、与软件相关的所有工作。正是在这种环境中我可以借鉴以前的一些经验并按照自己现有的想法设计软件,在实现系统功能的同时也证明了我在硬件、底层软件所掌握知识的正确性。从做大系统的冰山一角,到做麻雀虽小五脏俱全的小系统,各有各的难处,但也各有各的优点,这也为我编写这本手册提供了必要条件。在做这些小系统时有一个问题一直困扰着我,我所作的设备需要与主设备对接,主设备会实时下发命令给我们执行,并且需要实时回应消息,这样看来如果有一个嵌入式操作系统就会比较好实现。但我们的小系统硬件资源受限制,主频低、存储空间少,使得我很难找到一个合适的操作系统。现有的一些能用的操作系统需要收费,有些不提供源码,但让我最不能接受
7、的是资料不全,真看不明白,使用这些操作系统如果在项目开发过程中出了问题又没有很好的技术支持将是很大的风险,因此在做这些小系统时我一直是裸奔。裸奔是可以搞定一切,但对于系统设计、维护来说确实是比较费劲。在一个项目中我抛弃了原有的 51 单片机,使用了 ARM7TDMI 处理器。随着反复查看ARM 芯片手册并在项目调试过程中对 ARM7 芯片的逐步了解,我逐渐意识到实现一个简单的操作系统内核调度功能似乎并没有想象中的那么困难,原以为实现操作系统调度功能需要2深入了解编译器的知识,现在发现只要使用标准的 C 语言、一些汇编语言和芯片硬件知识就可以实现。整理一下我目前所处的情况:1.迫切需要一个适合小
8、系统的嵌入式操作系统,但又没有合适的。2.了解了嵌入式操作系统的一些概念。3.掌握了 ARM7 芯片的硬件结构、C 语言和汇编语言知识。4.找不到一本可以较好的介绍操作系统的书籍,希望能让更多的人了解嵌入式操作系统内核调度的基本原理,并以一种简单易懂的方式让更多的人接受。事已如此,万事具备!现在,我们就开始一起编写两个嵌入式操作系统内核Wanlix和 Mindows!Wanlix 是一个内核非常小的嵌入式操作系统,只有几百个字节(大小与编译器、编译选项也有关),但功能也非常少,只提供任务切换功能,而且需要主动调用函数切换任务。但,它确实可以实现任务调度功能,最难能可贵的是它的小巧,非常适合资源
9、特别少但又需要任务切换的小项目。在这个源码开放的时代,Linux、Unix 遍地生根,它就跟我姓了,因此叫 Wanlix。地球人都知道 Windows,它是一种大型 PC 机操作系统,它是分时操作系统,它是 PC机通用操作系统。而我们将要编写的 Mindows 则是一种小型操作系统,是实时的,是用在嵌入式设备上的嵌入式实时操作系统,一切都是与 Windows 相反的!因此这个操作系统就叫 Mindows!本手册只讲解 Wanlix、Mindows 操作系统的内核,至于其它的例如 BSP、文件系统、协议栈等内容过于庞大,本人没有精力也没有能力实现。这两个操作系统已经提供了源码,有兴趣的朋友可以在
10、此基础上自己试着实现其它功能,与他人互相讨论、交流,共同提高。在此我为大家提供了一个网站:http:/ vxworks 嵌入式操作系统时间只有一年左右,而且只是使用过极其简单的几个最基本的功能,在后来的一个项目中还简单使用过 TI DSP 的 BIOS操作系统,因此本人对嵌入式操作系统的了解仅限皮毛,本手册也仅是根据本人在使用上述两种操作系统中所建立的感官印象并按照我自己的想法来实现的,错误、疏漏之处在所难免,还请各位多多包涵,如有问题,可以反馈到论坛。本人免费提供 Wanlix 和 Mindows 的源码,但不承担您使用本操作系统为您带来的损失。另外,本人语文水平实在有限,当我还年轻的时候就
11、因为高中还需要写作文,就没有报考高中,后来是班主任硬逼着改报的高中,在此向当年的班主任孙老师表示感谢!因此,本手册无法顾及语言优美逻辑顺通,只要大家能看明白就行了,有问题我们可以再交流。最后,向那些无偿付出自己知识的兄弟姐妹们表示敬意!在编写操作系统过程中,确实遇到了一些问题,正是在网上查到你们贡献出的宝贵经验才能让我得以完成此操作系统的编写,因此,我也将这本手册无偿提供给大家,供大家参考,希望本手册能给你能带来一些帮助!2011.09.23 深圳坂田1目录目录底层工作者手册.1前言.1目录.1第 1 章 操作系统基础知识.1第 1 节 为什么要使用操作系统.1第 2 节 操作系统的分类.3第
12、 2 章 写操作系统前的预备知识.5第 1 节 ARM7 芯片基本结构.5第 2 节 ARM7 汇编语言简介.9第 3 节 ARM7 芯片的函数调用标准.19第 4 节 Wanlix 的文件组织结构.23第 5 节 Wanlix 的开发环境.25第 3 章 Wanlix 操作系统.27第 1 节 两个固定任务之间的切换.27第 2 节 任意任务间的切换.36第 3 节 用户代码入口根任务.43第 4 节 使用 Wanlix 编写交通红绿灯控制系统.44第 5 节 发布 Wanlix 操作系统.50第 4 章 Mindows 操作系统.56第 1 节 Mindows 的文件组织结构.56第 2
13、节 定时器触发的实时抢占调度.57第 3 节 实时事件触发的实时抢占调度.78第 4 节 任务切换钩子函数.102第 5 节 任务创建和任务删除钩子函数.107第 6 节 任务自结束.112第 7 节 二进制信号量.116第 8 节 计数信号量.136第 9 节 互斥信号量.144第 10 节 队列.153第 5 章 将操作系统移植到 Cortex 内核的芯片上.158第 1 节 Cortex 内核介绍.158第 2 节 开发环境.162第 3 节 将 Wanlix 移植到 Cortex 芯片.164第 4 节 将 Mindows 移植到 Cortex 芯片.168第 5 节 在 Mindow
14、s 上编写俄罗斯方块的游戏.174第 6 节 从堆申请内存.181第 7 节 任务保护功能.188附录 1Wanlix 接口函数.1附录 2参考资料.2附录 3Wanlix 开发环境安装.32附录 4Mindows 开发环境安装.93图图图 1没有操作系统和有操作系统的函数执行过程.3图 2ARM7 工作模式.6图 3ARM7 工作模式与寄存器.7图 4ARM7 CPSR 寄存器结构.8图 5ARM7 芯片模式位.8图 6MOV 指令的机器码格式.11图 7栈的 4 种类型.14图 8B 指令的机器码格式.17图 9AAPCS 关于 ARM 寄存器的定义.20图 10Wanlix 文件结构.2
15、4图 11Wanlix 文件调用关系.25图 12任务切换过程.27图 13寄存器组在内存中的结构.30图 14寄存器组在栈中的位置.31图 15进入操作系统前后的栈空间使用情况.31图 16两个任务交替执行.36图 17TCB 在栈中的位置.37图 18可创建任意多个任务的运行结果.42图 19使用根任务作为用户入口的运行结果.44图 20十字路口交通红绿灯示意图.45图 21十字路口运行状态切换图.46图 22十字路口主流程图.47图 23十字路口任务流程图.48图 24十字路口红绿灯演示.49图 25Keil 中生成 map 文件的选项.52图 26Keil 中生成库文件的选项.53图
16、27不使用库文件和使用库文件 Keil 工程对比.54图 28Mindows 文件调用关系.57图 29任务状态转换关系图.59图 30ready 表与任务的关联关系图.59图 31空链表.60图 32拥有 1 个子节点的链表.60图 33拥有 2 个子节点的链表.60图 34拥有多个子节点的链表.60图 35ready 表链表根节点与标志的对应关系图.61图 36ready 表 256 级标志分级方法.64图 37Mindows 任务调度流程.71图 384.2 节测试任务执行过程.76图 39tick 中断调度任务的结果.77图 40delay 表结构.78图 41delay 表操作流程图
17、.79图 42任务 delay 时间.794图 43打印消息处理过程.97图 44可变参数函数.99图 45增加 delay 状态的 4 个任务运行结果.101图 46带有任务切换过程的打印.107图 474.4 节任务切换过程图.107图 48带有任务创建、切换和删除过程的打印.112图 494.5 节任务切换过程图.112图 50任务自删除的打印信息.115图 51任务被删除与自删除的打印信息对比.115图 524.6 节任务切换过程图.116图 53TCB 与各种调度表的关系.131图 54任务获取信号量的打印信息.135图 554.7 节任务切换过程图.136图 56信号量改为 PRI
18、O 属性后的任务切换过程图.136图 57计数信号量的打印信息.144图 584.8 节任务切换过程图.144图 59互斥信号量的打印信息.152图 604.9 节任务切换过程图.153图 61任务间使用队列传递消息.153图 62使用队列打印消息.157图 634.10 节任务切换过程图.157图 64XPSR 寄存器.161图 65LM3S8962 开发板.163图 66STM32F103VB 开发板.164图 67Wanlix 移植到 cortex 内核芯片上的打印信息.167图 68cortex 内核任务调度中断.169图 69Mindows 移植到 cortex 内核芯片上的打印信息
19、.174图 70俄罗斯方块游戏任务结构图.176图 71俄罗斯方块游戏图形.178图 72LM3S8962 单板运行俄罗斯方块游戏.179图 73STM32F103VB 单板运行俄罗斯方块游戏.180图 74从堆中分配任务栈空间.182图 75任务自己申请任务栈的测试.187图 765.6 节任务切换过程图.187图 77任务保护测试.192图 785.7 节任务切换过程图.1925表表表 1汇编语言条件码.12表 2MOV 指令汇编格式对比.13表 3十字路口状态表.45表 4增加状态后的十字路口状态表.49表 5Wanlix 版本号格式.55表 6ready 表标志与优先级关系.62表 7
20、优先级数量与需要使用的内存数量.67表 8锁中断解锁中断函数内部状态变化.81表 9信号量操作与二进制信号量空满状态的对应关系.118表 10二进制信号量与计数信号量的对比.137表 11ARM、Thumb 和 Thumb-2 指令对比.159表 12俄罗斯方块游戏需求列表.1751第第 1 1 1 1 章章 操作系统基础知识操作系统基础知识有很多嵌入式系统设备的资源非常少,几十 K 的 ROM,几 K 的 RAM,这种小系统设备上的软件功能也非常简单,软件只要按照设定好的功能周而复始的运行就可以了。这种小系统设备不需要操作系统,也几乎没有合适的操作系统能运行在资源如此少的设备上。当芯片资源越
21、来越丰富,要实现的功能越来越多的时候,你就会发现软件所做的工作不再是简单的重复一件事情了,它需要及时的响应外部的输入信号,需要及时协调自己内部的运行状态,而且多个功能的软件可能会同时运行在一套硬件资源上,这样,软件不能只是简单的按照自己的计划完成自己的事情就可以了,它还需要不断的与外界交互,及时满足其它要求,并根据其它的要求及时调整自己的状态。本章将从几个例子开始,说明在没有操作系统的情况下软件编程的不便之处,以帮助读者理解使用操作系统的任务管理功能,并通过介绍操作系统的相关概念使读者对操作系统有一个基本了解,在后面的章节将依靠这些知识,先实现一个非常简单小巧的非抢占操作系统内核Wanlix,
22、然后再实现一个实时抢占操作系统内核Mindows。第第 1 1 节节 为什么要使用操作系统为什么要使用操作系统在没有操作系统的情况下,C 语言是以函数为单位实现功能的,一个函数一个函数串行的执行,一个完整的功能会由多个函数共同完成。然而当软件系统的功能变得多而庞大的时候,这种方法几乎无法使用,因为此时各个功能之间必然会有千丝万缕的联系,不可能依次串行的完成每个功能,各个功能必然需要交替执行。以函数为功能单元的程序很难在执行一个函数的时候转而去执行另外不相关的函数,即使是使用一些技巧实现了,也会使整个软件结构变的混乱不堪,不利于软件的维护和扩展。函数的工作方式就决定了并不适合以它为功能单元运行复
23、杂的程序,在这种情况下就需要使用操作系统了。操作系统是对函数运行管理的系统,它可以在一个函数还没有运行完就转而去执行另外一个函数,并且还可以恢复到原来的函数继续执行,这样就可以根据需要及时调整到需要运行的函数来满足各种要求。以大家熟悉的 Windows 为例,Windows 上运行了很多软件,有办公的、看电影的,玩游戏的,等等等等,太多了。你想过没有,它们是怎么运行的?它们是由不同的厂商开发的,它们之间如何协调?谁先运行谁后运行?这些就是操作系统要做的事。这些应用程序从宏观上看是在一台电脑上同时运行,但从微观上看它们是串行运行的。电脑的 CPU 每一时刻只能运行一个应用程序,运行很短的时间之后
24、,CPU 又去运行下一个应用程序,周而复始的这么运行。由于 CPU 的速度特别快,因此每个应用程序在很短的时间都可以运行很多次,以人的感觉来说,根本就感觉不到 CPU 在各个应用程序之间切换运行,因此我们就觉得电脑上的每个应用程序都是在同时运行。就像看电影一样,由于影片的刷新频率快过了人眼睛的可分辨频率,因此我们就觉得电影是在连续播放。这就是操作系统的一个重要功能任务调度功能。除此之外,操作系统还有很多功能,比如说文件系统。我们存储的游戏、电影文件是如何放在硬盘上的?为什么我们将几 G 的文件剪切到同一个硬盘分区上时间很短,而剪切到另外一个硬盘分区上则时间很长?为什么在 Dos6 下看不到 N
25、TFS 分区的文件?这些都是操作系统的一个功能文件管理功能。2另外,操作系统还具有设备管理功能。现在我们在 Windows 环境下,可以把一块显卡、声卡直接插到主板上,然后启动电脑,安装驱动程序,甚至不需要安装驱动程序就可以使用了。你可能认为电脑就应该是这样的,但实际上,这简单的背后是操作系统为我们做了很多工作,在过去操作系统并不完善的日子,我们需要手动为硬件分配物理地址、中断等资源,极其麻烦。一个完整的操作系统应该是一个非常复杂非常庞大的系统,还需要包含很多其它的功能,但由于本人能力及精力有限,这些不在本手册的讲述之中,本手册将重点介绍实现嵌入式操作系统的内核调度功能,只侧重任务调度部分,编
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 底层 工作者 手册 嵌入式 操作系统 内核 57
限制150内