(信号与信息处理专业论文)μcosⅡ嵌入式实时操作系统移植及其应用研究.pdf_第1页
(信号与信息处理专业论文)μcosⅡ嵌入式实时操作系统移植及其应用研究.pdf_第2页
(信号与信息处理专业论文)μcosⅡ嵌入式实时操作系统移植及其应用研究.pdf_第3页
(信号与信息处理专业论文)μcosⅡ嵌入式实时操作系统移植及其应用研究.pdf_第4页
(信号与信息处理专业论文)μcosⅡ嵌入式实时操作系统移植及其应用研究.pdf_第5页
已阅读5页,还剩58页未读 继续免费阅读

(信号与信息处理专业论文)μcosⅡ嵌入式实时操作系统移植及其应用研究.pdf.pdf 免费下载

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

文档简介

摘要 目前,在自动控制领域使用的微控制器主流仍然为8 位单片 机,但是,随着需求的发展,要求其实现越来越复杂的应用,同时 成本还要保持在较低的水平,于是很多发展型、增强型的单片机出 现了。更多的通用接口、更高的主频、更强大的集成功能、更丰富 的资源,使得只使用一片8 位单片机也能做很多复杂的控制,并且 可以进行多通道的a d d a 转换,可以加上液晶显示的人机交互、可 以进行网络通信、还可以无线收发 随着单片机处理能力的提高,应用程序功能复杂性的加大,使 得应用程序的任务数目增加,需要管理的资源增多,更有任务优先 级的变化,需要应用程序在各个任务之间合理地分配c p u 时间和系 统资源,同时还要保证系统的实时性和可靠性。选用高效的实时操 作系统内核则不但可以解决这些问题,还能够缩短产品开发周期, 增强应用程序的可移植性,具有必要性和良好的前景。 本文对嵌入式实时操作系统内核此0 s i i 进行了介绍,详细描 述了将此0 s i i 移植到a t m e lm e g a l 2 8 单片机上的过程和开发环 境,最后在移植成功的操作系统上,开发了一个用于智能家居中的 空调控制的多分区温度控制系统,并对其进行了部分测试。论文的 最后部分,对全文做出了总结,提出了后续工作的内容,并针对 此0 s i i 在智能家居领域提出了一些展望。 关键词:单片机、崛o s i i 、a t m e la v r 、智能家居 a b s a c t a b s t r a c t w i t h 廿l ei m p r o v e m e n to f t h es i i l g l ec h i pm i c r oc o n t m l l e ra n dt i l e a c c u r a c yo f 印p l i c a t i o n ,i t sn e c e s s a 巧t od i v i d ep r o g r 锄i n t om a i l y i m p o r t a n tt a s kr e s p e c t i v e l y i td i s t r i b u t e sc p ut i m ea 1 1 ds y s t e mr e s o u r c e i ne a c ht a s ke 伍c i e n t l y ,a j l da t 廿l es 锄et i m e ,w em u s tr e a l i z er e a l t i m e f h n c t i o n a l 酊锄dr e l i a b i l i 够o f t h es y s t e m i t si m p o r t a n tt oc h o o s ear e a l t i m eo p e r a t i o ns y s t e mk e m e lw h i c hs h o n e n st h ed e v e l o p m e m p e r i o d o f p r o d u c ta 1 1 de n h a n c e sp r o d u c te f n c i e n c y t h ef i r s tp a r to f t h e s i sd e s c r i b e st h ee m b e d d e dr e a lt i m eo p e r a t i o n s y s t e mk e m e l :p c 0 s 一t h e n ,p o r ti tt oas i n g l ec h i pm i c r oc o n 订o l l e r : a t m e l m e g a l 2 8a i l dd e s c m et h ep r o c e s ss t e pb ys t e p ht h ee n d , d e v e l o pas i m p l em u m z o n et e m p e r a t u r ec o n 仃o ls y s t e mu s i n gi n i m e l l i g e n tb u i l d i n go rh o u s eb a s e do n c o s a 1 1 da t m e g a l 2 8 k e y w o r d s :s c m ,斗c o s 一,a 研旺la v ri m e l l i g e n tb u i l d i n g i i 南开大学学位论文版权使用授权书 本人完全了解南开大学关于收集、保存、使用学位论文的规 定,同意如下各项内容:按照学校要求提交学位论文的印刷本和电 子版本;学校有权保存学位论文的印刷本和电子版,并采用影印、 缩印、扫描、数字化或其它手段保存论文;学校有权提供目录检索 以及提供本学位论文全文或者部分豹澜览服务;学校有权按有关规 定彝圈家有关部门或者机构送交论文的复印件和电子版;在不以赢 利为目的的前提下,学校可以适当复制论文的部分或全部内容用于 学术活动。 学位论文作者签名:兽缓 御6 年j 月油日 经指导教师同意,本学位论文属予保密,森年解密后适用本 授权书。 指导教师签名: 搋消雠嫦糙轹 解密时 年月 日 间: 各密级的最长保密年限及书写格式规定如下 内部5 年( 最长5 年,可少于5 年) 秘密1 0 年( 最长l o 年,可少于1 0 年) 机密2 0 年( 最长2 0 年,可少于2 0 年) 南开大学学位论文原创性声明 本人郑重声明:所呈交的学位论文,是本人在导师指导下,进 行研究工作所取得的成果。除文中已经注明引用的内容外,本学位 论文的研究成果不包含任何他人创作的、已公开发表或者没有公开 发表的作品的内容。对本论文所涉及的研究工作做出贡献的其他个 人和集体,均己在文中以明确方式标明。本学位论文原创性声明的 法律责任由本人承担。 学位论文作者签名: 马瑾 b 年y 月日 绪论 第一章绪论 第一节选题背景和目的意义 目前,在自动控制领域使用的微控制器主流仍然为8 位单片机,但是,随 着需求的发展,要求其实现越来越复杂的应用,同时成本还要保持在较低的水 平,于是很多发展型、增强型的单片机出现了。更多的通用接口、更高的主 频、更强大的集成功能、更丰富的资源,使得只使用一片8 位单片机也能做很 多复杂的控制,并且可以进行多通道的a d d a 转换,可以加上液晶显示的人 机交互、可以进行网络通信、还可以无线收发 随着单片机处理能力的增强、片上资源的增多,相应可以实现的应用程序 也越来越复杂了,拥有更多的任务和优先级别。显然,如何把操作系统应用在 8 位单片机上,加强对资源的管理,使单片机的应用程序更容易设计和扩展, 更方便在不同的处理器之间移植,是一个十分迫切的实际问题。然而,相对于 单片机的资源,一个操作系统的开销是绝对不容忽视的,那么在8 位的单片机 上引入操作系统是否必要以及可行呢? 基于以上的想法,本文探讨了嵌入式操作系统在基于增强型8 位单片机上 应用的必要性与可行性,从而向8 位单片机编程领域引入操作系统的概念。目 前,绝大多8 位单片机程序仍沿用前后台程序模式,即后台程序为主程序死循 环,前台程序为中断响应程序,普通任务于后台执行,紧急任务在中断中进行 响应。这样做,对于规模不大的程序来说没什么不妥,但随着8 位单片机功能 和片内资源( f l a s h 、e e p r o m 、r a i 、t i m e r 、g i o 、a d 、d a 、l c d 驱动等等) 的不断加强,应用程序也越来越复杂和庞大,对于应用中的众多任务,尤其是 它们要求的响应时间以及优先级也往往各不相同,引入操作系统的概念对程序 进行组织,成为提高编程效率、缩短开发周期、增强程序可移植性的有效手 段。 本文所作的工作主要有以下几个方面。 l 、对嵌入式实时操作系统及c o s i i 内核的相关理论进行了简要介绍, 重点集中在任务管理与调度方面,因为大多数单片机应用依赖于操作系统较多 的是其任务管理,在8 位单片机上,即使不引入商业嵌入式操作系统,我们也 可以用操作系统任务管理的思想组织程序。 2 、详细介绍了将u c ,o s i i 移植到a 眦lm e g a l 2 8 单片机上的开发环境和 过程,并详细分析了i a rc 编译器相比于其它c 编译器的优点,剖析了i a r 集 成开发环境中对芯片进行配置的方法) 【l i n i 【文件。 3 、在移植后的操作系统上,开发了一个用于智能家居中空调控制的小型 多分区温度控制系统,并对其功能进行了测试。由于本文的主要工作集中在嵌 入式编程方面,所以硬件部分采用a t m e ls t k 5 0 0 + s t k 5 0 1 进行仿真支持。 第二节研究方法和论文结构 本文通过研究和实践,验证了嵌入式实时操作系统在单片机上应用的可行 性,讨论了其优缺点,实现了基于操作系统的多分区温度控制器,并对其测试 方法进行了讨论,提出了后续工作的发展方向及意义。 第二章介绍了嵌入式实时操作系统c o s i i 的理论基础,讨论了本文选用 c ,0 s i i 作为操作系统的理由。分为概述、内核结构、任务管理、时间管理、 事件控制、信号及通道管理、内存管理等部分分别介绍。根据本文实现的多分 区温度控制器的需要。着重讨论d o s l l 内核结构、实时性和任务管理部分。 第三章介绍了向a 1 m e lm e g a l 2 8 单片机移植c ,o s i i 操作系统的过程和 要点。包括单片机的选型、开发环境的设置、代码的移植和测试等。 第四章介绍了基于u c 0 s i i 嵌入式实时操作系统的多分区温度控制器的设 计、实现与测试,并对相关智能家居自动控制的理论作了简单的说明。 第五章总结了本文所做的工作及成果,展望了u c o s i i 操作系统的应用前 景,并提出了后续工作的方向。 2 第二章嵌入式实时操作系统u c o s i i 理论研究 第二章嵌入式实时操作系统p c o s i i 理论研究 第一节实时系统概述1 1 1 实时系统具有在系统的逻辑性和时序正确性得不到保证时会引起严重的后 果的特点。目前有两种类型的实时系统:软实时系统和硬实时系统。在软实时 系统中,系统的宗旨是使各个任务运行得越快越好,并不要求限定某一任务必 须在多长时间内完成。 在硬实时系统中,各个任务不仅要执行无误而且要做到准时。大多数实时 系统是二者的结合。实时系统的应用涵盖广泛的领域,而多数实时系统又是嵌 入式的。 复杂程度不高的小系统一般被设计成前后台系统或超循环系统( s u p e p l 0 0 p s ) 。应用程序是一个无限的循环,循环中调用相应的函数完成相应的操 作,这部分可以看成后台行为( b a c k g r o u n d ) 。中断服务程序处理异步事件, 这部分可以看成前台行为( f o r e g r o u n d ) 。后台也可以叫做任务级,前台也叫中 断级。时间相关性很强的关键操作( c r i t i c a lo p e r a t i o n ) 一定是靠中断服务来保 证的。因为中断服务提供的信息一直要等到后台程序走到该处理这个信息这一 步时才能得到处理,这种系统在处理信息的及时性上,比实际可以做到的要 差。这个指标称作任务级响应时间。最坏情况下的任务级响应时间取决于整个 循环的执行时间。因为循环的执行时间不是常数,程序经过某一特定部分的准 确时间也是不能确定的。进而,如果程序修改了,循环的时序也会受到影响。 不可剥夺型内核要求每个任务自我放弃c p u 的所有权。不可剥夺型调度法 也称作合作型多任务,各个任务彼此合作共享一个c p u 。异步事件还是由中断 服务来处理。中断服务可以使一个高优先级的任务由挂起状态变为就绪状态。 但中断服务以后控制权还是回到原来被中断了的那个任务,直到该任务主动放 弃c p u 的使用权时,那个高优先级的任务才能获得c p u 的使用权。 不可剥夺型内核的一个优点是响应中断快。在任务级,不可剥夺型内核允 许使用不可重入函数。每个任务都可以调用非可重入性函数,而不必担心其它 任务可能正在使用该函数,从而造成数据的破坏。因为每个任务要运行到完成 时才释放c p u 的控制权。当然该不可重入型函数本身不得有放弃c p u 控制权 的企图。 第二章嵌入式实时操作系统u c ,o s - i i 理论研究 使用不可剥夺型内核时,任务级响应时间比前后台系统快得多。此时的任 务级响应时间取决于最长的任务执行时间。 不可剥夺型内核的另一个优点是,几乎不需要使用信号量保护共享数据。 运行着的任务占有c p u ,而不必担心被别的任务抢占。但这也不是绝对的,在 某种情况下,信号量还是用得着的。处理共享i 0 设备时仍需要使用互斥型信 号量。例如,在打印机的使用上,仍需要满足互斥条件。 当系统响应时间很重要时,要使用可剥夺型内核。因此,c o s i i 以及绝 大多数商业上销售的实时内核都是可剥夺型内核。最高优先级的任务一旦就 绪,总能得到c p u 的控制权。当一个运行着的任务使一个比它优先级高的任务 进入了就绪态,当前任务的c p u 使用权就被剥夺了,或者说被挂起了,那个高 优先级的任务立刻得到了c p u 的控制权。如果是中断服务子程序使一个高优先 级的任务进入就绪态,中断完成时,中断了的任务被挂起,优先级高的那个任 务开始运行。 使用可剥夺型内核,最高优先级的任务什么时候可以执行,可以得到c p u 的控制权是可知的。使用可剥夺型内核使得任务级响应时间得以最优化。 使用可剥夺型内核时,应用程序不应直接使用不可重入型函数。调用不可 重入型函数时,要满足互斥条件,这一点可以用互斥型信号量来实现。如果调 用不可重入型函数时,低优先级的任务c p u 的使用权被高优先级任务剥夺,不 可重入型函数中的数据有可能被破坏。所以,可剥夺型内核总是让就绪态的高 优先级的任务先运行,中断服务程序可以抢占c p u ,到中断服务完成时,内核 让此时优先级最高的任务运行( 不一定是那个被中断了的任务) 。任务级系统 响应时间得到了最优化,且是可知的。本文所选择移植的u c ,0 s i i 属于可剥夺 型内核。 综上所述,三种实时系统:前后台系统、不可剥夺型内核和可剥夺型内核 实时系统的小结见表2 1 。 基于单片机自控程序的特点,本文选用了u c o s i i 嵌入式实时操作系统作 为研究对象,主要基于以下几点考虑: l 、u c o s i i 嵌入式操作系统具有灵活的可剪裁性,其内核最小体积仅占 用1 2 k 代码空间,根据应用的不同,可以通过预编译选项装载更多的功能模 块,随时进行扩展; 4 第二章嵌入式实时操作系统c ,o s i l 理论研究 2 、n c o s - i i 具有良好的实时性,通过占先式实时内核、多任务机制和中 断管理,能够保证自动控制领域的实时要求; 3 、u c ,o s i i 具有很好的可移植性,在一个硬件平台上开发的应用程序, 仅需作微小的改动就可以移植到其它的硬件系统上,有利于缩短开发周期; 4 、u c ,o s i i 还是一个源代码开放的操作系统,有利于开发人员的学习与 使用。 下面各节简单介绍c o s i i 的原理和实现方法。 表2 1 实时系统小结 i 麟鬈羧麓黧鬟! 蘩戮嚣懿誉纂 :j 二蓦簸釜j 爷羁斌翔s j 麓蕊一喀懿i 毹每酾鬻? + t 嫡遍i 碡i 霹麓垂黧篡譬囊 o 簇:嚣。_ _ i 蠢臻0 基誊誊蛸磷菱i sr :,瑟薯。? j 麓瓣i o 囊黧瓤一、:;j j ;i ;搿孟茹+ 。k 溢溢芸西湔蕊最;黼乏文,f 溢;漆南甜i 童矗矗葫。j 谬备融。一 i 鬓篓麟窭鬓鏊季蒸i 溱黧鞲鬈囊鋈 7 0 日女 b k g m d r 8 p s e 仃协叫 l o n g e s tt a s k + f i n d h i g l l e s tp r i o 曲 t a s k + c o n t e x ts w i t c h f i n d h i g h e s t 州。一可t a s k + c o n t e x ts w i t c h 蠢减螽鬻蕊品赫赫潞鬻鬟瑟a 渐茹黼磊矗巍荔。翁舔戮蓄蠲浮;黪誊 i 。i ! 鬟;i 。- 鬟i :董! :,i ,? i ;i 誊警,。+ 墨j 酶! :药d t ,j i i 篓嚣! 。j 、二+ 簪懒! l ;i 萝睁i j j ;囊;笺i 1 jj 誓 删肘s 妇 a p p l i c a t l o nc o d ea p p l i c a t l o nc o d ea p p l f c a t i o nc o d o + k e m e l r a m+ k e 丌i e l r a m + s u m ( 亿ks t a c l ( s+ s u m ( 协ks t a c l c s + m a x ( i s rs 诅c k ) )+ m a x ( i s rs t a c k ) ) 磷每蓬。套,i 硒i 辫目i ;麟曩j ,? 鬻篓嚣囊i 黎攀髓囊鬻。i 叠j :鬻篱誊爱、j ; ? i e k 6 缸z v i 。i 蛹! i d ! e _ ;,- ;。j 薹萋:i ;j i ? j * 二i j 萋囊j ;ii :i :j :3 辩i :j ;j j ;j i 蔓凳,ij 蓦攀? ;爰;暑i j ! ; 5 第二章嵌入式实时操作系统u c ,o s - i i 理论研究 第二节 l c o s i i 内核结构1 2 l 2 2 1 临界段 和其它内核一样,c o s - i i 为了处理临界段代码需要关中断,处理完毕后 再开中断。这使得u c o s i i 能够避免同时有其它任务或中断服务进入临界段代 码。关中断的时间是实时内核开发商应提供的最重要的指标之一,因为这个指 标影响用户系统对实时事件的响应性。u c o s i i 努力使关中断时间降至最短, 但就使用u c o s i i 而言,关中断的时间很大程度上取决于微处理器的架构以及 编译器所生成的代码质量。 微处理器一般都有关中断开中断指令,用户使用的c 语言编译器必须有某 种机制能够在c 中直接实现关中断,开中断地操作。某些c 编译器允许在用户 的c 源代码中插入汇编语言的语句。这使得插入微处理器指令来关中断,开中断 很容易实现。而有的编译器把从c 语言中关中断开中断放在语言的扩展部分。 c o s i l 定义两个宏来关中断和开中断,以便避开不同c 编译器厂商选择不同 的方法来处理关中断和开中断。u c ,o s i i 中的这两个宏调用分别是: o se n t e rc r j t i c a l 0 和o se x i tc r j t i c a l 0 。因为这两个宏的定义取决 于所用的微处理器,故在文件0 sc p u h 中可以找到相应宏定义。每种微处理 器都有自己的0 sc p u h 文件。 2 2 2 任务 p c o s i i 可以管理多达6 4 个任务,但目前版本的p c o s i i 有两个任务已 经被系统占用了。系统保留了优先级为0 、l 、2 、3 、o sl o w e s tp r j o - 3 、 o sl o w e s tp r j o 2 ,0 sl 0 w e s tp r j 0 1 以及o sl o 、e s tp r j o 这8 个任 务以备将来使用。o sl o w e s tp 刚0 是作为定义的常数在o sc f g h 文件中 用定义常数语句托e f j n ec o n s t a r l t 定义的。因此用户可以有多达5 6 个应用任务。 必须给每个任务赋以不同的优先级,优先级可以从0 到o sl 0 w e s tp r l o 一 2 。优先级号越低,任务的优先级越高。u c o s 1 i 总是运行进入就绪态的优先 级最高的任务。目前版本的肚c o s i i 中,任务的优先级号就是任务编号 ( i d ) 。优先级号( 或任务的i d 号) 也被一些内核服务函数调用,如改变优 先级函数o s t a s k c h 锄g e p r i o ( ) ,以及任务删除函数0 s t a s k d e l ( ) 。【3 】 6 第二章嵌入式实时操作系统c 0 s - i i 理论研究 为了使u c ,o s i i 能管理用户任务,用户必须在建立一个任务的时候,将任 务的起始地址与其它参数一起传给下面两个函数中的一个:o s t a s t c r e a t 或 o s t a s k c r c a t e x t 0 。0 s t a s k c r e 砒e e x t 0 是o s 协k c r e a t e o 的扩展,它扩展了一些 附加的功能。 图2 1 是c o s i i 控制下的任务状态转换图。在任一给定的时刻,任务的 状态一定是在这五种状态之一。 睡眠态( d o r m a n t ) 指任务驻留在程序空间之中,还没有交给“c ,o s i i 管理。把任务交给p c 0 s i i 是通过调用下述两个函数之一:o s t a s k c r e a t e o 或 o s t a s k c r c a t e e x t 0 。当任务一旦建立,这个任务就进入就绪态准备运行。任务 的建立可以是在多任务运行开始之前,也可以是动态地被一个运行着的任务建 立。如果一个任务是被另一个任务建立的,而这个任务的优先级高于建立它的 那个任务,则这个刚刚建立的任务将立即得到c p u 的控制权。一个任务可以通 过调用o s t a s k d e l 0 返回到睡眠态,或通过调用该函数让另一个任务进入睡眠 态。 调用0 s s t a i t ( ) 可以启动多任务。o s s t a r t ( ) 函数运行进入就绪态的优先级最 高的任务。就绪的任务只有当所有优先级高于这个任务的任务转为等待状态, 或者是被删除了,才能进入运行态。 正在运行的任务可以通过调用两个函数之一将自身延迟一段时间,这两个 函数是o s t 岫e d l y o 或0 s t i m e d l y h m s m 0 。这个任务于是进入等待状态,等 待这段时间过去,下一个优先级最高的、并进入了就绪态的任务立刻被赋予了 c p u 的控制权。等待的时间过去以后,系统服务函数0 s t i m e t i c k ( ) 使延迟了的 任务进入就绪态。 正在运行的任务期待某一事件的发生时也要等待,手段是调用以下3 个函 数之一:o s s e m p e n d o ,o s m b o ) 【p e n d ( ) ,或o s q p e n d 0 。调用后任务进入了等 待状态( w a i t i n g ) 。当任务因等待事件被挂起( p e n d ) ,下一个优先级最高 的任务立即得到了c p u 的控制权。当事件发生了,被挂起的任务进入就绪态。 事件发生的报告可能来自另一个任务,也可能来自中断服务子程序。 正在运行的任务是可以被中断的,除非该任务将中断关了,或者“c o s 1 i 将中断关了。被中断了的任务就进入了中断服务态( i s r ) 。响应中断时,正 在执行的任务被挂起,中断服务子程序控制了c p u 的使用权。中断服务子程序 可能会报告一个或多个事件的发生,而使一个或多个任务进入就绪态。在这种 7 第二章嵌入式实时操作系统c o s - i i 理论研究 情况下,从中断服务子程序返回之前,“c o s i i 要判定,被中断的任务是否还 是就绪态任务中优先级最高的。如果中断服务子程序使一个优先级更高的任务 进入了就绪态,则新进入就绪态的这个优先级更高的任务将得以运行,否则原 来被中断了的任务才能继续运行。 当所有的任务都在等待事件发生或等待延迟时间结束,肛c o s i l 执行空闲 任务( i d l et a s k ) ,执行0 s 协l ( i d l e ( ) 函数。 一旦任务建立了,任务控制块o st c b s 将被赋值。任务控制块是一个数 据结构,当任务的c p u 使用权被剥夺时,1 lc ,o s 一用它来保存该任务的状 态。当任务重新得到c p u 使用权时,任务控制块能确保任务从当时被中断的那 一点丝毫不差地继续执行。o st c b s 全部驻留在r m 中。任务建立的时候, o st c b s 就被初始化了。 图2 1 任务的状态转换 每个任务被赋予不同的优先级等级,从o 级到最低优先级 o sl o w e s tp r l o ,包括0 和o sl o w e s tp r l o 在内( 见文件 o s _ c f g h ) 。当p c o s - i l 初始化的时候,最低优先级o s - l o w e s t _ p r l o 总 是被赋给空闲任务i d l et a s k 。注意,最多任务数目o sm a xt a s k s 和最低优 8 第二章嵌入式实时操作系统c o s i i 理论研究 先级数是没有关系的。用户应用程序可以只有1 0 个任务,而仍然可以有3 2 个 优先级的级别( 如果用户将最低优先级数设为3 1 的话) 。 每个任务的就绪态标志都放入就绪表中的,就绪表中有两个变量 o s r e d y g r p 和o s r d y t b l 】。在0 s r d y g r p 中,任务按优先级分组,8 个任务为 一组。o s r d y g r p 中的每一位表示8 组任务中每一组中是否有进入就绪态的任 务。任务进入就绪态时,就绪表o s r d y t b l 口中的相应元素的相应位也置位。就 绪表o s r d y t b l 口数组的大小取决于o s l o w e s t _ p r l o ( 见文件o s _ c f g h ) 。 当用户的应用程序中任务数目比较少时,减少0 s _ l 0 w e s tp r l o 的值可以降 低“c ,o s i i 对r a m ( 数据空间) 的需求量。 c o s i i 总是运行进入就绪态任务中优先级最高的那一个。确定哪个任务 优先级最高,下面该哪个任务运行了的工作是由调度器( s c h e d u l e r ) 完成 的。任务级的调度是由函数0 s s c h e d ( ) 完成的。中断级的调度是由另一个函数 0 s i n t e x t ( ) 完成的。 2 2 3 崛,o s 的初始化和启动1 4 l 在调用”c o s i i 的任何其它服务之前,p c o s i i 要求用户首先调用系统初 始化函数o s i i n t ( ) 。o s i i n t ( ) 初始化c ,o s i i 所有的变量和数据结构( 见 o s c o r e c ) 。o s i n i t o 建立空闲任务,这个任务总是处于就绪态的。空闲任 务o s 协l c i d l e ( ) 的优先级总是设成最低,即o sl o w e s tp r j o 。如果统计 任务允许o st a s ks t a te n 和任务建立扩展允许都设为1 ,则o s i n i t 0 还得 建立统计任务0 s t a s k s 诅t 0 并且让其进入就绪态。o s t a s k s 诅t 的优先级总是设 为o sl o w e s tp r i o l 。 多任务的启动是用户通过调用0 s s t a l t 0 实现的。然而,启动“c ,0 s i i 之 前,用户至少要建立一个应用任务。 v o i dm a i n ( v o i d ) o s i n i t 0 ;严初始化h c 0 s i i + 通过调用o s t a s k c r c a t e o 或o s t a s k c r e a t e e x t 0 创建至少一个任务 o s s t a r t o ;严开始多任务调度1 0 s s t a 哟永远不会返回+ , 9 第二章嵌入式实时操作系统p c ,o s 1 1 理论研究 第三节c o s i i 任务管理 任务管理是一个操作系统实现的主要功能之一,在本文后面的操作系统在 智能家居自动控制的应用实践中,选用操作系统与不用操作系统最大的区别就 体现在系统的任务管理方面,所以在p c o s 1 1 的原理介绍中,任务管理将作为 主要部分进行讲解。 2 3 1 建立任务0 5 l 想让u c ,o s i i 管理用户的任务,用户必须要先建立任务。用户可以通过传 递任务地址和其它参数到以下两个函数之一来建立任务:o s t a s k c r e a t e 0 或 o s t a s k c r e a t e e x t 0 。o s t a s k c r c a t e o 与p c o s i i是向下兼容的, o s t a s k c r e a t e e x t 0 是o s t a s k c r e a t e o 的扩展版本,提供了一些附加的功能。用 两个函数中的任何一个都可以建立任务。 任务可以在多任务调度开始前建立,也可以在其它任务的执行过程中被建 立。在开始多任务调度( 即调用0 s s t a n 0 ) 前,用户必须建立至少一个任务。任 务不能由中断服务程序( i s r ) 来建立。 o s t a s k c r e a t e 0 需要四个参数:t a s k 是任务代码的指针,p d a 诅是当任务开 始执行时传递给任务的参数的指针,p t o s 是分配给任务的堆栈的栈顶指针,p r i o 是分配给任务的优先级。 n q t 8 uo s t a s k c r e a t e ( v o i d ( + t a s k ) ( v o i d + p d ) ,v o i d + p d a t 如o s s t k + p t o s , i n t 8 up r j o ) v o i d + p s p ; r n t 8 ue r r : 检测分配给任务的优先级是否有效 任务的优先级必须在o 到o sl o w e s tp r j 0 之间。 i f ( p r i o o s l o w e s t - p 砌0 ) r e t i l m ( o sp r j oi n v a l i d ) ; ) 禁止中断 o s - e n t e r - c i u l l c a l 0 ; ,确保在规定的优先级上还没有建立任务 1 0 第二章嵌入式实时操作系统h c o s i i 理论研究 i f ( o s t c b p r i o t b l p r i o 】一( o s j c b + ) 0 ) 放置非空指针,保留该优先级 0 s t c b p r i o t b l r i o 】= ( 0 s t c b + ) l ; ,允许中断 o s - e x i t _ c l u t l c a l 0 ; 为任务建立堆栈,并返回新的栈顶。 p s p = ( v o i d + ) 0 s t 瓠k s t k i n i t ( t a s k ,p d a t a ,p t o s ,o ) ; 从空闲的o s j c b 池中获得并初始化一个o s j c b e r r = o s t c b i n i t o r i o ,p s p ,( v o j d + ) o ,0 ,o ,( v o i d + ) o ,o ) ; ,检验返回结果 i f ( e 玎一o s - n o e r r ) o s _ e n t e i u r j t i c a l o ; 如果成功,增加o s t a s k c t r 0 s t a s k c t r 斗斗: 用户自定义函数,用来扩展任务创建的功能 0 s t a s k c r e a t c h o o k ( 0 s t c b p 渤t b l 时i o 】) ; o s _ e i t - c i u l l c a l o ; i f ( o s r u n n i n g ) ,函数是在某个任务的执行过程中被调用 ,则调用任务调度函数,判断新建任务是否 具有更高的优先级,如果是,需要进行任 务 ,的切换 0 s s c h e d 0 ; ) ) e l s e o s e n t e i t _ c r i t l c a l o ; 如果失败,置0 s t c b p r i o t b l 【p r i o 】的入口为o ,以放弃该任务的优先级 o s t c b p r o t b l 【p r i o 】= ( o s j c b + ) 0 ; o s e x i t c r j t l c a l o ; 第二章嵌入式实时操作系统u c ,o s - i i 理论研究 , r e t u m ( e 丌) ; ) e i s e o s e x i t - c r j t i c a l ( ) ; r e t u m ( o s p r j 0 j x l s l ) ; ) ) 2 3 2 任务堆栈 每个任务都有自己的堆栈空间。堆栈必须声明为0 ss t k 类型,并且由连 续的内存空间组成。用户可以静态分配堆栈空间( 在编译的时候分配) 也可以 动态地分配堆栈空间( 在运行的时候分配) 。 静态堆栈声明方法: s 诅t i c0 s - s t km y t a s k s t a c k 【s t a c k _ s i z e 】; 或o s s t km y t a s k s 协c k s 诅c k - s i z e 】; 用户还可以用c 编译器提供的m a l l o c ( ) 函数来动态地分配堆栈空间。在动 态分配中,用户要时刻注意内存碎片问题。特别是当用户反复地建立和删除任 务时,内存堆中可能会出现大量的内存碎片,导致没有足够大的一块连续内存 区域可用作任务堆栈,这时m a l l o c ( ) 便无法成功地为任务分配堆栈空间。 任务所需的堆栈的容量是由应用程序指定的。用户在指定堆栈大小的时候 必须考虑用户的任务所调用的所有函数的嵌套情况,任务所调用的所有函数会 分配的局部变量的数目,以及所有可能的中断服务例程嵌套的堆栈需求。另 外,用户的堆栈必须能储存所有的c p u 寄存器。 有时候决定任务实际所需的堆栈空间大小是很有必要的。因为这样用户就 可以避免为任务分配过多的堆栈空间,从而减少自己的应用程序代码所需的 r a i ( 内存) 数量。虻0 s i i 提供的0 s t a s k s t k c h k ( ) 函数可以为用户提供堆栈检 验功能。o s t a s k s t k c h k ( ) 顺着堆栈的栈底开始计算空闲的堆栈空间大小,具体 实现方法是统计储存值为0 的连续堆栈入口的数目,直到发现储存值不为0 的 堆栈入口。用户应该使自己的应用程序运行足够长的时间,并且经历最坏的堆 栈使用情况,这样才能得到正确的数。一旦o s t a s k s t k c h k 0 提供给用户最坏情 况下堆栈的需求,用户就可以重新设置堆栈的最后容量了。为了适应系统以后 1 2 第二章嵌入式实时操作系统u c o s i i 理论研究 的升级和扩展,用户应该多分配l o 一1 0 0 的堆栈空间。在堆栈检验中,用 户所得到的只是一个大致的堆栈使用情况,并不能说明堆栈使用的全部实际情 况。 2 3 3 删除任务 有时候删除任务是很有必要的。删除任务,是说任务将返回并处于休眠状 态,并不是说任务的代码被删除了,只是任务的代码不再被崛0 s i i 调用。 通过调用o s t a s k d e l ( ) 就可以完成删除任务的功能。 i n t 8 uo s t a s k d e l ( i n t 8 up r i o ) o s j b + p t c b ; 0 s - e 狲t + p e v e n t ; 确保要删除的任务并非空闲任务 i f o r i o o s - l d l e _ p r j o ) r e t u m ( o s _ - t a s k d e l i d l e ) ; ) o s n t e r _ c :i u t i c a l 0 ; 确保用户不在中断例程中试图删除一个任务 i f ( o s i n t n e s t i n g 0 ) o s - e x i t c r j l l c a l 0 ; r c t u m ( 0 s t a s k j ) e l l i s r ) ; ) 确保被删除的任务确实存在 i f ( ( p t c b = o s t c b p r i o t b l 砸r i o 】) l _ ( o s 一_ t c b + ) 0 ) 如果任务处于就绪表中,将被直接删除 i f ( ( o s r d y t b l 噼c b o s t c b & = p t c b - o s t c b b i t ) ( ) 一 0 ) 0 s r d y g r p & = p t c b - 0 s t c b b i t y ; 第二章嵌入式实时操作系统u c ,o s - i i 理论研究 如果任务处于等待表中,将从自己所处的表中删除 i f ( q e v e n t = p t c b - o s t c b e v e n t p 廿) f - ( o s 旦v e n t + ) o ) i f ( ( p e v e m o s e v e n t t b l 【p t c b 一 o s t c b y 】 & = p t c b - o s t c b b i t x ) 一0 ) p e v e n t - o s e v e n t g r p & = p t c b - o s t c b b i t y ) ) 任务删除 ) e l s e 0 s _ e x i t _ a u l l c a l 0 ; r e t 啪( o s t a s k d e l _ e r r ) ; ) 有时候,如果任务a 拥有内存缓冲区或信号量之类的资源,而任务b 想删 除该任务,这些资源就可能由于没被释放而丢失。在这种情况下,用户可以想 法子让拥有这些资源的任务在使用完资源后,先释放资源,再删除自己。用户 可以通过o s t a s k d e l r e q 0 函数来完成该功能。 发出删除任务请求的任务( 任务b ) 和要删除的任务( 任务a ) 都需要调用 o s t a s k d e l r e q ( ) 函数。任务b 需要决定在怎样的情况下请求删除任务。换句话 说,用户的应用程序需要决定在什么样的情况下删除任务。如果任务需要被删 除,可以通过传递被删除任务的优先级来调用0 s t a s l ( d e l r e q ( ) 。如果要被删除 的任务不存在( 即任务已被删除或是还没被建立) ,0 s t a s k d e l r e q ( ) 返回 o s _ t a s k - n o i _ e x i s t 。如果o s t a s l 【d e l r e q ( ) 的返回值为0 s - n 0 - e r r ,则表明请 求已被接受但任务还没被删除。用户可能希望任务b 等到任务a 删除了自己以 后才继续进行下面的工作,这时用户可以通过让任务b 延时一定时间来达到这 个目的。 如果任务要删除自己,在0 s t a b 中存有一个标志,任务通过查询这个标 志的值来确认自己是否需要被删除。这个标志的值是通过调用0 s t a s k d e l r e q ( 0 s _ p r l 0 一s e l f ) 而得到的。当o s t a s i 【d e l r e q ( ) 返回给调用者o s - t a s k - d e l _ r e q 时,则表明已经有另外的任务请求该任务被删除了。在这种情况下,被删除的 1 4 第二章嵌入式实时操作系统d o s - u 理论研究 任务会释放它所拥有的所用资源,并且调用0 s t a s i 【d e l ( o s _ p r i o _ s e l f ) 来删除 自己。前面曾提到过,任务的代码没有被真正的删除,而只是此o s i i 不再 理会该任务代码,换句话说,就是任务的代码不会再运行了。但是,用户可以 通过调用o s t a s k c r e a t e ( ) 或o s t a s k c r e a t e e x t ( ) 函数重新建立该任务。 2 3 4 改变任务的优先级 在用户建立任务的时候会分配给任务一个优先级。在程序运行期间,用户 可以通过调用0 s t a s k c h a n g e p r i o ( ) 来改变任务的优先级。换句话说,就是 嵋o s i i 允许用户动态的改变任务的优先级。用户不能改变空闲任务的优先 级,但用户可以改变调用本函数的任务或者其它任务的优先级。 2 3 5 挂起任务 有时候将任务挂起是很有用的。挂起任务可通过调用0 s t a s k s u s p e n d ( ) 函 数来完成。被挂起的任务只能通过调用o s t a s k r e s m e ( ) 函数来恢复。任务挂起 是一个附加功能。也就是说,如果任务在被挂起的同时也在等待延时的期满, 那么,挂起操作需要被取消,而任务继续等待延时期满,并转入就绪状态。任 务可以挂起自己或者其它任务。 被挂起的任务只有通过调用o s t a s k r e s u m e ( ) 才能恢复。要恢复的任务必须 是存在的,因为用户要需要操作它的任务控制块o s j c b ,并且该任务必须是被 挂起的。o s t a s k r e s 唧e

温馨提示

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

评论

0/150

提交评论