小型的嵌入式操作系统μC╱OS-Ⅱ的研究和实现毕业论文

上传人:gu****n 文档编号:70186607 上传时间:2022-04-06 格式:DOC 页数:47 大小:482.70KB
收藏 版权申诉 举报 下载
小型的嵌入式操作系统μC╱OS-Ⅱ的研究和实现毕业论文_第1页
第1页 / 共47页
小型的嵌入式操作系统μC╱OS-Ⅱ的研究和实现毕业论文_第2页
第2页 / 共47页
小型的嵌入式操作系统μC╱OS-Ⅱ的研究和实现毕业论文_第3页
第3页 / 共47页
资源描述:

《小型的嵌入式操作系统μC╱OS-Ⅱ的研究和实现毕业论文》由会员分享,可在线阅读,更多相关《小型的嵌入式操作系统μC╱OS-Ⅱ的研究和实现毕业论文(47页珍藏版)》请在装配图网上搜索。

1、烟台大学毕业论文(设计) 目 录任务书摘要 Abstract 1绪论11.1嵌入式系统11.2嵌入式处理器11.3嵌入式实时操作系统(RTOS)21.4X-RTOS的介绍32硬件体系结构和软件平台42.1硬件体系结构42.2软件平台43实时系统的基本概念53.1前后台系统53.2代码的临界段63.3资源63.4共享资源63.5多任务63.6任务73.7任务切换83.8内核83.9调度93.10不可剥夺型内核93.11可剥夺型内核103.12时间片轮番调度法113.13任务优先级123.14静态优先级123.15动态优先级123.16优先级反转124X-RTOS详细设计及编码实现154.1X-R

2、TOS内核结构概述154.1.1临界区154.1.2任务及其任务控制块15454.1.3就绪表154.1.4任务调度184.1.5空闲任务194.2任务管理204.2.1建立任务204.2.2任务堆栈224.2.3改变任务的优先级234.2.4挂起任务254.2.5恢复任务264.2.6任务休眠274.3任务通信与同步对象和与对象有关的函数284.3.1初始化一个事件对象304.3.2使一个任务处于等待态314.3.3把一个任务放入就绪队列324.4信号量334.4.1创建信号量344.4.2等待一个信号量354.4.3释放一个信号量354.5互斥信号量364.5.1创建一个互斥信号量364.

3、5.2等待一个互斥信号量364.5.3释放一个互斥信号量374.6消息队列374.6.1创建一个消息队列394.6.2从消息队列中得到一个消息394.6.3往消息队列中放入一个消息404.7事件组404.7.1创建一个事件组404.7.2等待事件组的事件404.7.3设置事件组的事件42总结43致谢44参考文献451 绪论1.1 嵌入式系统随着社会的信息化和网络化的日益加强,对计算机系统小型化、实时性、可靠性的要求越来越高,嵌入式系统正是在这种背景下应运而生。目前嵌入式系统的应用日益广泛,大到波音飞机小到MP3、移动电话都有嵌入式系统的存在,因此 21 世纪也被一些人戏称为“嵌入式系统的世纪”

4、 。(1)嵌入式系统定义按照历史性、本质性、普遍性要求,嵌入式系统应定义为:“嵌入到对象体系中的专用计算机系统”。“嵌入性”、“专用性”与“计算机系统”是嵌入式系统的三个基本要素。对象系统则是指嵌入式系统所嵌入的宿主系统。(2)嵌入式系统的特点(与通用PC相比较)专用性-这是与传统PC最大的区别。嵌入式系统是面向用户,面向产品,面向应用的。它只有和具体的应用相结合才能体现出自己的优势。高实时性-这是嵌入式系统的基本条件。嵌入性-嵌入式系统是与具体的环境相结合的,与被控对象紧密连接的。智能性-操作使用人性化、仪表化。一般很少有人直接参与。(3)嵌入式系统组成嵌入式系统主要有两部分组成:嵌入式微处

5、理器等相关硬件和嵌入式操作系统等嵌入式软件。1.2 嵌入式处理器嵌入式处理器的体系架构可分为三种形式:(1)IP(Intellectual Property)级架构也就是片上系统SoC(System on Chip)形式,即是依设备功能的需求,将不同的IP单元,集成在一块总片中,它包含有处理器功能,I/O接口功能及嵌入式软件功能。(2)芯片级架构依应用系统要求,选用相应的微处理器,如MCU、MPU、DSP、RISC等芯片,并将RAM、ROM(EPROM/EEPROM/Fash)及I/O接口芯片等组成相应的嵌入式系统,相应的系统软件、应用软件是以固件形式固化在ROM中,这是目前常用的嵌入式系统的

6、架构方式。MCU、MPU属于单片机系列,这是大家熟知的。DSP(Digita Signal Processor)数字信号处理器,它具有数字信号处理能力强,特别适合于声音、图像等多媒体信息系统,但是其常规处理能力不强、寻址范围有限、I/O功能弱及开发平台问题,较少单独作为嵌入式系统的处理器,而是与嵌入式处理器相结合,构成更强大的功能。RISC(Reduced Instruction Set Computer)型处理器具有结构简单、处理速度快和处理功能强等优点,因此,新型的嵌入式系统大多数采用RISC处理器,主流架构由ARM架构处理器、Intel的8051处理器、Microchip的PIC处理器和

