实时操作系统详细解析_第1页
实时操作系统详细解析_第2页
实时操作系统详细解析_第3页
实时操作系统详细解析_第4页
实时操作系统详细解析_第5页
已阅读5页,还剩137页未读 继续免费阅读

下载本文档

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

文档简介

实时操作系统详细解析1第1页,共142页,2023年,2月20日,星期六本节提要132546实时操作系统概念及C/OS-Ⅱ简介C/OS-Ⅱ内核结构C/OS-Ⅱ任务通信与同步C/OS-Ⅱ任务管理C/OS-Ⅱ时间管理C/OS-Ⅱ移植2第2页,共142页,2023年,2月20日,星期六1、实时操作系统概念及C/OS-Ⅱ简介1.1操作系统的分类1.2常见的嵌入式实时操作系统1.3实时操作系统概念1.4C/OS-Ⅱ简介3第3页,共142页,2023年,2月20日,星期六1.1操作系统的分类

嵌入式操作系统的种类繁多,大体上可分为两种,商用型和免费型。商用型的实操作系统功能稳定、可靠,有完善的技术支持和售后服务,但往往价格昂贵。免费型的实时操作系统在价格方面具有优势,目前主要有Linux和μC/OS,稳定性与服务性存在挑战。4第4页,共142页,2023年,2月20日,星期六1.1操作系统的分类(1)顺序执行系统:系统内只含有一个程序,独占CPU的运行时间,按语句顺序执行该程序,直至执行完毕,另一程序才能启动运行。如DOS操作系统。(2)分时操作系统:系统内同时可以有多个程序运行,把CPU的时间按顺序分成若干片,每个时间片内执行不同的程序。如UNIX(3)实时操作系统:系统内有多个程序运行,每个程序有不同的优先级,只有最高优先级的任务才能占有CPU的控制权。5第5页,共142页,2023年,2月20日,星期六按实时性分类强实时系统,其系统响应时间在毫秒或微秒级(数控机床);一般实时系统,其系统响应时间在毫秒-几秒的数量级上,其实时性的要求比强实时系统要差一些(电子菜谱的查询)。弱实时系统,其系统响应时间约为数十秒或更长(工程机械)。6第6页,共142页,2023年,2月20日,星期六按软件结构分类1)循环轮询系统:(PollingLoop)最简单的软件结构是循环轮询,程序依次检查系统的每一个输入条件,一旦条件成立就进行相应的处理。Initialize()While(true){if(condition_1)action_1();if(condition_2)action_2();……if(condition_n)acition_n();}缺点:响应速度慢,占用CPU资源7第7页,共142页,2023年,2月20日,星期六2)事件驱动系统:(Event-Drivensystem)事件驱动系统是能对外部事件直接响应的系统。它包括前后台、实时多任务、多处理器等,是嵌入式实时系统的主要形式。应用程序是一个无限的循环,循环中调用相应的函数完成相应的操作,这部分可以看成后台行为(background)。中断服务程序处理异步事件,这部分可以看成前台行为(foreground)。后台也可以叫做任务级,前台也叫中断级。例如,很多基于微处理器的产品采用前后台系统设计,如微波炉、电话机、玩具等。从省电的角度出发,平时微处理器处在停机状态,所有的事都靠中断服务来完成。8第8页,共142页,2023年,2月20日,星期六前后台系统(后台循环、前台中断)ISRISR后台前台ISR时间9第9页,共142页,2023年,2月20日,星期六1.3实时操作系统概念(RTOS)RTOS的基本特征:高效的任务管理1.支持多任务2.优先级管理3.任务调度:基于优先级的抢占式调度、时间片轮转调度的算法4.支持快速而确定的上下文切换快速灵活的任务间通信1.信号量:二进制、互斥、计数器2.通信机制:消息队列、管道等高度的可剪裁性动态链接与部件增量加载快速有效的中断和异常事件处理优化的浮点支持动态内存管理系统时钟和定时器1、实时操作系统概念及C/OS-Ⅱ简介10第10页,共142页,2023年,2月20日,星期六任务的基本概念处理复杂问题的方法:分而治之,即把一个大问题分解成多个相对简单、比较容易解决的小问题,小问题解决了,大问题也就随之解决。同样,在设计一个较为复杂的应用程序时,通常也把大型任务分解成多个小任务,在计算机运行这些小任务,最终达到完成大任务的目的。操作系统几乎都是多任务的。在uC/OS-II中,与小任务对应的程序实体叫做任务。11第11页,共142页,2023年,2月20日,星期六嵌入式系统的任务由于嵌入式系统完成的是对一个装置或设备的控制任务,任务的功能相对固定,故一般情况下嵌入式实时系统支持的典型任务是一个无限循环结构。典型的任务一个无限循环。voidmytask(void*pdata){for(;;){dosomething;waiting;dosomething;}}从任务代码看,任务实质上是一个返回类型为void的函数,并在函数的无限循环中完成用户的工作。问题一:用户应用程序如何响应用户的一些外部异步事件?12第12页,共142页,2023年,2月20日,星期六采用中断技术来响应外部异步事件,并在中断服务程序中处理这些异步事件。嵌入式系统任务的典型结构如下所示:13第13页,共142页,2023年,2月20日,星期六1、实时操作系统概念及C/OS-Ⅱ简介嵌入式实时操作系统_多任务系统一个任务,也称作一个进程,是一个简单的运行程序。每个任务都是整个应用的某一部分,每个任务被赋予一定的优先级,有它自己的一套CPU寄存器和自己的栈空间。14第14页,共142页,2023年,2月20日,星期六多任务运行的实现实际上是靠CPU(中央处理单元)在许多任务之间转换、调度。

CPU只有一个,轮番服务于一系列任务中的某一个。多任务运行使CPU的利用率得到最大的发挥,并使应用程序模块化。实时应用程序的设计过程,包括如何把问题分割成多个任务。

