提高篇嵌入式操作系统_第1页
提高篇嵌入式操作系统_第2页
提高篇嵌入式操作系统_第3页
提高篇嵌入式操作系统_第4页
提高篇嵌入式操作系统_第5页
已阅读5页,还剩154页未读 继续免费阅读

下载本文档

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

文档简介

提高篇嵌入式操作系统第1页,共159页,2023年,2月20日,星期六嵌入式实时操作系统第2页,共159页,2023年,2月20日,星期六一实时系统简介 一般而言具有实时性能的控制系统是实时系统。实时表示一个非常短的时间间隔“timegap”(也可以认为表示时间框架“timeframe”或者时间窗口“timewindow”),具有“立即”之含义。当计算机进行实时处理时,要求在接收到数据的同时执行操作并输出计算结果,不能超出计算机系统所能容忍的时限。第3页,共159页,2023年,2月20日,星期六实时系统的定义IEEE(美国电气电子工程师协会)给出的实时系统定义是“那些正确性不仅取决于计算的逻辑结果,也取决于产生结果所花费的时间的系统”。这就是说,实时系统运算能力具有及时与正确的双重特征。给出的实时系统(Real-TimeSystem)定义是:对外来事件能在限定的响应时间内做出预定质量处理的计算机系统。第4页,共159页,2023年,2月20日,星期六实时系统的体系结构实时系统的体系结构必须满足:高运算速度高速的中断处理高的I/O吞吐率合理的处理器和I/O设备的拓扑连接高速可靠的和有时间约束的通信体系结构支持的出错处理,体系结构支持的调度体系结构支持的操作系统,体系结构支持的实时语言特性。第5页,共159页,2023年,2月20日,星期六实时的调度理论。由于实时系统应用的特殊性,以往通用系统中以大吞吐量为目标的调度算法必须改进以适应实时应用的需要。主要要求是满足时间的正确性,然后提供高度动态的,满足在线需求的,强适应性的实时调度。实时操作系统的设计和实现。在设计上首要目标是提供保证实时性的方法,包括一系列的经典问题的针对实时系统的解决方案。实现上要求操作系统的低开销,而且必须保证内核以及其他关键部件的可重入性。第6页,共159页,2023年,2月20日,星期六实时系统的主要特点及时响应外部发生的随机任务请求在规定的时间范围内完成任务

任务执行的时间限制类型截止时间任务执行时间第7页,共159页,2023年,2月20日,星期六截止时间:一个时间界限。它要求一个任务在该时刻之前完成任务执行时间一个任务从启动到完成所花费的时间。分为平均任务执行时间和最坏任务执行时间,实时系统中一般指最坏任务执行时间,考虑了可能的等待、阻塞等最不利的情况。任务余量:截止时间减去任务执行时间所得的值,反映了系统工作的从容程度。紧时间约束在满足任务时限的同时,留给系统的时间比较紧张。由任务的余量小而引起。松时间约束:与紧时限概念相反,指在满足任务时限的同时,留给系统的时间比较宽松第8页,共159页,2023年,2月20日,星期六实时系统的关键因素计算机系统的实时性能主要由操作系统和运行在操作系统上的应用软件决定,对于无操作系统的计算机则由控制程序决定。具有实时性能的操作系统称为实时操作系统(Real-TimeOperatingSystem,RTOS)第9页,共159页,2023年,2月20日,星期六实时系统与非实时系统的例子实时系统典型例子民用飞机的导航系统汽车的防刹车抱死系统非实时系统典型例子银行数据查询处理系统视频播放系统图像扫描文字识别系统第10页,共159页,2023年,2月20日,星期六提高实时性能的因素尽量采用硬件处理优化微处理器的中断机制采用简单的单线程循环程序采用基于实时操作系统的复杂多线程操作

可见硬件加速和RTOS应用是提高实时系统的两个主要因素以下几种途径常常用来提高应用系统实时性能第11页,共159页,2023年,2月20日,星期六实时系统的属性和指标实时系统的两个基本属性可预测性和可靠性实时系统的实时性能主要根据其RTOS的三个主要指标来衡量响应时间(responsetime)吞吐量(throughput)生存时间(survivaltime)第12页,共159页,2023年,2月20日,星期六可预测性系统能够对实时任务的执行时间进行判断,确定是否能够满足任务的时限要求。嵌入式系统的两个可预测性硬件延迟的可预测性、软件系统的可预测性应用程序的响应时间是可预测的,即在有限时间内完成必须的工作。操作系统的可预测性,即实时原语、调度函数等运行开销应是有界的以保证应用程序执行时间的有界性。资源约束指多个实时任务共享有限的资源时,必须按照一定的资源访问控制协议进行同步,以避免死锁和高优先级任务被低优先级任务堵塞的时间(即优先级反转时间)不可预测。第13页,共159页,2023年,2月20日,星期六可靠性可靠性已成为衡量实时系统性能不可缺少的重要指标。采用静态分析和保留资源的方法及冗余配置,使关键任务的要求总能满足,系统在最坏情况下能正常工作或避免损失一个系统的可靠性是由其组成元素共同决定的,这些元素包括硬件、板级开发包、RTOS和应用等。第14页,共159页,2023年,2月20日,星期六实时系统与通用系统区别通用系统方便用户管理计算机资源追求系统资源最大利用率实时系统调度的实时性响应时间可确定性高可靠性第15页,共159页,2023年,2月20日,星期六性能衡量对传统的通用系统大的系统吞吐量合理的响应速度对每个系统用户相对公平的进行计算资源的分配实时系统实时的数据吞吐取代了吞吐量对硬实时应用的优先响应取代了恰当的反应速度系统的计算资源和其他外设资源必须优先满足实时应用的要求取代了公平第16页,共159页,2023年,2月20日,星期六响应时间计算机从识别一个外部事件到做出响应的时间RTOS响应时间的具体指标是:中断延迟时间(InterruptLatency)任务切换时间(TaskSwitchingLatency)第17页,共159页,2023年,2月20日,星期六响应时间TCloseINT+TDoISR+TSaveReg+TStartService TCloseINT

:关中断的最长时间

TDoISR:开始执行中断服务子程序的第一条指令的时间

TSaveReg:保存CPU内部寄存器的时间

TStartService:内核进入中断服务函数的执行时间计算机接收到中断信号到操作系统作出响应,并完成换道转入中断服务程序的时间中断延迟时间第18页,共159页,2023年,2月20日,星期六响应时间TtoDoBTaskTime–TtoPauseATaskTime TtoDoBTaskTime:开始执行B任务的时刻

