第2章-嵌入式操作系统中的基本概念汇总ppt课件.ppt
-
资源ID:19232545
资源大小:1.12MB
全文页数:83页
- 资源格式: PPT
下载积分:20金币
快捷下载
会员登录下载
微信登录下载
三方登录下载:
微信扫一扫登录
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
第2章-嵌入式操作系统中的基本概念汇总ppt课件.ppt
第2章 嵌入式操作系统中的基本概念本章内容2.1 前后台系统前后台系统2.2 调度调度 2.3 临界区临界区 2.4 进程与线程进程与线程2.5 任务与多任务任务与多任务 2.6 任务切换任务切换 2.7 死锁死锁 2.8 不可剥夺型内核不可剥夺型内核 2.9 可剥夺型内核可剥夺型内核 2.10 可重入性可重入性 2.11 优先级反转优先级反转 2.12 事件事件 2.13 互斥互斥 2.14 同步同步 2.15 通信通信 2.16 对存储器的要求对存储器的要求 习题习题 2.1 前前后后台台系系统统n前后台系统的组成:前台和后台程序n后台:是一个无限循环的应用程序,循环中调用相应的任务函数完成相应的操作,各个任务依次运行,没有调度,运行的次序不能改变。n前台:是中断服务程序,处理异步事件。n前后台系统 n适用情形: 一般不复杂且实时性要求不高的小系统很适合采用前后台系统,例如微波炉、电话机、玩具等。 在另外一些基于省电的应用中,由于平时微处理器处在停机状态,所有的事都靠中断服务来完成,因此也常常采用前后台系统模式。2.2 调调 度度n调度:是内核的主要职责之一,它为任务分配资源和时间,决定任务运行的次序,从而使系统满足特定的性能要求。调度算法:有先来先服务(FCFS)、优先级法(Priority)、轮转法(Round-Robin)等。调度方式:有可剥夺型(占先式)和不可剥夺型(非占先式)。多数实时内核是基于优先级调度的多种方法的复合。先来先服务(FCFS)调度算法n将任务按提交顺序或变为就绪状态的先后排成队列,并按照先来先服务的方式进行调度处理。优先考虑在系统中等待时间最长的作业,而不管要求运行时间的长短。轮转法(RR)n过程描述:程序就绪队列往往按进程到达的时间来排序。进程调度程序总是选择就绪队列中的第一个进程,也就是说按照先来先服务原则调度,但一旦进程占用处理机则仅使用一个时间片。在使用先一个时间片后,进程还没有完成其运行,它必须释放出处理机给下一个就绪的进程,而被抢占的进程返回到就绪队列的末尾重新排队等待再次运行。2.3 临临 界界 区区n临界资源:任何时候都只允许一个任务访问的资源。n临界区或临界段:用于访问临界资源的代码段。n临界代码段不允许多个并发任务交叉执行,否则会产生严重后果,比如进入中断后的现场保护代码等。n为确保临界区代码的安全执行,在进入临界区之前要关中断,而临界区代码执行完以后要立即开中断2.4 进进程程与与线线程程n2.4.1 进程的概念进程的概念进程的提出:为了充分利用系统资源,提高CPU效率,采用多道程序设计技术,即指允许多个程序同时驻留计算机内存并运行。程序的并发运行:代替了原来程序的顺序运行。n各个程序之间由于需要使用共享系统资源,往往存在相互制约的关系n程序的活动也不再处于一个封闭的系统内,而是出现了许多新的特征,即独立性、并发性、动态性和相互制约性n进程的定义:(1) E.W.Dijkstra定义:行为的一个规则叫做程序,程序在处理器上执行时所发生的活动叫做进程。 (2) Madnick和Donovan定义:进程是可以与其它进程并发执行的计算部分。 (3) J.H.Saltzer定义:一个进程是由伪处理机执行的一个程序。n进程通常由三部分组成:程序、数据集合和进程控制块。n进程具有两种属性:可拥有资源的独立单位;可以独立调度和分配的基本单位。2.4.2 线程的概念线程的概念n需求:随着计算机技术的飞速发展,人们逐步发现进程拥有较多的资源,在创建、撤销和切换的过程中,系统为之付出的开销还是很大。n办法:将进程的两个属性分离开来,由操作系统分别处理,使具有调度和分配属性的基本单元不再拥有独立的资源,使之轻装运行,而拥有独立资源的基本单位,又不频繁地进行切换。n产生:20世纪80年代中期提出了比进程更小的独立运行单位线程的概念。n线程的特性:是进程中的一个实体,是CPU调度和分配的基本单位基本上不拥有资源,只拥有维持运行的最少资源(如寄存器、堆栈、程序计数器等)进程可以独立运行,同一进程可以拥有多个线程,每个线程都可以共享同一进程中的所有资源,线程可以在进程中并发执行,但不能脱离进程独立运行。2.5 任务与多任务任务与多任务n任务:在不同的应用领域具有不同的意义,它既可以是一个独立装载的程序,也可以是全部程序中的一段。在实时操作系统中,有时会用线程或者进程来替代任务。n嵌入式实时操作系统的任务:大多数嵌入式系统不具备担负面向进程操作系统的内存开销,小的微处理器也不具备支持面向进程操作系统的硬件结构绝大多数嵌入式实时操作系统的任务都采用了线程模式。n多任务:是指用户可以在同一时间内运行多个应用程序,每个应用程序就是一个任务。对于单CPU系统来说,由于CPU不能在同一时刻运行多个程序,因此多任务只是在宏观上看起来像是并发运行,而在微观上各个任务还是串联执行的。n任务控制块:多任务操作系统的核心是系统调度器,它使用任务控制块(Task Control Block,TCB)来管理任务调度功能。nTCB用来保存任务的当前状态、优先级、要等待的事件或资源、任务程序代码的起始地址、初始堆栈指针等信息。n一旦任务建立,TCB就被赋值当任务的CPU使用权被剥夺时,TCB用来保存该任务的状态;当任务重新得到CPU使用权时,该任务的信息将从它的TCB中取出,放入各个寄存器中。n图2.2 多任务n实时应用程序设计的关键:就是确定如何把问题分割成多个任务,以及如何确定每个任务的优先级和任务之间的通信。n任务的状态:每个任务都是一个无限的循环,每个任务都处在休眠态、就绪态、运行态、挂起态(等待某一事件发生)和被中断态等五种状态之一。休眠态:是指任务驻留在内存中,还没有交给内核管理,不被多任务内核所调度。就绪态:是指任务已经做好了运行的准备,可以运行,但由于有更高优先级的任务正控制着CPU的使用权,因此该任务暂时还不能运行。运行态:是指任务控制了CPU的使用权,正在运行中。挂起态:也叫做等待事件态,指任务在等待某一事件的发生,例如等待某外设的I/O操作,等待某共享资源的释放,等待定时脉冲的到来,或等待超时信号的到来以结束目前的等待状态,等等。被中断态:是指发生中断时,CPU转入相应的中断服务,原来正在运行的任务暂时放弃CPU的使用权,就进入了被中断状态。2.6 任任 务务 切切 换换n任务切换(Context Switch或者Task Switch) 即CPU寄存器内容切换。实际上是模拟一次中断过程,从而实现CPU使用权的转移。n任务栈:每个任务自己独立的堆栈,用于保存任务的当前状态和所有寄存器内容。n任务切换过程:当内核决定运行另一个任务时,首先入栈,将当前任务用到的所有寄存器内容以及当前状态保存到自己的任务栈中去,然后像中断返回一样,将下一个将要运行的任务的所有寄存器内容和状态从该任务的任务栈中弹出,重新装入CPU的寄存器,任务即恢复到挂起前的状态,并开始执行。n任务切换时间:任务切换所需要的时间,它取决于CPU有多少寄存器要进出堆栈。任务切换过程增加了CPU的额外负荷,CPU的内部寄存器越多,额外负荷就越重。实时内核的性能不应该以每秒钟能做多少次任务切换来评价。2.7 死死 锁锁n死锁:又称抱死,是指两个或者更多的任务相互等待对方占有的资源而无限期地僵持下去的局面。n例如:任务A正独享资源R1,任务B正在独享资源R2,而此时任务A又要独享资源R2,任务B也要独享资源R1,于是哪个任务都无法继续执行了,死锁就发生了。n产生死锁的根本原因:系统资源不足任务运行推进的顺序不合理资源分配不恰当等。n死锁产生有四个必要的条件: 互斥条件,系统中某些资源只能独占使用; 非抢占条件,系统中某些资源仅能被它的占有者所释放,而不能被别的任务强行抢占; 占有并等待条件,系统中的某些任务已占有了分给它的资源,但仍然等待其它资源; 循环等待条件,系统中由若干任务形成的环形请求链,每个任务均占有若干种资源中的某一种,同时还要求(链上)下一个任务所占有的资源。n死锁预防:打破产生死锁的四个必要条件中的一个或几个。 n预防死锁的策略:资源预先分配策略、资源有序分配策略。 (1) 资源预先分配策略:打破占有且申请条件,任务在运行前一次性地向系统申请它所需要的全部资源,如果所请求的全部资源得不到满足,则不分配任何资源,此任务暂不运行。 (2) 资源有序分配策略:打破循环等待条件,把资源事先分类编号,按序分配,使任务在申请、占用资源时不会形成环路。 2.8 不可剥夺型内核不可剥夺型内核n不可剥夺型内核:Non-Preemptive Kernel,运行的任务占有CPU的绝对使用权,若不自我放弃,准备就绪的高优先级任务不能抢占CPU的使用权。n它的中断处理:正在运行的任务允许中断打入,中断服务可以使任务由挂起状态变为就绪状态,但中断服务完成以后CPU的使用权还得还给原先被中断了的任务,直到该任务主动释放CPU,准备就绪的高优先级任务才能获得使CPU的使用权。n图2.3 不可剥夺型内核运行示意图运行过程:n(1) 低优先级任务正在运行时,有一个异步事件发生,中断打入。(2) 如果此时中断是开放的,则CPU进入中断服务子程序。(3) 假设中断服务子程序使一个更高优先级的任务进入就绪态。(4) 中断服务完成后,应用程序返回到原来被中断的任务。(5) 继续执行被中断的任务,该任务完成后,调用内核服务函数释放CPU控制权。(6) 准备就绪的高优先级任务获得CPU的使用权。 (7) 高优先级任务开始处理中断服务所标识的异步事件。n不可剥夺型内核的优点: 中断响应时间快,它不像可剥夺型内核要调用内核函数通知内核进入中断服务子程序; 由于采用了优先级调度法,因此任务级响应比前后台系统快得多,任务级响应时间取决于最长的任务执行时间; 由于正在运行的任务占有CPU,而不必担心被别的任务抢占,因此在任务级,不可剥夺型内核允许使用不可重入函数。n不可剥夺型内核的最大缺陷:任务响应时间慢,准备就绪的高优先级任务也许要等很久,直到当前运行着的任务释放CPU才能运行。n不可剥夺型内核的任务级响应时间要优于前后台系统,但仍是不可知的。商业软件几乎没有不可剥夺型内核。2.9 可剥夺型内核可剥夺型内核n可剥夺型内核:一旦有更高优先级的任务准备就绪,当前正在运行的低优先级任务的CPU使用权就立即被剥夺,该任务转为就绪态或挂起态,CPU的使用权移交给那个更高优先级的任务。n被中断的任务处理:如果中断服务使得一个高优先级任务准备就绪,那么中断服务完成后,被中断的任务将被挂起,高优先级的任务继续运行。n图2.4 可剥夺型内核运行示意图运行过程:n(1) 低优先级任务正在运行时,有一个异步事件发生,中断打入。(2) 若此时中断是开放的,则CPU转入中断服务子程序。(3) 假设中断服务子程序使一个更高优先级的任务进入就绪态。(4) 中断服务完成后,应用程序不再返回到原来被中断的任务,而是执行准备就绪的高优先级任务。中断返回到哪个任务,是由一个内核函数决定的。(5) 高优先级任务开始处理中断服务子程序所标识的异步事件。n(6) 高优先级任务执行完毕以后挂起,内核进行任务切换。n(7) 若此时没有比原来被中断的那个任务优先级更高的任务准备就绪,则被中断的任务将重新获得CPU的使用权;若有更高优先级的任务准备就绪,那么CPU将运行这个更高优先级的任务。n可剥夺型内核的优势:CPU的使用权是可预测的和可确定的,可使任务级响应得以优化。n使用可剥夺型内核时要注意:应用程序最好不要直接使用不可重入型函数;若确需使用不可重入型函数,则可用互斥条件来保护,这可以用互斥型信号量来实现。nC/OS-以及绝大多数商业实时内核都是可剥夺型内核。2.10 可可 重重 入入 性性n可重入(Reentrant)型函数:是指可以被多个任务并发使用,而数据不会遭到破坏的函数。n可重入型函数特征:只使用局部变量,变量保存在CPU寄存器或堆栈中,可以在任意时刻被中断,再重新恢复运行时,数据不会被破坏;若使用全局变量,则需满足互斥条件。可重入型函数实例n程序清单程序清单2.1 可重入型函数实例可重入型函数实例void func1(int* x, int* y) int temp; temp = *x; *x = *y;*y = temp;n程序清单程序清单2.2 不可重入型函数清单不可重入型函数清单static int temp;void func2(int* x, int* y) temp = *x; *x = *y;*y = temp; n讨论:假定函数func2()可以为任务TASK A和TASK B所调用,内核是可剥夺型的,且中断始终是开放的,temp定义为静态整数全局变量,其运行示意图如图2.5所示,过程简要说明如下:(1) 假设低优先级任务TASK A正在调用函数func2(),此时有中断打入。(2) 中断使高优先级任务TASK B准备就绪。(3) 中断退出后,CPU控制权被任务TASK B所抢占,TASK B也调用函数func2()。n(4) 任务TASK B执行完毕后挂起,此时变量temp=3。(5) 任务TASK A重新控制CPU,当func2()执行完毕后,y=3,正确的应该是1。n图2.5 不可重入型函数运行示意图n使用以下技术之一可使函数func2()具有可重入性:(1) 将temp定义为局部变量,如程序清单2.1所示;(2) 在调用前,禁止中断,执行完毕后再开中断;(3) 在调用过程中,应用信号量独占使用该函数。2.11 优优先先级级反反转转n任务的优先级:每个任务都有自己的优先级。任务越重要,赋予的优先级应越高。C/OS-任务的优先级也是任务的唯一标识。n静态优先级:是指任务在创建时就确定了的、且运行过程中不再动态改变的优先级。在静态优先级系统中,各个任务以及它们的时间约束在程序编译时是已知的。n动态优先级:是指应用程序在执行过程中,任务的优先级可以根据需要而改变的优先级。可剥夺型实时内核常常会出现优先级反转的问题,优先级反转会造成任务调度的不确定性,严重时可能导致系统崩溃。n优先级反转(Priority Inversion):是指一个任务等待比它优先级低的任务释放资源而被阻塞,如果这时有中等优先级的就绪任务,阻塞会进一步恶化。详细说明如下:(1) 低优先级任务C取得CPU的使用权,处于运行状态。n(2) 此时,任务C得到一个信号量,获得共享资源的使用权,继续运行。(3) 此时,任务A准备就绪,由于它的优先级高,因此剥夺了任务C的CPU使用权。(4) 任务A处于运行状态,任务C不能运行,但处于就绪状态。(5) 此时,任务A也要访问共享资源,申请信号量,但由于任务C还没有释放信号量,因此任务A因等待信号量而被挂起。(6) 此时,因没有更高优先级任务准备就绪,所以任务C立即转入运行态。n(7) 此时,中等优先级任务B准备就绪,它的优先级比任务C高,从而剥夺了任务C的CPU使用权。n(8) 任务B获得CPU使用权,处于运行状态,任务C转入就绪态,但不能运行。(9) 任务B挂起,任务C再次转入运行态。(10) 低优先级任务处于运行态。(11) 任务C共享资源访问完毕,释放信号量。(12) 任务A获得信号量得以继续运行。n图2.6 优先级反转原理示意图n纠正方法:在任务C使用共享资源时,提升其优先级,任务完成时予以恢复,任务C的优先级必须升至高于允许使用该资源的任何任务。然而改变任务的优先级时间开销很大,且优先级反转并非时时发生,这样做无形中浪费了很多CPU时间。2.12 事事 件件n事件(Event):一个任务或者中断服务子程序可以通过内核服务来向另外的任务发信号,这里所有的信号都被看成是事件。n事件类型:信号量、互斥信号量、消息邮箱、消息队列、事件标志组等。 2.12.1 信号量信号量n信号量信号量信号与信号量在英文中都是同一个词Semaphore,并不加以区别。是一种通信机制。 主要用来实现任务间同步以及标识某类资源的可用个数。n两种类型: 只取0和1两个值的二值(Binary)信号量,这种信号量也称为信号; 由若干位组合而成的计数式(Counting)信号量,一般有8位、16位或者32位等若干种,具体是多少位取决于内核。n起源:20世纪60年代中期荷兰著名计算机科学家Edgser Dijkstra把互斥的关键含义抽象成信号量概念,并引入信号量上的P、V操作作为同步原语(P、V是荷兰语“等待”和“发信号量”两个单词的第一个字母)。n作用: 满足互斥条件,实现共享资源的独占使用; 标志某事件的发生; 使两个任务的行为同步。工作原理:n(1) 初始化(INITIALIZE)信号量,也可称为建立(CREATE)信号量。信号量初始化时,要给信号量赋初值,等待信号量的任务列表应清空。n(2) 等信号(P操作)或申请信号量,可称做挂起(PEND)。对于执行等待信号量的任务来说,若该信号量有效,则信号量值减1,任务继续执行;若信号量值为0,则任务继续被挂起。若内核允许定义等待超时,则超时后,该任务转入就绪,同时返回错误代码以示发生了超时错误。n(3) 给信号(V操作),可称做发信号(POST)。若没有任务等待该信号量,则信号量的值仅简单加1;若只有一个任务等待该信号量,则该任务转入就绪状态,信号量的值不加1;若有多个任务等待信号量,至于谁先得到信号量,那就要看内核是如何调度的了。一般有两种可能:n一是按优先级原则,等待信号量的任务中优先级最高的先得到;n二是按先进先出的原则,最早开始等待信号量的那个任务先得到。nC/OS-只支持优先级法。信号量的一般表示方法n如果信号量用于表示对共享资源的访问就用钥匙符号,数字N表示可用资源数,二值信号量N = 1;n如果信号量用于表示某事件的发生和同步,就用旗帜符号,数字N表示事件已经发生的次数;n小沙漏表示定义的超时计时器,旁边的数字表示设置的超时时限,单位是时钟节拍。2.12.2 消息邮箱消息邮箱n邮箱:是一种通信机制,可以使一个任务或者中断服务子程序向另一个任务发送一个指针型变量,该指针指向一个包含了特定“消息”的数据结构。邮箱发送的不是消息本身,而是指向消息的指针,指针指向的内容就是那则消息。n消息邮箱的工作原理:邮箱在初始化时建有一个等待消息的任务列表,若邮箱为空,则等待消息的任务挂起,且被加入到等待消息的任务列表中。一旦邮箱收到消息,则等待任务列表中优先级最高的任务或最先等待消息的任务得到消息,且转入就绪并从任务列表中清除。n等待超时:一般地,内核允许用户定义等待超时。若等待消息超时,仍然没有收到消息,则任务转入就绪,并返回出错信息,报告等待超时错误。n邮箱服务: 邮箱初始化,或邮箱建立; 发消息给邮箱(POST); 等待消息进入邮箱(PEND); 无等待请求邮箱消息(ACCEPT)。n用途:消息邮箱可以用来标识一个事件的发生,也可以当作只取两个值的信号量用。消息邮箱的一般表示方法2.12.3 消息队列消息队列n消息队列:是一种以消息链表的方式进行通信的机制,它可以使一个任务或者中断服务子程序向另一个任务发送以指针方式定义的变量,指针指向的内容就是那则消息。消息队列本质上是一个邮箱阵列。n工作原理:消息队列在初始化时建有一张等待消息的任务列表,如果消息队列为空,等待消息的任务就被挂起并加入到等待消息的任务列表中。一旦队列中有消息进入,该消息传给等待消息的任务中优先级最高的那个任务,或是最先进入等待任务列表的那个任务,最后进入的那个任务,具体传递给谁,或是取决于内核定义的机制。n等待超时的处理:内核允许消息队列定义等待超时时限,如果限时内任务没有收到消息,则该任务转入就绪态,同时返回出错代码并指出出现等待超时错误。n消息队列服务: 消息队列初始化; 放一则消息到队列中去(POST); 等待一则消息的到来(PEND); 无等待请求消息。消息队列的一般表示方法 两个大写的字母I表示消息队列,数字“10”表示消息队列最多可以放10则消息,沙漏旁边的0表示任务没有定义超时,将无限等待,直至收到消息。2.12.4 事件标志组事件标志组n事件标志组:是一种多个事件组合的通信机制,主要用于一个任务与多个事件的同步。n独立型同步:Disjunctive Synchronization,即逻辑或关系,指任务需要与多个事件之一发生同步n关联型同步:即逻辑与关系,指任务需要与多个事件都发生同步。n组合:可以用多个事件的组合发信号给其它一个或多个任务。事件标志组可以是8个、16个或32个事件的组合,每个事件占1位。中断或任务可以给某一事件置位和清零。当任务所期望的事件都发生时,该任务转入就绪态C/OS-目前支持事件标志组。2.13 互互 斥斥n互斥:独占使用资源的方法。互斥的本质是为了有序地利用资源。满足互斥的方法有:禁止中断、禁止抢占、利用信号量和测试并置位等。禁止中断方法示例禁止中断方法示例n用禁止中断方法实现互斥程序用禁止中断方法实现互斥程序void Function (void)关中断;处理共享资源;开中断;nC/OS-内核在处理大部分内部变量和数据结构时使用的就是这种方法,它提供了关中断(OS_ENTER_ CRITICAL()和开中断(OS_EXIT_CRITICAL()两个宏调用,以方便用户利用C代码开关中断。n利用利用C/OS-宏调用关中断和开中断的程序宏调用关中断和开中断的程序void Function(void)OS_ENTER_CRITICAL();/宏调用,关中断处理共享数据;OS_EXIT_CRITICAL(); /宏调用,开中断n说明:禁止中断这种互斥方法是在中断服务子程序中处理共享变量或共享数据结构的唯一手段,当改变或者复制某些变量、结构的值时,这也是一个好方法。n缺点:增大了中断延迟时间,可能影响到系统的实时性。在任何情况下,应该使中断禁止的时间尽量短,这也是所有实时系统的基本要求。2.13.2 禁止抢占禁止抢占n禁止抢占:禁止抢占:如果任务不与中断服务子程序共享变量或数据结构,则可以使用先禁止然后允许任务切换(调度)的手段来实现互斥。n以C/OS-的使用为例:在处理共享资源时,先禁止调度,处理完毕后允许调度。虽然任务切换禁止了,但中断还是开放的,如果此时有中断打入,中断服务子程序会立即执行。中断服务结束时,不管是否有更高优先级的任务准备就绪,内核都会把CPU的使用权交还给被中断了的那个任务,直到共享资源处理完毕且允许任务切换后,准备就绪的高优先级任务才能得到CPU的使用权。这种机制比禁止中断方法要弱一些。利用禁止调度方法实现互斥的程序利用禁止调度方法实现互斥的程序nvoid Function (void) OSSchedLock(); /内核函数,调度上锁 处理共享数据(中断是开放的); OSSchedUnlock();/内核函数,调度解锁2.13.3 信号量信号量n利用信号量访问共享资源示例:假设允许两个任务同时向共享串口发送数据,任务A要输出1、2、3,任务B要输出4、5、6,若不满足互斥条件,串口会交叉输出两个任务的数据,可能的结果是“1、4、2、5、3、6”。使用二值信号量并给信号量赋初值1,要想访问串口的任务,首先请求信号量,得到该资源的访问权。谁先得到,谁先使用。2.13.4 测试并置位测试并置位n测试并置位: Test and Set,TAS,当两个任务共享一个资源时,设置一个全局标志变量并约定在访问共享资源以前先测试标志变量是否为1:若为1则表明共享资源正在被其它任务所访问,该任务继续等待直到标志变量为0;若标志变量为0,则任务将标志变量置位,然后访问共享资源,访问完毕后再清标志变量。若置位和清零标志变量只需一条不会被中断的语句,不需要用开关中断的方法来保护对标志变量的操作,否则在操作前后还要使用禁止与允许中断,以免标志变量被破坏。n图2.13 TAS方法流程图2.14 同同 步步n同步:在实时系统中,一个工作的完成往往需要多个任务或者多个任务与多个中断共同完成,它们之间必须相互配合、协调动作,甚至交换信息,这就要用到同步技术。n同步情形:可以是任务与任务之间的同步,也可以是任务与中断之间的同步,但中断不能与任务同步。n同步方式:单向同步(Unilateral Rendezvous)和双向同步(Bilateral Rendezvous)。n常用的同步方法:信号量、事件标志组、消息邮箱、消息队列等。n单向同步:是指一个任务只与一个任务或者一个中断同步。从一个任务或一个中断服务子程序向另外一个任务发一个信号量,该任务得到信号量后转入运行态,继续执行,这就是单向同步。n双向同步:两个任务以两个信号量同步它们之间的行为。任务A发一个信号量给任务B,且申请信号量挂起,任务B得到信号量后继续运行,运行到某处,再发一个信号量给任务A,自身挂起,任务A获得信号量后再度继续运行。任务与中断服务之间不能用双向同步。2.15 通通 信信n通信:指任务与任务之间或者任务与中断服务之间的信息传递任务间的通信机制是多任务之间相互同步和协调各活动的主要手段。n任务间信息的传递有两个途径:通过全程变量或发消息给另一个任务。常用的通信方法:全局变量、信号量、消息邮箱、消息队列、事件标志组和内存块。通信若干注意事项:n使用全局变量时,必须保证每个任务或中断服务子程序独占该变量,即满足互斥。n中断服务子程序中保证独占的唯一办法:是关中断。n任务与中断服务子程序通信的唯一方法:只有全局变量。而全局变量被中断服务子程序修改了,可以考虑使用邮箱、队列、信号量等通知任务,或者任务以查询方式不断地查询变量的值。n多任务之间共享全局变量并实现独占的办法:可以是满足互斥的各种方法。 2.16 对存储器的要求对存储器的要求2.16.1 代码存储器的需求代码存储器的需求n前后台系统对存储器(ROM)容量的需求:很简单,仅仅取决于应用程序代码。n多任务内核对存储器容量需求:不仅取决于应用程序,而且还取决于内核本身所需的代码空间。内核的大小取决于自身的特性,从1100 KB都有可能。用于8位CPU且仅提供任务调度、任务切换、信号量处理、延时及超时定义等服务的最小内核,也需要13 KB代码空间。代码空间总需求量由下式给出:代码空间总需求量=应用程序代码+内核代码2.16.2 数据存储器的需求数据存储器的需求n栈空间:应根据任务中局部变量、数据结构、消息队列、消息邮箱、信号量、函数调用、中断嵌套、堆栈、内部寄存器的数量等计算RAM的多少,使之尽可能地接近实际需求。n任务栈和系统栈:若任务栈和系统栈(一般专门用于处理中断级代码)可以分离,则可以大大减少每个任务需要的栈空间。n如果内核不支持单独的中断用栈,则RAM总需求量由下式给出:n如果内核支持中断用栈分离,则RAM总需求量由下式给出:n为减少对RAM的需求量,特别要注意以下几点:(1) 定义局部变量、大型数组和数据结构所需要的栈空间;(2) 函数嵌套所需要的栈空间;(3) 中断嵌套所需要的栈空间;(4) 库函数需要的栈空间;(5) 多变元函数调用所需要的栈空间。n比较:多任务系统比前后台系统需要更多的代码存储器空间和数据存储器空间,额外的代码空间取决于内核的大小,RAM的需求量取决于系统中的任务数量。 习习 题题n1. 什么是资源和共享资源?什么是临界资源和临界区?2. 什么是任务、进程、线程和多任务?任务有哪几种状态?3. 什么是任务切换?4. 什么是死锁?死锁如何产生,如何预防?5. 什么是不可剥夺型内核?它有何优缺点?请简要说明运行过程。6. 什么是可剥夺型内核?它有何优缺点?请简要说明运行过程。n7. 什么是可重入性?8. 什么是优先级反转?解决的方法是什么?9. 什么是事件?常用的事件有哪几种?什么是消息邮箱、消息队列、信号量?10. 互斥的作用是什么?互斥一般有哪几种方法?它们各有何优缺点? 11. 什么是同步?同步有哪几种方法?12. 任务间的通信有哪几种方法?13. 实时内核与前后台系统对存储器的需求如何?