1、实时操作系统概念及C/OS-Ⅱ简介15第15页,共142页,2023年,2月20日,星期六

任务的状态

每个任务都处在以下5种状态之一的状态下,这5种状态是休眠态,就绪态、运行态、挂起态(等待某一事件发生)和被中断态

1、实时操作系统概念及C/OS-Ⅱ简介16第16页,共142页,2023年,2月20日,星期六任务切换(ContextSwitchorTaskSwitch)

ContextSwitch在有的书中翻译成上下文切换,实际含义是任务切换,或CPU寄存器内容切换。当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态(Context),即CPU寄存器中的全部内容。这些内容保存在任务的当前状况保存区(Task’sContextStoragearea),也就是任务自己的栈区之中。入栈工作完成以后,就是把下一个将要运行的任务的当前状况从该任务的栈中重新装入CPU的寄存器,并开始下一个任务的运行。这个过程叫做任务切换。任务切换过程增加了应用程序的额外负荷。CPU的内部寄存器越多,额外负荷就越重。做任务切换所需要的时间取决于CPU有多少寄存器要入栈。1、实时操作系统概念及C/OS-Ⅱ简介17第17页,共142页,2023年,2月20日,星期六非占先式与占先式非占先式(non-preemptive)非占先式调度法也称作合作型多任务(cooperativemultitasking),各个任务彼此合作共享一个CPU。中断服务可以使一个高优先级的任务由挂起状态变为就绪状态。但中断服务以后控制权还是回到原来被中断了的那个任务,直到该任务主动放弃CPU的使用权时,那个高优先级的任务才能获得CPU的使用权。非占先式内核的一个特点是几乎不需要使用信号量保护共享数据。运行着的任务占有CPU,而不必担心被别的任务抢占。非占先式内核的最大缺陷在于其响应高优先级的任务慢,任务已经进入就绪态,但还不能运行,也许要等很时间,直到当前运行着的任务释放CPU。内核的任务级响应时间是不确定的,不知道什么时候最高优先级的任务才能拿到CPU的控制权,完全取决于应用程序什么时候释放CPU。1、实时操作系统概念及C/OS-Ⅱ简介18第18页,共142页,2023年,2月20日,星期六非占先式(Non-Preemptive)低优先级任务ISR高优先级任务(1)(2)(3)(4)(5)(6)(7)中断服务程序使高优先级任务就绪低优先级任务释放CPU使用权TIME1、实时操作系统概念及C/OS-Ⅱ简介19第19页,共142页,2023年,2月20日,星期六占先式(preemptive)当系统响应时间很重要时,要使用占先式(preemptive)内核。最高优先级的任务一旦就绪,总能得到CPU的控制权。当一个运行着的任务使一个比它优先级高的任务进入了就绪态,当前任务的CPU使用权就被剥夺了,或者说被挂起了,那个高优先级的任务立刻得到了CPU的控制权。使用占先式内核时,应用程序不应直接使用不可重入型函数。低优先级的任务CPU的使用权被高优先级任务剥夺,不可重入型函数中的数据有可能被破坏。1、实时操作系统概念及C/OS-Ⅱ简介20第20页,共142页,2023年,2月20日,星期六占先式(Preemptive)低优先级任务ISR高优先级任务(1)(2)(3)(4)(5)(6)中断服务程序使高优先级任务就绪高优先级任务得到CPU使用权TIME1、实时操作系统概念及C/OS-Ⅱ简介21第21页,共142页,2023年,2月20日,星期六可以被一个以上的任务调用,而不必担心数据的破坏。可重入型函数任何时候都可以被中断,一段时间以后又可以运行,而相应数据不会丢失。可重入型函数或者只使用局部变量,即变量保存在CPU寄存器中或堆栈中,或对全局变量予以保护。一个不可重入型函数的例子intTemp;Voidswap(int*x,int*y){Temp=*x;*X=*Y;*y=Temp;}可重入型函数1、实时操作系统概念及C/OS-Ⅱ简介22第22页,共142页,2023年,2月20日,星期六使用以下技术之一即可使Swap()函数具有可重入性:l

把Temp定义为局部变量l

调用Swap()函数之前关中断,调用后再开中断l

用信号量禁止该函数在使用过程中被再次调用

23第23页,共142页,2023年,2月20日,星期六一个可重入型函数的例子Voidswap(int*x,int*y){intTemp;Temp=*x;*X=*Y;*y=Temp;}1、实时操作系统概念及C/OS-Ⅱ简介24第24页,共142页,2023年,2月20日,星期六代码的临界区:处理时不可分割的代码。一旦这部分代码开始执行,则不允许任何中断打入。在进入临界区之前要关中断,而临界区代码执行完以后要立即开中断(在任务切换时,地址、指令、数据等寄存器堆栈保护)。代码的临界区1、实时操作系统概念及C/OS-Ⅱ简介25第25页,共142页,2023年,2月20日,星期六程序进行时可使用的软硬件环境称为资源,2个以上任务可同时访问的共享资源称为临界资源。任何任务所占用的实体都可称为资源。资源可以是输入输出设备,例如打印机、键盘、显示器,资源也可以是一个变量、一个结构或一个数组等。任务1共享内存任务2任务N资源与临界资源1、实时操作系统概念及C/OS-Ⅱ简介26第26页,共142页,2023年,2月20日,星期六内核(Kernel)

多任务系统中,内核负责管理各个任务,或者说为每个任务分配CPU时间,并且负责任务之间的通讯。内核提供的基本服务是任务切换。内核本身也增加了应用程序的额外负荷,代码空间增加ROM的用量,内核本身的数据结构增加了RAM的用量。但更主要的是,每个任务要有自己的栈空间。通过提供必不可少的系统服务,诸如信号量管理,邮箱、消息队列、延时等,实时内核使得CPU的利用更为有效。1、实时操作系统概念及C/OS-Ⅱ简介27第27页,共142页,2023年,2月20日,星期六调度(Scheduler)(Dispatcher)