TtoPauseATask

:暂停执行A任务的时刻也就是CPU从停止一个任务执行切换到执行另一个任务所需要的时间任务切换时间第19页,共159页,2023年,2月20日,星期六eCos嵌入式可配置操作系统内核实时响应时间参考数据硬件测试环境中断延迟时间任务切换时间ARM7TDMI(20MHz)22.10ms49.14msStrongARM(221.2MHz)3.25ms1.85msIntelXcale(600MHz)1.87ms0.87ms第20页,共159页,2023年,2月20日,星期六吞吐量生存时间指在指定时间内系统可处理的事件总数,例如通信控制器用每秒处理的字符数来表示他的吞吐量是输入数据的有效等待时间。如果在这段时间内系统能接收到输入数据,就能给出有用的输出时间。否则,即使接收到数据,也给不出有效的输出数据第21页,共159页,2023年,2月20日,星期六实时系统分类硬实时系统->灾难后果指应用的时间需求能够得到完全满足,否则就造成重大安全事故,甚至造成重大的生命财产损失和生态破坏航空航天、军事、核工业等软实时系统->性能下降应用虽提出时间需求,但实时任务偶尔违反这种需求对系统运行及环境不会造成严重影响,如:视频点播(Video-On-Demand,VOD)、监控系统、信息采集系统等。按实时性分第22页,共159页,2023年,2月20日,星期六硬实时系统和软实时系统时限效益第23页,共159页,2023年,2月20日,星期六实时系统的分类强实时系统:其响应时间在毫秒级或微秒级普通实时系统:其响应时间一般几秒弱实时系统:其响应时间一般在数十秒按照响应时间的快慢分类第24页,共159页,2023年,2月20日,星期六实时过程控制系统系统实时地从外界获得被控系统的当前状态,进行预定的处理,根据处理结果对外界被控系统进行及时控制,使其处于要求的状态下实时信息处理系统系统仅从外界系统中获得当前状态并进行相应处理不直接控制外界系统的变化第25页,共159页,2023年,2月20日,星期六嵌入式操作系统中的基本概念前后台系统调度临界区进程与线程任务与多任务任务切换死锁不可剥夺型内核可剥夺型内核可重入性优先级反转事件互斥同步对存储器要求第26页,共159页,2023年,2月20日,星期六嵌入式操作系统基本概念前后台系统调度临界区进程与线程任务与多任务任务切换死锁不可剥夺型内核可剥夺型内核可重入性优先级反转事件互斥同步对存储器要求第27页,共159页,2023年,2月20日,星期六

前、后台系统前后台系统应用程序是一个无限的循环,循环中调用相应的函数完成相应的操作,这部分可以看成后台行为(background)。中断服务程序处理异步事件,可以看成前台行为(foreground)后台也可以叫做任务级。前台也叫中断级。第28页,共159页,2023年,2月20日,星期六中断中断数据采集处理数据处理键盘显示打印传统前后台系统编程处理键盘RTOS数据采集处理数据显示打印中断基于RTOS编程

前后台与操作系统第29页,共159页,2023年,2月20日,星期六调度(Scheduler)内核的主要职责之一,决定任务运行的次序。基本的调度算法有先来先服务FCFS,优先级法(Priority),轮转法(Round-Robin)等。调度的基本方式有可剥夺型和不可剥夺型。多数实时内核是基于优先级调度的多种方法的复合。第30页,共159页,2023年,2月20日,星期六临界资源和代码临界区临界资源指的是一段时间只允许一个进程访问的资源。共享临界资源的各个进程必须互斥的访问临界资源。它分为硬件临界资源和软件临界资源。如打印机属于硬件临界资源而缓冲区和队列属于软件临界区。代码临界区指处理时不可分割的代码。一旦这部分代码开始执行,则不允许任何中断介入,为确保临界区代码执行,在进入临界区之前必须关中断,执行完临界区代码之后要立即开中断。第31页,共159页,2023年,2月20日,星期六

代码临界区(CriticalSection)指一段不可分割的代码,一旦执行,不能被中断。定义实现代码临界区的方法1、屏蔽中断,通常在代码执行前关闭中断,执行后打开中断。2、通过信号量机制。第32页,共159页,2023年,2月20日,星期六嵌入式操作系统基本概念前后台系统调度临界区进程与线程任务与多任务任务切换死锁不可剥夺型内核可剥夺型内核可重入性优先级反转事件互斥同步对存储器要求第33页,共159页,2023年,2月20日,星期六进程1、行为的一个规则叫做程序,程序在处理器上执行时所发生的活动叫做进程。2、进程是可以与其它进程并发执行的计算部分。3、进程是一个独立的可以调度的活动。第34页,共159页,2023年,2月20日,星期六进程1、进程是程序的一次执行过程,是一个动态的概念,而程序是指令的有序集合,是静态的概念。2、进程具有生命期,从创建时存在,到撤销时消失,其存在是暂时的,而程序是是静态的,其存在可以是永久的。3、进程具有结构特征,由程序段、数据段、进程控制块三部分组成,而程序仅是指令的有序集合,是进程的组成部分。4、进程与程序之间不是一一对应的关系。一个程序可同时运行于不同的数据集合上,映射成多个进程。进程与程序之间的区别第35页,共159页,2023年,2月20日,星期六线程