7、ZiOG的Z80处理器。目前典型的代表是ARM架构处理器,世界上许多公司均基于ARM架构开发出相应的微处理器芯片,如:ATME公司:AT91系列MCU(采用ARM7TDMI内核)。Intel公司:SA-1110微处理器MPU(采用Strong ARM核)。Cirros公司:EP及CL-PS系列掌上型计算机产品的MPU(采用ARM720T核)。 inkup Systems公司:L720互联网处理器(采用ARM720T核)。 Sharp公司:H77790掌上型产品中的MPU(采用ARM 7TD内核)。其它如Hyundai公司、OKI公司、Rohm公司、Samsung公司,Netsiicom公司等,

8、其产品中均采用ARM内核。另外一种新型的微架构处理器是Inte公司的Xscale,它是新一代为无线掌上型应用产品开发的嵌入式处理器,是PCA开发式平台架构中应用于子系统与通信子系统中的嵌入式处理器。(3)X86处理器嵌入到应用系统中这样可充分利用PC机的通用性和便利性,采用嵌入式操作系统,并且将操作系统和应用软件均固化在固态电子盘中,以缩小体积,增加可靠性。典型的产品有研祥公司的嵌入式CPU卡及威盛公司的C3 CPU卡。1.3 嵌入式实时操作系统(RTOS)嵌入式实时操作系统(Embedded Real Time OS,简称 RTOS)是嵌入式系统应用开发的核心软件,是嵌入式系统的灵魂,就像我

9、们日常所用计算机桌面系统中,微软公司的 Windows 操作系统一样重要。市场上有很多著名的商业化嵌入式操作系统,如VxWorks、Pam OS、Windows CE、嵌入式 Linux和C/OS-II等上千种RTOS。风河VxWorks是非常出色的设备软件操作系统平台,适用于从手持电子设备到大型网络设施的各种设备。它以其良好的可靠性和卓越的实时性被广泛的应用在通信、军事、航空、航天等高精尖技术及实时性要求很高的领域中,如卫星通信、军事演习等。它是目前嵌入式系统领域中使用最广泛、市场占有率最高的系统。它支持多种处理器,如x86,i960,StrongARM,ARM等。Palm OS是由Palm

10、公司自行开发,在掌上计算机和PDA市场上占有很大的市场份额。开放的操作系统应用程序接口(API),开发商可以根据需要自行开发所需的应用程序。Windows CE是微软开发的一个嵌入式操作系统,专门用于手持设备和信息家电,它的模块化设计允许他对从掌上计算机到专用的工业控制的用户电子设备进行定制。它的特点是发展掌上型Windows系统,有文件兼容性高、功能多样化的特点,可以看作是 Windows 95的简化版。Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。Linux继承了Unix以网络为核心的设计思想,是一个

11、性能稳定的多用户网络操作系统。它以高效性和灵活性著称。但是,由于Linux是全球各地的成千上万的程序员设计和实现的,因此开发散乱也是它的一大弱点。C/OS-II是源代码公开的实时嵌入式操作系统,主要有以下特点:(1)可移植性(Portable)强,C/OS-II绝大部分源码使用ANSI C编写的,而与微处理器硬件相关的那部分使用会编写的。(2)可固化,可裁减,可确定性。(3)C/OS-II完全是占先式(Preemptive)的实时内核。(4)实时多任务,不支持时间片轮转调度法。(5)任务栈, C/OS-II每个任务都有自己的任务栈(6)系统服务,C/OS-II提供了很多的系统服务,例如信号量、

12、互斥信号量、消息邮箱、消息队列等1.4 X-RTOS的介绍 现在,市场上有那么多的嵌入式操作系统,从简单到复杂,应有尽有。比如C/OS-II就是一个简单易学的RTOS,而且他又是开放源代码的,免费用于个人学习的。但是,他也还有一个最大的弱点,就是不支持时间片轮转调度算法,这样带来的另一个弱点就是任务的数量是有限。通过对C/OS-II的研究,最终实现一个小型的嵌入式操作系统,取名为X-RTOS。X-RTOS的主要特点:(1)可移植性强(Portable),X-RTOS绝大部分使用ANSI C编写,而而与微处理器硬件相关的那部分利用了C/OS-II的函数层,所以X-RTOS和C/OS-II一样有很

13、强的可移植性的可固化,可裁减,可确定性。X-RTOS是占先式(Preemptive)和时间片轮转共存的实时内核。实时多任务,支持时间片轮转调度法,任务数可以不确定(5)任务栈, X-RTOS每个任务都有自己的任务栈(6)系统服务,X-RTOS提供了很多的系统服务,例如信号量、互斥信号量、消息队列等,特别加入一个定时器的功能2 硬件体系结构和软件平台 2.1 硬件体系结构硬件平台采用的是EasyARM2138开发板, 他是广州周立功公司设计的EasyARM系列开发套件之一,下面简单介绍一下EasyARM2138。EasyARM2138采用了PHILIPS公司基于ARM7TDMI-S 核、单电源供