内核的主要职责之一,决定该轮到哪个任务运行了。多数实时内核是基于优先级调度法的。每个任务根据其重要程度的不同被赋予一定的优先级。基于优先级的调度法指,CPU总是让处在就绪态的优先级最高的任务先运行。究竟何时让高优先级任务掌握CPU的使用权,有两种不同的情况,这要看用的是什么类型的内核,是不可剥夺型(非占先式)的还是可剥夺型(占先式)内核。1、实时操作系统概念及C/OS-Ⅱ简介28第28页,共142页,2023年,2月20日,星期六 当两个或两个以上任务有同样优先级,内核允许一个任务运行事先确定的一段时间,叫做时间额度(quantum),然后切换给另一个任务。也叫做时间片调度。内核在满足以下条件时,把CPU控制权交给下一个任务就绪态的任务: ●当前任务已无事可做

●当前任务时间片用完 ●当前任务在时间片还没结束时已经完成了。 目前,μC/OS-Ⅱ不支持时间片轮番调度法。应用程序中各任务的优先级必须互不相同。时间片轮番调度法

1、实时操作系统概念及C/OS-Ⅱ简介29第29页,共142页,2023年,2月20日,星期六任务优先级

每个任务都有其优先级。任务越重要,赋予的优先级应越高。●静态优先级应用程序执行过程中诸任务优先级不变,则称之为静态优先级。在静态优先级系统中,诸任务以及它们的时间约束在程序编译时是已知的。●动态优先级应用程序执行过程中,任务的优先级是可变的,则称之为动态优先级。1、实时操作系统概念及C/OS-Ⅱ简介30第30页,共142页,2023年,2月20日,星期六优先级反转

使用实时内核,优先级反转问题是实时系统中出现得最多的问题。

1、实时操作系统概念及C/OS-Ⅱ简介31第31页,共142页,2023年,2月20日,星期六多任务内核应允许动态改变任务的优先级以避免发生优先级反转现象。为防止发生优先级反转,内核能自动变换任务的优先级,这叫做优先级继承(Priorityinheritance)但μC/OS-Ⅱ不支持优先级继承,一些商业内核有优先级继承功能

1、实时操作系统概念及C/OS-Ⅱ简介32第32页,共142页,2023年,2月20日,星期六互斥条件

实现任务间通讯最简便的办法是使用共享数据结构。特别是当所有的任务都在一个单一地址空间下.能使用全程变量、指针、缓冲区、链表等,使用共享数据结构通讯就更为容易。虽然共享数据区法简化了任务间的信息交换,但是必须保证每个任务在处理共享数据时的排它性,以避免竞争和数据的破坏。与共享资源打交道时,使之满足互斥条件最一般的方法有:

l

关中断

l

使用测试并置位指令

l禁止做任务切换

l利用信号量

1、实时操作系统概念及C/OS-Ⅱ简介33第33页,共142页,2023年,2月20日,星期六l

关中断和开中断处理共享数据时保证互斥,最简便快捷的办法是关中断和开中断。μC/OS-Ⅱ在处理内部变量和数据结构时就是使用的这种手段,即使不是全部,也是绝大部分。实际上μC/OS-Ⅱ提供两个宏调用,允许用户在应用程序的C代码中关中断然后再开中断:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()利用μC/OS_Ⅱ宏调用关中断和开中断voidFunction(void){

OS_ENTER_CRITICAL();

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

OS_EXIT_CRITICAL();}1、实时操作系统概念及C/OS-Ⅱ简介34第34页,共142页,2023年,2月20日,星期六l

测试并置位

如果不使用实时内核,当两个任务共享一个资源时,一定要约定好,先测试某一全程变量,如果该变量是0,允许该任务与共享资源打交道。为防止另一任务也要使用该资源,前者只要简单地将全程变量置为1,这通常称作测试并置位(Test-And-Set),或称作TAS。TAS操作可能是微处理器的单独一条不会被中断的指令,或者是在程序中关中断做TAS操作再开中断。有的微处理器有硬件的TAS指令(如Motorola68000系列,就有这条指令)

利用测试并置位处理共享资源Disableinterrupts;关中断if(‘AccessVariable’is0){如果资源可用,标志为0

Setvariableto1; 置资源不可用,标志为1

Reenableinterrupts;重开中断

Accesstheresource;处理该资源

Disableinterrupts;关中断

Setthe‘AccessVariable’backto0;清资源不可使用,标志为0

Reenableinterrupts;重新开中断}else{否则

Reenableinterrupts;开中断/*Youdon’thaveaccesstotheresource,trybacklater;*//*资源不可使用,以后再试;*/}1、实时操作系统概念及C/OS-Ⅱ简介35第35页,共142页,2023年,2月20日,星期六l

禁止,然后允许任务切换(给任务切换上锁和开锁)如果任务不与中断服务子程序共享变量或数据结构,可以使用禁止、然后允许任务切换。虽然任务切换是禁止了,但中断还是开着的。如果这时中断来了,中断服务子程序会在这一临界区内立即执行。中断服务子程序结束时,尽管有优先级高的任务已经进入就绪态,内核还是返回到原来被中断了的任务。直到执行完给任务切换开锁函数OSSchedUnlock()。虽然这种方法是可行的,但应该尽量避免禁止任务切换之类操作,因为内核最主要的功能就是做任务的调度与协调。用给任务切换上锁,然后开锁的方法实现数据共享.voidFunction(void){

OSSchedLock();

/*Youcanaccessshareddatainhere(interruptsarerecognized)*//*在这里处理共享数据(中断是开着的)*/

OSSchedUnlock();}1、实时操作系统概念及C/OS-Ⅱ简介36第36页,共142页,2023年,2月20日,星期六l

信号量(Semaphores)信号量实际上是一种约定机制,在多任务内核中普遍使用.信号量用于:

1、控制共享资源的使用权(满足互斥条件)

2、标志某事件的发生

3、使两个任务的行为同步 二值信号量只取两个值的信号(0、1) 计数式信号量的值可以是0到255或0到65535,或0到4294967295,一般地说,对信号量只能实施三种操作:初始化(INITIALIZE),也可称作建立(CREATE);等信号(WAIT)也可称作挂起(PEND);给信号(SIGNAL)或发信号(POST)。信号量初始化时要给信号量赋初值,等待信号量的任务表(Waitinglist)应清为空。1、实时操作系统概念及C/OS-Ⅱ简介37第37页,共142页,2023年,2月20日,星期六想要得到信号量的任务执行等待(WAIT)操作。如果该信号量有效(即信号量值大于0),则信号量值减1,任务得以继续运行。如果信号量的值为0,等待信号量的任务就被列入等待信号量任务表。

任务以发信号操作(SIGNAL)释放信号量。如果没有任务在等待信号量,信号量的值仅仅是简单地加1。如果有任务在等待该信号量,那么就会有一个任务进入就绪态,信号量的值也就不加1。于是钥匙给了等待信号量的诸任务中的一个任务。

收到信号量的任务可能是以下两者之一。

---等待信号量任务中优先级最高的

---最早开始等待信号量的那个任务,即按先进先出的原则(FirstInFirstOut,FIFO)

μC/OS-Ⅱ只支持优先级法。

1、实时操作系统概念及C/OS-Ⅱ简介38第38页,共142页,2023年,2月20日,星期六 要与同一共享数据打交道的任务调用等待信号量函数OSSemPend()。处理完共享数据以后再调用释放信号量函数OSSemPost()。

通过获得信号量处理共享数据OS_EVENT*SharedDataSem;voidFunction(void){

INT8Uerr;

OSSemPend(SharedDataSem,0,&err);../*Youcanaccessshareddatainhere(interruptsarerecognized)*/./*共享数据的处理在此进行,(中断是开着的)*/

OSSemPost(SharedDataSem);}1、实时操作系统概念及C/OS-Ⅱ简介39第39页,共142页,2023年,2月20日,星期六1、实时操作系统概念及C/OS-Ⅱ简介40第40页,共142页,2023年,2月20日,星期六计数式信号量的用法缓冲区阵列管理方满足前十个申请缓冲区的任务,就好像有10把钥匙可以发给诸任务。当所有的钥匙都用完了,申请缓冲区的任务被挂起,直到信号量重新变为有效。

1、实时操作系统概念及C/OS-Ⅱ简介41第41页,共142页,2023年,2月20日,星期六死锁(或抱死)(Deadlock(orDeadlyEmbrace))

死锁也称作抱死,指两个任务无限期地互相等待对方控制着的资源。最简单的防止发生死锁的方法是让每个任务都:先得到全部需要的资源再做下一步的工作.

内核大多允许用户在申请信号量时定义等待超时,以此化解死锁。1、实时操作系统概念及C/OS-Ⅱ简介42第42页,共142页,2023年,2月20日,星期六时钟节拍(ClockTick)时钟节拍是特定的周期性中断这个中断可以看作是系统心脏的脉动。中断之间的时间间隔取决于不同的应用,一般在10mS到200mS之间。时钟的节拍式中断使得内核可以将任务延时若干个整数时钟节拍,以及当任务等待事件发生时,提供等待超时的依据。时钟节拍率越快,系统的额外开销就越大。1、实时操作系统概念及C/OS-Ⅱ简介43第43页,共142页,2023年,2月20日,星期六实时系统是面向具体应用,对外来事件在限定时间内能做出反应的系统。限定时间的范围很广可以从微秒级(如信号处理)到分级(如联机查询系统)。在实时系统中主要有三个指标来衡量系统的实时性。响应时间(ResponseTime):是计算机识别一个外部事件到作出响应的时间,在控制应用中它是最重要的指标,如果事件不能及时的处理,系统可能就会崩溃。生存时间(SurvivalTime):是数据有效等待时间,在这段时间里数据是有效的。吞吐量(Throughput):是在一给定时间内(秒),系统可以处理的事件总数。例如通讯控制器用每秒钟处理的字符数来表示吞吐量,吞吐量是平均响应时间的倒数。实时系统的评价指标1、实时操作系统概念及C/OS-Ⅱ简介44第44页,共142页,2023年,2月20日,星期六1.1操作系统的分类1.2常见的嵌入式实时操作系统1.3实时操作系统概念1.4C/OS-Ⅱ简介1、实时操作系统概念及C/OS-Ⅱ简介45第45页,共142页,2023年,2月20日,星期六1.4C/OS简介

1、C/OS——MicroControllerOS,微控制器操作系统2、C/OS简介美国人JeanLabrosse1992年完成应用面覆盖了诸多领域,如照相机、医疗器械、音响设备、发动机控制、高速公路电话系统、自动提款机等1998年C/OS-II,目前的版本C/OS-IIV2.7x2000年,得到美国航空管理局(FAA)的认证,可以用于飞行器中网站www.ucos-II.com()1、实时操作系统概念及C/OS-Ⅱ简介46第46页,共142页,2023年,2月20日,星期六公开源代码

μCOS不但提供了一个完整的嵌入式实时内核的源代码,而且对这些代码的细节作了详尽的解释,它不仅告诉读者这个实时内核是怎么写的,还解释了为什么要这样写。而商业上的实时操作系统软件不但价格昂贵(一般都在5千到2万美元的价位上),而且其中很多都是所谓黑盒子,即不提供源代码。C/OS的性能特点(一)1、实时操作系统概念及C/OS-Ⅱ简介可移植性(Portable)

绝大部分

C/OS-II的源码是用移植性很强的ANSIC写的。和微处理器硬件相关的那部分是用汇编语言写的。汇编语言写的部分已经压到最低限度,使得

