




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、嵌入式实时操作嵌入式实时操作系统原理系统原理IIOS-/C参考教材:参考教材:嵌入式实时操作系统嵌入式实时操作系统C/OSII 北航出版社,北航出版社, 邵贝贝等译邵贝贝等译嵌入式实时操作系统嵌入式实时操作系统C/OSII原理及应用原理及应用 北航出版社,任哲北航出版社,任哲 编编嵌入式实时操作系统嵌入式实时操作系统C/OS原理与实践原理与实践 电子工业出版社,卢有亮电子工业出版社,卢有亮 编著编著概概 论论v嵌入式实时操作系统嵌入式实时操作系统(RTOS)是嵌入式系统设计是嵌入式系统设计的一个平台。其最重要的优点就是将系统开发人的一个平台。其最重要的优点就是将系统开发人员从繁杂的硬件及时序管
2、理中解放出来,而更多员从繁杂的硬件及时序管理中解放出来,而更多地关注于问题的解决。地关注于问题的解决。v现在流行的商业嵌入式实时操作系统种类繁多,现在流行的商业嵌入式实时操作系统种类繁多,但源码开放的并不多,只有少数几个,如:但源码开放的并不多,只有少数几个,如:v LinusIIOS /Cv1、 C/OSMicro Controller O S,微,微控制器操作系统控制器操作系统v2、 C/OS简介简介v美国人美国人Jean Labrosse 1992年完成年完成v应用面覆盖了诸多领域,如照相机、医疗应用面覆盖了诸多领域,如照相机、医疗器械、音响设备、发动机控制、高速公路器械、音响设备、发动
3、机控制、高速公路电话系统、自动提款机等电话系统、自动提款机等 v1998年年 C/OS-II,目前的版本,目前的版本 C/OS -II V2.91v2000年,得到美国航空管理局(年,得到美国航空管理局(FAA)的)的认证,可以用于飞行器中认证,可以用于飞行器中uC/OS的商业应用的商业应用v全世界有数百种产品在应用全世界有数百种产品在应用:vAvionicsvMedicalvCell phonesvRouters and switchesvHigh-end audio equipmentvWashing machines and dryersvUPS (Uninterruptible Pow
4、er Supplies)vIndustrial controllersvGPS Navigation SystemsvMicrowave RadiosvInstrumentationvPoint-of-sale terminalsv更多更多公开源代码公开源代码可移植性:主要内核由可移植性:主要内核由ANSI C编写,只有极少的部分采用了汇编。编写,只有极少的部分采用了汇编。可固化:只要有合适的开发调试工具,即可实现固化可固化:只要有合适的开发调试工具,即可实现固化可裁剪:可在应用程序中使用必要的可裁剪:可在应用程序中使用必要的uC/OS-II系统服务系统服务可剥夺:即总是运行优先级最高的任务。
5、可剥夺:即总是运行优先级最高的任务。多任务:可以管理多任务:可以管理64个不同的任务,留给用户的可达个不同的任务,留给用户的可达56个个可确定性:即任务执行时间的可确定性可确定性:即任务执行时间的可确定性任务栈管理:各任务具有自己独立的任务栈任务栈管理:各任务具有自己独立的任务栈系统服务:提供了丰富的系统服务例如邮箱、消息队列、信号量、系统服务:提供了丰富的系统服务例如邮箱、消息队列、信号量、块大小固定的内存的申请与释放、时间相关函数等。块大小固定的内存的申请与释放、时间相关函数等。中断管理:嵌套层数可达中断管理:嵌套层数可达255层层稳定性与可靠性稳定性与可靠性IIOS /C的特点:的特点:
6、其他参考资料其他参考资料v嵌入式实时操作系统嵌入式实时操作系统 影印件网址:影印件网址:v v其他资料:其他资料: IIOS /C第一章第一章 实时系统概念实时系统概念分类分类软实时:要求各任务尽可能快的执行,但不限定某一任软实时:要求各任务尽可能快的执行,但不限定某一任 务在特定时间内完成。务在特定时间内完成。硬实时:各任务要求做到准时、无误地执行硬实时:各任务要求做到准时、无误地执行现在流行的实时操作系统多为二者的结合。现在流行的实时操作系统多为二者的结合。操作系统的功能:操作系统的功能:管理计算机,提供对计算机底层硬件的管理(驱动)与接口管理计算机,提供对计算机底层硬件的管理(驱动)与接
7、口(系统服务)(系统服务)在操作系统的支持下,用户开发程序的重点放在任务的实现上。在操作系统的支持下,用户开发程序的重点放在任务的实现上。嵌入式实时系统:嵌入到计算机(如嵌入式实时系统:嵌入到计算机(如ARM、DSP、MCU)内部)内部本章主要内容:嵌入式实时操作系统的基本概念本章主要内容:嵌入式实时操作系统的基本概念1.00 前后台系统前后台系统v前后台系统多用在简单的以前后台系统多用在简单的以MCU为核心的较为简单的应用为核心的较为简单的应用系统中,如:空调控制器等家电控制器中。系统中,如:空调控制器等家电控制器中。v前台系统:前台系统: 多为一个死循环(超循环多为一个死循环(超循环sup
8、per-loops),), v 或是带有休眠态(或是带有休眠态(halt)的一段主程序,往)的一段主程序,往v 往是完成界面处理。往是完成界面处理。v后台系统:又称为任务级程序或是服务程序,完成某些后台系统:又称为任务级程序或是服务程序,完成某些v 具体的任务处理,通常为中断服务程序(具体的任务处理,通常为中断服务程序(ISR)。)。前后台系统示例前后台系统示例前后台系统的特点:前后台系统的特点:系统较为简单,可用系统较为简单,可用来完成一些简单的任来完成一些简单的任务,但往往任务响应务,但往往任务响应时效性较差;可维护时效性较差;可维护性差。性差。1.01 代码的临界段代码的临界段 指处理时
9、不可分割的代码,即不允许中断的代码。如一条指令,一段对数据的完整性有要求的程序代码。进入临界段之前必须关中断,而临界段代码执行完后,进入临界段之前必须关中断,而临界段代码执行完后,要立即开中断。要立即开中断。1.02 资资 源源任何为任务所占用的实体都可称为资源。资源可以是硬件实任何为任务所占用的实体都可称为资源。资源可以是硬件实体,亦可以是一个变量、数组或数据结构。体,亦可以是一个变量、数组或数据结构。1.03 共享资源共享资源被一个以上的任务使用的资源叫做共享资源。被一个以上的任务使用的资源叫做共享资源。 为防止对数据的破坏,每个任务在与共享资源打交道为防止对数据的破坏,每个任务在与共享资
10、源打交道时必须独占该资源,这称为互斥(时必须独占该资源,这称为互斥(mutual exclusion)。)。1.04 任任 务务 任务:完成某一特定(单一)功能的程序代码;又称为线程。嵌入式程序设计的任务之一就是如何把问题分割成多个任务。在在uC/OS-II中,每个任务有自己的任务栈。中,每个任务有自己的任务栈。一个典型的任务:就是一个无限循环,其可能处在以下一个典型的任务:就是一个无限循环,其可能处在以下5种状态之一:种状态之一:休眠态:任务已经驻留内存,但不被内核调度休眠态:任务已经驻留内存,但不被内核调度就绪态:任务已准备好运行。但由于有高优先级的任务而尚未执行。就绪态:任务已准备好运行
11、。但由于有高优先级的任务而尚未执行。运行态:已获得运行态:已获得CPU的使用权。的使用权。挂起态:又称等待事件态(挂起态:又称等待事件态(waiting)。)。被中断态:被某个中断的被中断态:被某个中断的ISR暂时中止了运行。暂时中止了运行。CPU中内中内部资源的部资源的映像映像典型的任务一个无限循环。典型的任务一个无限循环。void mytask(void *pdata) for ( ; ; ) do something; waiting for event; do something; C/OS II 2.5以上版本支持以上版本支持64个任务,每个任务一个特个任务,每个任务一个特定的优先级
12、。优先级越高,数字越小。定的优先级。优先级越高,数字越小。系统占用了系统占用了8个任务,保留优先级为个任务,保留优先级为0、1、2、3、OS_LOWEST_PRIO-3、 OS_LOWEST_PRIO-2、 OS_LOWEST_PRIO-1、 OS_LOWEST_PRIO-0。 void YourTask (void *pdata) for (;) / 用户代码 /调用uC/OS-II的某种系统服务: OSMboxPend(); OSQPend(); OSSemPend(); OSTaskDel(OS_PRIO_SELF); OSTaskSuspend(OS_PRIO_SELF); OSTim
13、eDly(); OSTimeDlyHMSM(); / 用户代码 1.05 多任务多任务 依靠CPU在不同的任务之间转换和调度。多任务与前后台系统的区别是: 前后台系统中,一次只有一个后台任务在运行;而多任务系统可以有许多后台任务“同时”被执行。多任务的特点:多任务的特点:允许同时运行多个任务,提高了允许同时运行多个任务,提高了CPU的利用率。的利用率。一个复杂的任务(程序)可以按照任务性质分成一个复杂的任务(程序)可以按照任务性质分成多个多个“子子”任务。提高了程序的模块化水平。任务。提高了程序的模块化水平。有利于系统维护。有利于系统维护。1.06 任务的切换任务的切换v任务切换任务切换(co
14、ntext switch) :当多个任务交换:当多个任务交换CPU的使用权的使用权时,需要对寄存器等资源的当前状态时,需要对寄存器等资源的当前状态(context)(类似中断现(类似中断现场)进行压栈保存,需保存的内容一般存在任务自己的栈区场)进行压栈保存,需保存的内容一般存在任务自己的栈区内的当前状态保存区内的当前状态保存区(tasks context storage area)。入栈。入栈完成后,则将下一个将要运行的任务的当前状态装入完成后,则将下一个将要运行的任务的当前状态装入CPU中中的寄存器,然后运行下一个任务。的寄存器,然后运行下一个任务。任务切换增加了任务切换增加了CPU的额外开
15、销,的额外开销,CPU内部寄存器越多,额外开销越大。内部寄存器越多,额外开销越大。1.07 内核内核(kernel)v实时操作系统的核心。主要负责任务的管理、任务实时操作系统的核心。主要负责任务的管理、任务间的通信、共享资源的管理以及时间的管理等。间的通信、共享资源的管理以及时间的管理等。 实时内核在带来底层管理方便的同时,也会消耗CPU宝贵的硬件资源(如ROM和RAM)。所以在MCU中,尤其是在中低端的MCU中,很少能够看到实用化的实时内核的影子。MCU中因为中因为RAM资源有限,更多地采用前、后台系统。资源有限,更多地采用前、后台系统。1.08 调度调度v调度调度(schedulers,
16、dispatcher):基于某种特定的:基于某种特定的规则来决定那个任务运行。规则来决定那个任务运行。v常用的调度规则是基于优先级常用的调度规则是基于优先级(priority)调度。即优调度。即优先级最高的任务先运行。先级最高的任务先运行。何时高优先级的任务获得何时高优先级的任务获得CPU的使用权?的使用权?问题问题v对该问题的不同解决方法就形成了两种不同的内核:对该问题的不同解决方法就形成了两种不同的内核:不可剥夺型内核不可剥夺型内核 与与 可剥夺型内核可剥夺型内核1.09 不可剥夺型内核不可剥夺型内核不可剥夺型内核不可剥夺型内核(non-preemptive kernel):要求每个任务主
17、动放弃要求每个任务主动放弃CPU的使用权。的使用权。见左图见左图: 不可剥夺型内核不可剥夺型内核又称合作型多任务内核。又称合作型多任务内核。异步事件还是由中断服务异步事件还是由中断服务程序来处理,中断服务程程序来处理,中断服务程序可使一个高优先级的任序可使一个高优先级的任务由挂起态变为就绪态,务由挂起态变为就绪态,ISR结束后,使用权仍返结束后,使用权仍返回原程序,直到原程序结回原程序,直到原程序结束或主动放弃束或主动放弃CPU的使用的使用权。权。不可剥夺型内核的特点:不可剥夺型内核的特点:v优点:v中断响应速度快,通常高于前后台系统v几乎无需使用信号量来保护共享资源v可以使用不可重入函数(本
18、身中途不得放弃CPU使用权)v缺点:v任务级的响应时间不确定商业化的软件很少有采用不可剥夺型内核的商业化的软件很少有采用不可剥夺型内核的1.10 可剥夺型内核可剥夺型内核可剥夺型内核可剥夺型内核(preemptive kernel):最高优先级的任务一旦准备就绪,总能得到最高优先级的任务一旦准备就绪,总能得到CPU的使用权。的使用权。见左图见左图: 可剥夺型内可剥夺型内核的突出优点就是可核的突出优点就是可以保证响应时间。当以保证响应时间。当一个运行的任务(或一个运行的任务(或中断)使一个高优先中断)使一个高优先级的任务进入就绪态级的任务进入就绪态时,当前任务的时,当前任务的CPU的使用权即被剥
19、夺而的使用权即被剥夺而进入挂起态,而高优进入挂起态,而高优先级的任务得到先级的任务得到CPU的使用权。的使用权。优点:优点:任务级的响应时间最优化,即最高优先级的任任务级的响应时间最优化,即最高优先级的任务何时被执行是可以预知的务何时被执行是可以预知的缺点:缺点:不可直接使用不可重入函数不可直接使用不可重入函数对于互斥型的共享资源,需使用信号量来保证对于互斥型的共享资源,需使用信号量来保证互斥条件互斥条件可剥夺型内核的特点:可剥夺型内核的特点:uC/OS属于可剥夺型内核属于可剥夺型内核1.11 可重入函数v可重入函数:可重入函数在任何时间可以被中断,可重入函数:可重入函数在任何时间可以被中断,
20、v 一段时间后又可以运行。一段时间后又可以运行。v特性:特性:v 可以被一个以上的任务调用,而不必担心数据被可以被一个以上的任务调用,而不必担心数据被破环破环v注意事项:注意事项:v 可重入函数使用的局部变量保存在可重入函数使用的局部变量保存在CPU的寄存器的寄存器或堆栈或堆栈 中,如使用全局变量,则在中断时应予保中,如使用全局变量,则在中断时应予保护。护。例例1.1 可重入函数可重入函数void strcpy(char *dest, char *src) / dest and src is local variable ; while (*dest += *src+) ; int Temp
21、; /Temp is a global variablevoid swap (int *x, int *y) / x and y is local variable Temp = *x ; *x = *y ; *y = Temp ; 例例1.2 不可重入函数不可重入函数如果如果swap( )在执行过程中被中断,则可发生在执行过程中被中断,则可发生如下情况:如下情况:解决的办法:解决的办法:v在写函数时候尽量使用局部变量(例如寄存在写函数时候尽量使用局部变量(例如寄存器、堆栈中的变量),如把器、堆栈中的变量),如把Temp定义为局定义为局部变量。部变量。v调用调用swap( )函数之前关中断,调
22、用之后再开函数之前关中断,调用之后再开中断中断v采用信号量采用信号量(semaphores)来控制共享资源的来控制共享资源的使用权(满足互斥条件)使用权(满足互斥条件)注意:不可重入函数引起的错误在测试中往往很注意:不可重入函数引起的错误在测试中往往很难发现。难发现。1.12 时间片轮番调度法时间片轮番调度法v时间片或称时间额度时间片或称时间额度(time quantum)v 任务运行事先确定的一个时间段。任务运行事先确定的一个时间段。v时间片轮番调度法:时间片轮番调度法:v 当两个以上的同优先级任务同时就绪时,则当两个以上的同优先级任务同时就绪时,则CPU的使用权交给下一个任务的条件是:的使
23、用权交给下一个任务的条件是:v当前任务已经空闲当前任务已经空闲v当前任务已经完成,但时间额度(时间片)尚未结当前任务已经完成,但时间额度(时间片)尚未结束束v时间片已结束时间片已结束 uC/OS不支持时间片轮番调度法,各任务的优先级必须互不不支持时间片轮番调度法,各任务的优先级必须互不相同。相同。1.13 任务的优先级任务的优先级v任务越重要,被赋予的优先级越高。任务越重要,被赋予的优先级越高。v对大多数内核而言,任务的优先级由用户决定对大多数内核而言,任务的优先级由用户决定v对对uC/OS而言,理论上支持而言,理论上支持64个优先级,个优先级,0级最高,级最高,63级最级最低。低。v为节省内
24、存,用户可根据需要,通过给为节省内存,用户可根据需要,通过给OS_CFG.H中的中的OS_LOWEST_PRIO来说明应用程序中任务优先级别的数来说明应用程序中任务优先级别的数目,其值为目,其值为0,1,2, , OS_LOWEST_PRIO+1。v最低的两个优先级的任务保留为:空闲任务和最低的两个优先级的任务保留为:空闲任务和CPU统计任务。统计任务。1.14 静态优先级与动态优先级静态优先级与动态优先级v静态优先级:静态优先级:v 在执行过程中,任务的优先级不变。在执行过程中,任务的优先级不变。v动态优先级:动态优先级:v 在执行过程中,任务的优先级可由用户在执行过程中,任务的优先级可由用
25、户改变。改变。uC/OS支持动态优先级。支持动态优先级。但动态优先级在使用过程中应注意优先级的反转问题。但动态优先级在使用过程中应注意优先级的反转问题。1.15 优先级的反转优先级的反转注意:任务注意:任务1的优先级的优先级实际上已经实际上已经降低到任务降低到任务3的水平。的水平。并且由于任并且由于任务务2剥夺了剥夺了任务任务3的的CPU使用权,使用权,使任务使任务1增增加了额外的加了额外的延迟时间。延迟时间。优先级的反转的解决方案优先级的反转的解决方案优先级继承优先级继承v优先级继承的核心是:内核自动变换任务的优先级。优先级继承的核心是:内核自动变换任务的优先级。注意:注意:1. mutex
26、是互是互斥型信号量。斥型信号量。2. uC/OS不支不支持优先级的继持优先级的继承。承。1.16 任务优先级分配任务优先级分配v一个基本的原则就是根据任务的重要性来确一个基本的原则就是根据任务的重要性来确定任务的优先级。一般应综合考虑如下两种定任务的优先级。一般应综合考虑如下两种需求:需求:v软实时:要求任务执行的尽可能快,但并没软实时:要求任务执行的尽可能快,但并没有特定的时间要求。有特定的时间要求。v硬实时:任务应准时、无误地执行。硬实时:任务应准时、无误地执行。实用的优先级分配方法:实用的优先级分配方法:v单调执行率调度法单调执行率调度法RMS(Rate Monotonic Schedu
27、ling)v基本假定:基本假定:v所有任务都是周期性的。所有任务都是周期性的。v任务间不需要同步,没有共享资源,没有数据交换。任务间不需要同步,没有共享资源,没有数据交换。vCPU总是执行最高优先级且处于就绪态的任务,即必须使用总是执行最高优先级且处于就绪态的任务,即必须使用可剥夺型调度法。可剥夺型调度法。但该方法应满足如下的所谓但该方法应满足如下的所谓RMS定理定理优先级分配方法:优先级分配方法: 根据在一个周期内任务执行的次数(任务执行率)来分配根据在一个周期内任务执行的次数(任务执行率)来分配任务的优先级,即执行最频繁的任务优先级最高。任务的优先级,即执行最频繁的任务优先级最高。RMS定
28、理定理假定:假定: n为系统的任务数;为系统的任务数;Ei为任务为任务i的最长执行时间;的最长执行时间;Ti是是任务任务 i的执行周期。的执行周期。则:则:Ei/Ti是任务是任务i所需的所需的CPU时间的占用率,一般在实际应时间的占用率,一般在实际应用中,该值应小于用中,该值应小于70%。) 12(E/1ininT采用采用RMS方法,欲满方法,欲满足硬实时的条件,应足硬实时的条件,应满足如下不等式:满足如下不等式:n为系统的任务数为系统的任务数说明:说明:v实际应用中,执行率最高的任务未必是最重要的任实际应用中,执行率最高的任务未必是最重要的任务。因此务。因此RMS方法仅仅是一个基础。方法仅仅
29、是一个基础。v分配任务的优先级有许多不同的算法,可参阅相关分配任务的优先级有许多不同的算法,可参阅相关文献。文献。v在许多在许多MCU中,硬中断(任务)的优先级是硬件设中,硬中断(任务)的优先级是硬件设定的,软中断的优先级可用户设定。定的,软中断的优先级可用户设定。1.17 互斥条件互斥条件v问题:如何在不同的任务间实现通讯及数据交换。问题:如何在不同的任务间实现通讯及数据交换。v解决的方法:通常使用的是共享的数据结构、消息解决的方法:通常使用的是共享的数据结构、消息邮箱或消息队列。邮箱或消息队列。v存在的问题:不同任务在处理共享数据时如何实现存在的问题:不同任务在处理共享数据时如何实现“独占
30、独占”,以避免竞争和数据的破坏。,以避免竞争和数据的破坏。结论:应使不同的任务在使用共享数据时结论:应使不同的任务在使用共享数据时 满足满足“互斥条件互斥条件”使用使用“互斥条件互斥条件”的一般方法:的一般方法:v在进入数据处理前关中断,处理完毕后立即在进入数据处理前关中断,处理完毕后立即开中断。开中断。v使用测试位,利用测试位来检测是否有其他使用测试位,利用测试位来检测是否有其他任务正在使用共享数据。任务正在使用共享数据。v禁止任务切换;禁止任务切换;v利用信号量。利用信号量。例例1.3 关中断与开中断关中断与开中断例例1.4 利用利用uC/OS-II宏调用关中断与开中断宏调用关中断与开中断
31、void function ( void ) OS_ENTER_CRITICAL( ); access the shared resource; OS_EXIT_CRITICAL( ); disable interrupts;access the shared resource;reenable interrupts;例例1.5 利用测试位处理共享资源利用测试位处理共享资源disable interrupts; /close the interruptsif ( access_variable = 0 ) /testing the shared resource set access_vari
32、able to 1; /locked the shared resource reenable interrupts; /open the interrupts access the resource; disable interrupts; set the access_variable back to 0; /release shared resource reenable interrupts; else reenable interrupts; 例例1.6 用给任务切换上锁,然后开锁的方法实现数据共享用给任务切换上锁,然后开锁的方法实现数据共享void function ( void
33、) OSSchedLock ( ) ; ; ; /处理共享数据,但注意中断是开着的处理共享数据,但注意中断是开着的 ; OSSchedUnlock ( ); 注意:注意: 如果任务不与如果任务不与ISR共享变量或数据结构,可以采用上共享变量或数据结构,可以采用上述方法。但因该方法禁止了任务切换,与内核的主要功述方法。但因该方法禁止了任务切换,与内核的主要功能能“任务调度与协调任务调度与协调”矛盾,所以应尽量少采用。矛盾,所以应尽量少采用。信号量(信号量(semaphores)及其应用及其应用信号量在多任务内核中普遍采用,主要用于:信号量在多任务内核中普遍采用,主要用于:控制共享资源的使用权(满
34、足互斥条件)控制共享资源的使用权(满足互斥条件)标志某事件的发生标志某事件的发生保证两个任务的同步保证两个任务的同步信号量可以是二值量(逻辑量),也可以是信号量可以是二值量(逻辑量),也可以是8位、位、16位、位、32位的整型量。位的整型量。说明:说明:信号量是各任务取得共享资源使用权的信号量是各任务取得共享资源使用权的“钥匙钥匙”。一个信号量可以管理多个对象,例如管理一个信号量可以管理多个对象,例如管理10个缓冲区,则可个缓冲区,则可使用信号量的使用信号量的10个不同状态(即计数式信号量)。个不同状态(即计数式信号量)。一个二值的信号量可用测试位代替,且测试位的操作更简单。一个二值的信号量可
35、用测试位代替,且测试位的操作更简单。信号量可以实现任务间的相互同步。信号量可以实现任务间的相互同步。信号量所定义的主要操作:信号量所定义的主要操作:v建立建立(create) ,亦可称之为初始化,亦可称之为初始化(initialize) (初始化的(初始化的值为值为1或或0)。对应的系统函数:)。对应的系统函数:v OSSemCreate( )v挂起挂起(pend),或称等信号,或称等信号(wait)。对应的系统函数为:。对应的系统函数为:OSSemPend( )v发信号发信号(post),或称给信号,或称给信号(signal)。对应的系统函数:。对应的系统函数:v OSSemPost( )v
36、另外还有无等待请求一个信号量另外还有无等待请求一个信号量v OSSemAccept( )v查询信号量的当前状态查询信号量的当前状态v OSSemQuery( )OS_SEM_EN = 1 (OS_CFG.H 中定义中定义)信号量的使用:信号量的使用:信号量的使用原则有以下两种:信号量的使用原则有以下两种:等待信号量的任务中优先级最高的任务等待信号量的任务中优先级最高的任务最早开始等待信号量的任务最早开始等待信号量的任务 信号量的使用过程:信号量的使用过程:发出等待请求;发出等待请求;如果该信号量有效(其值大于如果该信号量有效(其值大于0),则信号量值减),则信号量值减1,任务执行。任务执行。如
37、果该信号量无效(其值等于如果该信号量无效(其值等于0),则任务列入等待信),则任务列入等待信号量的任务表,多数内核支持定义等待超时。号量的任务表,多数内核支持定义等待超时。信号量的删除、等待只能由任务程序调用。信号量的删除、等待只能由任务程序调用。uC/OS仅支持基于优先级的方法仅支持基于优先级的方法例例1.7 通过获得信号量来处理共享数据通过获得信号量来处理共享数据OS_EVENT *SharedDataSem ;void Function ( void ) INT8U err ; OSSemPend ( SharedDataSem , 0 , &err ) ; /发出一个等待请求,
38、等待时间发出一个等待请求,等待时间 /为为0 ; ; /共享数据处理(中断是开着的)共享数据处理(中断是开着的) ; OSSempost ( SharedDataSem ) ; /释放信号量释放信号量例例1.8 隐含的信号量使用隐含的信号量使用INT8U CommSendCmd ( char *cmd , char *response , INT16U timeout ) acquire ports semphore ; send command to device ; wait for response ( with timeout ) ; if ( timeout ) release se
39、mphore ; return ( error code ) ; else release semphore ; return ( error code ) ; 计数式信号量的使用计数式信号量的使用例例1.9 上图的程序示例上图的程序示例1.19 死死 锁锁 死锁又称抱死(deadlock或deadly embrace),是指2个任务无限期地互相等待对方控制的资源。解决方法:解决方法:首先得到全部需要的资源,再做下一步的工作;首先得到全部需要的资源,再做下一步的工作;用特定的顺序申请多个资源;用特定的顺序申请多个资源;释放资源时,采用相反的顺序;释放资源时,采用相反的顺序;多数内核还允许采用等
40、待超时。多数内核还允许采用等待超时。死锁在大型多任务系统中容易发生,嵌入式系统中要少得多。死锁在大型多任务系统中容易发生,嵌入式系统中要少得多。1.20 同同 步步v利用信号量来保证任务与利用信号量来保证任务与ISR,或者是两个不同的,或者是两个不同的任务(互相之间无数据交换)的运行同步。任务(互相之间无数据交换)的运行同步。注意:注意:此时的信号量已经不再是保证互斥条件的钥匙。此时的信号量已经不再是保证互斥条件的钥匙。用来实现同步的信号量初始化为用来实现同步的信号量初始化为0 。用一个信号量实现的单向同步用一个信号量实现的单向同步 ( unilateral rendezvous ):用用2个
41、信号量实现的双向同步个信号量实现的双向同步 ( bilateral rendezvous ):双向同步只能是在任务与任务之间,而不可能在任务与双向同步只能是在任务与任务之间,而不可能在任务与ISR之间。之间。例例1.10 双向同步范例双向同步范例task1 ( ) for ( ; ; ) perform operation ; Init signal task #2 ; wait for signal from task #2 ; continue operation ; task2 ( ) for ( ; ; ) perform operation ; Init signal task #1
42、 ; wait for signal from task #1 ; continue operation ; 1.20 事件标志事件标志(event flag)v当某任务需要与其他事件同步时,需使用事件标志。当某任务需要与其他事件同步时,需使用事件标志。 上图表示某任务需与另一些事件或条件之一发生同步,称为独立型同步,亦即逻辑“或”关系。 上图表示某任务需与另一些事件或条件都发生同步,称为关联型同步,亦即逻辑“与”关系。 上图表示多个事件的组合事件发信号给多个任务。uC/OS支持事件标志置位、事件标志清支持事件标志置位、事件标志清0和等待事件标志。和等待事件标志。1.21 任务间通信任务间通信
43、 指任务间或中断服务与任务间的通信指任务间或中断服务与任务间的通信(intertask communication)。这种通信的方式有两种:。这种通信的方式有两种:通过全局变量通过全局变量使用全局变量时,必须保证每个任务或是使用全局变量时,必须保证每个任务或是ISR独享该变量。独享该变量。在中断服务中保证独享的唯一手段就是在中断服务中保证独享的唯一手段就是“关中断关中断”,而任务,而任务欲独享该变量时,可以采用欲独享该变量时,可以采用“关中断关中断”或者是使用或者是使用“信号量信号量”。利用消息传递利用消息传递亦可使用消息队列或者邮箱。亦可使用消息队列或者邮箱。1.22 消息邮箱消息邮箱v利用
44、内核服务可以给任务发送消息或者交换消息。典型的手利用内核服务可以给任务发送消息或者交换消息。典型的手段可以使用消息邮箱段可以使用消息邮箱(message mail box),在消息邮箱中,在消息邮箱中放的是一个指向待传送消息的指针型变量。放的是一个指向待传送消息的指针型变量。一个或一个或多个任多个任务及务及ISR一个或一个或多个任多个任务及务及ISR等待超时等待超时计时器计时器 在在uC/OS中,内核总是把消息传递给等待消息任务列表中,内核总是把消息传递给等待消息任务列表中优先级最高的任务。中优先级最高的任务。内核提供的邮箱服务内核提供的邮箱服务v邮箱的创建(初始化)及撤销,邮箱里最初可以有(
45、或没邮箱的创建(初始化)及撤销,邮箱里最初可以有(或没有)消息。相关函数为:有)消息。相关函数为: v OSMboxCreat( ) v OSMboxDel ( ) v将消息放入邮箱将消息放入邮箱(post)。v OSMboxPost ( )v OSMboxPostOpt ( ) /新函数,可实现消息广播新函数,可实现消息广播v等待消息进入邮箱等待消息进入邮箱(pend)。v OSMboxPend ( )v查询邮箱中的状态。查询邮箱中的状态。v OSMboxQuery ( ) v无等待从邮箱中得到消息。如果邮箱里没有消息,则任务无等待从邮箱中得到消息。如果邮箱里没有消息,则任务并不被挂起,如果
46、邮箱内有消息,则接受消息。并不被挂起,如果邮箱内有消息,则接受消息。v OSMboxAccept ( )邮箱里的消息可当作二值信号量来使用。邮箱里的消息可当作二值信号量来使用。亦可使用邮箱来实现延时。亦可使用邮箱来实现延时。说明:说明:1.23 消息队列消息队列 消息队列(message queue)实际上就是邮箱队列。 任务或者是ISR可以将消息放入队列,同样一个任务或者是多个任务可以从队列中得到消息。得到消息的方式既可以是FIFO,亦可是LIFO。每个邮箱均有一个等待消息的列表,如果邮箱为空,每个邮箱均有一个等待消息的列表,如果邮箱为空,则相应的任务被挂起。则相应的任务被挂起。 与邮箱的使
47、用相同,每个消息队列均有一个任务与邮箱的使用相同,每个消息队列均有一个任务等待列表等待列表(waiting list)。且。且如果消息队列为空,等待消息的任务挂起。并进入如果消息队列为空,等待消息的任务挂起。并进入等待消息任务列表。等待消息任务列表。如果等待任务定义了超时,则在规定的时间内没有如果等待任务定义了超时,则在规定的时间内没有收到消息的任务进入运行态,并返回错误代码。收到消息的任务进入运行态,并返回错误代码。消息总是传递给等待消息任务列表中优先级最高的消息总是传递给等待消息任务列表中优先级最高的任务任务(uC/OS规定)。规定)。 内核提供的消息队列服务如下:内核提供的消息队列服务如
48、下:v消息队列的创建(初始化)及撤销,消息队列的初始化为空。消息队列的创建(初始化)及撤销,消息队列的初始化为空。相关函数为:相关函数为: v OSQcCreat( ) ; OSQDel ( ) v OSQFlush ( ) /清空消息队列清空消息队列v向消息队列发送消息向消息队列发送消息 (post) (FIFO) 。v OSQPost ( )v向消息队列发送消息向消息队列发送消息 (post) (FIFO或或LIFO) v OSQPostOpt ( ) /这是一个新函数,可实现消息广播这是一个新函数,可实现消息广播v等待消息队列中的消息等待消息队列中的消息(pend)。v OSQPend
49、( )v获取消息队列的状态。获取消息队列的状态。v OSQQuery ( ) v无等待从消息队列中得到消息。如果邮箱里没有消息,则任无等待从消息队列中得到消息。如果邮箱里没有消息,则任务并不被挂起,如果邮箱内有消息,则接受消息。务并不被挂起,如果邮箱内有消息,则接受消息。v OSQAccept ( )1.24 中中 断断v中断是中断是CPU提供的一种处理异步事件的硬件机制,提供的一种处理异步事件的硬件机制,中断一旦被识别,中断一旦被识别,CPU将保存部分(或是全部)现将保存部分(或是全部)现场场(context,寄存器内容,寄存器内容),跳到,跳到ISR,当,当ISR处理处理完事件后,程序回到
50、:完事件后,程序回到:v在前后台系统中,回到后台程序;在前后台系统中,回到后台程序;v对不可剥夺型内核,回到被中断的任务;对不可剥夺型内核,回到被中断的任务;v对可剥夺型内核,让进入就绪态的优先级最高的任对可剥夺型内核,让进入就绪态的优先级最高的任务开始运行。务开始运行。中断所提供的机制无需中断所提供的机制无需CPU不断地查询不断地查询(pollimg) 异步事件。异步事件。内核提供的与中断相关的服务:内核提供的与中断相关的服务:v关中断关中断(disable interrupt)v OS_ENTER_CRITICAL( );v开中断开中断(enable interrupt)v OS_EXIT
51、_CRITICAL( );注意:注意:在实时环境中,关中断的时间应尽可能短,也在实时环境中,关中断的时间应尽可能短,也 就是说就是说ISR应尽可能短。应尽可能短。不同的不同的CPU对中断的嵌套有不同的规定。对中断的嵌套有不同的规定。1.25 中断延迟与中断响应中断延迟与中断响应v中断延迟:中断延迟:CPU关中断的时间。所有的实时系统在进入临界关中断的时间。所有的实时系统在进入临界区代码之前,总是要关中断,执行完临界区代码后再开中断。区代码之前,总是要关中断,执行完临界区代码后再开中断。因此,关中断的时间长短是实时内核的重要指标。因此,关中断的时间长短是实时内核的重要指标。v 中断延迟中断延迟
52、= 关中断的最长时间关中断的最长时间 + 开始执行开始执行ISR第一条指第一条指令的时间令的时间v中断响应:从中断发生到开始执行用户的中断响应:从中断发生到开始执行用户的ISR代码之间的时代码之间的时间。这个时间包含中断延迟时间与间。这个时间包含中断延迟时间与CPU保存现场的时间:保存现场的时间:v 中断响应中断响应 = 中断延迟中断延迟 + CPU保存现场的时间保存现场的时间一般系统提供的中断相应时间应该是在最坏情况下的中一般系统提供的中断相应时间应该是在最坏情况下的中断响应时间。断响应时间。对于可剥夺型内核:对于可剥夺型内核:vuC/OS-II在处理中断时需要首先调用在处理中断时需要首先调
53、用OSIntEnter ( ),该函数通知内核即将开始中断服务,以使内核可以跟该函数通知内核即将开始中断服务,以使内核可以跟踪中断嵌套。踪中断嵌套。v 中断响应中断响应 = 中断延迟中断延迟 + CPU保存现场时间保存现场时间 + 内核进内核进入入ISR的的 v 执行时间执行时间1.26 中断处理时间中断处理时间v从原则上讲,中断处理时间应该尽可能得短。但由于从原则上讲,中断处理时间应该尽可能得短。但由于ISR的的重要性,我们无法给出一个具体的时间限制。重要性,我们无法给出一个具体的时间限制。ISR通常所做通常所做的工作是:的工作是:v识别中断源;识别中断源;v从中断请求的外设读取状态或数据;
54、从中断请求的外设读取状态或数据;v“通知通知”负责对该事件处理的任务。负责对该事件处理的任务。v 尤其是最后一条,在尤其是最后一条,在uC/OS-II中,中,“通知通知”意味意味着使用信号量、邮箱或是消息队列,需要花费较多的时间。着使用信号量、邮箱或是消息队列,需要花费较多的时间。因此对于一些简单的中断服务,应考虑由因此对于一些简单的中断服务,应考虑由ISR来完成中断的来完成中断的处理以及开处理以及开/关中断的管理。关中断的管理。1.27 中断延迟、响应及恢复中断延迟、响应及恢复前后台系统的中断延迟、响应及恢复前后台系统的中断延迟、响应及恢复可剥夺型内核的中断延迟、响应及恢复可剥夺型内核的中断
55、延迟、响应及恢复进入就绪态的最高进入就绪态的最高级任务级任务不可剥夺型内核的中断延迟、响应及恢复不可剥夺型内核的中断延迟、响应及恢复1.28 非屏蔽中断(非屏蔽中断(NMI)v对于像复位、断电保存、看门狗溢出等异常事件的处理,内对于像复位、断电保存、看门狗溢出等异常事件的处理,内核引起的服务延迟是不可忍受的。此时应使用核引起的服务延迟是不可忍受的。此时应使用NMI,几乎所,几乎所应的应的CPU均设有均设有NMI。v综合考虑各种中断的情况,则有以下关系:综合考虑各种中断的情况,则有以下关系:v 中断延迟时间中断延迟时间 = 最长的指令执行时间最长的指令执行时间 + 开始开始NMI服务的时服务的时
56、间间v 中断响应时间中断响应时间 = 中断延迟时间中断延迟时间 + CPU保存现场的时间保存现场的时间v 中断恢复时间中断恢复时间 = 恢复恢复CPU寄存器的时间寄存器的时间 + 执行中断返回指执行中断返回指令的时间令的时间vNMI的的ISR不能使用内核服务,故不能处理临界区不能使用内核服务,故不能处理临界区代码。但是向代码。但是向NMI的的ISR传递参数或者得到参数是传递参数或者得到参数是允许的。允许的。v参数的传递必须使用全局变量,且应该是一次即参数的传递必须使用全局变量,且应该是一次即可读写完毕的数据类型,而不应该是可读写完毕的数据类型,而不应该是2个分离的字个分离的字(节)。(节)。一
57、个使用可屏蔽中断的处理机制处理一个使用可屏蔽中断的处理机制处理NMI的例子的例子1.29 时钟节拍时钟节拍v时钟节拍(时钟滴答时钟节拍(时钟滴答ClockTick)是一种定时器中断,可通过编程方式)是一种定时器中断,可通过编程方式实现实现 。主要用来提供任务(消息)等待计时、任务延时计时等应用的依。主要用来提供任务(消息)等待计时、任务延时计时等应用的依据。据。v时钟节拍依据软硬件系统、任务的不同而设置不同。一般来讲,时钟节时钟节拍依据软硬件系统、任务的不同而设置不同。一般来讲,时钟节拍中断越快,时间分辨率越高,但系统的额外开销也就越大。拍中断越快,时间分辨率越高,但系统的额外开销也就越大。v
58、如果在实时内核中要对任务进行如果在实时内核中要对任务进行n个时钟节拍的延时,应注意这种延时个时钟节拍的延时,应注意这种延时仅仅是在每个时钟节拍到来时做一次裁决,而绝不是精确地延时仅仅是在每个时钟节拍到来时做一次裁决,而绝不是精确地延时n个时个时钟节拍的时间。钟节拍的时间。v时钟节拍是操作系统的心脏。首先时钟节拍是操作系统的心脏。首先32位的整数位的整数OSTime加一。对任务列加一。对任务列表进行扫描,判断是否有延时任务应该处于准备就绪状态,最后进行上表进行扫描,判断是否有延时任务应该处于准备就绪状态,最后进行上下文切换。下文切换。任务的延时与抖动任务的延时与抖动void OSTimeTick
59、 (void) OS_TCB *ptcb; OSTimeTickHook(); (1) ptcb = OSTCBList; (2) while (ptcb-OSTCBPrio != OS_IDLE_PRIO) (3) OS_ENTER_CRITICAL(); if (ptcb-OSTCBDly != 0) if (- -ptcb-OSTCBDly = 0) if (!(ptcb-OSTCBStat & OS_STAT_SUSPEND) (4) OSRdyGrp |= ptcb-OSTCBBitY; (5) OSRdyTblptcb-OSTCBY |= ptcb-OSTCBBitX; else ptcb-OSTCBDly = 1; ptcb = ptcb-OSTCBNext; OS_EXIT_CRITICAL(); OS_ENTER_CRITICAL(); (6) OSTime+; (7)出现抖动的原因及解决方法出现抖动的原因及解决方法v原因:原因:v 与与CPU的负荷有关,也可能与系
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年植物生长调节剂合作协议书
- 2025版权转让协议合同
- 2025年个人借款合同英文版
- 2025标准装修合同模板
- 2025房屋租赁合同范文汇编
- 2025年ZRO2陶瓷磨介合作协议书
- 2025年特种氯乙烯共聚物项目建议书
- 2025年板卧式电除尘器项目建议书
- 2025年植物促生菌剂合作协议书
- 2025年单晶生产炉合作协议书
- 义务兵家庭优待金审核登记表
- GA 255-2022警服长袖制式衬衣
- GB/T 5202-2008辐射防护仪器α、β和α/β(β能量大于60keV)污染测量仪与监测仪
- GB/T 39560.4-2021电子电气产品中某些物质的测定第4部分:CV-AAS、CV-AFS、ICP-OES和ICP-MS测定聚合物、金属和电子件中的汞
- GB/T 3452.4-2020液压气动用O形橡胶密封圈第4部分:抗挤压环(挡环)
- 计划生育协会基础知识课件
- 【教材解读】语篇研读-Sailing the oceans
- 抗肿瘤药物过敏反应和过敏性休克
- 排水管道非开挖预防性修复可行性研究报告
- 交通工程基础习习题及参考答案
- 线路送出工程质量创优项目策划书
评论
0/150
提交评论