线程是进程内一个相对独立的可调度的执行单元实体。定义:引入线程的优点:(1)提高了程序并发执行的程度,加快了系统的执行速度。线程是比进程粒度更小的调度单位。一个进程可以有多个线程。(2)大大降低了系统的开销。线程不拥有自己的资源,只共享进程的资源空间,创建、切换、撤销的开销都很小。(3)提高了资源的利用率。(4)更好地为用户提供服务。实现高质量的人机交互。第36页,共159页,2023年,2月20日,星期六线程线程与进程的关系(1)线程是进程的一个组成部分,进程创建时一般只有一个线程,需要时可由这个线程创建其他线程。(2)一个进程可以有多个线程,这些共享进程的资源在进程的空间中并发活动。(3)线程使用的资源是进程所分到的资源。(4)进程切换的开销远大于线程切换的开销。第37页,共159页,2023年,2月20日,星期六任务Task指拥有所有CPU资源的简单程序。任务即是一个进程,UCOS-II是多任务的可抢占操作系统,我们可以把一个复杂的事情分成多个简单的子任务,每个作为一个进程运行,这样可以简化复杂程序的设计。实时系统中的大部分任务是周期的,体现在编程上每个任务则是一个典型的无限循环。任务的状态:休眠态、就绪态、运行态、挂起态、被中断态。第38页,共159页,2023年,2月20日,星期六等待状态:任务在等待某一事件的发生还不能运行的状态;被中断状态:因为中断服务程序正在执行而得不到CPU控制权的状态;睡眠状态:任务驻留在程序空间之中,还没有交给μC/OS-Ⅱ管理的状态,而将任务交给μC/OS-Ⅱ管理是通过调用函数OSTaskCreate()实现的;就绪状态:任务已经准备好,可以运行了,但由于该任务的优先级比正在运行的任务的优先级低,还暂时不能运行的状态。在μC/OS-Ⅱ中,当任务一旦建立,这个任务就进入就绪态准备运行;运行状态:任务掌握了CPU的控制权,正在运行中的状态。任务的状态运行睡眠等待被中断就绪任务状态描述任务Task第39页,共159页,2023年,2月20日,星期六任务Task任务=程序代码+堆栈+任务控制块任务控制块保存着所有与进程相关的信息,包括堆栈的指针和优先级任务的堆栈则用来保存任务分配的局部变量,此外,当任务被切换出去时,堆栈还保存当前寄存器的值第40页,共159页,2023年,2月20日,星期六多任务

多任务是指用户可以在同一时间内运行多个应用程序,每个应用程序是一个任务。多任务运行的实现实际上是靠CPU(中央处理单元)在许多任务之间转换、调度。第41页,共159页,2023年,2月20日,星期六任务:example手持数据采集终端的打印CreateTASK(myprintf,priority);voidmyprintf(){for(;;){

等待接收队列信息;往打印机发送打印信息;

}}第42页,共159页,2023年,2月20日,星期六嵌入式操作系统基本概念前后台系统调度临界区进程与线程任务与多任务任务切换死锁不可剥夺型内核可剥夺型内核可重入性优先级反转事件互斥同步对存储器要求第43页,共159页,2023年,2月20日,星期六

任务切换(ContextSwitch)当多任务内核决定运行另外的任务时,保存正在运行任务的当前状态,即保存CPU寄存器中的全部内容。这些内容保存在任务自己的栈区之中。入栈工作完成以后,就把下一个将要运行的任务的当前状态从任务的栈中重新装入CPU的寄存器,并开始下一个任务的运行。这个过程就称为任务切换。第44页,共159页,2023年,2月20日,星期六死锁是指各并发任务彼此等待对方所拥有的资源,且这些并发任务在得到对方的资源之前不会释放自己所拥有的资源,从而造成大家都想得到资源而又都得不到资源,各并发任务不能继续向前推进的状态。第45页,共159页,2023年,2月20日,星期六防止发生死锁的方法内核大多允许用户在申请信号量时定义等待超时,以化解死锁。等待时间超过了某一确定值,信号量还是无效状态时,就会返回某种形式的出现超时错误的代码。这个出错代码告知该任务,不是得到了资源使用权,而是系统错误。死锁一般发生在大型多任务系统中,在嵌入式系统中不易出现。第46页,共159页,2023年,2月20日,星期六不可剥夺型内核第47页,共159页,2023年,2月20日,星期六不可剥夺型内核1、任务在运行过程中,中断来了。2、如果此时中断是开着的,CPU由中断向量进入中断服务子程序。3、中断服务子程序做事件处理,使一个有更高级的任务进入就绪态。4、中断服务完成以后,中断返回指令,CPU回到原来被中断的任务。5、接着执行该任务被中断了的代码。6、直到该任务完成,调用一个内核服务函数以释放CPU控制权。7、内核将控制权交给那个优先级更高的、并已进入就绪态的任务这个优先级更高的任务才开始处理中断服务程序标识的事件。

第48页,共159页,2023年,2月20日,星期六可剥夺型内核第49页,共159页,2023年,2月20日,星期六可剥夺型内核1、任务在运行过程中,中断来了。2、如果此时中断是开着的,CPU由中断向量进入中断服务子程序。3、中断服务子程序做事件处理,使一个有更高级的任务进入就绪态。当ISR完成时,进入内核提供的一种服务(一个内核提供的函数被调用)。4、该函数知道一个更重要的任务进入就绪态,于是内核进行任务切换,执行更重要的任务的代码。5.当该任务完成后,内核提供另一个函数。6.该函数使得内核看到了低优先级的任务要运行,于是发生另一次任务切换,被中断了的任务继续运行。

第50页,共159页,2023年,2月20日,星期六使用占先式内核,最高优先级的任务什么时候可以执行以及什么时候可以得到CPU的控制权是可知的。使用占先式内核使得任务级响应时间得以最优化。使用占先式内核时,应用程序不应该直接使用不可重入型函数。可剥夺型内核第51页,共159页,2023年,2月20日,星期六嵌入式操作系统中的基本概念前后台系统调度临界区进程与线程任务与多任务任务切换死锁不可剥夺型内核可剥夺型内核可重入性优先级反转事件互斥同步对存储器要求第52页,共159页,2023年,2月20日,星期六可重入性(Reentrant)

可重入型函数可以被一个以上的任务调用,而不必担心数据的破坏。可重入型函数任何时候都可以被中断,一段时间以后又可以运行,而相应数据不会丢失。第53页,共159页,2023年,2月20日,星期六可重入性(Reentrant)strcpy(char*dest,char*src){while(*src!=‘\0’){*dest=*src;dest++;src++;}*dest=‘\0’;}----------可重入函数第54页,共159页,2023年,2月20日,星期六可重入性(Reentrant)intTemp;voidswap(int*x,int*y){Temp=*x;*x=*y;*y=Temp;}----------不可重入函数第55页,共159页,2023年,2月20日,星期六使函数具有可重入性的方法把temp定义为局部变量;调用函数之前关中断,调用后再开中断;用信号量禁止该函数在使用过程中被再次调用。第56页,共159页,2023年,2月20日,星期六优先级(Priority)

每个任务按其重要性被赋予一定的优先级。静态优先级与动态优先级。基于优先级的系统会出现优先级反转(倒置)的问题,一个好的实时内核应该提供解决倒置的方法。第57页,共159页,2023年,2月20日,星期六优先级反转第58页,共159页,2023年,2月20日,星期六优先级列表任务1任务2任务3高低共享资源