14、电、QFP64封装的LPC2138,LPC2138具有32kB 的片内静态RAM 和512kB 的片内Fash 程序存储器,支持JTAG仿真调试、ISP编程等功能,EasyARM2138开发板上还提供了一些键盘、ED、蜂鸣器等常用功能部件,还具有RS232接口电路、I2C存储器电路。另外,灵活的跳线组合(开发板内使用的所有I/O均可断开连接),还有用户I/O接口,极大地方便了用户进行32位ARM嵌入式系统的开发实验。开发的小型嵌入式操作系统(X-RTOS),代码量不是很大,对于拥有32kB 的片内静态RAM 和512kB 的片内Flash 程序存储器的PC2138来说是绰绰有余,再加上开发板还

15、支持JTAG仿真测试,ISP编程,这样使得开发效率大幅度提高。另外开发板上还提供了一些键盘、LED、蜂鸣器等常用功能部件,还具有RS232接口电路、I2C存储器电路。这样更有利于通过小的试验才测试一下程序的正确性,通过这两点所以选择了 EasyARM2138开发板。2.2 软件平台在软件平台的选择上,现在有很多的嵌入式开发软件平台,比如ARM公司的ADS 系列的软件,还有IAR公司的IAR Embedded Workbench for ARM Evauation等软件。由于比较熟悉ADS ,最后选择了ADS软件平台,选用的是ADS 1.2。ARM ADS全称为ARM Developer Sui

16、te 。是ARM公司推出的一款ARM集成开发工具。除了可以安装在 Windows NT4,Windows 2000操作系统下,还支持Windows XP操作系统。ADS由命令行开发工具,ARM时实库,GUI开发环境(Code Warrior 和 AXD),实用程序和支持软件组成。有了这些部件,用户就可以为ARM系统的RISC处理器编写和调试自己的开发应用程序了。加上自身集成的CodeWarrior for ARM 是一套完整的开发工具,充分发挥了ARM RISC的优势,使产品开发人员能够很好的应用尖端的片上系统技术。该工具是专为基于ARM RISC的处理器而设计的,它可加速并简化嵌入式开发过程

17、的每一个环节,使得开发人员只需要一个集成软件开发环境就能研制出ARM产品,在整个开发周期中,开发人员无需离开CodeWarrior开发环境,因此节省了在操作工具上花的时间,使的开发人员有更多的精力投入到代码编写上来。最后,还要必须说到他的一个工具,就是他自身带的调试器AXD。程序员可以通过这个软件使用debug agent 可以对包含有调试信息的,正在运行的可以执行代码进行比如变量的查看,断点的控制等调试操作,这样的话,使的找程序的错误变得更加的简单,快速。3 实时系统的基本概念实时系统的特点是,如果逻辑和时序出现偏差将会引起严重后果的系统。有两种类型的实时系统:软实时系统和硬实时系统。在软实

18、时系统中系统的宗旨是使各个任务运行得越快越好,并不要求限定某一任务必须在多长时间内完成。在硬实时系统中,各任务不仅要执行无误而且要做到准时。大多数实时系统是二者的结合。实时系统的应用涵盖广泛的领域,而多数实时系统又是嵌入式的。这意味着计算机建在系统内部,用户看不到有个计算机在系统里面。以下是一些嵌入式系统的例子:过程控制食品加工化工厂汽车业发动机控制防抱死系统(ABS)办公自动化传真机复印机计算机外设打印机计算机终端扫描仪调制解调器通讯类Switch Hurb路由器机器人航空航天飞机管理系统武器系统喷气发动机控制民用消费品微波炉洗碗机洗依机稳温调节器3.1 前后台系统不复杂的小系统一般设计成如

19、图3.1所示的样子。这种系统可称为前后台系统或超循环系统(Super-loops)。应用程序是一个无限的循环,循环中调用相应的函数完成相应的操作,这部分可以看成后台行为(background)。中断服务程序处理异步事件,这部分可以看成前台行为(foreground)。后台也可以叫做任务级。前台也叫中断级。时间相关性很强的关键操作(Critical operation)一定是靠中断服务来保证的。因为中断服务提供的信息一直要等到后台程序走到该处理这个信息这一步时才能得到处理,这种系统在处理信息的及时性上,比实际可以做到的要差。这个指标称作任务级响应时间。最坏情况下的任务级响应时间取决于整个循环的执

20、行时间。因为循环的执行时间不是常数,程序经过某一特定部分的准确时间也是不能确定的。进而,如果程序修改了,循环的时序也会受到影响图3.1 前后台系统很多基于微处理器的产品采用前后台系统设计,例如微波炉、电话机、玩具等。在另外一些基于微处理器的应用中,从省电的角度出发,平时微处理器处在停机状态(hat),所有的事都靠中断服务来完成。3.2 代码的临界段代码的临界段也称为临界区,指处理时不可分割的代码。一旦这部分代码开始执行,则不允许任何中断打入。为确保临界段代码的执行,在进入临界段之前要关中断,而临界段代码执行完以后要立即开中断。3.3 资源 任何为任务所占用的实体都可称为资源。资源可以是输入输出

