嵌入式实时操作系统ucos ii译原版章_第1页
嵌入式实时操作系统ucos ii译原版章_第2页
嵌入式实时操作系统ucos ii译原版章_第3页
嵌入式实时操作系统ucos ii译原版章_第4页
嵌入式实时操作系统ucos ii译原版章_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

22实时系统概 前后台系统(FOREGROUND/BACKGROUND 任务切换(CONTEXTSWITCHORTASK 不可剥夺型内核(NON-PREEMPTIVE 死锁(或抱死)(DEADLOCK(ORDEADLY 事件标志(EVENT 任务间的通讯(INTERTASK 消息邮箱(MESSAGEMAIL 消息队列(MESSAGE 时钟节拍(CLOCKI对存对存储器的需 使用实时内核的优缺 实时系统小 第2实时系统概第2实时系统概Switch航空航稳温调过程控发动机计算机调制解实时应用软件的设计一般比非实时应用软件设计难一些。本章讲述实时系前后台系统(Foreground/Background不复杂的小系统一般设计成如图2.1所示的样子。这种系统可称为前后台系统或超循环系统。应用程序是一个无限的循环,循环中调用相应的函数完成相应的操作,这部分可以看成后台行为)。中断服务程序处理异步事件,这部分可以看成前台(foregroundl一定是靠中断服务来保证的。因为中断服务提供的信息一直要等到后台程序走到该处理这个信息这一步时才能得到处理,这种系统在处理信息的及时性上,比实际可确定的。进而,如果程序修改了,循环的时序也会受到影响1图2-1前后台ha,所有的事都靠中图2-1前后台ha,所有的事都靠中断服务来完成代码的临界不允许任何中断打入。为确保临界段代码的执行,在进入临界段之前要关中断,而临界段码执行完以后要立即开中断。(参阅2.03共享资源资享资源打交道时,必须独占该资源。这叫做互斥(mutualexclusion。在2.18节“互斥”中,多任多任务运行的实现实际上是靠CPU(中央处理单元)在许多任务之间转换、调度。2UU任一个任务,也称作一个线程,是一个简单的程序,该程序可以认为CPU完全只属该程CPU如图22所示。图2.2多任务3不能运行,就进入了被中断状态。图2.3表示μC/OS-Ⅱ中一些函数提供的服务,这任务切换(ContextSithorTask内容切换。当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态(Contextarea就是把下一个将要运行的任务的当前状况从该任务的栈中重新装入CPU的寄存器,并开始下4内核)内核)调度调度(Scheduler)dispatcher,也是调度的意思。这是内核的主要不可剥夺型内核(Non-Preemptive放弃CPU控制权的企图。5中断来了,如果此时中断是开着的,CPU由中断向量[F2.4(2)]进入中断服务子程序,中断中断来了,如果此时中断是开着的,CPU由中断向量[F2.4(2)]进入中断服务子程序,中断CPU的控制权,完全取决于应用程序什么时候释放CPU。2.10可剥夺型内CPU的控制权。如果是中断服务6任务级系统响应时间得到了最优化,且是可知的。C/OSⅡ属于可剥夺型内核2.11可重入性程序清单2.1可重入7voidstrcpy(char*dest,char{while(*dest++=*src++);程序程序清单不可重入型程序员打算让Swap()生时Temp1,中断服务子程序使更优先级的任务就绪,当中断完成时调用Swap()函数是Temp赋值为3。这对该任务本身来说,实现两个变量的交换是没有问题Z4,X3。然后高优先级的任务通过调用内核服务函数中的延迟一个时钟节拍[F2.6(4)],释放了CPU的使用权,低优先级任务得以继续运行[F2.6(5)].注8intvoidswap(int*x,int{Temp=*x=*y=}}*dest=}把把Temp调用Swp函数之前关中断,调动后再开中用信号量禁止该函数在使用过程中被再次调如果中断发生在Swap()函数调用之前或调用之后,两个任务中的X,Y2.12时间片轮番调度(quantum时,把CPU控制权交给下一个任务就绪态的任务:92.13任务优先2.14静态优2.13任务优先2.14静态优先2.15动态优先2.16优先级反转是如何出现的。如图,任务1优先级高于任务2,任务2优先级高于任务3。任务1和任使用其共享资源。使用共享资源之前,首先必须得到该资源的信号量(Semaphore)(见2.2.7(41327(11)]。直到此时,由于实时内核知道有个高优先级的31剥夺CPU2抢走了CPU时间。内核恢复任务3本来的优先级并把信号量交给任务1,任务1得以顺利运行。[图2CPU2.8(1122.8(3)]到[图2.8(1013的完成过程。在某种程2.17任务优先级分2.17任务优先级分一项有意思的技术可称之为单调执行率调度法RMS(RateMonotonicScheduling)∑n(21/ni这里Ei是任务i最长执行时间,Ti∑n(21/ni这里Ei是任务i最长执行时间,Ti是任务i的执行周期。换句话说,Ei/Ti是任务i100%。使CPU100%并不好,因为那样的话程序就没有了修改的余地,也没法增加新功能了。作为系统设计的一条原则,CPU利用率应小于60%到70%。表2.1基于任务到CPU最高允许使用率(21-任务24....互斥条 2.18.12.18.1程序清单关中断和开中分。实际上μC/OS-Ⅱ提供两个宏调用,允许用户在应用程序的C代码中关中断然后再开中断:OS_ENTER_CRITICALOS_EXIT_CRITICAL()[参见8.03.02OS_ENTER_CRITICAL()程序清单2.4利用μC/OS_Ⅱ宏调用关中断和开voidFunction{. /*在这里处理共享数据}Disable Accesstheresource(read/writefrom/tovariables);/*读/写变Reenable 2.18.22.18.2程序清单2.5利用测试并置位处2.18.3Disable ifAccessVariableis0 Setvariableto Reenable Accessthe Disable SettheAccessVariablebackto Reenable else Reenable /*Youdon’thaveaccesstotheresource,trybacklater;}程序清单2程序清单2.6用给任务切换上锁,然后开锁的方法实现数据共享2.18.4信号量)(译者注:信号与信号量在英文中都叫做Semaphore,并不加以区分,而说它有两种类制信号量通常指若干位的组合。而本书中解释为事件标志的置位与清除(见2.21))。010voidFunction{. /*Youcanaccessshareddatainhere(interruptsarerecognized)*/./*在这里处理共享数据(中断是开着的)这里的中断是与此函数部共享数据结}信号量赋初值,等待信号量的任务表(Waitinglist)应清为空。信号量赋初值,等待信号量的任务表(Waitinglist)应清为空。道的任务调用等待信号量函数OSSemPend()。处理完共享数据以后再调用释放信号量函数程序清单通过获得信号量处理共享数voidFunction(void){INT8Uerr;OSSemPend(SharedDataSem,0,&err);. /*Youcanaccessshareddatainhere(interruptsarerecognized)*/./*共享数据的处理在此进行,(中断是开着的}打印机送数据时会出现什么现象。打印机会打出相互交叉的两个任务的数据。例如任务1打印机送数据时会出现什么现象。打印机会打出相互交叉的两个任务的数据。例如任务1TTasaskk1!2!”2.11程序清单.号量INT8UCommSendCmd(char*cmd,char*response,INT16U{Acquireport'ssemaphore;Sendcommandtodevice;Waitforresponse(withtimeout);if(timedout){Releasereturn(errorCommSendCmd()函数的任务申请并得CommSendCmd()函数的任务申请并得函数程序29用信号量管理缓冲区BUF{BUFAcquireasemaphore;Disableinterrupts; =}elseReleasesemaphore;return(no}}BufFreeList=ptr->BufNext;Enableinterrupts;return}voidBufRel(BUF{Disableptr->BufNext=BufFreeList;BufFreeList=ptr;Release}2.19死锁(或抱死(Delck(orDayc)正独享R1T2T2T1R2,T2R1,于是哪个任务2.20同0,信号量用于这种类型同步的称作单向同步(unilateralrendezvous)。一个两个任务可以用两个信号量同步它们的行为。如图2.14所示。这叫做双向同步(bilateralrendezvous)。双向同步同单向同步类似,只是两个任务要相互同步。例如则程序清单2.10运行到某一处的第一个任务发信号给第二个任务程序清单双向程序清单双向同步2.21事件标志(Event{for(;;)PerformSignaltask Waitforsignalfromtask#2; Continueoperation;}}{for(;;)PerformSignaltask Waitforsignalfromtask#1; Continueoperation;}}2.22任务间的通讯(Intetsk2.23消息邮2.23消息邮箱eeMil边的数字表示定时器设定值,即任务最长可以等多少个时钟节拍(ClockTicks),关于时钟2.24消2.24消息队列esage2.18示意中断服务子程序如何将消息放入消息队列。图中两个大写的I“10100等2.25中2.25中中断使得CPU可以在事件发生时才予以处理,而不必让微处理器连续不断地查询(Polling)是否有事件发生。通过两条特殊指令:关中断(Disableinterrupt)和开中断2.26中断延2.27中断响护现场,将CPU的各寄存器推入堆栈。这段时间将被记作中断响应时间。2.27中断响护现场,将CPU的各寄存器推入堆栈。这段时间将被记作中断响应时间。[2.3]保存CPU[2.4]保存CPUμC/OSOSIntEnter(),可剥夺2.28中断恢复时间Inerupt个由实时内核提供的函数。在μC/OS-Ⅱ中,这个函数叫做OSIntExit(),这个函数用于辨2.29中断延迟、响应和恢2.30中断处理时中断服务必须全部小于100μS,500μS1mS。如果中断服务是在任何给定的时间开始,2.31非屏蔽中断)2.31非屏蔽中断)的话,中断响应会推迟20μS。2.242.242.32时钟节拍(Ck)1有关。以下是这类问题可能的解决方案重新安排任务的优先时间要求苛刻的代码用汇编语言不管怎么样,抖动总是存在2.33对存储器的需核时的情况则很不一样。内核本身需要额外的代码空间)。内核的大小取决于多种因素1K到10K8位U务调度、任务切换、信号量处理、延时及超时服务约需要1K到3K[2.12]总代码量=应用程序代码+内核[2.12]总代码量=应用程序代码+内核计人员决定分配给每个任务多少栈空间时,应该尽可能使之接近实际需求量(有时,这是相所需的栈空间大小可以分别定义(µC/OS-II可以做到)。相反,有些内核要求每个任务所需等。如果内核不支持单独的中断用栈,总的[2.13RAM总需求=应用程序的RAM需求任务栈需求+最大中断嵌套栈需求*任如果内核支持中断用栈分离,总 [2.14]RAM总需求=应用程序RAM需求+内核数据区的RAM需求+各任务栈需求之总和+最多中断嵌套之栈需求除非有特别大的中断嵌外的代码空间取决于内核的大小,而2.34使用实时内核的优缺实时内核也称为实时操作系统或RT。它的使用使得实时应用程序的设计和扩展变得S了尽可能快捷、有效的处理。通过有效的服务,如信号量了尽可能快捷、有效的处理。通过有效的服务,如信号量、邮箱、队列、延时、超时等RTOS核的价格,额外的ROM/RAM开销,2到4百分点的CPU额外负荷。至于对使用RTOS连想都不敢想。当今80个以上的RTOS商家,生产面向8位、16位、32位、甚至是64位的微处理compilers)。RTOS的价格从70美元到30,000美元。RTOS制造商还可能索取每个目标系统商家称之为硅片软件(SiliconSof

温馨提示

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

评论

0/150

提交评论