假设任务1和任务3共享一个资源,任务2为优先级介于任务1和任务3之间的一个与该共享资源无关任务,分析优先级反转问题。任务2优先级高于任务3而进入运行状态任务1申请共享资源而处于等待状态此时,虽然任务1比任务2优先级更高,但却在任务2之后运行,这种现象就是优先级反转。任务3得到共享资源而处于运行状态优先级反转第59页,共159页,2023年,2月20日,星期六优先级反转问题的解决—优先级继承优先级继承(Priorityinheritance):为防止发生优先级反转,内核能自动变换任务的优先级。将占用共享资源的低优先级任务的优先级提升到略高于等待共享资源的高优先级任务的优先级。这个略高于高优先级任务的优先级称为:优先级继承优先级(PriorityInheritancePriority,PIP)第60页,共159页,2023年,2月20日,星期六优先级列表优先级继承任务1任务2任务3高低共享资源任务3共享资源

假设任务1和任务3共享一个资源,定义优先级继承优先级,任务2为优先级介于任务1和任务3之间的一个与该共享资源无关任务。任务2优先级不够高无法获得CPU任务1申请共享资源而处于等待状态任务3此时,任务2无法在任务1之前得到运行,不发生优先级反转共享资源任务1任务3获得CPU,且优先级升到优先级继承优先级任务1获得CPU优先级反转问题的解决——优先级继承第61页,共159页,2023年,2月20日,星期六嵌入式操作系统中的基本概念前后台系统调度临界区进程与线程任务与多任务任务切换死锁不可剥夺型内核可剥夺型内核可重入性优先级反转事件互斥同步对存储器要求第62页,共159页,2023年,2月20日,星期六事件一个任务或者中断服务子程序可以通过内核服务来向另外的任务发信号,这里所有的信号被看作事件(Event)。包括信号量、消息邮箱、消息队列。第63页,共159页,2023年,2月20日,星期六事件——信号量信号量是一种程序间的约定机制,这种约定决定哪个程序(任务)可以执行。信号量像是通行证,且通行证的数目是有限的。任务要运行下去,要先拿到通行证。如果信号量已被别的任务占用,则该任务只得被挂起,直到信号量被当前使用者释放掉。第64页,共159页,2023年,2月20日,星期六

我们知道酒店的桌子数是固定的,因此可以这样理解其最大桌子数就是计数器的初值,假设一人占用一张桌子,因此每进去一人,计数器就会自动减1,而只有出去一人时计数器才会自动加1。即就是说,如果计数器大于0,就可以进去吃饭,否则只好等待有人出来才能进去,这种计数信号就是信号量。酒店人计数器(能容纳的人数)3210人人人禁止其它客人进入人没有空位,不能再容纳客人有空位,能再容纳1位客人事件——信号量第65页,共159页,2023年,2月20日,星期六事件——信号量初始化,也可称做建立;等信号,也可称做挂起;给信号或发信号。信号量初始化时要给信号量赋初值,等待信号量的任务表应清为空。对信号量只能实施三种操作第66页,共159页,2023年,2月20日,星期六事件——消息邮箱通过内核服务可以给任务发送消息。用一个指针型变量,通过内核服务,一个任务或一个中断服务程序可以把一则消息(即一个指针)放到邮箱里去。同样,一个或多个任务可以通过内核服务接收这则消息。用来传递消息缓冲区指针的数据结构叫做消息邮箱。第67页,共159页,2023年,2月20日,星期六

消息是任务之间的一种通信手段,当同步过程需要传输具体内容时就不能使用信号量,此时可以选择消息邮箱,即通过内核服务可以给任务发送带具体内容的消息。

通过上述图解可知,用来传递消息缓冲区指针的数据结构就是消息邮箱。消息缓存区消息邮箱PCPC一个邮箱只能存放一个消息指针事件——消息邮箱第68页,共159页,2023年,2月20日,星期六事件——消息队列消息队列用于给任务发消息。通过内核提供的服务,任务或中断服务子程序可以将一条消息放入消息队列。同样,一个或多个任务可以通过内核服务从消息队列中得到消息。通常,消息队列传递的是一个指针,以便任务可以通过它发送和接收任意类型数据(即消息,也就是指针指向的内容)。第69页,共159页,2023年,2月20日,星期六消息邮箱:实际上就是个数据结构,里面有个成员变量是个指针,该指针指向一条消息。消息队列:和消息邮箱基本相同,只是它可以放入多条消息,而邮箱通常只有一条消息。事件——消息队列第70页,共159页,2023年,2月20日,星期六互斥(mutualexclusion)资源的使用必须独占,叫做互斥。解决办法:

●禁止中断(关中断)

●禁止抢占(禁止做任务切换)

●利用信号量