21、设备,例如打印机、键盘、显示器,资源也可以是一个变量,一个结构或一个数组等。3.4 共享资源可以被一个以上任务使用的资源叫做共享资源。为了防止数据被破坏,每个任务在与共享资源打交道时,必须独占该资源。这叫做互斥。3.5 多任务多任务运行的实现实际上是靠CPU(中央处理单元)在许多任务之间转换、调度。CPU只有一个,轮番服务于一系列任务中的某一个。多任务运行很像前后台系统,但后台任务有多个。多任务运行使CPU的利用率得到最大的发挥,并使应用程序模块化。在实时应用中,多任务化的最大特点是,开发人员可以将很复杂的应用程序层次化。使用多任务,应用程序将更容易设计与维护。3.6 任务一个任务,也称作一个

22、线程,是一个简单的程序,该程序可以认为CPU完全只属该程序自己。实时应用程序的设计过程,包括如何把问题分割成多个任务,每个任务都是整个应用的某一部分,每个任务被赋予一定的优先级,有它自己的一套CPU寄存器和自己的栈空间(如图3.2所示)。图3.2 多任务环境典型地、每个任务都是一个无限的循环。每个任务都处在以下5种状态之一的状态下,这5种状态是休眠态,就绪态、运行态、挂起态(等待某一事件发生)和被中断态(见图3.3) 图3.3 任务的状态休眠态相当于该任务驻留在内存中,但并不被多任务内核所调度。就绪意味着该任务已经准备好,可以运行了,但由于该任务的优先级比正在运行的任务的优先级低,还暂时不能运

23、行。运行态的任务是指该任务掌握了CPU的控制权,正在运行中。挂起状态也可以叫做等待事件态WAILTING,指该任务在等待,等待某一事件的发生,(例如等待某外设的I/O操作,等待某共享资源由暂不能使用变成能使用状态,等待定时脉冲的到来或等待超时信号的到来以结束目前的等待,等等)。最后,发生中断时,CPU提供相应的中断服务,原来正在运行的任务暂不能运行,就进入了被中断状态。3.7 任务切换Context Switch 也称为在上下文切换,实际含义是任务切换,或CPU寄存器内容切换。当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态(Context),即CPU寄存器中的全部内容。这些内容

24、保存在任务的当前状况保存区(Tasks Context Storage area),也就是任务自己的栈区之中。(见图3.2)。入栈工作完成以后,就是把下一个将要运行的任务的当前状况从该任务的栈中重新装入CPU的寄存器,并开始下一个任务的运行。这个过程叫做任务切换。任务切换过程增加了应用程序的额外负荷。CPU的内部寄存器越多,额外负荷就越重。做任务切换所需要的时间取决于CPU有多少寄存器要入栈。实时内核的性能不应该以每秒钟能做多少次任务切换来评价。3.8 内核多任务系统中,内核负责管理各个任务,或者说为每个任务分配CPU时间,并且负责任务之间的通讯。内核提供的基本服务是任务切换。之所以使用实时内

25、核可以大大简化应用系统的设计,是因为实时内核允许将应用分成若干个任务,由实时内核来管理它们。内核本身也增加了应用程序的额外负荷,代码空间增加ROM的用量,内核本身的数据结构增加了RAM的用量。但更主要的是,每个任务要有自己的栈空间,这一块吃起内存来是相当厉害的。内核本身对CPU的占用时间一般在2到5个百分点之间。单片机一般不能运行实时内核,因为单片机的RAM很有限。通过提供必不可缺少 的系统服务,诸如信号量管理,邮箱、消息队列、延时等,实时内核使得CPU的利用更为有效。一旦读者用实时内核做过系统设计,将决不再想返回到前后台系统。3.9 调度调度(Scheduler)是内核的主要职责之一,就是要

26、决定该轮到哪个任务运行了。多数实时内核是基于优先级调度法的。每个任务根据其重要程度的不同被赋予一定的优先级。基于优先级的调度法指,CPU总是让处在就绪态的优先级最高的任务先运行。然而,究竟何时让高优先级任务掌握CPU的使用权,有两种不同的情况,这要看用的是什么类型的内核,是不可剥夺型的还是可剥夺型内核。3.10 不可剥夺型内核不可剥夺型内核要求每个任务自我放弃CPU的所有权。不可剥夺型调度法也称作合作型多任务,各个任务彼此合作共享一个CPU。异步事件还是由中断服务来处理。中断服务可以使一个高优先级的任务由挂起状态变为就绪状态。但中断服务以后控制权还是回到原来被中断了的那个任务,直到该任务主动放

27、弃CPU的使用权时,那个高优先级的任务才能获得CPU的使用权。不可剥夺型内核的一个优点是响应中断快。在讨论中断响应时会进一步涉及这个问题。在任务级,不可剥夺型内核允许使用不可重入函数。函数的可重入性以后会讨论。每个任务都可以调用非可重入性函数,而不必担心其它任务可能正在使用该函数,从而造成数据的破坏。因为每个任务要运行到完成时才释放CPU的控制权。当然该不可重入型函数本身不得有放弃CPU控制权的企图。使用不可剥夺型内核时,任务级响应时间比前后台系统快得多。此时的任务级响应时间取决于最长的任务执行时间。不可剥夺型内核的另一个优点是,几乎不需要使用信号量保护共享数据。运行着的任务占有CPU,而不必