C/OS-II便于移植到其他微处理器上。汇编语言写的部分只有200行左右。

C/OS-II可以在绝大多数8位、16位、32位以至64位微处理器、微控制器、数字信号处理器(DSP)上运行。移植范例的源代码可以从因特网上下载。47第47页,共142页,2023年,2月20日,星期六可裁剪(Scalable)

(os_cfg.h)

可以只使用

C/OS-II中应用程序需要的那些系统服务。也就是说某产品可以只使用很少几个

C/OS-II调用,而另一个产品则使用了几乎所有

C/OS-II的功能,这样可以减少产品中的

C/OS-II所需的存储器空间(RAM和ROM)。这种可剪裁性是靠条件编译实现的。多任务

C/OS-II可以管理64个任务,然而,目前这一版本保留8个给系统。应用程序最多可以有56个任务占先式(Preemptive)C/OS的性能特点(二)48第48页,共142页,2023年,2月20日,星期六可确定性

全部

C/OS-II的函数调用与服务的执行时间具有可确定性。任务栈

每个任务有自己单独的栈,

C/OS-II允许每个任务有不同的栈空间,以便压低应用程序对RAM的需求。系统服务

C/OS-II提供很多系统服务,例如邮箱、消息队列、信号量、块大小固定的内存的申请与释放、时间相关函数等。中断管理

中断可以使正在执行的任务暂时挂起,如果优先级更高的任务被该中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达255层。可固化(ROMable)

C/OS-II是为嵌入式应用而设计的,这就意味着,只要读者有固化手段(C编译、连接、下载和固化),

C/OS-II可以嵌入到读者的产品中成为产品的一部分。稳定性与可靠性C/OS的性能特点(三)1、实时操作系统概念及C/OS-Ⅱ简介49第49页,共142页,2023年,2月20日,星期六

μC/OS已被移植到以下一些CPU上。Analog设备公司AD21xxARM公司ARM6,ARM7日立公司64180,H8/3xx,SH系列Intel公司80x86,Pentium,PentiumII,8051,8052,MCS-251,80196,8096三菱公司M16和M32摩托罗拉公司PowerPC,68K,CPU32,CPU32+,68H11,68HC16飞利浦公司XA西门子公司80C166和TriCoreTI公司TMS320Zilog公司Z—80和Z—1801、实时操作系统概念及C/OS-Ⅱ简介50第50页,共142页,2023年,2月20日,星期六μC/OS的几个典型应用1).NSA2010便携式电话,在日本大约有15000台投入市场。使用μC/OS实时操作系统。2).CYCLONE移动电话,HitachiH8S/2318k微程序控制器,256K闪存和8KRam,μC/OS实时操作系统。选择μC/OS的原因:INFEAR&D的职员从1996年以来开始应用Micriμm实时操作系统。通过比较,还没有发现比μC/OS更好的实时操作系统。我们将继续应用μC/OS以及Micriμm的其它产品包括下一代μC/OS-IIV2.52的产品。

1、实时操作系统概念及C/OS-Ⅱ简介51第51页,共142页,2023年,2月20日,星期六3)三轴运动控制卡

——HitachiSH2微处理器;——7个任务;——时钟频率10Hz;用于加工眼镜的塑料镜片的计算机控制车床的运动控制。选择μC/OS-II的原因:

主要原因是它与其它市场上的实时操作系统相比的相对低廉的费用。另一个主要原因是资源和内设的可获得性。最后一点,μC/OS-II有足够的能力使我们能够顺利完成工作。1、实时操作系统概念及C/OS-Ⅱ简介52第52页,共142页,2023年,2月20日,星期六4)MB-20-M信用卡处理装置TCP/IP协议;20MHzAm188ES;10项任务;时钟频率100Hz;

MB-20-M被用于对很多的教学和商务设备的控制使用和收费,包括身份证,安全卡和图书馆借阅卡,现在只要应用标准磁条的用户卡都可以在MB-20-M终端上使用。选择μC/OS-II的原因:

价格便宜,代码尺寸小,缩短开发周期1、实时操作系统概念及C/OS-Ⅱ简介53第53页,共142页,2023年,2月20日,星期六5)独立静态交换机HitachiH8S/2357CPU4个任务时钟频率1000Hz

独立静态交换机(SIEL交换机)是一个可以连续的瞬时改变电源的装置从而控制两条电线的状态,最终保证负载的最佳电力供给。这种机器同样可以保护负载以防短路。选择μC/OS—II的原因:与其它实时方案相比低廉的价格,与很多微处理器可以进行数据传输,对源代码的完全控制。1、实时操作系统概念及C/OS-Ⅱ简介54第54页,共142页,2023年,2月20日,星期六本节提要132546C/OS-Ⅱ简介及实时操作系统概念C/OS-Ⅱ内核结构C/OS-Ⅱ任务通信与同步C/OS-Ⅱ任务管理C/OS-Ⅱ时间管理C/OS-Ⅱ移植55第55页,共142页,2023年,2月20日,星期六uC/OS功能:56第56页,共142页,2023年,2月20日,星期六C/OS-II的文件结构H2、C/OS-Ⅱ内核结构S

57第57页,共142页,2023年,2月20日,星期六2.1任务taskC/OS–II支持64个任务,每个任务一个特定的优先级。优先级越高,数字越小。系统占用了8个任务,保留优先级为0、1、2、3、OS_LOWEST_PRIO-3、OS_LOWEST_PRIO-2、OS_LOWEST_PRIO-1、OS_LOWEST_PRIO-0。用户一般有56个任务可用C/OS–II通过OSTaskCreate()或OSTaskCreateExt()创建任务,后者是前者的扩展,有了一些附加功能。2、C/OS-Ⅱ内核结构58第58页,共142页,2023年,2月20日,星期六C/OS–IITaskStructure

