chap02实时系统概念PPT课件02

上传人:s9****2 文档编号:567895728 上传时间:2024-07-22 格式:PPT 页数:106 大小:794.50KB
返回 下载 相关 举报
chap02实时系统概念PPT课件02_第1页
第1页 / 共106页
chap02实时系统概念PPT课件02_第2页
第2页 / 共106页
chap02实时系统概念PPT课件02_第3页
第3页 / 共106页
chap02实时系统概念PPT课件02_第4页
第4页 / 共106页
chap02实时系统概念PPT课件02_第5页
第5页 / 共106页
点击查看更多>>
资源描述

《chap02实时系统概念PPT课件02》由会员分享,可在线阅读,更多相关《chap02实时系统概念PPT课件02(106页珍藏版)》请在金锄头文库上搜索。

1、 12024/7/22嵌入式实时操作系统嵌入式实时操作系统 C/OS-IIpage2024/7/222第第2章章 实时系系统概念概念 32024/7/22实时系系统概念概念软实时系系统-各个任务尽快运行,不要求限定某一任务在多长时间内完成。硬硬实时系系统-任务要做到准时。 2.0 前前/后台系后台系统 不复不复杂的小系的小系统一般一般设计成如下成如下图所所示的示的样子。子。这种系种系统可称可称为前后台系前后台系统或或超循超循环系系统(Super-Loops)。42024/7/22 52024/7/22后台是一个循环轮询系统一直在运行。后台是一个循环轮询系统一直在运行。前台是由一些中断处理过程组

2、成的。前台是由一些中断处理过程组成的。当有一前台事件当有一前台事件( (外部事件外部事件) )发生时,引起中断发生时,引起中断, , 进行进行前台处理前台处理, , 处理完成后又回到后台处理完成后又回到后台( (通常又称主程序通常又称主程序) )。 中断中断1 1中断中断2 2主程序主程序中断中断1 1中断中断1 1中断中断2 2 初始化初始化处理1事件事件1 1处理2事件事件2 2N NY YY YN NISR1ISR2前台处理后台处理ISR3实时性?实时性?认为所有的任务具有相同的优先级别认为所有的任务具有相同的优先级别任务的执行通过任务的执行通过FIFO队列排队队列排队某执行任务崩溃会造

3、成整个系统的崩溃某执行任务崩溃会造成整个系统的崩溃 应用程序是一个无限的循用程序是一个无限的循环,循,循环中中调用相用相应的函数完成相的函数完成相应的操作,的操作,这部分可以看成后台部分可以看成后台行行为(background)。中断服。中断服务程序程序处理异步事件,理异步事件,这部分可以看成前台行部分可以看成前台行为(foreground)。后台)。后台也可以叫做也可以叫做任任务级。前台也叫。前台也叫中断中断级。82024/7/22 92024/7/22 时间相关性很相关性很强的关的关键操作操作(Critical operation)一定是靠中断服一定是靠中断服务来保来保证的。因的。因为中中

4、断服断服务提供的信息一直要等到后台程序走到提供的信息一直要等到后台程序走到该处理理这个信息个信息这一步一步时才能得到才能得到处理,理,这种系种系统在在处理信息的理信息的及及时性性上,比上,比实际可以做到的要可以做到的要差差。这个指个指标称作任称作任务级响响应时间。最坏情况最坏情况下的任下的任务级响响应时间取决于整个循取决于整个循环的的执行行时间。因。因为循循环的的执行行时间不是常数,程序不是常数,程序经过某一特定部某一特定部分的准确分的准确时间也是不能确定的。也是不能确定的。进而,如果程序而,如果程序修改了,循修改了,循环的的时序也会受到影响。序也会受到影响。 2.01 代代码的的临界段界段

5、代代码的的临界段界段也称也称为临界区界区,指,指处理理时不可分割的代不可分割的代码。 一旦一旦这部分代部分代码开始开始执行,行,则不允不允许任任何中断打入。何中断打入。为确保确保临界段代界段代码的的执行,行,在在进入入临界段之前要界段之前要关中断关中断,而,而临界段代界段代码执行完以后要立即行完以后要立即开中断开中断。102024/7/22 2.02 资源源 资源源-任何任何为任任务所占用的所占用的实体都可称体都可称为资源源。 资源可以是源可以是输入入输出出设备,例如打印机、,例如打印机、键盘、显示器,示器,资源也可以是一个源也可以是一个变量,量,一个一个结构或一个数构或一个数组等。等。112

6、024/7/22 2.03 共享共享资源源 共享共享资源源-可以被一个以上任可以被一个以上任务使用的使用的资源叫做共享源叫做共享资源。源。 为了防止数据被破坏,每个任了防止数据被破坏,每个任务在与共在与共享享资源打交道源打交道时,必,必须独占独占该资源。源。这叫叫做做互斥互斥(mutual exclusion)。122024/7/22 2.04 多任多任务 多任多任务运行的运行的实现实际上是靠上是靠CPU(中中央央处理理单元元)在在许多任多任务之之间转换、调度度。CPU只有一个,只有一个,轮番服番服务于一系列任于一系列任务中中的某一个。多任的某一个。多任务运行很像前后台系运行很像前后台系统,但

7、后台任但后台任务有多个。多任有多个。多任务运行使运行使CPU的的利用率得到最大的利用率得到最大的发挥,并使,并使应用程序模用程序模块化。在化。在实时应用中,多任用中,多任务化的最大特化的最大特点是,开点是,开发人人员可以将很复可以将很复杂的的应用程序用程序层次化。使用多任次化。使用多任务,应用程序将更容易用程序将更容易设计与与维护。132024/7/22 流程并发多任务:后台后台前台前台 ISRsTasks 多任务系统多任务系统多个顺序执行的程序并行运行。多个顺序执行的程序并行运行。宏宏观观上上看看,所所有有的的程程序序同同时时运运行行,每每个个程程序序运行在自己独立的运行在自己独立的CPU上