28、担心被别的任务抢占。但这也不是绝对的,在某种情况下,信号量还是用得着的。处理共享I/O设备时仍需要使用互斥型信号量。例如,在打印机的使用上,仍需要满足互斥条件。图3.4示意不可剥夺型内核的运行情况,任务在运行过程之中,图3.4(1)中断来了,如果此时中断是开着的,CPU由中断向量3.4(2)进入中断服务子程序,中断服务子程序做事件处理图3.4(3),使一个有更高级的任务进入就绪态。中断服务完成以后,中断返回指令图3.4(4), 使CPU回到原来被中断的任务,接着执行该任务的代码图3.4(5)直到该任务完成,调用一个内核服务函数以释放CPU控制权,由内核将控制权交给那个优先级更高的、并已进入就绪

29、态的任务图3.4(6),这个优先级更高的任务才开始处理中断服务程序标识的事件图3.4(7)。 图3.4 不可剥夺型内核不可剥夺型内核的最大缺陷在于其响应时间。高优先级的任务已经进入就绪态,但还不能运行,要等,也许要等很长时间,直到当前运行着的任务释放CPU。与前后系统一样,不可剥夺型内核的任务级响应时间是不确定的,不知道什么时候最高优先级的任务才能拿到CPU的控制权,完全取决于应用程序什么时候释放CPU。总之,不可剥夺型内核允许每个任务运行,直到该任务自愿放弃CPU的控制权。中断可以打入运行着的任务。中断服务完成以后将CPU控制权还给被中断了的任务。任务级响应时间要大大好于前后系统,但仍是不可

30、知的,商业软件几乎没有不可剥夺型内核。3.11 可剥夺型内核当系统响应时间很重要时,要使用可剥夺型内核。因此,C/OS-以及绝大多数商业上销售的实时内核都是可剥夺型内核。最高优先级的任务一旦就绪,总能得到CPU的控制权。当一个运行着的任务使一个比它优先级高的任务进入了就绪态,当前任务的CPU使用权就被剥夺了,或者说被挂起了,那个高优先级的任务立刻得到了CPU的控制权。如果是中断服务子程序使一个高优先级的任务进入就绪态,中断完成时,中断了的任务被挂起,优先级高的那个任务开始运行。如图3.5所示。图3.5 可剥夺型内核使用可剥夺型内核,最高优先级的任务什么时候可以执行,可以得到CPU的控制权是可知

31、的。使用可剥夺型内核使得任务级响应时间得以最优化。使用可剥夺型内核时,应用程序不应直接使用不可重入型函数。调用不可重入型函数时,要满足互斥条件,这一点可以用互斥型信号量来实现。如果调用不可重入型函数时,低优先级的任务CPU的使用权被高优先级任务剥夺,不可重入型函数中的数据有可能被破坏。综上所述,可剥夺型内核总是让就绪态的高优先级的任务先运行,中断服务程序可以抢占CPU,到中断服务完成时,内核让此时优先级最高的任务运行(不一定是那个被中断了的任务)。任务级系统响应时间得到了最优化,且是可知的。C/OS-属于可剥夺型内核。3.12 时间片轮番调度法当两个或两个以上任务有同样优先级,内核允许一个任务

32、运行事先确定的一段时间,叫做时间额度,然后切换给另一个任务。也叫做时间片调度。内核在满足以下条件时,把CPU控制权交给下一个任务就绪态的任务,当前任务已无事可做;当前任务在时间片还没结束时已经完成了;目前,C/OS-不支持时间片轮番调度法。应用程序中各个任务的优先级必须互不相同,但是,在我的毕业设计中X-RTOS中,支持时间片轮转。3.13 任务优先级每个任务都有其优先级。任务越重要,赋予的优先级应越高。3.14 静态优先级应用程序执行过程中诸任务优先级不变,则称之为静态优先级。在静态优先级系统中,诸任务以及它们的时间约束在程序编译时是已知的。3.15 动态优先级应用程序执行过程中,任务的优先

33、级是可变的,则称之为动态优先级。实时内核应当避免出现优先级反转问题。3.16 优先级反转使用实时内核,优先级反转问题是实时系统中出现得最多的问题。图3.6解释优先级反转是如何出现的。如图3.6,任务1优先级高于任务2,任务2优先级高于任务3。任务1和任务2处于挂起状态,等待某一事件的发生,任务3正在运行如图3.6 (1)。此时,任务3要使用其共享资源。使用共享资源之前,首先必须得到该资源的信号量(Semaphore)。任务3得到了该信号量,并开始使用该共享资源图3.6(2)。由于任务1优先级高,它等待的事件到来之后剥夺了任务3的CPU使用权图3.6 (3),任务1开始运行图3.6 (4)。运行

34、过程中任务1也要使用那个任务3正在使用着的资源,由于该资源的信号量还被任务3占用着,任务1只能进入挂起状态,等待任务3释放该信号量图3.6 (5)。任务3得以继续运行图3.6 (6)。由于任务2的优先级高于任务3,当任务2等待的事件发生后,任务2剥夺了任务3的CPU的使用权图3.6 (7)并开始运行。处理它该处理的事件图3.6(8),直到处理完之后将CPU控制权还给任3图3.6(9)。任务3接着运行图3.6(10),直到释放那个共享资源的信号量图2.7(11)。直到此时,由于实时内核知道有个高优先级的任务在等待这个信号量,内核做任务切换,使任务1得到该信号量并接着运行图3.6(12)。在这种情