●测试并置位第71页,共159页,2023年,2月20日,星期六禁止中断voidFunction(void){OS_ENTER_CRITICAL();//宏调用,关中断

/*在这里处理共享数据*/

OS_EXIT_CRITICAL();//宏调用,开中断}第72页,共159页,2023年,2月20日,星期六禁止抢占voidFunction(void){OSSchedLock();//内核函数,调度上锁

/*在这里处理共享数据(中断是开着的)*/OSSchedUnlock();//内核函数,调度解锁}注意:这种办法只能保证多个任务之间的互斥,不能保证任务与中断服务程序之间的互斥第73页,共159页,2023年,2月20日,星期六同步一个工作的完成需要多个任务或者多个任务与多个中断共同完成,它们之间必须互相配合、协调动作,甚至交换信息,这就要用到同步技术。任务之间这种制约性的合作运行机制叫做任务间的同步。系统中是依靠任务与任务之间相互发送消息来保证同步。定义同步方法信号量、事件标志组、消息邮箱、消息队列第74页,共159页,2023年,2月20日,星期六嵌入式操作系统中的基本概念前后台系统调度临界区进程与线程任务与多任务任务切换死锁不可剥夺型内核可剥夺型内核可重入性优先级反转事件互斥同步对存储器要求第75页,共159页,2023年,2月20日,星期六对存储器的要求

代码量=应用程序代码+内核代码

RAM总需求=应用程序的RAM需求+(任务栈需求+最大中断嵌套栈需求)*任务数第76页,共159页,2023年,2月20日,星期六使用RTOS的得失失更方便开发复杂系统(通过将复杂任务分解为简单子任务,且每个任务的开发相对独立,逻辑关系简单);提供更好的实时性,更强大的功能。运行操作系统本身需要占用一定的RAM,操作系统代码也要占用一定程序ROM(flash);

此外,运行内核也会需要一定的CPU时间得第77页,共159页,2023年,2月20日,星期六什么是实时系统?什么是程序的可重入性?什么是事件?什么是前后台系统?程序、进程和线程的区别?解释一下信号量?什么叫消息邮箱?互斥是什么意思?作业第78页,共159页,2023年,2月20日,星期六内容uCOS-II操作系统简介uCOS-II操作系统内核结构uCOS-II操作系统任务管理uCOS-II操作系统内存管理uCOS-II操作系统时间管理uCOS-II操作系统任务间的通讯uCOS-II操作系统移植第79页,共159页,2023年,2月20日,星期六uC/OS-II简介1、uC/OS-II是一个简单、高效的嵌入式实时操作系统内核。2、支持x86、ARM、PowerPC、MIPS等众多体系结构。3、可从网站上获得全部源码及其在各种体系结构平台上的移植范例。1、uC/OS-II内核具有可抢占的实时多任务调度功能。2、提供了许多系统服务,如信号量、消息队列、邮箱、内存管理、时间函数等。3、这些功能可以根据不同的需求进行裁减。第80页,共159页,2023年,2月20日,星期六µC/OS-II的各种商业应用全世界有数百种产品在应用:医疗器械移动电话路由器工业控制GPS导航系统智能仪器更多第81页,共159页,2023年,2月20日,星期六uC/OS-II简介

μC/OS和μC/OS-II是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。CPU硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU上。第82页,共159页,2023年,2月20日,星期六uC/OS-II是一种基于优先级的可抢先的硬实时内核。自从92年发布以来,在世界各地都获得了广泛的应用,它是一种专门为嵌入式设备设计的内核,目前已经被移植到40多种不同结构的CPU上,运行在从8位到64位的各种系统之上。尤其值得一提的是,该系统自从2.51版本之后,就通过了美国FAA认证,可以运行在诸如航天器等对安全要求极为苛刻的系统之上。鉴于uC/OS-II可以免费获得代码,对于嵌入式RTOS而言,选择uC/OS无疑是最经济的选择。uC/OS-II简介

第83页,共159页,2023年,2月20日,星期六uC/OS-II嵌入式系统基本模型严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于uC/OS-II良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。第84页,共159页,2023年,2月20日,星期六uC/OS操作系统的特点uC/OS是一个完成的,可移植、可固化、可裁减的抢占式实时多任务操作系统内核。主要用ANSI的C语言编写,少部分代码是汇编语言。第85页,共159页,2023年,2月20日,星期六抢占式内核内核抢占(可抢占式内核):即当进程位于内核空间时,有一个更高优先级的任务出现时,如果当前内核允许抢占,则可以将当前任务挂起,执行优先级更高的进程。非抢占式内核:高优先级的进程不能中止正在内核中运行的低优先级的进程而抢占CPU运行。进程一旦处于核心态(例如用户进程执行系统调用),则除非进程自愿放弃CPU,否则该进程将一直运行下去,直至完成或退出内核。第86页,共159页,2023年,2月20日,星期六优点1、与终端硬件平台相适应 全部源代码5500行,可裁减定制,生成的可执行代码占15~20k,可以移植到多种系列单片机上,包括ARM;2、考虑成本,免费的源代码公开;3、uC/OS-II代码简单,容易掌握和使用;具有多任务调度的基本功能。第87页,共159页,2023年,2月20日,星期六缺点1、缺少技术支持,相关的支持软件少;2、和商业软件比,功能较弱(如不支持时间片轮转,最大任务数为64等);对应用开发的支持不够。第88页,共159页,2023年,2月20日,星期六uC/OS-II文件结构第89页,共159页,2023年,2月20日,星期六目的:为了实现资源共享。实现方法:进入临界段时关中断,退出临界段时开中断。这使得μC/OS-Ⅱ能够在临界段代码时避免被其它任务或中断服务所中断。μC/OS-Ⅱ定义两个宏(macros)来开关中断。分别是:进入临界段:OS_ENTER_CRITICAL()退出临界段:OS_EXIT_CRITICAL()。这两个宏的定义取决于所用的微处理器,每种微处理器都有自己的OS_CPU.H文件。临界段(CriticalSections)第90页,共159页,2023年,2月20日,星期六任务(task)voidmytask(void*pdata){doinitwhile(1){ dosomething; waiting; dosomething;}}一个任务通常是一个无限的循环第91页,共159页,2023年,2月20日,星期六任务(task)μC/OS-Ⅱ可以管理多达64个任务。优先级为0-63优先级号越低,任务的优先级越高。每个任务的优先级不能相同。保留优先级:高优先级:0、1、2、3低优先级:OS_LOWEST_PRIO-3、OS_LOWEST_PRI0-2,OS_LOWEST_PRI0-1以及OS_LOWEST_PRI0用户可以有多达56个应用任务。第92页,共159页,2023年,2月20日,星期六中断处理1、保存全部CPU寄存器;2、调用OSIntEnter或OSIntNesting直接加1;3、执行用户代码做中断服务;4、调用OSIntExit();5、恢复所有CPU寄存器;6、执行中断返回指令;用户中断服务子程序框架第93页,共159页,2023年,2月20日,星期六OSIntEnter()voidOSIntEnter(void){OS_ENTER_CRITICAL();OSIntNesting++;OS_EXIT_CRITICAL();}第94页,共159页,2023年,2月20日,星期六OSIntExitOS_ENTER_CRITICAL();if((--OSIntNesting|OSLockNesting)==0){ OSIntExitY=OSUnMapTbl[OSRdyGrp];OSPrioHighRdy=(INT8U)((OSIntExitY<<3)+OSUnMapTbl[OSRdyTbl[OSIntExitY]]);if(OSPrioHighRdy!=OSPrioCur){ OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];OSCtxSwCtr++;OSIntCtxSw();}}OS_EXIT_CRITICAL();第95页,共159页,2023年,2月20日,星期六中断与时钟节拍当发生中断时,首先应保护现场,将CPU寄存器入栈,再处理中断函数,然后恢复现场,将CPU寄存器出栈,最后执行中断返回。uC/OS中提供了OSIntEnter()和OSIntExit()告诉内核进入了中断状态。时钟节拍是一种特殊的中断,操作系统的心脏。对任务列表进行扫描,判断是否有延时任务应该处于准备就绪状态,最后进行上下文切换。第96页,共159页,2023年,2月20日,星期六时钟节拍μC/OS需要用户提供周期性信号源,用于实现时间延时和确认超时。节拍率应在说10到100Hz。时钟节拍率越高,系统的额外负荷就越重。时钟节拍的实际频率取决于用户应用程序的精度。时钟节拍源可以是专门的硬件定时器,也可以是来自50/60Hz交流电源的信号。用户必须在多任务系统启动以后再开启时钟节拍器,也就是在调用OSStart()之后。第97页,共159页,2023年,2月20日,星期六OSTickISRvoidOSTickISR(void){

保存处理器寄存器的值;调用OSIntEnter()或是将OSIntNesting加1;

调用OSTimeTick();

调用OSIntExit();

恢复处理器寄存器的值;

执行中断返回指令;}第98页,共159页,2023年,2月20日,星期六μC/OS-Ⅱ初始化在调用μC/OS-Ⅱ的任何其它服务之前,μC/OS-Ⅱ要求用户首先调用系统初始化函数OSInit()。OSInit()建立空闲任务idletask,这个任务总是处于就绪态的。空闲任务OSTaskIdle()的优先级总是设成最低,即OS_LOWEST_PRIO。μC/OS-Ⅱ还初始化了4个空数据结构缓冲区。第99页,共159页,2023年,2月20日,星期六μC/OS-Ⅱ初始化后的一些数据结构内容第100页,共159页,2023年,2月20日,星期六μC/OS-Ⅱ初始化后的缓冲区第101页,共159页,2023年,2月20日,星期六μC/OS-Ⅱ的启动多任务的启动是用户通过调用OSStart()实现的。然而,启动μC/OS-Ⅱ之前,用户至少要建立一个应用任务。