8、。上。实实际际上上,不不同同的的程程序序是是共共享享同同一一个个CPU和和其其它它硬硬件件。因因此此,需需要要RTOS来来对对这这些些共共享享的的设备和数据进行管理。设备和数据进行管理。每个程序都被编制成无限循环的程序,等待每个程序都被编制成无限循环的程序,等待特定的输入,执行相应的任务等。特定的输入,执行相应的任务等。这种程序模型将系统分成相对简单的,相互这种程序模型将系统分成相对简单的,相互合作的模块。合作的模块。单处理器多任务系统单处理器多任务系统 n优点优点将将复复杂杂的的系系统统分分解解为为相相对对独独立立的的多多个个线线程程, 达达到到“分分而治之而治之”的目的,从而降低系统的复杂

9、性。的目的,从而降低系统的复杂性。保证系统的实时性。保证系统的实时性。系统的模块化好,提高系统的可维护性。系统的模块化好,提高系统的可维护性。n缺点缺点需要采用一些新的软件设计方法。需要采用一些新的软件设计方法。需要增加功能:线程间的协调,同步和通信功能。需要增加功能:线程间的协调,同步和通信功能。需要对每一个共享资源互斥。需要对每一个共享资源互斥。导致线程间的竞争。导致线程间的竞争。需要使用需要使用RTOS,RTOS要增加系统的开销。要增加系统的开销。单处理器多任务系统单处理器多任务系统 多处理器多任务系统多处理器多任务系统多多任任务务可可运运行行在在多多个个处处理理器器上上,由由操操作作系

10、系统统统一调度,处理。统一调度,处理。宏观上看是并发的,微观上看也是并发的。宏观上看是并发的,微观上看也是并发的。多多 处处 理理 机机 系系 统统 分分 为为 紧紧 耦耦 合合 系系 统统 (tightly-coupled system)和和松松耦耦合合系系统统(loosely-coupled system)两种。两种。多处理器多任务系统目前还不成熟。多处理器多任务系统目前还不成熟。 2.05 任任务182024/7/22 一个任务,也称作一个一个任务,也称作一个线程线程,是一个简,是一个简单的程序,单的程序,该程序可以认为该程序可以认为CPU 完全只属完全只属该程序自己该程序自己。实时应用

11、程序的设计过程,。实时应用程序的设计过程,包括如何把问题分割成多个任务,每个任包括如何把问题分割成多个任务,每个任务都是整个应用的某一部分,每个任务被务都是整个应用的某一部分,每个任务被赋予一定的优先级,有它自己的一套赋予一定的优先级,有它自己的一套CPU 寄存器和自己的栈空间。寄存器和自己的栈空间。 19 每个任每个任务都是一个无限的循都是一个无限的循环。每个任。每个任务都都处在以下在以下5种状种状态之一的状之一的状态下,下,这5 种状种状态是休眠是休眠态,就,就绪态、运行、运行态、挂起、挂起态(等待某一事件等待某一事件发生生)和被中断和被中断态。l休眠休眠态-相当于相当于该任任务驻留在内存

12、中,但并不留在内存中,但并不被多任被多任务内核所内核所调度。度。l就就绪态-意味着意味着该任任务已已经准准备好,可以运行好,可以运行了,但由于了,但由于该任任务的的优先先级比正在运行的任比正在运行的任务的的优先先级低,低,还暂时不能运行。不能运行。20 l运行运行态-是指是指该任任务掌握了掌握了CPU 的控制的控制权,正在,正在运行中。运行中。l挂起状挂起状态-也可以叫做等待事件也可以叫做等待事件态WAITING,指,指该任任务在等待,等待某一事件的在等待,等待某一事件的发生,(例如等待生,(例如等待某外某外设的的I/O 操作,等待某共享操作,等待某共享资源由源由暂不能使用不能使用变成能使用状

13、成能使用状态,等待定,等待定时脉冲的到来或等待超脉冲的到来或等待超时信号的到来以信号的到来以结束目前的等待,等等)。束目前的等待,等等)。l被中断被中断态-发生中断生中断时,CPU提供相提供相应的中断服的中断服务,原来正在运行的任,原来正在运行的任务暂不能运行,就不能运行,就进入了被入了被中断状中断状态。21 22休眠态休眠态挂起态挂起态被中断被中断态态运行态运行态就绪态就绪态 2.06 任任务切切换(Context Switch or Task Switch)vContext Switch 在有的在有的书中翻中翻译成成上下文切上下文切换,实际含含义是是任任务切切换,或,或CPU 寄存器内容切

14、寄存器内容切换。v当多任当多任务内核决定运行另外的任内核决定运行另外的任务时,它保存正,它保存正在运行任在运行任务的当前状的当前状态(Context),即),即CPU寄寄存器中的全部内容。存器中的全部内容。这些内容保存在任些内容保存在任务的当前的当前状况保存区(状况保存区(Tasks Context Storage area),),也就是任也就是任务自己的自己的栈区之中。区之中。v任任务切切换-入入栈工作完成以后,就是把下一个将工作完成以后,就是把下一个将要运行的任要运行的任务的当前状况从的当前状况从该任任务的的栈中重新装中重新装入入CPU 的寄存器,并开始下一个任的寄存器,并开始下一个任务的