35、况下,任务1优先级实际上降到了任务3 的优先级水平。因为任务1要等,直等到任务3释放占有的那个共享资源。由于任务2剥夺任务3的CPU使用权,使任务1的状况更加恶化,任务2使任务1增加了额外的延迟时间。任务1和任务2的优先级发生了反转。纠正的方法可以是,在任务3使用共享资源时,提升任务3的优先级。任务完成时予以恢复。任务3的优先级必须升至最高,高于允许使用该资源的任何任务。多任务内核应允许动态改变任务的优先级以避免发生优先级反转现象。然而改变任务的优先级是很花时间的。如果任务3并没有先被任务1剥夺CPU使用权,又被任务2抢走了CPU使用权,花很多时间在共享资源使用前提升任务3的优先级,然后又在资

36、源使用后花时间恢复任务3的优先级,则无形中浪费了很多CPU时间。真正需要的是,为防止发生优先级反转,内核能自动变换任务的优先级,这叫做优先级继承(Priority inheritance)但C/OS-不支持优先级继承,我得到毕业设计就支持优先级继承。在我的毕业设计中就会支持优先级继承。图3.6 优先级反转问题 图3.7解释如果内核支持优先级继承的话,在上述例子中会是怎样一个过程。任务3在运行图3.7(1),任务3申请信号量以获得共享资源使用权图3.7(2),任务3得到并开始使用共享资源图3.7(3)。后来CPU使用权被任务1剥夺图3.7(4),任务1开始运行图3.7(5),任务1申请共享资源信

37、号量图3.7(6)。此时,内核知道该信号量被任务3占用了,而任务3的优先级比任务1低,内核于是将任务3的优先级升至与任务1一样,然而回到任务3继续运行,使用该共享资源图3.7(7),直到任务3释放共享资源信号量图3.7(8)。这时,内核恢复任务3本来的优先级并把信号量交给任务1,任务1得以顺利运行。 图3.7(9),任务1完成以后图2.8(10)那些任务优先级在任务1与任务3之间的任务例如任务2才能得到CPU使用权,并开始运行 图3.7(11)。注意,任务2在从图3.7(3)到3.7(10)的任何一刻都有可能进入就绪态,并不影响任务1、任务3的完成过程。在某种程度上,任务2和任务3之间也还是有

38、不可避免的优先级反转。图3.7 内核支持优先级继承4 X-RTOS详细设计及编码实现4.1 X-RTOS内核结构概述4.1.1 临界区和其它内核一样,X-RTOS为了处理临界段代码需要关中断,处理完毕后再开中断。这使得X-RTOS能够避免同时有其它任务或中断服务进入临界段代码。关中断的时间是实时内核开发商应提供的最重要的指标之一,因为这个指标影响用户系统对实时事件的响应性。X-RTOS努力使关中断时间降至最短,但就使用X-RTOS而言,关中断的时间很大程度上取决于微处理器的架构以及编译器所生成的代码质量。微处理器一般都有关中断/开中断指令,用户使用的C语言编译器必须有某种机制能够在C中直接实现

39、关中断/开中断地操作。某些C编译器允许在用户的C源代码中插入汇编语言的语句。这使得插入微处理器指令来关中断/开中断很容易实现。而有的编译器把从C语言中关中断/开中断放在语言的扩展部分。X-RTOS定义两个宏(macros)来关中断和开中断,以便避开不同C编译器厂商选择不同的方法来处理关中断和开中断。X-RTOS中的这两个宏调用分别是:OS_ENTER_CRITICA()和OS_EXIT_CRITICA()。因为这两个宏的定义取决于所用的微处理器。 4.1.2 任务及其任务控制块一个任务通常是一个无限的循环。一个任务看起来像其它C的函数一样,有函数返回类型,有形式参数变量,但是任务是绝不会返回的

40、。故返回参数必须定义成void。X-RTOS可以管理的任务数取决于cpu资源的大小,任务之间的优先级可以相等,也可以不相等。一旦任务建立了,任务控制块rtos_tcb将被赋值(图4.1)。任务控制块是一个数据结构,当任务的CPU使用权被剥夺时,X-RTOS用它来保存该任务的状态。当任务重新得到CPU使用权时,任务控制块能确保任务从当时被中断的那一点丝毫不差地继续执行。rtos_tcb全部驻留在RAM中。程序清单4.1 rtos_tcb typedef struct rtos_tcb rtos_type_stk *rtos_tcb_stk_ptr; /*堆栈指针*/ rtos_ist_t rto

41、s_tcb_head_ist; /*head_ist*/ INT8U rtos_tcb_state; /*任务的状态*/ rtos_type_prio rtos_tcb_prio_now; /*任务的优先级*/ rtos_type_prio rtos_tcb_prio_init; /*任务初始化的优先级*/ #if rtos_cyce_schedue_en 0 INT32U rtos_tcb_init_tick; /* tasks tick .*/ INT32U rtos_tcb_remaining_tick; /* tasks remaining tick*/#endif #if rtos_

