初识嵌入式操作系统.docx
- 文档编号:4131229
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:18
- 大小:368.89KB
初识嵌入式操作系统.docx
《初识嵌入式操作系统.docx》由会员分享,可在线阅读,更多相关《初识嵌入式操作系统.docx(18页珍藏版)》请在冰豆网上搜索。
初识嵌入式操作系统
一、从RTX51到smallRTOS51到μC/OSII到linux到winCE1
二、初识操作系统2
2.1受益终生的入门帖子:
不同花式的跑马灯,同时跑怎么办?
2
2.2这几个开源的、小型的操作系统简介8
2.3《嵌入式实时操作系统smallRTOS51原理及应用》的前言,周立功和陈明计在2003年写的,觉得很受启发,就连章节介绍都值得一读9
2.4一些关键的概念(一点笔记)12
2.5μC/OSII中的重要函数的实现13
三、嵌入式系统开发流程(linux)16
一、从RTX51到smallRTOS51到μC/OSII到linux到winCE
有人问我,为什么那么爱写东西,我第一反应是,记录,记下来的东西才是永恒的,让一些宝贵的灵感和感悟不随着时间的推移而被忘却。
说不定哪天用到还能应付不时之需。
记忆力好的人比较容易成功,是因为他们能将知识联系起来,我觉得我十分健忘,就是因为爱写东西,才让我一步一个台阶,虽然成长得很慢,但很享受这个过程。
第二反应是反思,只有写东西的时候你才真正在思考,在聆听你内心的真正所想,反思汇总的过程是提高升华不可或缺的环节。
忘记是哪位心理学家说过:
通过我的手,写在纸面上的文字,我总是第一个受益者。
第三,像贺立坚老师说的,活的更明白!
你记录过你思想的精华,反思过之前做的,之后要做的,才能保证现在做的都是有意义的,这当然活的很明白,少了很多的迷茫、混日子的感觉。
第四,为了留个脚印吧,一步一个脚印是我一向的习惯,我不喜欢回首某段时间时会有怅然若失的感觉,很多人会感慨:
这段时间什么都没学到,什么都没干好。
有的时候,受教育都是潜移默化的,并不是没有收获。
我就不会发这样的感慨,因为我只要打开电脑,就能浏览记忆。
所以就算是现在还有两天就考试了,而且是考三门,我也觉得,有想法就写出来,不能让灵感错失,更不能憋着。
O(∩_∩)O
回到正题,从去年知道keil环境自带为51设计的实时多任务操作系统RTX51tiny开始,到接触周立功公司为51单片机开发的smallRTOS51,到后来的μC/OSII,再到后来的linux和winCE,在操作系统的路上越走越远,但因为非计算机非软件出身,也越走越难走。
在关系到计算机体系结构和编译原理方面的知识时,往往就很难深入了,甚至连那些指针、链表都能把自己绕晕了。
而且linux各种机制庞大而复杂,学得越多越绝望。
很多问题几乎找不到一个人能透彻讲明白,一般是各有各的理解。
必须得有若干年年的实践积累才能有全局的感悟,这对于好奇心和求知欲非常强的人是非常残忍的,渴望懂得内核的机理,渴望从click到寄存器的全线理解,可能随着时间的推移,也慢慢妥协了,在别人问到的时候,无奈的说那句话:
这是操作系统做的。
如果以我的绝对智力条件和机遇只能走到那一步,我想至少曾经呐喊过牢骚过。
如果真正学习到一件事物的过程就是激烈碰撞,就是推到重来的过程,那么现在肯定处于推平了刚打了个地基的阶段,我想还是一步步地来,边走边感悟。
一直想以一个学期的见闻说一下linux,现在发现根本不能用轻巧的语言驾驭已经学到的东西,这说明远没有学明白,脑袋里东西少问好多,也不敢写一些误人子弟、班门弄斧的东西。
我认为体会操作系统的管理思想是至关重要的,既然有了一些感悟不能通过linux表达出来,wince又没下功夫,所以只能找一个了解比较多的μC/OSII说一说。
而smallRTOS51是模仿开源的μC/OSII,二者甚至连关键的函数名都是一样的,一个复杂版,一个精简版。
二、初识操作系统
2.1受益终生的入门帖子:
不同花式的跑马灯,同时跑怎么办?
当我还在51的世界徜徉的时候,下决心学习操作系统,从网上查资料,我至今非常感谢一个帖子,把它当作我的入门指导老师,它短短的千余字,就帮助我理解了任务、多任务并行的概念,任务管理的概念,体会了一把操作系统的管家角色,更重要的是,它用活生生的例子告诉我,51,也是可以跑操作系统的!
!
帖子的名称是《RTX51——Tiny51单片机的实时操作系统介绍》。
把它粘过来,跟大家分享一下:
原帖地址:
前段时间给单片机写个跑马灯的程序,它是将单片机4组IO口全用了,一个引脚一个LED一共32个,当初是拿出去当作品展用的,写了个程序,要求好几个花样,但是写程序的时候发现,单独控制一组端口还可以,要是同时控制4组IO口,并且显示的花样都不一样?
该怎么办呢?
这就要用的RTX51了,MCS-51单片机的RTOS(实时操作系统)。
一、RTX51简介:
(简介被我编辑到了下一节)
上面只是RTX51的简单介绍,具体的用法自己到XX文库下载RTX51实时操作系统的使用方法:
上面有详细的介绍,由于篇幅有限,这里就不做过多的介绍。
大家好好阅读文档上的内容,才知道怎么使用RTOS,刚开始接触的时候有点不好理解,多写几个程序练练手,就有点理解了,确实,要建立起操作系统的概念不是一两天的事情,其中要设计很多的抽象的概念,只有把他们完全理解了,才好应用。
二、使用说明和应用举例:
言归正传,回到开头的“LED问题”上来。
根据RTX51时间片的思想来实现多任务的运行,其实这个“时间片”思想是这样的,首先是单片机内部的定时器一定时间中断一次,也就是所谓的嘀嗒。
也就是说单片机每次实际上是在执行一个任务,但是执行的时间很短,当第一个任务执行完后,发送一个完成的signal,然后执行第二个任务,当这个间隔的时间很短很短,以至于我们人眼无法分辨,看上去好像几个任务同时执行一样,这样就达到了多任务同时执行的目的,这个时间就是通过单片机内部的定时器实现的,也就是定时嘀嗒,一般是为50ms,这个可以自行设置,不过如果没有什么特殊的要求最好不好改动!
上面的文档中都有相关的介绍,大家可以参考下。
这种实现并行执行的效果其实并不是真正意义上的多任务同时执行,CPLD/FPGA开发中,硬件描述语言VHDL或者Verilog中的并行是真正意义上的并行。
不过FPGA跟单片机不相同,不能相提并论。
C语言的顺序执行可以实现相同的并行执行的效果,这就是系统的好处,好的软件与好的硬件同等重要,比如一块ARM学习板,不理解系统,跟普通的单片机没什么两样!
关键是学好系统!
由于我接触RTX51的时间不长,FULL版本的还没怎么用过,只玩过Tiny版本,就针对上面提到的LED编写个简单的程序,有什么不当的地方,还望大家批评指正,在此表示感谢。
根据上面的设计要求,P0、P1、P2、P3四组IO端口,一组端口控制8个LED,要求这四组端口的8个LED显示不同的跑马灯样式,并且同时执行。
在Proteus中画好仿真电路图,如下图所示:
根据要求可知,为了要达到效果,我们创建5个Task。
第一个task作用的创建剩下的这四个task,没个task控制一组端口,而且要求每个task执行的内容不一样,即实现不同的流水灯样式。
在一般的C语言程序编写过程中,要有一个主函数,但RTX51中不需要创建主函数,它将自动开始执行任务0,在任务0这个函数中用系统函数os_create_task函数创建剩下的任务!
任务程序的编写类似中断服务函数,如下所示:
这个任务序号就是Task_ID,也就执行的第几个任务,在程序运行的过程中,可以调用系统函数os_running_task_id函数来判断当前正在执行的任务的序号,调用该函数,会返回一个值,对于tiny型,由于支持最多16个任务,所以返回值的范围是0~15。
具体的使用方法文档中也有清晰的介绍,这里就不做过多的说明!
下面是任务0程序清单:
其中_task_后面跟的是任务序号,就像我们写中断服务函数一样,TASKINIT、以及后面的LED_TASK1……在前面已经宏定义过!
这里要说明的是在任务0中,将4个任务创建完成后,任务0的工作已经结束了,等到下次循环的时候,我们没有必要再创建这四个任务,因此,在函数的末尾,调用系统删除任务函数os_wait_task,将任务0删除!
接下来我们分析4个任务中的其中一个,看它是怎么实现任务调度切换的。
针对P0端口的LED做分析。
其程序如下:
首先,任务0完成后,执行任务1,函数内容是从上往下,依次循环点亮LED。
Os_wait2函数的用法如下:
它是用来停止当前任务并等待一个或几个事件,比如一个时间间隔、一个超时、或从一个任务或中断发送给另一个任务或中断信号。
参数event_sel确定事件或要等待的事件,并且可以综合使用下列常数:
上面用到的就是K_TMO参量,等待一个超时,相当于一个延时函数,延时时间的大小通过设置系统时钟的嘀嗒次数决定,假如系统定时器嘀嗒一次的时间为50ms,ticks设置为10也就是延时500ms。
当超时后,系统就会自动发送个一超时信号,告诉CPU,第一个任务已经完成,转去执行第二个任务,然后再发送一个超时signal,执行第三个任务,依次循环执行!
这个是最简单的任务调度,FULL版本的更高级些,有邮箱系统(mailbox),支持抢占式任务调度,可以设置任务的优先级,当多个任务挂起等待占用CPU执行时,优先级高的先执行,执行完后在执行优先级相对低的task。
下面是任务执行状态切换的示意图:
除了os_wait2函数外,还有类似的os_wait及os_wait1函数,用法都大同小异。
大几参看手册即可!
KEIL下的编译:
与一般的C程序不同,要使用RTX51-Tiny,必须包含头文件:
#include
才能运行,keil还有进行相应的设置:
点击keil中的option,target选项卡下面Operating选择RTX-51 Tiny系统,因为我们用的是RTX-51的tiny型系统,OUTPUT中点击生成十六进制HEX文件,编译通过即可!
如下图所示:
图5 keil中的RTX设定
下面是仿真效果:
至此,RTX51就简单介绍到这里,上面只是粗略的介绍了RTX51,要想用好它还需细心的研究,陈明计先生的Small RTOS51和大名鼎鼎的开源系统UCOSII,等等这些在51上面的移植,都是系统的例子,所以感觉一块普通的51单片机再搭配上系统,还是很强大的!
可以实现很多功能。
来个动态的:
这个就是仿真的真实效果:
每组端口的流水灯样式都不一样,并且是同时执行,大家可以通过Proteus联调看出RTX51-Tiny工作的原理,你会有不一样的发现:
(动态图在word和日志文档中不显示,所以建议大家一定要到原帖地址去看一看)。
本人水平有限,错误难免,还望大家批评指正!
!
2.2这几个开源的、小型的操作系统简介
RTX51
它是KEIL公司开发的专门针对于8051内核兼容MCU所作的实时操作系统(RTOS),RTX51有两个版本:
RTX51-FULL与RTX51-Tiny。
FULL版本支持四级任务优先级,最大256任务,它工作在类似于中断功能的状态下,同时支持抢占式与时间片循环调度、支持信号(signal)、消息队列、二进制信号量(semaphore)和邮箱(mailbox),其功能强大,仅仅占用 6~8KB的程序存储器空间。
RTX51_Tiny是RTX51FULL的子集,是一个很小的内核,只占用大约800byte的存储空间(主要程序RTX51TNY.A51仅有不足一千行)它适用于对实时性要求不非常严格的、仅要求多任务管理且任务间通信功能不要求非常强大的应用。
它仅使用51内部寄存器来实现所有功能,应用程序只需要以系统调用(system call)的方式引用RTX51中的函数即可,RTX51-Tiny可以支持16个任务,多个任务遵循时间片轮转的规则,任务间以信号signal的方式进行通信,任务可以等待另一任务给他发出signal然后再从挂起状态恢复运行,它并不支持抢占式任务切换的方式。
SmallRTOS51
Small RTOS51是为51系列单片机而编写的。
它是完全免费的、源代码公开的多任务实时操作系统。
它可在无任何外部数据存储器的单片80C51系统上运行,并且是可移植的。
它使用了RTX51Tiny的堆栈管理机制,并像μC/OSII一样是抢占式的。
虽然它为51系列单片机编写,但比较容易移植到其他CPU上。
smallrtos和ucos太像了,函数名都一样。
只是不允许动态优先级,不允许休眠态、只有16个任务(资源限制)
μC/OSII
μC/OSII是著名的、源码公开的实时内核,可用于各类8位、16位和32位单片机或DSP。
从μC/OS算起,该内核已有10余年应用史,并在诸多领域得到广泛应用。
μC/OSII是一个完整、可移植、可固化和可剪裁的占先式实时多任务内核。
μC/OSII是用ANSI的C语言编写的,包含一小部分汇编代码,使之可以供不同架构的微处理器使用。
也就是说ucos的文件结构:
与处理器相关的代码,与处理器无关的代码(包括与应用相关的代码)。
至今,从8位到64位,μC/OSII已在超过40种不同架构的微处理器上运行。
SmallRTOS51是实时的内核,而linux则不是,虽然有商家推出了实时的linux,但价格昂贵,在这样的背景下,源码开放的实时内核μC/OSII是一个不错的选择。
Vxworks是非常有名的实时内核,但是不开源。
UCOS的缺点:
1、固定的基于优先级的调度,不支持时间片,使用起来不方便。
一个任务的基础上增加一个基于时间片的微型调度核
2、系统时钟中断,没有提供用户使用定时器,可以借鉴linux的定时器加以修改
3、在对临界资源的访问上使用关闭中断实现,没有使用CPU提供的硬件指令,例如测试并置位。
4、只是一个实时多任务内核,没有图形用户接口(GUI)、文件系统(FS)和TCP/IP协议栈
最后一个所谓的缺点其实并不算是,因为它本身就是为了实时环境所设计的,过于臃肿会影响实时性。
2.3《嵌入式实时操作系统smallRTOS51原理及应用》的前言,周立功和陈明计在2003年写的,觉得很受启发,就连章节介绍都值得一读
快速掌握嵌入式操作系统的捷径
2002年的某一天下午,有位员工告诉我,他发现有人在“21IC中国电子网”发布了一个基于80C51单片机、仅需要4KB程序空间和128个RAM单元就可以运行的嵌入式操作系统自由软件源码。
我不由自主地想到了这个人可能就是公司要寻找的优秀人才,于是开始静下心来花了一个通宵大致阅读了整个源码,发现作者编写的程序具有非常良好的风格。
凭我多年的经验判断,作者是一个有强烈爱好和敬业精神的人,于是开始给作者写Email联系。
当然,现在他已经成为了我们公司的员工,他就是本书的主要作者陈明计先生。
他目前主要负责嵌入式操作系统应用部门的工作,领导一个小组从事PHILIPS公司半导体32位ARM单片机的应用开发。
去年,我邀请清华大学邵贝贝教授来公司专门讲解μC/OSII嵌入式操作系统。
为了帮助内部开发工程师深入掌握嵌入式操作系统的应用技术,我要求公司的开发工程师尝试写作一个基于80C51单片机的小操作系统。
有一部分员工完成了这个大作业,可以说效果十分惊人,完全达到了理解和掌握嵌入式操作系统的目的。
由此可以看出,这是一种行之有效的学习方法。
面对未来,一个要继续从事电子产品开发的工程师,不懂得嵌入式操作系统是不可想像的。
怎么办?
实践证明,最好的办法就是尝试自己写一个简易的嵌入式操作系统。
不在乎写出来的嵌入式操作系统水平的高低,关键是通过做这样一件事情,将完全有助于彻底弄懂嵌入式操作系统的来龙去脉。
当然,对于大多数人来说,要自己去写一个嵌入式操作系统软件不是一件容易的事情;但如果能够真正读懂一个嵌入式操作系统的源码,从而达到运用自如地编写驱动程序“中间件”的程度,也不失为一条捷径。
我认为,经过大量实际应用,使用KeilC51编写的嵌入式实时操作系统SmallRTOS51就是一个很好的例子,特此推荐给广大的单片机应用开发工程师。
它将为您迈入32位嵌入式操作系统的应用开发行列打下一个坚实的基础。
基于此,由我负责组织和策划并调动了公司相关开发小组的优秀人才和内部的技术资源,成立了一个专门的小组来写作这本专著。
其中围绕DP51单片机仿真实验仪的硬件电路阐述SmallRTOS51操作系统的设计原理,详细地介绍了RS232、I2C、USB1.1和CANBUS等一系列外围器件及其功能部件的应用设计。
我们有针对性地提供了大量的源码,希望能够最大限度地帮助更多的初学者掌握嵌入式操作系统,跟上新技术发展的潮流。
本书的第一部分为原理篇,主要介绍SmallRTOS51的设计思想和实现方法,读者可以结合SmallRTOS51源程序和本篇的详细解说,深入研究其中的机理。
第二部分为应用篇,主要介绍SmallRTOS51的基本应用,以实战为主线,详细地阐述了单片机基本功能部件的应用及其外围器件的应用设计。
后续的内容主要介绍基于SmallRTOS51的USB固件编程及其CANBUS的驱动开发。
这部分有一定的难度,牵涉的知识面比较广,对开发工程师本身的要求很高,读者可以根据自己的具体情况作为选学内容。
参与本书编写及其相关工作的主要人员有陈明计、刘养海、刘英斌、黄晓清、黄绍斌;全书由周立功负责规划、审核与统稿。
很多的网友多次来信讨论对编写这本书的意见,也进一步征求了不少在教学中引入80C51操作系统的老师的意见,在此对他们表示衷心的感谢。
有一点非常重要,如果没有陈明计个人的努力,也就没有SmallRTOS51的诞生,无疑这是不能忘记的!
特别要感谢北航出版社的全力支持,如果没有他们的努力和辛勤劳动,这本书不会这么快出版。
周立功
2003年8月28日
前言
在激烈的竞争下,公司(特别是小公司)往往因为市场的压力,要求开发人员在较短的时间内把产品开发出来,从而导致产品不稳定和维护困难。
我使用8051系列单片机,在当时是用汇编语言编写程序。
我于1998年开始接触C51高级语言,从1999年开始直到现在,一直使用C语言编写8051的程序。
在此期间,我经常思考如何在保证性能的前提下提高开发效率,并降低程序的维护难度。
根据我的经验,使用C语言的确会提高开发效率,也能提高软件的可维护性;但仅仅依靠编程语言还远远不够,应该要建立自己的开发平台。
在平台上开发,才能事半功倍。
嵌入式实时操作系统(RTOS)就是一个很好的嵌入式软件的开发平台。
近年来,随着半导体工业的发展,32位单片机的价格持续降低。
在某些应用中,使用32位单片机的总体成本更低,而在32位单片机中不使用RTOS几乎是不可能的。
因而,
在嵌入式系统中使用RTOS是大势所趋。
到2001年,我下决心学习RTOS。
当时我仍旧是用8051系列单片机开发产品,于是想通过一个基于51单片机的RTOS来学习它。
当时基于51单片机的RTOS中比较有名气的有KeilC51所带的RTXFull和RTXTiny及网友移植的μC/OSII。
以下对这几个RTOS进行简单的介绍。
RTX51是一个用于8051系列单片机的多任务实时操作系统。
有两个不同的RTX51版本可以利用。
其中RTX51Full使用四个任务优先权完成同时存在时间片轮转调度和抢先的任务切换。
RTX51工作在与中断功能相似的状态下,信号和信息可以通过邮箱系统在任务之间互相传递。
您可以从一存储池中分配和释放内存;可以强迫一个任务等待中断、超时,或者是从另一个任务或中断发出信号、信息。
而RTX51Tiny是一个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只有4KBFlash和128字节RAM。
但RTX51Full自身代码有6K多字节,且需要大量外部RAM,又无源代码,很多时候不实用,不利于学习。
RTXTiny虽然小(自身占用900多字节ROM),但是任务没有优先级和中断管理,也无源代码,也不太实用(目前Keil已经把RTXTiny的源码提供给其正版用户,全部是汇编代码),也不利于学习。
而μC/OSII有源代码,也有配套图书,比较利于学习。
但是它规模太大,又需要大量外部RAM,而且所有函数都必须是可重入函数,用在8051这类小片内RAM的单片机上有点勉强,在8051系列单片机上不太实用。
于是为了学习RTOS,也为了建立自己的开发平台,到2002年春节,我下决心自己编写一个基于8051系列单片机的RTOS,这就是SmallRTOS51V0.50版。
它使用了RTX51Tiny的堆栈管理机制,并像μC/OSII一样是抢占式的。
虽然它为51系列单片机编写,但比较容易移植到其他CPU上。
到2002年6月,经过一些实践的检验,SmallRTOS51升级到V1.00版,这也是公开发布的第一个版本。
目前SmallRTOS51最新版本为V1.12.1版,V120.0版本也已基本完成,在本书发售时应该已经发布,读者可以到embedsys.asp下载最新版。
目前SmallRTOS51的所有版本均可以免费在任何领域使用,详细情况请参考使用许可证(见附录A)。
V1.20.0版与V1.12.1版相比,主要有以下改变:
支持任务动态建立与删除,函数功能向一般的RTOS靠拢;支持C51的重入函数(用关键字reentrant定义的函数);支持动态内存分配(使用动态内存分配的任务必须使用重入栈),并增加一个对PHILIPS公司的ARM(LPC2106/LPC2105/LPC2104)的移植。
本书的原理篇(第0章到第10章)以SmallRTOS51V1.12.1版为基础,通过分析源码介绍SmallRTOS51原理。
第0章源自与SmallRTOS51V1.00版本同时发布的我撰写的文章《单片机RTOS随想曲》,即现在的绪论,主要说明学习嵌入式实时操作系统的必要性。
第1章简单介绍SmallRTOS51的特点、运行条件等知识。
第2章通过一个简单的例子说明如何使用SmallRTOS51。
第3章介绍一些基本概念。
第4章分析任务管理的代码。
这部分是RTOS的真正核心。
核心的其他部分,如消息队列、延时/超时等都可以看作是基于RTOS的中间件(或者说驱动程序)。
这一章还分析了延时/超时处理代码。
第5章则详细分析了SmallRTOS51与CPU相关的代码,揭示了8051系列单片机如何从一个任务切换到另一个任务。
对于初学者,这是RTOS中比较神秘的地方。
第6章和第7章介绍SmallRTOS51的两种通信方式:
信号量和消息队列。
它们与标准的信号量和消息队列有细微差别。
第8章介绍如何把SmallRTOS51移植到其他的微处理器框架上。
第9章和第10章分别给
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 初识 嵌入式 操作系统