15、运行。的运行。v任任务切切换过程增加了程增加了应用程序的用程序的额外外负荷。荷。 2.07 内核(内核(Kernel)v多任多任务系系统中,内核中,内核负责管理各个任管理各个任务,或者,或者说为每个任每个任务分配分配CPU时间,并且,并且负责任任务之之间的的通通讯。内核提供的基本服内核提供的基本服务是任是任务切切换。v内核本身内核本身也增加了也增加了应用程序的用程序的额外外负荷,代荷,代码空空间增加增加ROM 的用量的用量,内核本身的数据,内核本身的数据结构增加了构增加了RAM的用量的用量。但更主要的是,。但更主要的是,每个任每个任务要有自己要有自己的的栈空空间,这一一块吃起内存来是相当吃起内

16、存来是相当厉害的。内害的。内核本身核本身对CPU 的占用的占用时间一般在一般在2 到到5个百分点个百分点之之间。 2.08 调度(度(Scheduler)v调度度(Scheduler),英文英文还有一有一词叫叫dispatcher,也是,也是调度的意思。度的意思。这是内核的主要是内核的主要职责之一,之一,就是要就是要决定决定该轮到哪个任到哪个任务运行运行了。了。v多数多数实时内核是内核是基于基于优先先级调度法度法的。每个任的。每个任务根据其重要程度的不同被根据其重要程度的不同被赋予一定的予一定的优先先级。基。基于于优先先级的的调度法指,度法指,CPU总是是让处在就在就绪态的的优先先级最高的任最

17、高的任务先运行先运行。v让高高优先先级任任务掌握掌握CPU 的使用的使用权,有两种不同,有两种不同的情况,的情况,不可剥不可剥夺型内核型内核 可剥可剥夺型内核型内核。 2.09 不可剥不可剥夺型内核型内核 (Non-Preemptive Kernel)v不可剥不可剥夺型内核型内核要求每个任要求每个任务自我放弃自我放弃CPU 的所有的所有权。不可剥。不可剥夺型型调度法也称作度法也称作合作型合作型多任多任务,各个任,各个任务彼此合作共享一个彼此合作共享一个CPU。v不可剥不可剥夺型内核的一个型内核的一个优点是点是响响应中断快中断快。v在任在任务级,不可剥,不可剥夺型内核型内核允允许使用不可重使用不

18、可重入函数入函数。 不可剥夺型内核示例不可剥夺型内核示例 v不可剥不可剥夺型内核的型内核的最大缺陷在于其响最大缺陷在于其响应时间。高。高优先先级的任的任务已已经进入就入就绪态,但,但还不能运行,要等,也不能运行,要等,也许要等很要等很长时间,直到当前运行着的任直到当前运行着的任务释放放CPU。不可剥。不可剥夺型内核的任型内核的任务级响响应时间是不确定的,是不确定的,不知道什么不知道什么时候最高候最高优先先级的任的任务才能拿才能拿到到CPU 的控制的控制权,完全取决于,完全取决于应用程序什用程序什么么时候候释放放CPU。v商商业软件几乎没有不可剥件几乎没有不可剥夺型内核。型内核。 2.10 可剥

19、可剥夺型内核型内核v当系当系统响响应时间很重要很重要时,要使用可剥,要使用可剥夺型内核。型内核。因此,因此,C/OS-以及以及绝大多数商大多数商业上上销售的售的实时内核都是可剥内核都是可剥夺型内核。型内核。v最高最高优先先级的任的任务一旦就一旦就绪,总能得到能得到CPU 的控的控制制权。当一个运行着的任。当一个运行着的任务使一个比它使一个比它优先先级高高的任的任务进入了就入了就绪态,当前任,当前任务的的CPU 使用使用权就就被剥被剥夺了,或者了,或者说被挂起了,那个高被挂起了,那个高优先先级的任的任务立刻得到了立刻得到了CPU的控制的控制权。 可剥夺型内核示例可剥夺型内核示例 v使用可剥使用可

20、剥夺型内核,最高型内核,最高优先先级的任的任务什么什么时候候可以可以执行,可以得到行,可以得到CPU 的控制的控制权是可知的。使是可知的。使用可剥用可剥夺型内核型内核使得任使得任务级响响应时间得以最得以最优化化。v使用可剥使用可剥夺型内核型内核时,应用程序用程序不不应直接使用不直接使用不可重入型函数可重入型函数。调用不可重入型函数用不可重入型函数时,要,要满足足互斥条件,互斥条件,这一点可以一点可以用互斥型信号量来用互斥型信号量来实现。 可重入型函数可重入型函数可以被可以被一个以上一个以上的任的任务调用,用,而不必担心数据的破坏。而不必担心数据的破坏。 可重入型函数任何可重入型函数任何时候都可

21、以被中断,一段候都可以被中断,一段时间以后又可以运行,而相以后又可以运行,而相应数据不会数据不会丢失。可失。可重入型函数或者只使用局部重入型函数或者只使用局部变量,即量,即变量保存在量保存在CPU寄存器中或堆寄存器中或堆栈中。如果使用全局中。如果使用全局变量,量,则要要对全局全局变量予以保量予以保护。2.11 可重入性(可重入性(Reentrancy) 可重入型函数可重入型函数void strcpy(char *dest, char *src) while (*dest+ = *src+) ; *dest = NUL; 不可重入型函数不可重入型函数int Temp;void swap(int

22、*x, int *y) Temp = *x; *x = *y; *y = Temp; 使用以下技使用以下技术之一即可使之一即可使Swap()函数函数具有可重入性:具有可重入性:v 把把Temp 定定义为局部局部变量量v 调用用Swap()函数之前关中断,函数之前关中断,调动后再开中断后再开中断v 用信号量禁止用信号量禁止该函数在使用函数在使用过程中被再次程中被再次调用用 2.12 时间时间片片轮轮番番调调度法度法 当两个或两个以上任当两个或两个以上任务有同有同样优先先级,内核,内核允允许一个任一个任务运行事先确定的一段运行事先确定的一段时间,叫做,叫做时间额度度(quantum),然后切,然后

23、切换给另一个任另一个任务。也叫做也叫做时间片片调度度。内核在内核在满足以下条件足以下条件时,把,把CPU控制控制权交交给下一个任下一个任务就就绪态的任的任务:v当前任当前任务已无事可做已无事可做v当前任当前任务在在时间片片还没没结束束时已已经完成了完成了。 目前,目前,C/OS-不支持不支持时间片片轮番番调度法。度法。应用程序中各任用程序中各任务的的优先先级必必须互不相同。互不相同。 2.13 任任务优务优先先级级 每个任每个任务都有其都有其优先先级。任。任务越重要,越重要,赋予的予的优先先级应越高。越高。 2.14 静静态优态优先先级级 应用程序用程序执行行过程中程中诸任任务优先先级不不变,

24、则称之称之为静静态优先先级。在静。在静态优先先级系系统中,中,诸任任务以及它以及它们的的时间约束在程序束在程序编译时是已知的。是已知的。 动态优动态优先先级级 应用程序用程序执行行过程中,任程中,任务的的优先先级是是可可变的,的,则称之称之为动态优先先级。实时内核内核应当避免出当避免出现优先先级反反转问题。 优优先先级级反反转转v使用使用实时内核内核,优先先级反反转问题是是实时系系统中出中出现得最多的得最多的问题。v为防止防止发生生优先先级反反转,内核能内核能自自动变换任任务的的优先先级,这叫做叫做优先先级继承承(Priority inheritance)。但。但C/OS-不支持不支持优先先级

25、继承承,一些商一些商业内核有内核有优先先级继承功能。承功能。 2.17 任任务优先先级分配分配 给任任务定定优先先级可不是件小事,因可不是件小事,因为实时系系统相当复相当复杂。许多系多系统中,并非所有的任中,并非所有的任务都至都至关重要。不重要的任关重要。不重要的任务自然自然优先先级可以低一些。可以低一些。实时系系统大多大多综合了合了软实时和硬和硬实时这两种需求。两种需求。软实时系系统只是要求任只是要求任务执行得尽量快,并不要行得尽量快,并不要求在某一特定求在某一特定时间内完成。硬内完成。硬实时系系统中,任中,任务不但要不但要执行无行无误,还要准要准时完成。完成。 单调执行率行率调度法度法RM

26、S(Rate Monotonic Scheduling)-用于分配任用于分配任务优先先级。这种方法种方法基于哪个任基于哪个任务执行的次数最行的次数最频繁繁,执行最行最频繁的任繁的任务优先先级最高。最高。 2.18 互斥条件互斥条件 实现任任务间通通讯最最简便到便到办法是法是使用共使用共享数据享数据结构构。特。特别是当所有到任是当所有到任务都在一都在一个个单一地址空一地址空间下,能使用全程下,能使用全程变量、指量、指针、缓冲区、冲区、链表、循表、循环缓冲区等,使用冲区等,使用共享数据共享数据结构通构通讯就更就更为容易。容易。虽然共享然共享数据区法数据区法简化了任化了任务间的信息交的信息交换,但是

27、,但是必必须保保证每个任每个任务在在处理共享数据理共享数据时的的排排它性它性,以避免,以避免竞争和数据的破坏。与共享争和数据的破坏。与共享资源打交道源打交道时,使之,使之满足互斥条件最一般足互斥条件最一般的方法有:的方法有: v关中断关中断v使用使用测试并置位指令并置位指令v禁止做任禁止做任务切切换v利用信号量利用信号量 2.18.1 关中断和开中断关中断和开中断程序清程序清单 关中断和开中断关中断和开中断Disable interrupts; /*关中断关中断*/Access the resource (read/write from/to variables); /*读/写写变量量*/Re

28、enable interrupts; /*重新允重新允许中断中断*/ 实际上上C/OS-提供两个宏提供两个宏调用,允用,允许用用户在在应用程序的用程序的C 代代码中关中断然后再开中断:中关中断然后再开中断:OS_ENTER_CRITICAL()和和OS_EXIT_CRITICAL,这两个宏两个宏调用的使用用的使用法法见程序:程序:程序清程序清单利用利用C/OS_ 宏宏调用关中断和开中断用关中断和开中断void Function (void) OS_ENTER_CRITICAL(); . . /*在在这里里处理共享数据理共享数据*/ . OS_EXIT_CRITICAL(); v关中断的关中断的

29、时间不能太不能太长。因。因为它它影响整个系影响整个系统的的中断响中断响应时间,即中断延,即中断延迟时间。当改。当改变或复制或复制某几个某几个变量的量的值时,应想到用想到用这种方法来做。种方法来做。这也是在中断服也是在中断服务子程序中子程序中处理共享理共享变量或共享数量或共享数据据结构的唯一方法。在任何情况下,关中断的构的唯一方法。在任何情况下,关中断的时间都要尽量短。都要尽量短。v如果使用某种如果使用某种实时内核,一般地内核,一般地说,关中断的最关中断的最长时间不超不超过内核本身的关中断内核本身的关中断时间,就不会影,就不会影响系响系统中断延中断延迟。 2.18.2 测试并置位并置位 如果不使

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

31、试并置位并置位处理共享理共享资源源vDisable interrupts; 关中断vif (Access Variable is 0) 如果资源未占用,标志为0v Set variable to 1; 置资源不可用,标志为1v Reenable interrupts; 重开中断v Access the resource; 处理该资源v Disable interrupts; 关中断v Set the Access Variable back to 0; 清资源不可使用,标志为0v Reenable interrupts; 重新开中断v else 否则v Reenable interrupts;

32、 开中断v /* You dont have access to the resource, try back later; */v /* 资源不可使用,以后再试; */v 2.18.3 禁止禁止,然后允然后允许任任务切切换 如果任如果任务不与中断服不与中断服务子程序共享子程序共享变量或数量或数据据结构构,可以可以使用禁止、然后允使用禁止、然后允许任任务切切换。 如下述程序清如下述程序清单所示,以所示,以C/OS-的使用的使用为例,两个或两个以上的任例,两个或两个以上的任务可以共享数据而不可以共享数据而不发生生竞争。注意,此争。注意,此时虽然任然任务切切换是禁止了,但是禁止了,但中断中断还是开

33、着的。如果是开着的。如果这时中断来了,中断服中断来了,中断服务子程序会在子程序会在这一一临界区内立即界区内立即执行。中断服行。中断服务子子程序程序结束束时,尽管有,尽管有优先先级高的任高的任务已已经进入就入就绪态,内核,内核还是返回到原来被中断了的任是返回到原来被中断了的任务。直。直到到执行完行完给任任务切切换开开锁函数函数OSSchedUnlock (),内核再看有没有内核再看有没有优先先级更高的任更高的任务被中断服被中断服务子程序激活而子程序激活而进入就入就绪态,如果有,如果有,则做任做任务切切换。 v程序清程序清单2.6 用用给任任务切切换上上锁,然后开,然后开锁的方法的方法实现数据共享

34、数据共享.vvoid Function (void)vv OSSchedLock();v .v . /* You can access shared data in here (interrupts are recognized) */v . /*在这里处理共享数据(中断是开着的)*/v OSSchedUnlock();v 2.18.4 信号量信号量(Semaphores) 信号量是信号量是60年代中期年代中期Edgser Dijkstra 发明明的。信号量的。信号量实际上是一种上是一种约定机制,在多任定机制,在多任务内内核中普遍使用。信号量用于:核中普遍使用。信号量用于:控制共享控制共享资源

35、的使用源的使用权(满足互斥条件足互斥条件)标志某事件的志某事件的发生生使两个任使两个任务的行的行为同步同步 信号像是一把信号像是一把钥匙,任匙,任务要运行下去,得先要运行下去,得先拿到拿到这把把钥匙匙。如果信号已被。如果信号已被别的任的任务占用,占用,该任任务只得被挂起,直到信号被当前使用者只得被挂起,直到信号被当前使用者释放。放。 信号信号是只有两个是只有两个值的的变量量,信号量信号量是是计数式的数式的。只取两个只取两个值的信号是只有两个的信号是只有两个值0 和和1的量,因此的量,因此也称之也称之为信号量。信号量。计数式信号量的数式信号量的值可以是可以是0 到到255 或或0 到到65535

36、,或,或0 到到4294967295,取决于信,取决于信号量号量规约机制使用的是机制使用的是8 位、位、16位位还是是32 位。位。 一般地一般地说,对信号量只能信号量只能实施三种操作:施三种操作:初初始化始化INITIALIZE),也可称作,也可称作建立建立(CREATE);等等信号信号(WAIT)也可称作也可称作挂起挂起(PEND);给信号信号(SIGNAL)或或发信号信号(POST)。 信号量信号量初始化初始化时要要给信号量信号量赋初初值,等,等待信号量的任待信号量的任务表表(Waiting list)应清清为空。空。 想要得到信号量的任想要得到信号量的任务执行行等待等待(WAIT)操作

37、。操作。v如果如果该信号量有效信号量有效(即信号量即信号量值大于大于0),则信号量信号量值减减1,任,任务得以得以继续运行。运行。v如果信号量的如果信号量的值为0,等待信号量的任,等待信号量的任务就被列入就被列入等待信号量任等待信号量任务表。表。 任任务以以发信号信号操作操作(SIGNAL)释放信号量放信号量。如。如果没有任果没有任务在等待信号量,信号量的在等待信号量,信号量的值仅仅是是简单地加地加1。如果有任。如果有任务在等待在等待该信号量,那么就会有信号量,那么就会有一个任一个任务进入就入就绪态,信号量的,信号量的值也就不加也就不加1。 收到信号量的任收到信号量的任务可能是以下两者之一可能

38、是以下两者之一等待信号量任等待信号量任务中中优先先级最高的,或者是最高的,或者是最早开始等待信号量的那个任最早开始等待信号量的那个任务,即按先,即按先进先出先出的原的原则(First In First Out ,FIFO) v程序清程序清单2.7 通通过获得信号量得信号量处理共享数据理共享数据vOS_EVENT *SharedDataSem;vvoid Function (void)vv INT8U err;v OSSemPend(SharedDataSem, 0, &err);v .v . /* You can access shared data in here (interrupts a

39、re recognized) */v . /*共享数据的处理在此进行,(中断是开着的)*/v OSSemPost(SharedDataSem);v如果中断服如果中断服务程序或当务程序或当前任务激活前任务激活了一个高优了一个高优先级的任务,先级的任务,高优先级的高优先级的任务立即开任务立即开始执行。始执行。 当当诸任任务共享共享输入入输出出设备时,信号量,信号量特特别有用有用。 如:多任如:多任务同同时访问打印机。使用信号打印机。使用信号量并量并给信号量信号量赋初初值1(用二用二进制信号量制信号量)。要想使用打印机的任要想使用打印机的任务,先要得到,先要得到该资源源的信号量。的信号量。 用获取信

40、号量来得到打印机使用权用获取信号量来得到打印机使用权 每个任每个任务都知道有个信号表示都知道有个信号表示资源可不源可不可以使用。要想使用可以使用。要想使用该资源,要先得到源,要先得到这个信号。然而有些情况下,个信号。然而有些情况下,最好把信号量最好把信号量藏起来藏起来,各个任,各个任务在同某一在同某一资源打交道源打交道时,并不知道并不知道实际上是在申上是在申请得到一个信号量。得到一个信号量。例如例如,多任,多任务共享一个共享一个RS-232C 外外设接口,接口,各任各任务要送命令要送命令给接口另一端的接口另一端的设备并接并接收收该设备的回的回应。 在任务级看不到隐含的信号量在任务级看不到隐含的

41、信号量 v程序清程序清单 2.8 隐含的信号量。含的信号量。vINT8U CommSendCmd(char *cmd, char *response, INT16U timeout)vv Acquire ports semaphore;v Send command to device;v Wait for response (with timeout);v if (timed out) v Release semaphore;v return (error code);v else v Release semaphore;v return (no error);v v 计数式信号量数式信号量用

42、于某用于某资源可以同源可以同时为几个任几个任务所用。所用。例如例如,用信号量管理,用信号量管理缓冲冲区区阵列列(buffer pool),如,如图2.12 所示。所示。缓冲区冲区阵列中共有列中共有10 个个缓冲区,任冲区,任务通通过调用申用申请缓冲区函数冲区函数BufReq()向向缓冲区管理冲区管理方申方申请得到得到缓冲区使用冲区使用权。当。当缓冲区使用冲区使用权还不再需要不再需要时,通,通过调用用释放放缓冲区函冲区函数数BufRel()将将缓冲区冲区还给管方。函数示意管方。函数示意码如程序清如程序清单所示所示 v程序清程序清单 2.9 用信号量管理用信号量管理缓冲区。冲区。vBUF *Buf

43、Req(void)vv BUF *ptr;v Acquire a semaphore;v Disable interrupts;v ptr = BufFreeList;v BufFreeList = ptr-BufNext;v Enable interrupts;v return (ptr);vvvoid BufRel(BUF *ptr)vv Disable interrupts;v ptr-BufNext = BufFreeList;v BufFreeList = ptr;v Enable interrupts;v Release semaphore;v 处理理简单的共享的共享变量也使用信号

44、量量也使用信号量则是是多余的多余的。请求和求和释放信号量的放信号量的过程是要花程是要花相当的相当的时间的。有的。有时这种种额外的外的负荷是不荷是不必要的。用必要的。用户可能可能只需要关中断、开中断只需要关中断、开中断来来处理理简单共享共享变量,以提高效率量,以提高效率。 2.19 死死锁锁(或抱死或抱死)(Deadlock (or Deadly Embrace)) 死死锁也称作也称作抱死抱死,指两个任指两个任务无限期地互相无限期地互相等待等待对方控制着的方控制着的资源源。设任任务T1 正独享正独享资源源R1,任,任务T2 在独享在独享资源源R2,而此,而此时T1 又要独享又要独享R2,T2 也

45、要独享也要独享R1,于是哪个任,于是哪个任务都没法都没法继续执行了,行了,发生了死生了死锁。最最简单的防止的防止发生死生死锁的的方法是方法是让每个任每个任务都都:v先得到全部需要的先得到全部需要的资源再做下一步的工作源再做下一步的工作v用同用同样的的顺序去申序去申请多个多个资源源v释放放资源源时使用相反的使用相反的顺序序 内核大多允内核大多允许用用户在申在申请信号量信号量时定定义等待超等待超时,以此化解死,以此化解死锁。当等待。当等待时间超超过了某一确定了某一确定值,信号量,信号量还是无效状是无效状态,就会返回某种形式的出就会返回某种形式的出现超超时错误的代的代码,这个出个出错代代码告知告知该

46、任任务,不是得到了,不是得到了资源使用源使用权,而是系,而是系统错误。死。死锁一般一般发生生在大型多任在大型多任务系系统中,在嵌入式系中,在嵌入式系统中不中不易出易出现。 2.20 同步同步 可以利用信号量使某任可以利用信号量使某任务与中断服与中断服务同步同步(或者是与另一个任或者是与另一个任务同步,同步,这两个任两个任务间没有数据交没有数据交换)。 图图2.13 用信号量使任务与中断服务同步用信号量使任务与中断服务同步用来实现同步机制的信号量初始化成用来实现同步机制的信号量初始化成0,信号量用于,信号量用于这种类型同步的称作这种类型同步的称作单向同步单向同步(unilateral rende

47、zvous)。一个任务做。一个任务做I/O操作,然后等信号回操作,然后等信号回应。当应。当I/O 操作完成,中断服务程序操作完成,中断服务程序(或另外一个任或另外一个任务务)发出信号,该任务得到信号后继续往下执行。发出信号,该任务得到信号后继续往下执行。 如果内核支持如果内核支持计数式信号量,信号量的数式信号量,信号量的值表示尚未得到表示尚未得到处理的事件数理的事件数。请注意,注意,可能会有一个以上的任可能会有一个以上的任务在等待同一事件在等待同一事件的的发生,生,则这种情况下内核会根据以下原种情况下内核会根据以下原则之一之一发信号信号给相相应的任的任务:v发信号信号给等待事件等待事件发生的任

48、生的任务中中优先先级最最高的任高的任务,或者,或者v发信号信号给最先开始等待事件最先开始等待事件发生的那个任生的那个任务 两个任两个任务可以用两个信号量同步它可以用两个信号量同步它们的的行行为。如。如图2.14 所示。所示。这叫做叫做双向同步双向同步(bilateral rendezvous)。双向同步同。双向同步同单向向同步同步类似,只是两个任似,只是两个任务要相互同步。要相互同步。 图图2.14 两个任务用信号量同步彼此的行为两个任务用信号量同步彼此的行为 v程序清程序清单2.10 双向同步双向同步vTask1()vv for (;) v Perform operation;v Signa

49、l task #2; (1)v Wait for signal from task #2; (2)v Continue operation;v vvTask2()vv for (;) v Perform operation;v Signal task #1; (3)v Wait for signal from task #1; (4)v Continue operation;v v 2.21 事件事件标标志志(Event Flags) 当某任当某任务要与多个事件同步要与多个事件同步时,要使用,要使用事件事件标志。若任志。若任务需要与任何事件之一需要与任何事件之一发生同步,可称生同步,可称为独立

50、型同步独立型同步(即即逻辑或关系或关系)。任。任务也可以与若干事件都也可以与若干事件都发生了同步,生了同步,称之称之为关关联型型(逻辑与关系与关系)。独立型及关。独立型及关联型同步如型同步如图所示。所示。 图图2.15 独立型及关联型同步独立型及关联型同步 可以用可以用多个事件的多个事件的组合合发信号信号给多个任多个任务。如。如图所示,典型地,所示,典型地,8 个、个、16个或个或32个事件可以个事件可以组合在一起,取决于用的哪种合在一起,取决于用的哪种内核。每个事件占一位内核。每个事件占一位(bit),以,以32位的情位的情况况为多。多。任任务或中断服或中断服务可以可以给某一位置某一位置位或

51、复位,当任位或复位,当任务所需的事件都所需的事件都发生了,生了,该任任务继续执行,至于哪个任行,至于哪个任务该继续执行了,是在一行了,是在一组新的事件新的事件发生生时断定的断定的。也就是在事件位置位也就是在事件位置位时做判断。做判断。 2.22 任任务间务间的通的通讯讯(Intertask Communication) 有有时很需要任很需要任务间的或中断服的或中断服务与任与任务间的的通通讯。这种信息种信息传递称称为任任务间的通的通讯。任。任务间信息的信息的传递有有两个途径两个途径:通:通过全程全程变量或量或发消息消息给另一个任另一个任务。 用全程用全程变量量时,必,必须保保证每个任每个任务或中

52、断服或中断服务程序程序独享独享该变量。中断服量。中断服务中保中保证独享的唯一独享的唯一办法是关中断。如果两个任法是关中断。如果两个任务共享某共享某变量,各任量,各任务实现独享独享该变量的量的办法可以是法可以是关中断关中断再再开中断开中断,或使用信号量。或使用信号量。 问题:任:任务如何知道全局如何知道全局变量被修改?量被修改?解决方法:解决方法:v以信号量方式向任以信号量方式向任务发信号信号v该任任务以以查询方式不断周期性地方式不断周期性地查询变量量的的值v使用使用邮箱或消息箱或消息队列列 2.23 消息消息邮邮箱箱(Message Mail boxes) 通通过内核服内核服务可以可以给任任务

53、发送消息。送消息。典型的典型的消息消息邮箱箱也称作也称作交交换消息消息,是用一,是用一个个指指针型型变量量,通,通过内核服内核服务,一个任,一个任务或一个中断服或一个中断服务程序可以把一程序可以把一则消息消息(即一即一个指个指针)放到放到邮箱里去箱里去。同。同样,一个或多个,一个或多个任任务可以通可以通过内核服内核服务接收接收这则消息。消息。发送消息的任送消息的任务和接收消息的任和接收消息的任务约定,定,该指指针指向的内容就是那指向的内容就是那则消息。消息。 内核一般提供以下邮箱服务:内核一般提供以下邮箱服务:邮箱内消息的内容初始化,邮箱里最初可以有,也邮箱内消息的内容初始化,邮箱里最初可以有

54、,也可以没有消息可以没有消息将消息放入邮箱将消息放入邮箱(POST)等待有消息进入邮箱等待有消息进入邮箱(PEND)如果邮箱内有消息,就接受这则消息。如果邮箱里如果邮箱内有消息,就接受这则消息。如果邮箱里没有消息,则任务并不被挂起没有消息,则任务并不被挂起(ACCEPT),用返回代,用返回代码表示调用结果,是收到了消息还是没有收到消息。码表示调用结果,是收到了消息还是没有收到消息。消息邮箱也可以当作只取两个值的信号量来用。消息邮箱也可以当作只取两个值的信号量来用。 2.24 消息消息队队列列(Message Queue)v消息消息队列列实际上是上是邮箱箱阵列列。图图2.18 消息队列消息队列

55、2.25 中断中断 中断中断是一种硬件机制,是一种硬件机制,用于通知用于通知CPU有个异有个异步事件步事件发生了生了。中断一旦被。中断一旦被识别,CPU保存部分保存部分(或全部或全部)现场(Context)即部分或全部寄存器的即部分或全部寄存器的值,跳跳转到到专门的子程序,称的子程序,称为中断服中断服务子程序子程序(ISR)。中断服。中断服务子程序做事件子程序做事件处理,理,处理完成后,程理完成后,程序回到:序回到:v在前后台系在前后台系统中,程序回到后台程序中,程序回到后台程序v对不可剥不可剥夺型内核而言,程序回到被中断了的任型内核而言,程序回到被中断了的任务v对可剥可剥夺型内核而言,型内核

56、而言,让进入就入就绪态的的优先先级最最高的任高的任务开始运行开始运行 图2.19 中断嵌套 2.26 中断延中断延迟 所有所有实时系系统在在进入入临界区代界区代码段之段之前都要关中断,前都要关中断,执行完行完临界代界代码之后再开之后再开中断。关中断的中断。关中断的时间越越长,中断延,中断延迟就越就越长。中断延。中断延迟由下面表达式由下面表达式给出。出。 中断延中断延迟 = 关中断的最关中断的最长时间 + 开始开始执行行中断服中断服务子程序的第一条指令的子程序的第一条指令的时间 2.27 中断响中断响应应 中断响中断响应-从中断从中断发生到开始生到开始执行用行用户的的中断服中断服务子程序代子程序

57、代码来来处理理这个中断的个中断的时间。 中断响中断响应时间包括开始包括开始处理理这个中断前个中断前的全部开的全部开销。(保。(保护现场) v对前后台系前后台系统,保存寄存器以后立即,保存寄存器以后立即执行用行用户代代码,中断响,中断响应时间由下式由下式给出。出。 中断响中断响应时间 = 中断延中断延迟 + 保存保存CPU内部寄内部寄存器的存器的时间v对于不可剥于不可剥夺型内核,微型内核,微处理器保存内部寄存器理器保存内部寄存器以后,用以后,用户的中断服的中断服务子程序代子程序代码全立即得到全立即得到执行。不可剥行。不可剥夺型内核的中断响型内核的中断响应时间由下式由下式给出。出。 中断响中断响应

58、时间 = 中断延中断延迟 + 保存保存CPU内部寄内部寄存器的存器的时间 v对于可剥于可剥夺型内核,型内核,则要先要先调用一个特定的函数,用一个特定的函数,该函数通知内核即将函数通知内核即将进行中断服行中断服务,使得内核可以,使得内核可以跟踪中断的嵌套。跟踪中断的嵌套。对于于 C/OS-说来,来,这个函数个函数是是OSIntEnter(),可剥,可剥夺型内核的中断响型内核的中断响应时间由由下式下式给出:出: 中断响中断响应 中断延中断延迟 + 保存保存CPU 内部寄存器的内部寄存器的时间 + 内核的内核的进入中断服入中断服务函数的函数的执行行时间中断响中断响应是系是系统在在最坏情况最坏情况下的

59、响下的响应中断的中断的时间 2.28 中断恢复中断恢复时间时间(Interrupt Recovery)v中断恢复中断恢复时间定定义为微微处理器返回到被中理器返回到被中断了的程序代断了的程序代码所需要的所需要的时间。v前后台系前后台系统: 中断恢复中断恢复时间 = 恢复恢复CPU 内部寄存器内部寄存器值的的时间 + 执行中断返回指令的行中断返回指令的时间v不可剥不可剥夺型内核:型内核: 中断恢复中断恢复时间 = 恢复恢复CPU 内部寄存器内部寄存器值的的时间 + 执行中断返回指令的行中断返回指令的时间 v可剥可剥夺型内核在中断服型内核在中断服务子程序的末尾,子程序的末尾,要要调用一个由用一个由实

60、时内核提供的函数。内核提供的函数。C/OS-中中这个函数个函数为OSIntExit(),用于,用于判断中断是否脱离了所有的中断嵌套。判断中断是否脱离了所有的中断嵌套。 中断恢复中断恢复时间 = 判定是否有判定是否有优先先级更高的任更高的任务进入了就入了就绪态的的时间 + 恢复那个恢复那个优先先级更高任更高任务的的CPU内部寄存器的内部寄存器的时间 + 执行中断返回指令的行中断返回指令的时间 2.29 中断延中断延迟迟、响、响应应和恢复和恢复图图2.20 中断延迟、响应和恢复中断延迟、响应和恢复(前后台模式前后台模式) 图图2.21 中断延迟、响应和恢复中断延迟、响应和恢复(不可剥夺型内核不可剥

61、夺型内核) 图图2.22 中断延迟、响应和恢复中断延迟、响应和恢复(可剥夺型内核可剥夺型内核)返回返回被中被中断的断的任务任务运行因运行因中断而中断而进入就进入就绪态的绪态的优先级优先级最高的最高的任务任务 2.30 中断中断处处理理时间时间v中断服中断服务的的处理理时间应该尽可能的短,但尽可能的短,但是是对处理理时间并没有并没有绝对的限制。的限制。v如果中断服如果中断服务是在任何是在任何给定的定的时间开始,开始,且中断服且中断服务程序代程序代码是是应用程序中最重要用程序中最重要的代的代码,则中断服中断服务需要多需要多长时间就就应该给它多它多长时间。v大多数情况下,中断服大多数情况下,中断服务

62、子程序子程序应识别中中断来源,从叫中断的断来源,从叫中断的设备取得数据或状取得数据或状态,并通知真正做并通知真正做该事件事件处理的那个任理的那个任务。通知一个任务去做事件通知一个任务去做事件处理所花的时间比处理处理所花的时间比处理这个事件所花的时间还这个事件所花的时间还多,如何处理?多,如何处理?在中断服务子程序中做在中断服务子程序中做事件处理并在中断服务事件处理并在中断服务子程序中开中断,以允子程序中开中断,以允许优先级更高的中断打许优先级更高的中断打入并优先得到服务。入并优先得到服务。 2.31 非屏蔽中断非屏蔽中断(NMI)v中断服中断服务对时间要求非常要求非常严格,在格,在这种情况下可

63、种情况下可以使用以使用非屏蔽中断非屏蔽中断,绝大多数微大多数微处理器有非屏蔽理器有非屏蔽中断功能。中断功能。v留做留做紧急急处理用理用(如断(如断电时保存重要的信息)。保存重要的信息)。如果如果应用程序没有用程序没有这方面的要求,非屏蔽中断可方面的要求,非屏蔽中断可用于用于时间要求最苛刻的中断服要求最苛刻的中断服务。v在非屏蔽中断的中断服在非屏蔽中断的中断服务子程序中,子程序中,不能使用内不能使用内核提供的服核提供的服务,因,因为非屏蔽中断是关不掉的,故非屏蔽中断是关不掉的,故不能在非屏蔽中断不能在非屏蔽中断处理中理中处理理临界区代界区代码。 2.32 时钟节时钟节拍拍(Clock Tick)

64、v时钟节拍拍是特定的周期性中断是特定的周期性中断。这个中断可以看个中断可以看作是系作是系统心心脏的脉的脉动。中断之。中断之间的的时间间隔取决隔取决于不同的于不同的应用,一般在用,一般在10mS 到到200mS 之之间。时钟的的节拍式中断使得内核可以将任拍式中断使得内核可以将任务延延时若干个若干个整数整数时钟节拍,以及当任拍,以及当任务等待事件等待事件发生生时,提,提供等待超供等待超时的依据。的依据。时钟节拍率越快,系拍率越快,系统的的额外开外开销就越大。就越大。v各种各种实时内核都有将任内核都有将任务延延时若干个若干个时钟节拍的拍的功能功能。然而。然而这并不意味着延并不意味着延时的的精度精度是

65、是1 个个时钟节拍,只是在每个拍,只是在每个时钟节拍中断到来拍中断到来时对任任务延延时做一次裁决而已。做一次裁决而已。 图2.25 将任务延迟一个时钟节拍(第一种情况) 图2.26 将任务延迟一个时钟节拍(第二种情况) 图2.27 将任务延迟一个时钟节拍(第三种情况) 2.33 对存存储器的需求器的需求v前后台系前后台系统:对存存储器容量的需求器容量的需求仅仅取取决于决于应用程序代用程序代码。v多任多任务内核:内核本身需要内核:内核本身需要额外的代外的代码空空间(ROM)。内核的大小取决于多种因素,。内核的大小取决于多种因素,取决于内核的特性,从取决于内核的特性,从1K到到100K字字节都是都

66、是可能的。可能的。 总代代码量量 = 应用程序代用程序代码 + 内核代内核代码 v因因为每个任每个任务都是独立运行的,必都是独立运行的,必须给每每个任个任务提供提供单独的独的栈空空间(RAM)。v系系统栈专门用于用于处理中断理中断级代代码。v每个任每个任务所需的所需的栈空空间大小可以分大小可以分别定定义或要求相同。或要求相同。 v如果内核不支持如果内核不支持单独的中断用独的中断用栈,总的的RAM 需求由下列表达式需求由下列表达式给出。出。RAM 总需求需求 = 应用程序的用程序的RAM需求需求 + (任任务栈需求需求 + 最大中断嵌套最大中断嵌套栈需求需求) * 任任务数数v如果内核支持中断用如果内核支持中断用栈分离,分离,总RAM需求需求量由下列表达式量由下列表达式给出。出。RAM总需求需求 = 应用程序的用程序的RAM需求需求 + 内核数据区的内核数据区的RAM需求需求 + 各任各任务栈需求之需求之总和和 + 最多中断嵌套之最多中断嵌套之栈需求需求 表表2.2 实时系统小结实时系统小结

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号