1、本科毕业论文(20 届)实时操作系统设计所在学院 专业班级 通信工程 学生姓名 学号 指导教师 职称 完成日期 年 月 0目 录第一章 实时操作系统 .41.1 实时操作系统简述 .41.2 实时操作系统的主要特点 .51.3 内核结构 .71.3.1 任务 .71.3.2 任务状态 .71.3.3 任务控制块(Task Control Blocks, OS_TCBs) .91.3.4 任务调度(Task Scheduling) .91.3.5 C/OS 中的中断处理 .10第二章 单片机 .122.1 单片机概述 .122.2 单片机的发展简史 .122.3 单片机的特点 .142.4 单片
2、机的应用领域 .152.5 主流单片机简介 .162.6 单片机系统的结构 .182.6.1 单片机的内部结构 .182.6.2 单片机的引脚功能 .18第三章 实时操作系统在单片机中的应用 .203.1 系统方案方案论证 .203.2 系统硬件设计 .213.3 实时操作系统在控制器中应用 .223.3.1 嵌入式系统的 2 种触发方式 .233.3.2 调度器的设计 .233.3.3 任务及任务间通信 .243.3.4 中断处理 .253.3.5 存储器管理 .273.3.6 外围设备的管理 .273.4 交通控制器的软件设计 .273.4.1 软件延时 .293.4.2 时间及信号灯的显
3、示 .303.4.3 8255 与 8051 的连接 .313.5 系统调试 .323.5.1 键盘和 LCD 字符显示器的调试 .323.5.2 中断和外设调试 .32第四章 总结 .34参 考 文 献 .351致 谢 .362实时操作系统设计摘要8051 系列单片机系统广泛应用于工控、仪器仪表、通信等领域,为了避免其软件开发的重复性工作,提高所编软件的可靠性, 结合自主开发的、基于AT89C51 单片机为核心的硬件平台,实现了一个基于该平台的实时操作系统。该操作系统具有一个基于 C 语言的、实时多任务的内核,有较好的移植性。单片机在嵌入式微控制系统应用中具有十分重要的地位。在嵌入式系统中使
4、用实时操作系统已经成为嵌入式应用的一种趋势,是单片机高水平应用开发的一个标志。一个好的实时操作系统可大大提高控制产品的研制效率,缩短开发时问,有利于多人的分工协作,用 RTOS 开发的产品稳定性、可靠性也会得到提高。本系统就是充分利用了 8051 和 8255 芯片的 I/O 引脚。系统统采用 MSC-51系列单片机 Intel8051 和可编程并行 I/O 接口芯片 8255A 为中心器件来设计交通灯控制器,实现了能根据实际车流量通过 8031 芯片的 P1 口设置红、绿灯燃亮时间的功能;红绿灯循环点亮,倒计时剩 5 秒时黄灯闪烁警示(交通灯信号通过 PA 口输出,显示时间直接通过 8255
5、 的 PC 口输出至双位数码管) ;车辆闯红灯报警;绿灯时间可检测车流量并可通过双位数码管显示。 。系统不足之处不能控制车的左、右转、以及自动根据车流改变红绿灯时间等。这是由于本身地理位子以及车流量情况所定,如果有需要可以设计扩充原系统来实现。关键字:8051,单片机,实时操作系统3Real-time operating systemAbstract8051 system is widely used in industrial control, instrumentation, communications and other fields, in order to avoid duplic
6、ation of work in software development, improve the reliability of the editing software, combined with self-developed, based on AT89C51 microcontroller as the core hardware platform, Based on the platform of a real-time operating system. The operating system has a C language-based, real-time multitas
7、king kernel, a better portability.SCM applications in embedded micro-control system has a very important position. In embedded systems using real-time operating system has become a trend in embedded applications, is the MCU application development a sign of a high level. A good real-time operating s
8、ystem can greatly improve the efficiency of control of product development and shorten the development time to ask, is conducive to many of the division of labor, with the RTOS development of product stability, reliability will be improved.The system is full use of the 8051 and 8255 chip I / O pins.
9、 System integration with MSC-51 Series MCU Intel8051 and programmable parallel I / O interface chip 8255A is designed as the center traffic light controller device to realize the actual traffic flow according to the chip through the P1 port 8031 set of red, green brighten time Function; traffic ligh
10、t cycle lights, countdown 5 seconds left when the yellow light flashing warning (traffic signal through the PA port output, display the time directly through the 8255s PC port to double-digit LED output); vehicle ran a red light alarm; green time to detect vehicle Flow and through the double-digit d
11、igital display. . The inadequacies of the system can not control the cars left, right, and automatically change the traffic light traffic time. This is because of their geographical position and traffic condition set, if there is a need to expand the original system can be designed to achieve.4Keywo
12、rds: 8051, microcontroller, real-time operating system第一章 实时操作系统1.1 实时操作系统简述C/OS-II 是一个简单、高效的嵌入式实时操作系统内核,被应用到各种嵌入式系统中。C/OS-II 是由 Labrosse 编写的一个开放式内核,主要的特点就是源码公开,是一个占先式的内核,即已经准备就绪的高优先级任务可以剥夺正在运行的低优先级任务的 CPU 使用权,这个特点使得它的实时性比非占先式的内核要好得多。C/OS 是源代码公开的实时嵌入式操作系统,后来推出的 C/OSII 是 C/OS 的升级版。C/OS-在网上的资源丰富,源码公开,
13、而且被很多产品所使用。它具有源码公开、可移植性好、可固化、可裁剪、占先式、多任务,而且稳定性与可靠性都很不错,已经有几百个商业应用的实例。操作系统的移植,就是使一个实时内核能在某个微处理器或微控制器上运行。大部分的 C/OS- 代码是用 C 语言写的,但仍需要用 C 和汇编语言写一些与处理器相关的代码,这是因为C/OS-在读写处理器寄存器时只能通过汇编语言来实现。为了让 C/OS-更方便地实现移植,C/OS-在设计时就已经充分考虑了可移植性。目前,它支持 x86、ARM、PowerPC、MIPS 等众多体系结构,并有上百个商业应用实例,其稳定性和可用性是经过实践验证的。同时,它的源代码公开,获
14、得全部源码以及在各种体系结构平台上的移植范例。C/OS-II 版以上的内核都具有可抢占的实时多任务调度功能,另外它还提供了许多系统服务,例如信号量、消息队列、邮箱、内存管理、时间函数等,这些功能可以根据不同的需求进行裁减。可以说,C/OS-II 是一个具备现代操作系统特点的 RTOS,同时它结构清晰、注解详尽,具有良好的可扩展性和可移植性,被广泛地应用于各种架构的微处理器上。51.2 实时操作系统的主要特点 公开源代码源代码全部公开,并且可以从有关出版物上找到详尽的源代码讲解和注释。这样使系统变得透明,很容易就能把操作系统移植到各个不同的硬件平台上。 可移植性C/OSII 绝大部分源码是用 A
15、NSIC 写的,可移植性较强。而与微处理器硬件相关的那部分是用汇编语言写的,已经压到最低限度,使得 C/OSII 便于移植到其它微处理器上。C/OSII 移植的条件是,只要该微处理器有堆栈指针,有 CPU 内部寄存器入栈、出栈指令。另外,使用的 C 编译器必须支持内嵌汇编或者该 C 语言可扩展、可连接汇编模块,使得关中断、开中断能在 C 语言程序中实现。 C/OSII 可以在绝大多数 8 位、16 位、32 位甚至 64 位微处理器、微控制器、数字信号处理器上运行。 可固化C/OSII 是为嵌入式应用而设计的,这就意味着,只要开发者有固化手段(C 编译、连接、下载和固化) ,C/OSII 可以
16、嵌入到开发者的产品中成为产品的一部分。 可裁剪可以只使用 C/OS II 中应用程序需要的那些系统服务。也就是说某产品可以只使用很少几个 C/OSII 调用,而另一个产品则使用了几乎所有 C/OS II 的功能,这样可以减少产品中的 C/OSII 所需的存储器空间(ROM 和 RAM) 。这种可剪裁性是靠条件编译实现的。只要在用户的应用程序中定义那些 C/OS II 中的功能是应用程序需要的就可以了。 占先式C/OSII 完全是占先式(Preemptive)的实时内核,这意味着C/OS II 总是运行就绪条件下优先级最高的任务。大多数商业内核也是占先式的,C/OSII 性能上和它们类似。 多任
17、务6C/OSII 可以管理 64 个任务,然而,目前的版本保留 8 个给系统。应用程序最多可以有 56 个任务,赋予每个任务的优先级必须是不相同的,这意味着 C/OS II 不支持时间片轮转调度法。该调度法适用于调度优先级平等的任务。 可确定性全部 C/OSII 的函数调用与服务的执行时间具有其可确定性。也就是说,全部 C/OSII 的函数调用与服务的执行时间是可知的,进而言之,C/OS II 系统服务的执行时间不依赖于应用程序任务的多少。 任务栈每个任务有自己单独的栈,C/OSII 允许每个任务有不同的栈空间,以便压低应用程序对 RAM 的需求。使用 C/OS II 的栈空间校验函数,可以确
18、定每个任务到底需要多少栈空间。 系统服务C/OSII 提供很多系统服务,例如邮箱、消息队列、信号量、块大小固定的内存的申请和释放、时间相关函数等。 中断管理中断可以使正在执行的任务暂时挂起,如果优先级更高的任务被该中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达 255 层。 稳定性与可靠性由于 C/OSII 仅是一个实时内核,这就意味着它不像其他实时操作系统那样提供给用户的只是一些 API 函数接口,有很多工作需要自己去完成。把 C/OS II 移植到目标硬件平上也只是系统设计工作的开始,后面还需要针对实际的应用需求对 C/OSII 进行功能扩展,包括底层的硬件驱动、
19、文件系统、用户图像接口(GUI)等,从而建立一个实用的 RTOS。71.3 内核结构1.3.1 任务一个任务通常是一个无限的循环,一个任务看起来像其它 C 的函数一样,有函数返回类型,有形式参数变量,但是任务是绝不会返回的。故返回参数必须定义成 void。不同的是,当任务完成以后,任务可以自我删除。注意任务代码并非真的删除了,C/OS-只是简单地不再理会这个任务了,这个任务的代码也不会再运行,如果任务调用了 OSTaskDel(),这个任务绝不会返回什么。C/OS-可以管理多达 64 个任务,但目前版本的 C/OS- 有两个任务已经被系统占用了。作者保留了优先级为 0、1、2、3、OS_LOW
20、EST_PRIO-3、OS_LOWEST_PRI0-2,OS_LOWEST_PRI0-1 以及 OS_LOWEST_PRI0 这 8个任务以被将来使用。OS_LOWEST_PRI0 是作为定义的常数在 OS_CFG.H 文件中用定义常数语句#define constant 定义的。因此用户可以有多达 56 个应用任务。必须给每个任务赋以不同的优先级,优先级可以从 0 到OS_LOWEST_PR10-2。优先级号越低,任务的优先级越高。 C/OS- 总是运行进入就绪态的优先级最高的任务。目前版本的 C/OS-中,任务的优先级号就是任务编号(ID) 。优先级号(或任务的 ID 号)也被一些内核服务
21、函数调用,如改变优先级函数 OSTaskChangePrio(),以及任务删除函数 OSTaskDel()。1.3.2 任务状态图 1.1 是 C/OS- 控制下的任务状态转换图。在任一给定的时刻,任务的状态一定是在这五种状态之一。睡眠态(DORMANT)指任务驻留在程序空间之中,还没有交给 C/OS-管理。把任务交给 C/OS-是通过调用下述两个函数之一:OSTaskCreate()或 OSTaskCreateExt()。当任务一旦建立,这个任务就进入就绪态准备运行。任务的建立可以是在多任务运行开始之前,也可以是动态地被一个运行着的任务建立。如果一个任务是被另一个任务建立的,而这个任务的优先
22、级高于建立它的那个任务,则这个刚刚建立的任务将立即得到 CPU 的控制权。一个任务可以通过调用 OSTaskDel()返回到睡眠态,或通过调用该函数让另一个任务进入睡眠态。8调用 OSStart()可以启动多任务。OSStart()函数运行进入就绪态的优先级最高的任务。就绪的任务只有当所有优先级高于这个任务的任务转为等待状态,或者是被删除了,才能进入运行态。图 1.1 任务的状态正在运行的任务可以通过调用两个函数之一将自身延迟一段时间,这两个函数是 OSTimeDly()或 OSTimeDlyHMSM()。这个任务于是进入等待状态,等待这段时间过去,下一个优先级最高的、并进入了就绪态的任务立刻
23、被赋予了CPU 的控制权。等待的时间过去以后,系统服务函数 OSTimeTick()使延迟了的任务进入就绪态。正在运行的任务期待某一事件的发生时也要等待,手段是调用以下 3 个函数之一:OSSemPend(),OSMboxPend(),或 OSQPend()。调用后任务进入了等待状态(WAITING ) 。当任务因等待事件被挂起(Pend) ,下一个优先级最高的任务立即得到了 CPU 的控制权。当事件发生了,被挂起的任务进入就绪态。事件发生的报告可能来自另一个任务,也可能来自中断服务子程序。正在运行的任务是可以被中断的,除非该任务将中断关了,或者 C/OS-将中断关了。被中断了的任务就进入了中断服务态(ISR) 。响应中断时,正在执行的任务被挂起,中断服务子程序控制了 CPU 的使用权。中断服务子程序可能会报告一个或多个事件的发生,而使一个或多个任务进入就绪态。在这种情况下,从中断服务子程序返回之前,C/OS- 要判定,被中断的任务是否还是就绪态任务中优先级最高的。如果中断服务子程序使一个优先级更高的任务进入了就绪态,则新进入就绪态的这个优先级更高的任务将得以运行,否则原