| 嵌入式实时操作系统Small
RTOS51原理及应用

(点击图片可放大) |
嵌入式实时操作系统Small RTOS51原理及应用
陈明计 周立功 等编著
北京航空航天大学出版社出版发行
2004年1月第1版
书号:ISBN 7-81077-409-3
定价:38.00元(含光盘)
购买联系: 北航出版社 网上购书 |
| 内容简介 |
Small RTOS51是为51系列单片机而编写的。它是完全免费的、源代码公开的多任务实时操作系统。它可在无任何外部数据存储器的单片80C51系统上运行,并且是可移植的。全书分两部分。第一部分为基础篇,介绍Small
RTOS51和一些基本概念,并详细分析Small RTOS51的工作原理。第二部分为应用篇,给出部分常用硬件在Small
RTOS51下驱动程序的源代码。这些源代码在DP51单片机仿真实验仪上全部调试通过,且只要经过很少的改动,或是不改动,就可以在其他环境下使用。应用篇还通过对这些源代码的分析,让读者理解基于RTOS的编程方法,并给出完整的例子让读者全面掌握基于RTOS的编程方法。
本书可以作为高等院校相关专业的课程教材、实验参考资料或课外读物,对嵌入式应用开发人员也有重要的参考价值。
|
| 前 言 |
|
快速掌握嵌入式操作系统的捷径
2002年的某一天下午,有位员工告诉我,他发现有人在“21IC中国电子网”发布了一个基于80C51单片机、仅需要4
KB程序空间和128个RAM单元就可以运行的嵌入式操作系统自由软件源码。我不由自主地想到了这个人可能就是公司要寻找的优秀人才,于是开始静下心来花了一个通宵大致阅读了整个源码,发现作者编写的程序具有非常良好的风格。凭我多年的经验判断,作者是一个有强烈爱好和敬业精神的人,于是开始给作者写Email联系。当然,现在他已经成为了我们公司的员工,他就是本书的主要作者陈明计先生。他目前主要负责嵌入式操作系统应用部门的工作,领导一个小组从事PHILIPS公司半导体32位ARM单片机的应用开发。
去年,我邀请清华大学邵贝贝教授来公司专门讲解μC/OSII嵌入式操作系统。为了帮助内部开发工程师深入掌握嵌入式操作系统的应用技术,我要求公司的开发工程师尝试写作一个基于80C51单片机的小操作系统。有一部分员工完成了这个大作业,可以说效果十分惊人,完全达到了理解和掌握嵌入式操作系统的目的。由此可以看出,这是一种行之有效的学习方法。
面对未来,一个要继续从事电子产品开发的工程师,不懂得嵌入式操作系统是不可想像的。怎么办?实践证明,最好的办法就是尝试自己写一个简易的嵌入式操作系统。不在乎写出来的嵌入式操作系统水平的高低,关键是通过做这样一件事情,将完全有助于彻底弄懂嵌入式操作系统的来龙去脉。当然,对于大多数人来说,要自己去写一个嵌入式操作系统软件不是一件容易的事情;但如果能够真正读懂一个嵌入式操作系统的源码,从而达到运用自如地编写驱动程序“中间件”的程度,也不失为一条捷径。我认为,经过大量实际应用,使用Keil
C51编写的嵌入式实时操作系统Small RTOS51就是一个很好的例子,特此推荐给广大的单片机应用开发工程师。它将为您迈入32位嵌入式操作系统的应用开发行列打下一个坚实的基础。
基于此,由我负责组织和策划并调动了公司相关开发小组的优秀人才和内部的技术资源,成立了一个专门的小组来写作这本专著。其中围绕DP51单片机仿真实验仪的硬件电路阐述Small
RTOS51操作系统的设计原理,详细地介绍了RS232、I2C、USB 1.1和CANBUS等一系列外围器件及其功能部件的应用设计。我们有针对性地提供了大量的源码,希望能够最大限度地帮助更多的初学者掌握嵌入式操作系统,跟上新技术发展的潮流。
本书的第一部分为原理篇,主要介绍Small
RTOS51的设计思想和实现方法,读者可以结合Small RTOS51源程序和本篇的详细解说,深入研究其中的机理。第二部分为应用篇,主要介绍Small
RTOS51的基本应用,以实战为主线,详细地阐述了单片机基本功能部件的应用及其外围器件的应用设计。后续的内容主要介绍基于Small
RTOS51的USB固件编程及其CANBUS的驱动开发。这部分有一定的难度,牵涉的知识面比较广,对开发工程师本身的要求很高,读者可以根据自己的具体情况作为选学内容。
参与本书编写及其相关工作的主要人员有陈明计、刘养海、刘英斌、黄晓清、黄绍斌;全书由周立功负责规划、审核与统稿。很多的网友多次来信讨论对编写这本书的意见,也进一步征求了不少在教学中引入80C51操作系统的老师的意见,在此对他们表示衷心的感谢。有一点非常重要,如果没有陈明计个人的努力,也就没有Small
RTOS51的诞生,无疑这是不能忘记的!
特别要感谢北航出版社的全力支持,如果没有他们的努力和辛勤劳动,这本书不会这么快出版。
周立功
2003年8月28日
前 言
在激烈的竞争下,公司(特别是小公司)往往因为市场的压力,要求开发人员在较短的时间内把产品开发出来,从而导致产品不稳定和维护困难。我使用8051系列单片机,在当时是用汇编语言编写程序。我于1998年开始接触C51高级语言,从1999年开始直到现在,一直使用C语言编写8051的程序。在此期间,我经常思考如何在保证性能的前提下提高开发效率,并降低程序的维护难度。根据我的经验,使用C语言的确会提高开发效率,也能提高软件的可维护性;但仅仅依靠编程语言还远远不够,应该要建立自己的开发平台。在平台上开发,才能事半功倍。嵌入式实时操作系统(RTOS)就是一个很好的嵌入式软件的开发平台。近年来,随着半导体工业的发展,32位单片机的价格持续降低。在某些应用中,使用32位单片机的总体成本更低,而在32位单片机中不使用RTOS几乎是不可能的。因而,
在嵌入式系统中使用RTOS是大势所趋。
到2001年,我下决心学习RTOS。当时我仍旧是用8051系列单片机开发产品,于是想通过一个基于51单片机的RTOS来学习它。当时基于51单片机的RTOS中比较有名气的有Keil
C51所带的RTX Full和RTX Tiny及网友移植的μC/OSII。以下对这几个RTOS进行简单的介绍。
RTX51是一个用于8051系列单片机的多任务实时操作系统。有两个不同的RTX51版本可以利用。其中RTX51
Full使用四个任务优先权完成同时存在时间片轮转调度和抢先的任务切换。RTX51工作在与中断功能相似的状态下,信号和信息可以通过邮箱系统在任务之间互相传递。您可以从一存储池中分配和释放内存;可以强迫一个任务等待中断、超时,或者是从另一个任务或中断发出信号、信息。而RTX51
Tiny是一个 RTX51的子集,可以很容易地在没有任何外部存储器的单片8051系统上运转;但它仅支持时间片轮转任务切换和使用信号进行任务切换(即非抢占式的),不支持抢占式的任务切换,不包括消息队列,没有存储器池分配程序。
μC/OSII是著名的、源码公开的实时内核,可用于各类8位、16位和32位单片机或DSP。从μC/OS算起,该内核已有10余年应用史,并在诸多领域得到广泛应用。μC/OSII是一个完整、可移植、可固化和可剪裁的占先式实时多任务内核。μC/OSII是用ANSI的C语言编写的,包含一小部分汇编代码,使之可以供不同架构的微处理器使用。至今,从8位到64位,μC/OSII已在超过40种不同架构的微处理器上运行。
8051系列单片机一般只有很少的ROM和RAM资源,如P89C51只有4 KB Flash和128字节RAM。但RTX51
Full自身代码有6 K多字节,且需要大量外部RAM,又无源代码,很多时候不实用,不利于学习。RTX Tiny虽然小(自身占用900多字节ROM),但是任务没有优先级和中断管理,也无源代码,也不太实用(目前Keil已经把RTX
Tiny的源码提供给其正版用户,全部是汇编代码),也不利于学习。而μC/OSII有源代码,也有配套图书,比较利于学习。但是它规模太大,又需要大量外部RAM,而且所有函数都必须是可重入函数,用在8051这类小片内RAM的单片机上有点勉强,在8051系列单片机上不太实用。
于是为了学习RTOS,也为了建立自己的开发平台,到2002年春节,我下决心自己编写一个基于8051系列单片机的RTOS,这就是Small
RTOS51 V 0.50版。它使用了RTX51 Tiny的堆栈管理机制,并像μC/OSII一样是抢占式的。虽然它为51系列单片机编写,但比较容易移植到其他CPU上。
到2002年6月,经过一些实践的检验,Small
RTOS51升级到 V 1.00版,这也是公开发布的第一个版本。目前Small RTOS51最新版本为V
1.12.1版,V 120.0版本也已基本完成,在本书发售时应该已经发布,读者可以到http://www.zlgmcu.com/philips/philipsembedsys.asp下载最新版。目前Small
RTOS51的所有版本均可以免费在任何领域使用,详细情况请参考使用许可证(见附录A)。V 1.20.0版与V
1.12.1版相比,主要有以下改变:
支持任务动态建立与删除,函数功能向一般的RTOS靠拢;支持C51的重入函数(用关键字reentrant定义的函数);支持动态内存分配(使用动态内存分配的任务必须使用重入栈),并增加一个对PHILIPS公司的ARM(LPC2106/LPC2105/LPC2104)的移植。
本书的原理篇(第0章到第10章)以Small
RTOS51 V 1.12.1版为基础,通过分析源码介绍Small RTOS51原理。第0章源自与Small
RTOS51 V 1.00版本同时发布的我撰写的文章《单片机RTOS随想曲》,即现在的绪论,主要说明学习嵌入式实时操作系统的必要性。第1章简单介绍Small
RTOS51的特点、运行条件等知识。第2章通过一个简单的例子说明如何使用Small RTOS51。第3章介绍一些基本概念。第4章分析任务管理的代码。这部分是RTOS的真正核心。核心的其他部分,如消息队列、延时/超时等都可以看作是基于RTOS的中间件(或者说驱动程序)。这一章还分析了延时/超时处理代码。第5章则详细分析了Small
RTOS51与CPU相关的代码,揭示了8051系列单片机如何从一个任务切换到另一个任务。对于初学者,这是RTOS中比较神秘的地方。第6章和第7章介绍Small
RTOS51的两种通信方式:信号量和消息队列。它们与标准的信号量和消息队列有细微差别。第8章介绍如何把Small
RTOS51移植到其他的微处理器框架上。第9章和第10章分别给出函数参考手册和系统配置手册,以便用户使用Small
RTOS51。
本书的应用篇(第11章到第24章)以DP51单片机仿真实验仪为硬件基础,介绍各种常用硬件Small
RTOS51下的中间件(驱动程序)的编写方法,并在最后给出一个完整的实例,说明如何编写基于RTOS的程序。这些中间件虽然基于DP51单片机仿真实验仪,但是其与硬件相关的部分基本独立,很容易移植到其他硬件上。第11章和第12章介绍DP51单片机仿真实验仪的硬件,以便用户容易读懂后面的程序。第13章简单介绍如何为Small
RTOS51编写中间件(驱动程序),这对使用其他RTOS也有一定的参考价值。从第14章到第23章分别分析了各种常用硬件(LCD扫描、LCD显示、软定时器、键盘扫描、串行通信、I2C总线、串行E2PROM、串行实时时钟、CAN总线和USB)的驱动程序(中间件)的编写方法。它们都是采用首先介绍原理,然后以分析源代码的形式编写其驱动程序的写作方法,一般还给出应用实例。第24章给出一个比较完整的例子,说明如何编写基于RTOS的程序。
对于本书的出版,首先要感谢使用和关心Small
RTOS51的网友,没有他们,Small RTOS51也许是昙花一现;更重要的是要感谢我的家人。Small
RTOS51及本书基本上是利用业余时间编写的,我的家人使我有充足的时间完成Small RTOS51及本书。但最重要的是要感谢周立功先生及其公司的员工。本书实际上是由周立功先生负责策划的,并给本书的编写提供了很多指导和建议,而且还引用了很多广州周立功单片机技术有限公司的内部资料作为参考。参与本书编写的还有刘养海、刘英斌、黄晓清、黄绍斌。
由于我是第一次写书,且对嵌入式实时操作系统的理解并不深刻,若书中有不恰当甚至完全错误的地方,恳请各位同行指正。
陈明计
2003年8月28日
广州周立功单片机发展有限公司
|
| 目 录 |
第一部分原理篇
第0章绪论
第1章Small RTOS51简介
1.1Small RTOS51的特点
1.2Small RTOS51的运行条件
1.3Small RTOS51的存储器需求
1.4Small RTOS51的任务堆栈的计算
1.5关于可重入功能
1.6关于C51的库函数
1.7关于51系列单片机派生类型的多数据指针和数学单元
1.8关于51系列单片机的寄存器段
1.9关于局部变量
第2章基本概念
2.1嵌入式系统
2.2实时系统
2.3前、后台系统
2.4操作系统
2.5实时操作系统
2.6代码的临界区
2.7资源
2.8共享资源
2.9任务
2.10任务切换
2.11内核
2.12调度
2.13非占先式内核
2.14占先式内核
2.15可重入性
2.16任务优先级
2.17信号量
2.18死锁
2.19消息队列
2.20中断
2.21时钟节拍
第3章一个简单的例子
3.1Small RTOS51的安装及目录结构
3.2例子简介
3.3Config.h、Os_cfg.h和Os_cpu.h
3.4与编译器无关的数据类型
3.5OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()
3.6main()函数
3.7建立任务
3.8删除任务
3.9用户任务
3.10软非屏蔽中断
3.11中断服务程序的编写
3.12Os_cpu.h可改变的其他内容
3.13Small RTOS51的其他注意事项
第4章任务管理——核心的核心
4.1临界区
4.2任务
4.3任务状态
4.4与任务相关的数据结构
4.5任务调度
4.6Small RTOS51中的中断处理
4.7时钟节拍
4.8Small RTOS51初始化和启动
4.9建立任务
4.10任务堆栈
4.11删除任务
4.12时间服务及任务的挂起和恢复
4.13获取当前Small RTOS51 的版本号
4.14OSInt...()函数
第5章如何切换任务
5.1CPU可以执行多个任务的原因
5.2CPU怎样运行才能执行多个任务
5.3何时进行任务切换
5.4Small RTOS51任务切换时的程序框图
5.5数组OSTsakStackBotton\[\]和Small RTOS51的堆栈结构
5.6变量OSFastSwap
5.7常量数组OSMapTbl\[\]
5.8软非屏蔽中断的堆栈SP2\[\]
5.9中断切换函数OSIntCtxSw()
5.10任务主动放弃CPU——OS_TASK_SW()
5.11堆栈变换函数C_OSCtxSw()
5.12恢复新任务环境LoadCtx()
5.13优先级最低的任务OSIdle ()
5.14Small RTOS51初始化函数OSStart()
5.15系统时钟节拍中断OSTickISR()
第6章任务之间的通信和同步之信号量
6.1概述
6.2使Keil C51函数具有重入性的特殊方法
6.3数据结构
6.4EN_OS_SEM_CHK宏及相关代码
6.5初始化一个信号量
6.6等待一个信号量
6.7发送一个信号量
6.8无等待地请求一个信号量
6.9查询信号量
第7章任务之间的通信和同步之消息队列
7.1概述
7.2数据结构及存储空间的分配
7.3消息队列发送消息和取得消息的操作
7.4EN_OS_Q_CHK及相关代码
7.5建立一个消息队列
7.6等待一个消息队列中的消息
7.7向消息队列发送一个消息(FIFO)
7.8向消息队列发送一个消息(LIFO)
7.9同时发送多个消息
7.10无等待地从消息队列中取得消息
7.11清空一个消息队列
7.12查询一个消息队列的状态
第8章Small RTOS51的移植
8.1系统相关的宏
8.2与编译器无关的变量类型
8.3OSStart()
8.4OSIntCtxSw()
8.5OS_TASK_SW()
8.6OSTickISR()
8.7OSIdle()
第9章函数参考手册
9.1OS_INT_ENTER()函数
9.2OSClearSignal()函数
9.3OSIntExit()函数
9.4OSIntSendSignal()函数
9.5OSQAccept()函数
9.6OSQCreate()函数
9.7OSQFlush()函数
9.8OSQIntPost()函数
9.9OSQIntPostFront()函数
9.10OSQNMsgs()函数
9.11OSQPend()函数
9.12OSQPost()函数
9.13OSQPostFront()函数
9.14OSQSize()函数
9.15OSRunningTaskID()函数
9.16OSSemAccept()函数
9.17OSSemCreate()函数
9.18OSSemIntPost()函数
9.19OSSemPend()函数
9.20OSSemPost()函数
9.21OSSemQuery()函数
9.22OSSendSignal()函数
9.23OSStart()函数
9.24OSTimeTick()函数
9.25OSVersion()函数
9.26OSWait()函数
|
第10章系统配置手册
10.1基本配置
10.2消息队列的配置
10.3信号量的配置
10.4Small RTOS51的特殊配置
第二部分应用篇
第11章DP51单片机仿真实验仪简介
11.1概述
11.2产品实物
11.3功能特点
11.4主控CPU简介
11.5DP51单片机仿真实验仪的应用领域
第12章DP51单片机仿真实验仪硬件结构
12.1主要器件
12.2电路外观
12.3应用接口
12.4I/O地址分配
12.5跳线选择器
第13章如何为Small RTOS51编写驱动程序
13.1Keil C51简介
13.2Keil C51的特殊性
13.3判断Keil C51是否可重入的方法
13.4使用任务编写驱动程序
13.5使用消息队列编写驱动程序
13.6使用信号量编写驱动程序
13.7复合方法
第14章LED扫描程序的实现
14.1LED简介
14.2LED数码显示器简介
14.3LED驱动程序的实现
第15章LCD显示驱动的实现
15.1点阵字符型LCDTC1602A简介
15.2TC1602A液晶显示器与DP51单片机仿真实验仪的连接
15.3驱动程序的使用
15.4对TC1602A操作的基本函数
15.5初始化TC1602A液晶显示器
15.6清除指定行
15.7在指定位置显示字符串
15.8在指定地址向液晶模块写多个字符
15.9驱动程序在DP51单片机仿真实验仪上使用的例子
第16章软定时器的实现
16.1软定时器简介
16.2软定时器模块的使用
16.3软定时器的数据结构
16.4软定时器模块的接口函数
16.5软定时器模块的管理
16.6软定时器模块在DP51运用的例子
第17章键盘扫描程序的实现
17.1键盘简介
17.2软件去抖动处理
17.3连击的处理
17.4复合键
17.5串键
17.6键盘驱动的实现
17.7键盘驱动在DP51上运用的例子
第18章串行通信程序的实现
18.1概述
18.2串行通信硬件电路
18.3通信协议
18.4本例使用的串行通信协议
18.5本例执行的效果
18.6串行通信驱动程序的发送部分
18.7串行通信驱动程序的接收部分
18.8例子中其他未介绍部分代码
第19章I2C总线驱动程序的实现
19.1标准模式I2C总线规范简介
19.2位传输
19.3数据传输
19.4仲裁与时钟发生
19.5传输协议
19.6I2C总线驱动程序的实现
第20章串行E2PROM芯片Cat24WCxx驱动程序的实现
20.1概述
20.2引脚描述
20.3串行E2PROM芯片的寻址
20.4写操作方式
20.5读操作方式
20.6Cat24WC02在DP51中的连接
20.7Cat24WCxx驱动程序的使用
20.8Cat24WCxx的写操作
20.9Cat24WCxx的读操作
20.10DP51上对Cat24WC02读/写操作的例子
第21章实时时钟芯片PCF8563驱动程序的实现
21.1实时时钟PCF8563简介
21.2PCF8563的基本原理
21.3PCF8563在DP51中的连接
21.4PCF8563驱动程序的使用
21.5PCF8563的写操作
21.6PCF8563的读操作
21.7DP51上对PCF8563读/写操作的例子
第22章CAN总线驱动程序的实现
22.1CAN简介
22.2CAN控制器SJA1000简介
22.3SJA1000的硬件连接
22.4对SJA1000的软件控制
22.5SJA1000的BasicCAN方式
22.6寄存器位功能介绍
22.7SJA1000的编程流程
22.8驱动程序的使用
22.9对SJA1000 操作的基本函数
22.10用户可修改、可调整的应用层函数
22.11CAN通信在DP51上运用的例子
第23章PDIUSBD12 USB驱动程序的实现
23.1简介
23.2USB设备的枚举过程
23.3USB标准设备请求
23.4程序实现方法
第24章完整的程序——闹钟的实现
24.1简介
24.2关键代码
附录A使用许可证
附录B本书配套光盘说明
参考文献
|
|
| |
|