OSInit();/*初始化uC/OS-II*/……

调用OSTaskCreate()或OSTaskCreateExt();

……OSStart();/*开始多任务调度!永不返回*/第102页,共159页,2023年,2月20日,星期六OSStartif(OSRunning==FALSE){y=OSUnMapTbl[OSRdyGrp];x=OSUnMapTbl[OSRdyTbl[y]];OSPrioHighRdy=(INT8U)((y<<3)+x);OSPrioCur=OSPrioHighRdy;OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy]; OSTCBCur=OSTCBHighRdy;OSStartHighRdy(); }第103页,共159页,2023年,2月20日,星期六任务状态就绪休眠等待或挂起运行中断服务删除任务删除任务删除任务中断中断结束创建任务任务调度任务被占先等待消息挂起收到消息挂起时间到第104页,共159页,2023年,2月20日,星期六任务控制块(TCB)任务控制块OS_TCB是一个数据结构,保存该任务的相关参数,包括任务堆栈指针,状态,优先级,任务表位置,任务链表指针等。一旦任务建立了,任务控制块OS_TCBs将被赋值。所有的任务控制块分为两条链表,空闲链表和使用链表。第105页,共159页,2023年,2月20日,星期六任务控制块结构的主要成员OS_STK*OSTCBStkPtr;/*当前任务栈顶的指针*/structos_tcb*OSTCBNext;/*任务控制块的双重链接指针*/structos_tcb*OSTCBPrev;/*任务控制块的双重链接指针*/OS_EVENT*OSTCBEventPtr;/*事件控制块的指针*/void*OSTCBMsg;/*消息的指针*/INT16UOSTCBDly;/*任务延时*/INT8UOSTCBStat;/*任务的状态字*/INT8UOSTCBPrio;/*任务优先级*/INT8UOSTCBX;/*用于加速进入就绪态的过程*/INT8UOSTCBY;/*用于加速进入就绪态的过程*/INT8UOSTCBBitX;/*用于加速进入就绪态的过程*/INT8UOSTCBBitY;

/*用于加速进入就绪态的过程*/第106页,共159页,2023年,2月20日,星期六任务就绪表(ReadyList)每个任务的就绪态标志都放入就绪表中的,就绪表中有两个变量OSRdyGrp和OSRdyTbl[]。在OSRdyGrp中,任务按优先级分组,8个任务为一组。OSRdyGrp中的每一位表示8组任务中每一组中是否有进入就绪态的任务。任务进入就绪态时,就绪表OSRdyTbl[]中的相应元素的相应位也置位。第107页,共159页,2023年,2月20日,星期六任务就绪表第108页,共159页,2023年,2月20日,星期六任务就绪表OSRdyTbl[]1/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/0OSRdyGrp

D7D6D5D4D3D2D1D0

1/01/01/01/01/01/01/01/001234567xy01234567第109页,共159页,2023年,2月20日,星期六任务创建想让µC/OS-Ⅱ管理用户的任务,用户必须要先建立任务。用户可以通过传递任务地址和其它参数到以下两个函数之一来建立任务:OSTaskCreate()OSTaskCreateExt()。任务不能由中断服务程序(ISR)来建立。第110页,共159页,2023年,2月20日,星期六任务调度C/OS是抢占式实时多任务内核,优先级最高的任务一旦准备就绪,则拥有CPU的所有权开始投入运行。C/OS中不支持时间片轮转法,每个任务的优先级要求不一样且是唯一的,所以任务调度的工作就是:查找准备就绪的最高优先级的任务并进行上下文切换。C/OS任务调度所花的时间为常数,与应用程序中建立的任务数无关。第111页,共159页,2023年,2月20日,星期六任务调度μC/OS-Ⅱ总是运行进入就绪态任务中优先级最高的那一个。确定哪个任务优先级最高,下面该哪个任务运行了的工作是由调度器(Scheduler)完成的。任务级的调度是由函数OSSched()完成的。中断级的调度是由另一个函数OSIntExt()完成的,这个函数将在以后描述。第112页,共159页,2023年,2月20日,星期六根据就绪表确定最高优先级通过OSRdyGrp值确定高3位,假设OSRdyGrp=0x08,对应OSRdyTbl[3],高优先级为2;通过OSRdyTbl[3]的值来确定低3位,假设OSRdyTbl[3]=0x3a,最高优先级的任务为25第113页,共159页,2023年,2月20日,星期六使任务进入就绪态如果prio是任务是优先级,也是任务的识别号,则将任务放入就绪表,即使任务进入就绪态的方法是:OSRdyGrp|=OSMapTbl[prio>>3];OSRdyTbl[prio>>3]|=OSMapTbl[prio&0x07];假设优先级为12——1100bOSRdyGrp|=0x02;OSRdyTbl[1]|=0x10;第114页,共159页,2023年,2月20日,星期六使任务脱离就绪态将任务就绪表OSRdyTbl[prio>>3]相应元素的相应位清零,而且当OSRdyTbl[prio>>3]中的所有位都为零时,即全组任务中没有一个进入就绪态时,OSRdyGrp的相应位才为零。if((OSRdyTbl[prio>>3]&=OSMapTbl[prio&0x07])==0) OSRdyGrp&=OSMapTbl[prio>>3];第115页,共159页,2023年,2月20日,星期六任务调度器voidOSSched(void){INT8Uy;

OS_ENTER_CRITICAL();if((OSLockNesting|OSIntNesting)==0) {y =OSUnMapTbl[OSRdyGrp];OSPrioHighRdy =(INT8U)((y<<3)+ OSUnMapTbl[OSRdyTbl[y]]); if(OSPrioHighRdy!=OSPrioCur) {OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy]; OSCtxSwCtr++; OS_TASK_SW(); } }OS_EXIT_CRITICAL();}第116页,共159页,2023年,2月20日,星期六任务切换将被挂起的任务寄存器入栈将较高优先级任务的寄存器出栈第117页,共159页,2023年,2月20日,星期六任务级的任务切换OS_TASK_SW()通过系统调用指令完成保护当前任务的现场恢复新任务的现场执行中断返回指令开始执行新的任务第118页,共159页,2023年,2月20日,星期六调用OS_TASK_SW()前的数据结构低优先级任务