voidYourTask(void*pdata) (1){

for(;;){ (2)/*用户代码*/

调用uC/OS-II的某种系统服务:OSMboxPend();OSQPend();OSSemPend();OSTaskDel(OS_PRIO_SELF);OSTaskSuspend(OS_PRIO_SELF);OSTimeDly();OSTimeDlyHMSM();/*用户代码*/}}2、C/OS-Ⅱ内核结构59第59页,共142页,2023年,2月20日,星期六C/OS–IITaskStructure任务的几个特征:任务通常是一个无限的循环返回参数类型必须定义成void(当任务开始执行时,可以有一个参数传递给用户任务代码)也可以使用while(1)语句,实现无限的循环;任务可以有返回值类型和参数,但任务函数永远不会返回。任务完成后,任务可以自我删除。60第60页,共142页,2023年,2月20日,星期六任务可以自删除(进入睡眠态)voidYourTask(void*pdata){/*用户代码*/OSTaskDel(OS_PRIO_SELF);}一个CPU在一个具体时刻,只能允许一个任务占用CPU,任务的状态:睡眠态、就绪态、运行态、等待态、中断服务态2、C/OS-Ⅱ内核结构61第61页,共142页,2023年,2月20日,星期六62第62页,共142页,2023年,2月20日,星期六2.2任务状态//