42、using_event 0INT32U rtos_tcb_event_set;INT8U rtos_tcb_event_info;#endif INT8U rtos_tcb_id; /*the tasks id number*/struct rtos_timer rtos_tcb_timer; /* thread timer .*/ rtos_tcb; .rtos_tcb_stk_ptr是指向当前任务栈顶的指针。X-RTOS允许每个任务有自己的栈,尤为重要的是,每个任务的栈的容量可以是任意的。有些商业内核要求所有任务栈的容量都一样,除非用户写一个复杂的接口函数来改变之。这种限制浪费了RAM,当

43、各任务需要的栈空间不同时,也得按任务中预期栈容量需求最多的来分配栈空间。.rtos_tcb_head_ist是一个特殊的结构体,他的作用是起到组成双链表的作用,是从Linux中引入的一个方法.rtos_tcb_state用于存储任务的状态。.rtos_tcb_prio_now 代表任务当前的优先级.rtos_tcb_prio_init 代表任务初始化时的优先级,一般的情况是两个优先级是一样的.rtos_tcb_init_tick 代表任务拥有的时间片.rtos_tcb_remaining_tick 代表任务还剩下的时间片.rtos_tcb_event_set是留给事件组用的,设置任务要等待的事

44、件组的情况.rtos_tcb_id 是任务的标号,是区分一个任务和别的任务的重要的标志。.rtos_tcb_timer 是任务的定时器,用于任务定时和事件等待4.1.3 就绪表每个任务被赋予一个的优先级等级,从0级到最低优先级OS_OWEST_PR1O,包括0和OS_OWEST_PR1O在内,当X-RTOS初始化的时候,最低优先级OS_OWEST_PR1O总是被赋给空闲任务rtos_task_ide。每个任务的就绪态标志都放入就绪表中的,就绪表中有两个变量rtos_rdy_grp和rtos_map_tbl。在 rtos_rdy_grp中,任务按优先级分组,8个任务为一组。 rtos_rdy_g

45、rp中的每一位表示8组任务中每一组中是否有进入就绪态的任务。任务进入就绪态时,就绪表rtos_map_tbl中的相应元素的相应位也置位。就绪表 rtos_rdy_tbl数组的大小取决于OS_OWEST_PR1O。当用户的应用程序中任务数目比较少时,减少OS_OWEST_PR1O的值可以降低X-RTOS对RAM(数据空间)的需求量。为确定下次该哪个优先级的任务运行了,内核调度器总是将OS_OWEST_PR1O在就绪表中相应字节的相应位置1。 rtos_rdy_grp和 rtos_map_tbl之间的关系见图4.1,是按以下规则给出的:当rtos_map_tbl0中的任何一位是1时, rtos_r

46、dy_grp的第0位置1,当rtos_map_tbl1中的任何一位是1时, rtos_rdy_grp的第1位置1,当rtos_map_tbl2中的任何一位是1时, rtos_rdy_grp的第2位置1,当rtos_map_tbl3中的任何一位是1时, rtos_rdy_grp的第3位置1,当rtos_map_tbl4中的任何一位是1时, rtos_rdy_grp的第4位置1,当rtos_map_tbl5中的任何一位是1时, rtos_rdy_grp的第5位置1,当rtos_map_tbl6中的任何一位是1时, rtos_rdy_grp的第6位置1,当rtos_map_tbl7中的任何一位是1时

47、, rtos_rdy_grp的第7位置1,图 4.1 就绪表程序清单4.2中的代码用于将任务放入就绪表。tcbtemp-rtos_tcb_prio_now是某个任务的优先级。程序清单4.2 把任务进入就绪表/*把任务进入就绪表*/ rtos_rdy_grp |= rtos_map_tbltcbtemp-rtos_tcb_prio_now 3; rtos_rdy_tbltcbtemp-rtos_tcb_prio_now 3 |= rtos_map_tbltcbtemp-rtos_tcb_prio_now & 0x07;如果一个任务被删除了,则用程序清单 4.3中的代码做求反处理。程序清单4.3把