OS_TCBOSTCBCur(1)存贮器低地址存贮器高地址堆栈方向SPR1R2R3R4PCPSW存贮器低地址存贮器高地址高优先级任务

OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)第119页,共159页,2023年,2月20日,星期六保存当前CPU寄存器的值低优先级任务

OS_TCBOSTCBCurPSWPCR1R2R3R4存贮器低地址存贮器高地址堆栈方向SPR1R2R3R4PCPSW存贮器低地址存贮器高地址高优先级任务

OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)(1)(3)第120页,共159页,2023年,2月20日,星期六重新装入要运行的任务低优先级任务

OS_TCBOSTCBCurPSWPCR1R2R3R4存贮器低地址存贮器高地址堆栈方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存贮器低地址存贮器高地址高优先级任务

OS_TCBOSTCBHighRdyOSTCBCur(1)(2)CPU(4)(4)(1)(3)(3)(4)第121页,共159页,2023年,2月20日,星期六任务切换OS_TASK_SW()的代码VoidOSCtxSw(void){

将R1,R2,R3及R4推入当前堆栈;

OSTCBCurOSTCBStkPtr=SP;OSTCBCur=OSTCBHighRdy;SP=OSTCBHighRdyOSTCBSTKPtr;

将R4,R3,R2及R1从新堆栈中弹出;执行中断返回指令;}第122页,共159页,2023年,2月20日,星期六内存管理在ANSIC中可以用malloc()和free()两个函数动态地分配内存和释放内存。在嵌入式实时操作系统中,容易产生内存碎片。µC/OS-II中,操作系统把连续的大块内存按分区来管理。每个分区中包含有整数个大小相同的内存块。在一个系统中可以有多个内存分区。这样,用户的应用程序就可以从不同的内存分区中得到不同大小的内存块。但是,特定的内存块在释放时必须重新放回它以前所属于的内存分区。第123页,共159页,2023年,2月20日,星期六内存控制块为了便于内存的管理,在µC/OS-II中使用内存控制块(memorycontrolblocks)的数据结构来跟踪每一个内存分区,系统中的每个内存分区都有它自己的内存控制块。typedefstruct{void*OSMemAddr; /*分区起始地址*/void*OSMemFreeList; /*下一个空闲内存块*/INT32UOSMemBlkSize; /*内存块的大小*/INT32UOSMemNBlks; /*内存块数量*/INT32UOSMemNFree; /*空闲内存块数量*/}OS_MEM;第124页,共159页,2023年,2月20日,星期六内存管理初始化如果要在µC/OS-II中使用内存管理,需要在OS_CFG.H文件中将开关量OS_MEM_EN设置为1。这样µC/OS-II在启动时就会对内存管理器进行初始化(OSMemInit())。第125页,共159页,2023年,2月20日,星期六建立一个内存分区,OSMemCreate()在使用一个内存分区之前,必须使用OSMemCreate()先建立该内存分区。该函数共有4个参数:内存分区的起始地址、分区内的内存块总块数、每个内存块的字节数和一个指向错误信息代码的指针。每个内存分区必须含有至少两个内存块,每个内存块至少为一个指针的大小。OS_MEM*CommTxBuf;INT8UCommTxPart[100][32];CommTxBuf=OSMemCreate(CommTxPart,100,32,&err);第126页,共159页,2023年,2月20日,星期六分配一个内存块,OSMemGet()调用OSMemGet()函数从已经建立的内存分区中申请一个内存块。该函数的唯一参数是指向特定内存分区的指针,该指针在建立内存分区时,由OSMemCreate()函数返回。注意的是,用户可以在中断服务子程序中调用OSMemGet(),因为在暂时没有内存块可用的情况下,OSMemGet()不会等待,而是马上返回NULL指针。第127页,共159页,2023年,2月20日,星期六释放一个内存块,OSMemPut()应用程序不再使用一个内存块时,必须及时地把它释放并放回到相应的内存分区中。这个操作由OSMemPut()函数完成。必须注意的是,OSMemPut()并不知道一个内存块是属于哪个内存分区的。释放内存块时必须将它释放到正确的分区。第128页,共159页,2023年,2月20日,星期六时间管理µC/OS-Ⅱ(其它内核也一样)要求用户提供定时中断来实现延时与超时控制等功能。这个定时中断叫做时钟节拍,它应该每秒发生10至100次。时钟节拍的频率越高,系统的负荷就越重。