2、C/OS-Ⅱ内核结构63第63页,共142页,2023年,2月20日,星期六任务状态64第64页,共142页,2023年,2月20日,星期六uC/OS-II的任务由三部分组成:任务控制块用来保存任务属性任务的栈用来保存任务的工作环境任务代码程序执行部分65第65页,共142页,2023年,2月20日,星期六66第66页,共142页,2023年,2月20日,星期六用户应用程序结构67第67页,共142页,2023年,2月20日,星期六68第68页,共142页,2023年,2月20日,星期六2.3任务控制块(TCB)任务控制块OS_TCB是一个数据结构,保存该任务的相关参数,包括任务堆栈指针,状态,优先级,任务就绪表位置,任务链表指针等。当任务重新得到CPU使用权时,任务控制块能确保任务从当时被中断的哪一点丝毫不差的继续执行。所有的任务控制块分为两条链表,空闲链表和使用链表。2、C/OS-Ⅱ内核结构69第69页,共142页,2023年,2月20日,星期六µC/OS-II任务控制块.ucos-ii.htypedefstructos_tcb{OS_STK*OSTCBStkPtr;指向当前任务栈顶的指针

#ifOS_TASK_CREATE_EXT_EN>0void*OSTCBExtPtr;指向用户定义的任务控制块扩展

OS_STK*OSTCBStkBottom;指向任务栈底的指针

INT32UOSTCBStkSize;栈中可容纳的指针元数

INT16UOSTCBOpt;把“选择项”传给OSTaskCreateExt()

INT16UOSTCBId;任务的识别码

#endifstructos_tcb*OSTCBNext;任务控制块OS_TCBs的双重链接

structos_tcb*OSTCBPrev;#ifOS_EVENT_ENOS_EVENT*OSTCBEventPtr;/*指向事件控制块*/#endif2、C/OS-Ⅱ内核结构70第70页,共142页,2023年,2月20日,星期六#if((OS_Q_EN>0)&&(OS_MAX_QS>0))||(OS_MBOX_EN>0)void*OSTCBMsg;指向传给任务的消息的指针#endifINT16UOSTCBDly;任务延时若干时钟节拍

INT8UOSTCBStat;任务的状态字0,就绪INT8UOSTCBPrio;任务优先级

INT8UOSTCBX;用于加速任务进入就绪态的过程

INT8UOSTCBY;或进入等待事件发生状态的过程

INT8UOSTCBBitX;INT8UOSTCBBitY;#ifOS_TASK_DEL_ENBOOLEANOSTCBDelReq;表示该任务是否需要删除自身

#endif}OS_TCB;2、C/OS-Ⅱ内核结构71第71页,共142页,2023年,2月20日,星期六

任务控制块OS_TCB中几个成员的算法OSTCBY=priority>>3;(第几组)OSTCBBitY=OSMapTbl[priority>>3];(在OSRdyGrp中1的位置)OSTCBX=priority&0x07;OSTCBBitX=OSMapTbl[priority&0x07];000000001100000010200000100300001000400010000500100000601000000710000000IndexOSMapTbl[Index]OSRdyGrp1207654300XXXYYY任务优先级2017654310891514131211181617232221201926242531302928273432333938373635424041474645444350484955545352515856576362616059[0][1][2][3][4][5][6][7]OSRdyTbl[7]XYos_core.c2、C/OS-Ⅱ内核结构72第72页,共142页,2023年,2月20日,星期六空任务列表所有的任务控制块都被放置在任务控制块列表数组OSTCBTbl[]中,系统初始化时,所有任务控制块被链接成空任务控制块的单向链表,2、C/OS-Ⅱ内核结构73第73页,共142页,2023年,2月20日,星期六OSInit():主要功能完成一般变量初始化就绪列表初始化空闲任务键表OSTCBFreeList建立事件空闲键表OSEventFreeList建立其它相关功能参数初始化。创建空闲任务OS_TaskIdle创建统计任务OS_InitTaskSta74第74页,共142页,2023年,2月20日,星期六调用OSInit()之后的数据结构:使用任务块链表75第75页,共142页,2023年,2月20日,星期六任务建立后,空任务控制块指针OSTCBFreeList指向的任务控制块就赋给了该任务,然后OSTCBFreeList的值调整为指向链表中的下一个空任务控制块。μC/OS-Ⅱ分配给系统任务OS_N_SYS_TASKS若干个任务控制块,见文件μC/OS-Ⅱ.H,供其内部使用。76第76页,共142页,2023年,2月20日,星期六任务控制块的初始化当应用程序调用函数OSTaskCreate()创建一个任务时,这个函数会调用系统函数OSTCBInit()来为任务控制块进行初始化。系统函数OSTCBInit()的功能:为被创建任务从空任务控制块链表获取一个任务控制块;用任务属性对任务控制块各个成员进行赋值;把赋值的任务控制块链入到任务控制块链表的头部。77第77页,共142页,2023年,2月20日,星期六任务控制块初始化函数OS_TCBInit()INT8UOS_TCBInit(INT8Uprio,OS_STK*ptos,OS_STK*pbos,INT16Uid,INT32Ustk_size,void*pext,INT16Uopt){OS_ENTER_CRITICAL();ptcb=OSTCBFreeList;/*GetafreeTCBfromthefreeTCBlist*/if(ptcb!=(OS_TCB*)0){//是否有空任务OSTCBFreeList=ptcb->OSTCBNext;/*UpdatepointertofreeTCBlist*/OS_EXIT_CRITICAL();ptcb->OSTCBStkPtr=ptos;/*LoadStackpointerinTCB*/ptcb->OSTCBPrio=(INT8U)prio;/*LoadtaskpriorityintoTCB*/ptcb->OSTCBStat=OS_STAT_RDY;/*Taskisreadytorun,’00’*/ptcb->OSTCBDly=0;……函数OstaskCreate()、OstaskCreateExt()中调用

2、C/OS-Ⅱ内核结构os_core.c78第78页,共142页,2023年,2月20日,星期六ptcb->OSTCBY=(INT8U)(prio>>3);/*Pre-computeX,Y,BitXandBitY*/ptcb->OSTCBBitY=OSMapTbl[ptcb->OSTCBY];ptcb->OSTCBX=(INT8U)(prio&0x07);ptcb->OSTCBBitX=OSMapTbl[ptcb->OSTCBX];……OSTCBPrioTbl[prio]=ptcb;ptcb->OSTCBNext=OSTCBList;/*LinkintoTCBchain*/ptcb->OSTCBPrev=(OS_TCB*)0;if(OSTCBList!=(OS_TCB*)0){//是否有任务OSTCBList->OSTCBPrev=ptcb;}OSTCBList=ptcb;OSRdyGrp|=ptcb->OSTCBBitY;/*Maketaskreadytorun*/OSRdyTbl[ptcb->OSTCBY]|=ptcb->OSTCBBitX;}OS_EXIT_CRITICAL();return(OS_NO_ERR);}79第79页,共142页,2023年,2月20日,星期六启动多任务多任务的启动是用户通过调用OSStart()实现的。voidmain(void){OSInit();/*初始化uC/OS-II.通过调用OSTaskCreate()或OSTaskCreateExt()创建至少一个任务;.OSStart();/*开始多任务调度!OSStart()永远不会返回*/}80第80页,共142页,2023年,2月20日,星期六voidOSStart(void){INT8Uy;INT8Ux;if(OSRunning==FALSE){y=OSUnMapTbl[OSRdyGrp];x=OSUnMapTbl[OSRdyTbl[y]];OSPrioHighRdy=(INT8U)((y<<3)+x);OSPrioCur=OSPrioHighRdy;OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];获得最高级任务 OSTCBCur=OSTCBHighRdy;OSStartHighRdy(); 启动最高优先级任务}}81第81页,共142页,2023年,2月20日,星期六调用OSStart()以后的变量与数据结构82第82页,共142页,2023年,2月20日,星期六Os_tcb*的数组OSTCBPrioTBL[],专门用来以任务的优先级为顺序,在数组的元素里存放指向各个任务控制块的指针。任务控制块列表数组OSTCBTBL[]与OSTCBPrioTBL[]的区别?83第83页,共142页,2023年,2月20日,星期六2.4就绪表

任务级的任务调度--OSSchedC/OS是占先式实时多任务内核,优先级最高的任务一旦准备就绪,则拥有CPU的所有权开始投入运行。C/OS中不支持时间片轮转法,每个任务的优先级要求不一样且是唯一的,所以任务调度的工作就是:查找准备就绪的最高优先级的任务并进行上下文切换。C/OS任务调度所花的时间为常数,与应用程序中建立的任务数无关。2、C/OS-Ⅱ内核结构84第84页,共142页,2023年,2月20日,星期六C/OS进行任务调度的思想是,每时每刻总是让优先级最高的就绪任务处于运行状态;为保证这一点它在系统或用户任务调用系统函数及执行中断服务程序结束时,总是调用调度器来确定应该运行的任务并运行它。C/OS进行任务调度的依据就是任务就绪表;就绪表为每个任务安排了一个二进制位,该位的值为1表示对应的任务处于就绪状态;该位为0表示对应的任务处于非就绪态。C/OS的状态有两个变量OSRdyGrp、OSRdyTbl[]表示;OSRdyTbl[]数组的每一个元素描述八个任务的状态,OSRdyGrp是一个8位元素,每一位描述了对应OSRdyTbl[]数组的任务状态。如果OSRdyTbl[]数组的有任务就绪,OSRdyGrp会把该任务组对应的位置一。85第85页,共142页,2023年,2月20日,星期六每个就绪的任务都放入就绪表中(readylist)中,就绪表有两个变量:OSRdyGrp、OSRdyTbl[]OSRdyGrp1207654300XXXYYY任务优先级2017654310891514131211181617232221201926242531302928273432333938373635424041474645444350484955545352515856576362616059[0][1][2][3][4][5][6][7]OSRdyTbl[7]XY优先级最低任务(空闲任务)优先级最高任务任务优先级号86第86页,共142页,2023年,2月20日,星期六两个关键:优先级数分解为高三位和低三位分别确定;高优先级有着小的优先级号;针对就绪表的三种操作:使任务进入就绪态使任务脱离就绪态根据就绪表确定最高优先级87第87页,共142页,2023年,2月20日,星期六优先级和就绪任务表的位置关系每个就绪的任务都放入就绪表中(readylist)中,就绪表有两个变量:OSRdyGrp、OSRdyTbl[]OSRdyGrp1207654300XXXYYY任务优先级2017654310891514131211181617232221201926242531302928273432333938373635424041474645444350484955545352515856576362616059[0][1][2][3][4][5][6][7]OSRdyTbl[7]XY优先级最低任务(空闲任务)优先级最高任务任务优先级号2、C/OS-Ⅱ内核结构88第88页,共142页,2023年,2月20日,星期六根据优先级确定就绪表(1)假设优先级为12的任务进入就绪状态,12=1100b,则OSRdyTbl[1]的第4位置1,且OSRdyGrp的第1位置1,相应的数学表达式为:OSRdyGrp|=0x02;OSMapTbl[1]=(00000010)

OSRdyTbl[1]|=0x10;OSMapTbl[4]=(00010000)而优先级为21的任务就绪21=10101b,则OSRdyTbl[2]的第5位置1,且OSRdyGrp的第2位置1,相应的数学表达式为:

OSRdyGrp|=0x04;OSMapTbl[2]=(00000100)

OSRdyTbl[2]|=0x20;OSMapTbl[5]=(00100000)2、C/OS-Ⅱ内核结构89第89页,共142页,2023年,2月20日,星期六根据优先级确定就绪表(2)从上面的计算我们可以得到:若OSRdyGrp及OSRdyTbl[]的第n位置1,则应该把OSRdyGrp及OSRdyTbl[]的值与2n相或。uC/OS中,把2n的n=0-7的8个值先计算好存在数组OSMapTbl[7]中,也就是:

OSMapTbl[0]=20=0x01(00000001)

OSMapTbl[1]=21=0x02(00000010)

……OSMapTbl[7]=27=0x80(10000000)000000001100000010200000100300001000400010000500100000601000000710000000IndexBitMask(Binary)2、C/OS-Ⅱ内核结构os_core.c90第90页,共142页,2023年,2月20日,星期六使任务进入就绪态如果prio是任务是优先级,也是任务的识别号,则将任务放入就绪表,即使任务进入就绪态的方法是:OSRdyGrp|=OSMapTbl[prio>>3];OSRdyTbl[prio>>3]|=OSMapTbl[prio&0x07];即:OSRdyGrp|=OSTCBBitY OSRdyTbl[prio>>3]|=OSTCBBitX假设优先级为12——1100bOSMapTbl[1]=00000010OSMapTbl[4]=00010000OSRdyGrp|=0x02;OSRdyTbl[1]|=0x10;2、C/OS-Ⅱ内核结构OSTCBY=priority>>3;(第几组)OSTCBBitY=OSMapTbl[priority>>3];(在OSRdyGrp中1的位置)OSTCBX=priority&0x07;OSTCBBitX=OSMapTbl[priority&0x07];91第91页,共142页,2023年,2月20日,星期六使任务脱离就绪态将任务就绪表OSRdyTbl[prio>>3]相应元素的相应位清零,而且当OSRdyTbl[prio>>3]中的所有位都为零时,即全组任务中没有一个进入就绪态时,OSRdyGrp的相应位才为零。If((OSRdyTbl[prio>>3]&=OSMapTbl[prio&0x07])==0);OSRdyGrp&=OSMapTbl[prio>>3];2、C/OS-Ⅱ内核结构92第92页,共142页,2023年,2月20日,星期六根据就绪表确定最高优先级通过OSRdyGrp值确定高3位,假设为0x2B=101011b,---〉对应OSRdyTbl[2]和OSRdyTbl[5],高优先级为2通过OSRdyTbl[2]的值来确定低3位,假设为0x12=010010b,---〉第2个和第5个任务,取高优先级为2,则最高优先级的任务号为17OSRdyGrp0100010000010001任务优先级2017654310891514131211001000102624253130292827343233393837363542404147464544150484955545352515856576362616059[0][1][2][3][4][5][6][7]OSRdyTbl[7]XY2、C/OS-Ⅱ内核结构93第93页,共142页,2023年,2月20日,星期六源代码中使用了查表法查表法具有确定的时间,增加了系统的可预测性,uC/OS中所有的系统调用时间都是确定的High3=OSUnMapTbl[OSRdyGrp];Low3=OSUnMapTbl[OSRdyTbl[High3]];Prio=(High3<<3)+Low3;OSRdyGrp1207654300XXXYYY任务优先级2017654310891514131211181617232221201926242531302928273432333938373635424041474645444350484955545352515856576362616059[0][1][2][3][4][5][6][7]OSRdyTbl[7]XY2、C/OS-Ⅱ内核结构94第94页,共142页,2023年,2月20日,星期六INT8UconstOSUnMapTbl[]={0,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0};优先级判定表OSUnMapTbl[256](os_core.c中)举例:

如OSRdyGrp的值为00101000B,即0X28,则查得OSUnMapTbl[OSRdyGrp]的值是3,它相应于OSRdyGrp中的第3位置1;如OSRdyTbl[3]的值是11100100B,即0XE4,则查OSUnMapTbl[OSRdyTbl[3]]的值是2,则进入就绪态的最高任务优先级Prio=3*8+2=26

2、C/OS-Ⅱ内核结构High3=OSUnMapTbl[OSRdyGrp];Low3=OSUnMapTbl[OSRdyTbl[High3]];Prio=(High3<<3)+Low3;95第95页,共142页,2023年,2月20日,星期六2.5TaskschedulervoidOS_Sched(void)/*os_core.c中*/{INT8Uy;OS_ENTER_CRITICAL();if((OSLockNesting=0)&&(OSIntNesting=0)){ y=OSUnMapTbl[OSRdyGrp];获得最高优先级的高三位 OSPrioHighRdy=(INT8U)((y<<3)+OSUnMapTbl[OSRdyTbl[y]])if(OSPrioHighRdy!=OSPrioCur){ OSTCBHighRdy=OSTCBP

温馨提示

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

评论

0/150

提交评论