48、任务进入就绪表if (rtos_ist_isempty(&(rtos_tcb_priority_tbltask-rtos_tcb_prio_now) if(rtos_rdy_tbltask-rtos_tcb_prio_now 3 &= rtos_map_tbltask-rtos_tcb_prio_now & 0x07) = 0) rtos_rdy_grp &= rtos_map_tbltask-rtos_tcb_prio_now 3;以上代码将就绪任务表数组rtos_rdy_tbl中相应元素的相应位清零,对于rtos_rdy_grp,只有当被删除任务所在任务组中全组任务一个都没有进入就绪态时,

49、才将相应位清零。也就是说rtos_rdy_tbltask-rtos_tcb_prio_now3所有的位都是零时,rtos_rdy_grp的相应位才清零。4.1.4 任务调度X-RTOS总是运行进入就绪态任务中优先级最高的那一个。确定哪个任务优先级最高,下面该哪个任务运行了的工作是由调度器(Scheduer)完成的。任务级的调度是由函数rtos_sched()完成的。中断级的调度是由另一个函数rtos_int_exit()完成的.程序清单4.4调度函数void rtos_sched (void) INT8U y; rtos_tcb * to_task;OS_ENTER_CRITICA(); (1

50、) if (rtos_int_nesting = 0) & (rtos_ock_nesting = 0) y = rtos_unmap_tblrtos_rdy_grp; (2) rtos_prio_high_rdy = (INT8U) (y rtos_tcb_state &= rtos_stat_run; rtos_prio_cur = rtos_prio_high_rdy; to_task-rtos_tcb_state &= rtos_stat_rdy; to_task-rtos_tcb_state |= rtos_stat_run;rtos_tcb_high_rdy = to_task;

51、OS_TASK_SW(); OS_EXIT_CRITICA();X-RTOS任务调度所花的时间是常数,与应用程序中建立的任务数无关。如程序清中4.4(1)条件语句的条件不满足,任务调度函数rtos_sched()将退出,不做任务调度。这个条件是:如果在中断服务子程序中调用rtos_sched(),此时中断嵌套层数rtos_int_nestin0,或者由于用户至少调用了一次给任务调度上锁函数rtos_ock_nest (),使rtos_ock_nesting 0。如果不是在中断服务子程序调用rtos_sched(),并且任务调度是允许的,即没有上锁,则任务调度函数将找出那个进入就绪态且优先级最高

52、的任务4.4(2),进入就绪态的任务在就绪任务表中有相应的位置位。一旦找到那个优先级最高的任务,rtos_sched()检验这个优先级最高的任务是不是当前正在运行的任务,以此来避免不必要的任务调度4.4(3)。为实现任务切换,rtos_tcb_high_rdy必须指向优先级最高的那个任务控制块rtos_tcb,任务切换很简单,由以下两步完成,将被挂起任务的微处理器寄存器推入堆栈,然后将较高优先级的任务的寄存器值从栈中恢复到寄存器中。在X-RTOS中,就绪任务的栈结构总是看起来跟刚刚发生过中断一样,所有微处理器的寄存器都保存在栈中。换句话说,X-RTOS运行就绪态的任务所要做的一切,只是恢复所有

53、的CPU寄存器并运行中断返回指令。为了做任务切换,运行OS_TASK_SW(),人为模仿了一次中断。4.1.5 空闲任务程序清单4.5 空闲任务void rtos_task_ide (void *pdata) pdata = pdata; whie(1) rtos_ide_zhan_time +; 上面的代码就是系统的空闲任务rtos_task_idle(),X-RTOS总是建立一个空闲任务,这个任务在没有其它任务进入就绪态时投入运行。这个空闲任务永远设为最低优先级,即OS_OWEST_PRI0。空闲任务rtos_task_idle()什么也不做,只是在不停地给一个32位的名叫OSIdeCtr

54、的计数器加1,注意空闲任务不可能被应用软件删除。4.2 任务管理任务可以是一个无限的循环。任务看起来与任何C函数一样,具有一个返回类型和一个参数,只是它从不返回。任务的返回类型必须被定义成void型。4.2.1 建立任务想让X-RTOS管理用户的任务,用户必须要先建立任务。用户可以通过传递任务地址和其它参数到以下这个函数来建立任务:rtos_task_create ()。任务可以在多任务调度开始前建立,也可以在其它任务的执行过程中被建立。在开始多任务调度(即调用rtos_start()前,用户必须建立至少一个任务。任务不能由中断服务程序(ISR)来建立。rtos_task_create ()的

55、代码如下。从中可以知道,rtos_task_create ()需要六个参数:tcb是任务控制块的指针,task是任务代码的指针,pdata是当任务开始执行时传递给任务的参数的指针,ptos是分配给任务的堆栈的栈顶指针,prio是分配给任务的优先级,tick是给任务的时间片程序清单4.6 建立任务rtos_type_err rtos_task_create( rtos_tcb *tcb, void (*task)(void *pd), void *pdata, rtos_type_stk *ptos, INT8U prio,INT32U tick ) rtos_type_stk *stktemp

56、; rtos_type_err err; if (prio rtos_owest_prio) (1) return (rtos_err_prio_invaid); OS_ENTER_CRITICA(); stktemp= (rtos_type_stk *)rtos_task_stk_init(task, pdata, ptos, 0); (2) err = rtos_tcb_init(tcb,prio,stktemp,tick); (3) OS_EXIT_CRITICA(); if (err = rtos_err_no) OS_ENTER_CRITICA(); rtos_task_tota_n

57、ember+; OS_EXIT_CRITICA(); if (rtos_running = TRUE) rtos_sched(); return (err); rtos_task_create ()一开始先检测分配给任务的优先级是否有效代码4.4(1)。任务的优先级必须在0到OS_OWEST_PRIO之间。然后,rtos_task_create ()调用rtos_task_stk_init ()代码4.4(2),它负责建立任务的堆栈。该函数是与处理器的硬件体系相关的函数。rtos_task_stk_init()函数返回新的堆栈栈顶(stktemp),并被保存在任务的rtos_tcb中。X-RTOS支持的处理器的堆栈既可以从上(高地址)往下(低地址)递减也可以从下往上递增。用户在调用rtos_task_create ()的时候必须知道堆栈是递增的还是递减的,因为用户必须得把堆栈的栈顶传

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!