与时钟管理相关的系统服务有:OSTimeDLY()OSTimeDLYHMSM()OSTimeDlyResmue()OStimeGet()OSTimeSet()第129页,共159页,2023年,2月20日,星期六任务间通信手段C/OS中,采用多种方法保护任务之间的共享数据和提供任务之间的通信。提供OS_ENTER_CRITICAL和OS_EXIT_CRITICAL来对临界资源进行保护OSSchedLock()禁止调度保护任务级的共享资源。提供了经典操作系统任务间通信方法:信号量、邮箱、消息队列,事件标志。第130页,共159页,2023年,2月20日,星期六事件控制块ECB所有的通信信号都被看成是事件(event),一个称为事件控制块(ECB,EventControlBlock)的数据结构来表征每一个具体事件,ECB的结构如下:typedefstruct{void*OSEventPtr;/*指向消息或消息队列的指针*/INT8UOSEventTbl[OS_EVENT_TBL_SIZE];/*等待任务列表*/INT16UOSEventCnt;/*计数器(事件是信号量时)*/INT8UOSEventType;/*事件类型:信号量、邮箱等*/INT8UOSEventGrp;/*等待任务组*/}OS_EVENT;与TCB类似的结构,使用两个链表,空闲链表与使用链表第131页,共159页,2023年,2月20日,星期六信号量semaphore信号量在多任务系统中用于:控制共享资源的使用权、标志事件的发生、使两个任务的行为同步。uC/OS中信号量由两部分组成:信号量的计数值和等待该信号任务的等待任务表。信号量的计数值可以为二进制,也可以是其他整数。系统通过OSSemPend()和OSSemPost()来支持信号量的两种原子操作P()和V()。P()操作减少信号量的值,如果新的信号量的值不大于0,则操作阻塞;V()操作增加信号量的值。第132页,共159页,2023年,2月20日,星期六任务调度不存在一个内核任务/实体,内核的管理是通过调用系统函数来实现的。每个任务有自己的堆栈空间。内核对任务的占先式调度不会干扰每个任务的总的运行结果。第133页,共159页,2023年,2月20日,星期六COS-II在ARM9上的移植所谓移植,是指使一个实时操作系统能够在某个微处理器平台上运行。COS-II的主要代码都是由标准的C语言写成的,移植方便。第134页,共159页,2023年,2月20日,星期六移植COS-II满足的条件处理器的C编译器能产生可重入代码在程序中可以打开或者关闭中断处理器支持中断,并且能产生定时中断(通常在10—1000Hz之间)处理器支承能够容纳一定量数据的硬件堆栈处理器有将堆栈指针和其他CPU寄存器存储和读出到堆栈(或者内存)的指令第135页,共159页,2023年,2月20日,星期六打开/关闭中断在COS-II中,可以通过:OS_ENTER_CRITICAL()OS_EXIT_CRITICAL()宏来控制系统关闭或者打开中断。这需要处理器的支持。在ARM7TDMI的处理器上,可以设置相应的寄存器来关闭或者打开系统的所有中断。第136页,共159页,2023年,2月20日,星期六处理器支持中断并且能产生定时中断COS-II是通过处理器产生的定时器的中断来实现多任务之间的调度的。ARM7TDMI的处理器上可以产生定时器中断。本系统工作在60MHz的主频下,定时器的中断的频率为100Hz。也就是系统的响应时间为10ms。第137页,共159页,2023年,2月20日,星期六处理器支持硬件堆栈COS-II进行任务调度的时候,会把当前任务的CPU寄存器存放到此任务的堆栈中,然后,再从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个任务。所以,寄存器的入栈和出栈是COS-II多任务调度的基础。ARM7处理器中有专门的指令处理堆栈,可以灵活的使用堆栈。第138页,共159页,2023年,2月20日,星期六C/OS-II在S3C2410上的移植设置OS_CPU.H中与处理器和编译器相关的代码用C语言编写六个操作系统相关的函数(OS_CPU_C.C)用汇编语言编写四个与处理器相关的函数(OS_CPU.ASM)第139页,共159页,2023年,2月20日,星期六设置与处理器和编译器相关的代码OS_CPU.H中定义了与编译器相关的数据类型。比如:INT8U、INT8S等。与ARM处理器相关的代码,使用OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()宏开启/关闭中断设施堆栈的增长方向:堆栈由高地址向低地址增长第140页,共159页,2023年,2月20日,星期六用C语言编写六个操作系统相关的函数void*OSTaskStkInit(void(*task)(void*pd),void*pdata,void*ptos,INT16Uopt)voidOSTaskCreateHook(OS_TCB*ptcb)voidOSTaskDelHook(OS_TCB*ptcb)voidOSTaskSwHook(void)voidOSTaskStatHook(void)voidOSTimeTickHook(void)后5个函数为钩子函数,可以不加代码第141页,共159页,2023年,2月20日,星期六用汇编语言编写四个与处理器相关的函数OSStartHighRdy()OSCtxSw()OSIntCtxSw()OSTickISR()第142页,共159页,2023年,2月20日,星期六关于移植相对于其他的嵌入式操作系统,uCOS-II的移植虽然是一个很简单的过程,但是,对于不熟悉uCOS-II的开发者,移植还是有一定难度的。第143页,共159页,2023年,2月20日,星期六移植要点定义函数OS_ENTER_CRITICAL和OS_ENTER_CRITICAL。定义函数OS_TASK_SW执行任务切换。定义函数OSCtxSw实现用户级上下文切换,用纯汇编实现。定义函数OSIntCtxSw实现中断级任务切换,用纯汇编实现。定义函数OSTickISR。定义OSTaskStkInit来初始化任务的堆栈。第144页,共159页,2023年,2月20日,星期六uC/OS的改进固定的基于优先级的调度,不支持时间片,使用起来不方便。一个任务的基础上增加一个基于时间片的微型调度核。在对临界资源的访问上使用关闭中断实现,没有使用CPU提供的硬件指令,例如测试并置位。系统时钟中断,没有提供用户使用定时器,可以借鉴linux的定时器加以修改。可以加上文件系统和TCP/IP协议栈。第145页,共159页,2023年,2月20日,星期六 基于uC/OS-II操作系统进行应用系统时,设计任务的主要任务是将系统合理划分成多个任务,并由RTOS进行调度,任务之间使用uC/OS-II提供的系统服务进行通信,以配合实现应用系统的功能。上图中应用代码部分主要是设计人员设计的业务代码。 与前后台系统一样,基于uC/OS-II的多任务系统也有一个main主函数,main函数由编译器所带的C启动程序调用。在main主函数中主要实现uC/OS-II的初始化OSInit()、任务创建、一些任务通信方法的创建、uC/OS-II的多任务启动OSStart()等常规操作。另外,还有一些应用程序相关的初始化操作,例如:硬件初始化、数据结构初始化等。 uC/OS的改进第146页,共159页,2023年,2月20日,星期六 在使用uC/OS-II提供的任何功能之前,必须先调用OSInit()函数进行初始化。在main主函数中调用OSStart()启动多任务之前,至少要先建立一个任务。否则应用程序会崩溃。

OSInit()初始化uC/OS-II所有的变量和数据结构,并建立空闲任务OS_TaskIdle(),这个任务总是处于就绪态。uC/OS的改进第147页,共159页,2023年,2月20日,星期六典型的main函数voidmain(void){

温馨提示

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

评论

0/150

提交评论