




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践嵌入式实时操作系统嵌入式实时操作系统c/c/原理与实践原理与实践教材教材 :嵌入式实时操作系统:嵌入式实时操作系统c/os原理与实践原理与实践电子工业出版社电子工业出版社 作者作者:卢有亮卢有亮 电子科技大学能源科学与工程学院电子科技大学能源科学与工程学院作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践第4章 事件管理 4.1 事件管理重要数据结构 4.2 事件管理程序 4.3
2、 信号量管理 4.4 互斥信号量管理 4.5事件标志组管理 习题作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践 c/os-ii作为实时多任务操作系统,是事件驱动的,支持信号量,消息等机制。 事件主要包括信号量和互斥信号量,而事件的组合可以用事件标志组来管理。 本章的内容包括事件管理中数据结构,事件管理程序,信号量管理,互斥型信号量管理,以及事件标志组管理。 作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.1 事件管理重
3、要数据结构事件管理重要数据结构4.1.1 事件控制块事件控制块ecb事件控制块ecb在事件管理中占据着举足轻重的作用。虽然事件控制块ecb并没有任务控制块tcb的内容丰富,但是在事件处理中仍然是核心的数据结构,频繁被访问。ecb的定义出现在操作系统的头文件ucos_ii.h中。 作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.1.2事件等待组和事件等待表事件等待组和事件等待表一个事件块标志着一个事件,等待这个事件的任务在事件块的事件等待组和事件等待表中标记自己的存在,然后被阻塞。当事件发生的时候,操作系统
4、会找到优先级最高的等待事件发生的任务,并将该任务就绪,然后在事件等待组和事件等待表中取消该任务的标记。事件等待组和事件等待表的关系和就绪组与就绪表的关系是完全相同的。 作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践上图没有任务等待事件的发生,因此就绪组为上图没有任务等待事件的发生,因此就绪组为0,就绪表的内容也是全,就绪表的内容也是全0。假。假设有优先级为设有优先级为20和和32的任务在等待事件的发生,那么就绪组和就绪表应如的任务在等待事件的发生,那么就绪组和就绪表应如下图所示:下图所示:作者卢有亮作者卢有
5、亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.1.3事件控制块空闲链表事件控制块空闲链表 事件管理中,将空闲的事件块链接为一个单向的链表,事件控制块空闲链事件管理中,将空闲的事件块链接为一个单向的链表,事件控制块空闲链表。这个链表的形式和任务块表。这个链表的形式和任务块tcb的空闲链表的形式是完全相同的。的空闲链表的形式是完全相同的。当创建一个事件的时候,要在事件控制块当创建一个事件的时候,要在事件控制块ecb空闲链表查找是否有空闲的空闲链表查找是否有空闲的ecb可用。如果有就从链表中取出分配给事件。要做这件事,首先要找
6、到可用。如果有就从链表中取出分配给事件。要做这件事,首先要找到链表的表头,因此声明了一个重要的全局变量链表的表头,因此声明了一个重要的全局变量oseventfreelist指示表头指示表头的地址,称之为事件空闲链表指针。的地址,称之为事件空闲链表指针。oseventfreelist的定义为:的定义为: os_event *oseventfreelist;在事件控制块初始化程序结束的时候,该链表如图所示。在事件控制块初始化程序结束的时候,该链表如图所示。 作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.2.
7、1 事件控制块事件控制块ecb初始化初始化事件控制块的初始化在操作系统初始化函数os_init中被调用事件控制块的初始化函数是os_initeventlist 表4.3 ecb初始化函数os_initeventlist解析ecb初始化函数os_initeventlist首先清空了所有的ecb块,也就是清空了事件表。然后从0到os_max_events - 1u)循环对除最后一个ecb块之外的所有ecb块进行初始化,并顺便构建了单向的链表。循环结束后最后一个ecb 块oseventtblos_max_events - 1进行初始化。最后一个事件控制块oseventtblos_max_events
8、 - 1的oseventptr域指向空地址0,构造完成了如图4-3所示的空闲事件控制块链表。 然后将ecb空闲链表的表头地址给oseventfreelist,初始化完成 4.2 事件管理程序事件管理程序作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.2.2 事件等待表初始化事件等待表初始化当建立一个事件或消息,如信号量、邮箱、消息队列时,如信号量的建立函数ossemcreate等,需要对事件等待表进行初始化。表4.4事件等待表初始化函数为os_eventwaitlistinit解析 pevent-osev
9、entgrp = 0u; /* 清空任务等待组*/ for (i = 0u; i oseventtbli = 0u; /* 采用循环模式清空任务等待表*/ 作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.2.3设置事件等待设置事件等待当任务等待事件发生,并获得事件控制块ecb后,需要在ecb中标记任务在等待事件的发生,才可以在事件发生时取消任务的阻塞。 表4.5事件等待函数os_eventtaskwait解析 os_eventtaskwait做了两件事情:1.标记。在ecb中登记本任务,即在ecb的事件等
10、待表中对应优先级处标记为1,事件等待组中对应位标记为1。2.取消标记。在就绪表和就绪组中取消对该事件就绪的标记,将就绪表中对应优先级处标记为0,如果就绪表该任务所在的一组没有任务就绪,将就绪组中的对应位标记为0。 作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.2.4取消事件等待取消事件等待os_eventtaskremove 是与os_eventtaskwait相反的操作,当一个事件由于某种原因不再需要等待事件需运行os_eventtaskremove 。void os_eventtaskremove
11、(os_tcb *ptcb, os_event *pevent) int8u y; y = ptcb-ostcby; pevent-oseventtbly &= (os_prio)ptcb-ostcbbitx; /* 在事件等待表中删除事件等待标志 */ if (pevent-oseventtbly = 0u) /*若该行已没有任务等待*/ pevent-oseventgrp &= (os_prio)ptcb-ostcbbity; /*删除事件等待组的事件等待标志*/ 作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入
12、式实时操作系统原理与实践4.2.5将等待事件的任务就绪将等待事件的任务就绪任务因为等待事件而在ecb中登记自己的等待,当事件发生的时候,如果该任务是事件等待表中优先级最高的任务,就绪被取消等待而回到就绪状态。等待的事件发生的函数为os_eventtaskrdy 表4.8将等待事件的任务就绪函数os_eventtaskrdy的声明 表4.9将等待事件的任务就绪函数os_eventtaskrdy解析 os_eventtaskrdy的流程为:1.在事件等待表和事件等待组中找到最高优先级的等待任务的优先级。2.根据优先级查优先级指针表,找到该任务的任务控制块tcb指针。3.对任务控制块的相关参数进行赋
13、值。4.判断任务是否被挂起,如果未被挂起就将任务就绪。完成从阻塞态到就绪态的转移。5.调用os_eventtaskremove在ecb的事件等待表中删除该任务。6.返回任务的优先级。作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.3 信号量管理信号量管理 信号量在资源共享管理,任务同步与通信等方面都有广泛的应用。c/os-ii单独为信号量管理编写了c文件os_sem.c。 作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践
14、4.3.1 信号量的建立信号量的建立ossemcreate信号量在操作系统初始化的时候并不存在。这时操作系统中的事件管理数据结构事件控制块ecb为全空,所有的事件控制块都在ecb空闲链表中排队。信号量的建立函数ossemcreate将使用一个并配置一个ecb,使其具备信号量的属性。 表4.11创建信号量函数ossemcreate解析假设信号量值为5,则赋值后的ecb应该如图4-4所示。 作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践 宏os_event_type_sem的值是3,所以ecb中的osevent
15、type的值为3。假设该信号量为创建的第一个事件,那么图4.3的事件空闲任务链表将去掉第一个事件控制块,变为如图4.5所示。 作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.3.2 信号量的删除信号量的删除ossemdel信号量如果不再使用了就应该尽快删除,否则很快系统就没有可用的事件块可用。信号量的删除函数是ossemdel。 删除信号量比创建一个信号量更复杂 。表4.12删除信号量函数ossemdel解析开开始始返返回回是是否否在在中中断断i is sr r中中若若有有任任务务等等待待该该信信号号量量
16、t ta as sk ks s_ _w wa ai it ti in ng g= =t tr ru ue e否否则则为为f fa al ls se e否否os_del_no_pend其其他他值值是是设设置置该该e ec cb b属属性性为为未未用用空空闲闲e ec cb b链链表表表表头头插插入入该该e ec cb b无无任任务务等等待待该该事事件件? ?否否e ec cb b指指针针和和e ec cb b类类型型是是否否都都有有效效是是根根据据o op pt t值值进进行行分分支支转转移移是否否os_del_always使使所所有有的的等等待待该该信信号号量量的的任任务务就就绪绪设设置置该该
17、e ec cb b属属性性为为未未用用空空闲闲e ec cb b链链表表表表头头插插入入该该e ec cb b若若有有任任务务等等待待该该信信号号量量执执行行一一次次任任务务调调度度作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.3.3 请求信号量请求信号量ossempend 请求信号量也称为等待信号量。等待信号量的参数为3个,分别是ecb的指针pevent,32位无符号整数超时时间timeout,和用来返回结果的指向整型的指针perr。 表4.13等待信号量函数ossempend解析开开始始返返回回是是
18、否否在在中中断断i is sr r中中否否是是是信信号号量量计计数数值值o os se ev ve en nt tc cn nt t减减1 1,占占用用一一个个信信号号量量,不不需需要要等等待待否否e ec cb b指指针针和和e ec cb b类类型型是是否否都都有有效效是是若若信信号号量量有有效效否置置位位o os st tc cb bs st ta at t中中等等待待信信号号量量标标志志调调用用o os s_ _e ev ve en nt tt ta as sk kw wa ai it t终终止止当当前前任任务务,e ec cb b事事件件表表中中添添加加当当前前任任务务执执行行一一次
19、次任任务务调调度度存存储储超超时时时时间间到到o os st tc cb bd dl ly y 否 这这里里任任务务又又一一次次被被调调度度了了!从从阻阻塞塞态态回回到到就就绪绪态态又又被被调调度度 这这里里任任务务被被剥剥夺夺了了c cp pu u!进进入入阻阻塞塞态态!事事件件等等待待标标志志是是否否有有效效是如如果果是是资资源源满满足足而而结结束束等等待待,只只需需要要设设置置任任务务块块的的e ec cb b指指针针为为空空返返回回值值设设置置为为o os s_ _t ti im me eo ou ut t任任务务仍仍不不能能使使用用资资源源是返返回回值值设设置置为为o os s_ _
20、n no o_ _e er rr r任任务务可可使使用用资资源源返返回回值值设设置置为为o os s_ _e er rr r_ _p pe en nd d_ _i is sr r,提提示示出出错错是是返返回回值值设设置置为为o os s_ _e er rr r_ _p pe ev ve en nt t_ _n nu ul l或或o os s_ _e er rr r_ _e ev ve en nt t_ _t ty yp pe e提提示示出出错错否否是是否否是是等等待待超超时时调调用用o os s_ _e ev ve en nt tt ta as sk kr re em mo ov ve e清清
21、除除任任务务块块相相关关等等待待标标志志和和任任务务块块o os st tc cb bs st ta at t清清除除任任务务块块相相关关等等待待标标志志返返回回值值设设置置为为o os s_ _e er rr r_ _p pe en nd d_ _a ab bo or rt t任任务务仍仍不不能能使使用用资资源源否作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.3.4 提交信号量提交信号量 当任务a获得信号量之后将信号量数字减1,然后就可以访问资源r。这时,如果信号量的值为0,任务b如果也要访问资源r,
22、必须等待信号量,因此将任务b阻塞。任务a在对资源的访问完成之后,应将信号量的值加1。因为资源已经可以被其他的任务访问了,因此应该将任务b唤醒,使任务b就绪。 当访问资源的任务有2个以上,资源r可同时被n个任务访问,因此信号量的值在最开始创建的时候应该等于n。当任务a访问信号量,信号量值变为n-1,任务b又访问,信号量等于n-2,当第m个任务访问,信号量等于n-m。当n-m=0的时候,也就是当n=m的时候,当第n+1也要访问该资源r,第n+1个任务必须等待。当任何一个任务(例如第2个)访问资源完成,应该唤醒第n+1个任务让其访问资源。当第n+1个任务访问完成之后,因为没有其他的任务等待信号量,只
23、需简单地将信号量值加1。 表4.14提交信号量函数ossempost解析作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.3.5 无等待请求信号量无等待请求信号量在中断服务程序和有些用户任务中,需要无等待的请求信号量。也就是说,使用信号量请求资源,当没有可用的资源,信号量为0的时候,并不阻塞自己,而是继续执行其他代码。ossemaccept就是无等待的请求信号量函数 。表4.15无等待地请求信号量函数ossemaccept解析1进行参数检查2将信号量的值赋值给局部变量cnt,如果cnt 0说明资源有效或信号
24、量有效,因此将信号量的值减1然后哦返回cnt,可以执行访问资源的代码了。如果函数返回值为0,不能执行访问资源的代码。 作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.3.6 放弃等待信号量放弃等待信号量放弃等待信号量并非放弃本任务对信号量的等待。如果是放弃本任务对信号量的等待,那么本任务在等待信号量,那么本任务应该处于阻塞状态,一个处于阻塞状态的任务得不到运行,怎么能执行放弃等待信号量的代码呢?因此,一定是放弃其他任务对一个信号量的等待。表4.16放弃等待信号量函数ossempendabort解析 1.参
25、数检查,如果ecb指针无效或ecb的类型不是信号量类型,返回参数检查错误信息。2.如果pevent-oseventgrp为0说明没有任务等待信号量,返回0。3.否则根据参数opt(选项)进行分支转移,如果为os_pend_opt_broadcast,使用while语句循环地将等待该信号量的每个任务用os_eventtaskrdy来取消等待并使其就绪(除非任务还被挂起);如果为其他值则只将最高优先级的任务取消等待并就绪之。两种情况下都返回取消等待信号量的任务数。作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4
26、.3.7 信号量值设置信号量值设置操作系统提供了直接设置信号量值的函数ossemset。一般情况下无需使用该函数设置信号量的值,应该在信号量创建的时候初始化信号量的值。当一个信号量的值在创建之后为n,每次有任务请求信号量就将该值减1,反之将该值加1,一般情况下是不允许随便修改的。但是,在极其特殊的情况下,因为某种特殊的需要,例如突然增加了其他的资源,需要修改资源数n,可采用ossemset直接对信号量赋值,但条件是这时没有任务在等待该信号量。 表4.17设置信号量值函数ossemset解析 作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实
27、践嵌入式实时操作系统原理与实践4.3.8 查询信号量状态查询信号量状态信号量状态查询将ecb中关于信号量的信息拷贝到另一个数据结构信号量数据os_sem_data,信号量数据os_sem_data的声明见下表。表4.19查询信号量状态函数ossemquery解析 作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.3.9 信号量应用举例信号量应用举例假设有共享资源r,允许2个任务分时访问r,那么信号量的值应设置为2。系统中有3个用户任务访问资源r,分别为任务a、b、c,优先级分别为7、6、5。三个任务在操作系
28、统初始化和启动多任务之前被创建。任务a运行后创建信号量,并访问r,访问完成后任务a将自己阻塞1000个时钟周期,也就是10秒。任务b先阻塞300个时钟周期,然后操作步骤同任务a。任务c先阻塞400个时钟周期,然后操作步骤同任务a。假设三个任务才做资源r需要的时间都是1000个时钟周期,对资源r的操作可以用延时语句虚拟完成。表4.20操作资源r的三个任务的实现代码作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.3 互斥信号量管理互斥信号量管理 互斥信号量是一种特殊的信号量,取值只能是0或1。也就是说,只能有
29、一个任务访问的独占资源,应采用互斥信号量来管理。独占资源在系统中是非常常见的,例如各种io端口如串口、usb设备、网络设备等。为了保证系统的实时性,拒绝优先级反转,对互斥信号量的管理采用了优先级继承机制。 优先级继承机制:优先级继承机制对优先级升级的机制以优化系统的调度。例如当前的任务的优先级是比较低的,如优先级为50。优先级为3的任务请求互斥信号量的时候因为信号量已被占有所以只有阻塞。这时有优先级为20的任务就绪,而不请求该互斥信号量。因此优先级为20的任务会先运行。如果又有优先级为30、40的任务运行,那么优先级为50的任务总也得不到运行也就不能释放信号量,更可怕的是优先级为3的任务还在苦
30、苦等待信号量。这样,就发生了优先级反转。代码中的解决办法为将占有信号量的任务的优先级提高,例如提高为2,这样保证他对互斥资源处理完成,释放资源后又恢复他本来的优先级50,优先级为3的任务就不需要等待优先为20、30、40的那些中等优先级任务的运行了,纠正了优先级反转! 作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.4.1 互斥信号量的建立互斥信号量的建立与信号量一样,互斥信号量在操作系统初始化的时候并不存在。这时操作系统中的事件管理数据结构事件控制块ecb为全空,所有的事件控制块都在ecb空闲链表中排队
31、。信号量的建立函数osmutexcreate将使用并配置一个ecb,使其具备互斥信号量的属性。不同的是,互斥信号量中采用了优先级升级技术,因此osmutexcreate使用了一个优先级参数prio来创建信号量,含义是:prio是取得信号量的任务的被提升的优先级。含义是如果某任务取得了互斥信号量而使用互斥资源,这时候高优先级的任务试图取得互斥信号量,那么拥有此资源的任务就被提升为优先级prio。目的是使正在使用互斥信号量的资源优先级高于在请求该互斥信号量的任务 表4.22创建互斥信号量函数osmutexcreate解析作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/
32、嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.4.2 请求互斥信号量请求互斥信号量因为涉及优先级继承机制,请求互斥信号量与请求信号量的操作有极大的差异。虽然如此,但是两者的参数是完全相同的。请求互斥信号量的参数为3个,分别是ecb的指针pevent,32位无符号整数超时时间timeout,和用来返回结果的指向整型的指针perr。请求互斥信号量函数为osmutexpend,代码和分析见表4.17。 开开 始始返返 回回参参 数数 检检 查查 、 中中 断断及及 调调 度度 锁锁 检检 查查 是是否否 通通 过过是是是否否将 oseventcnt的低 8位 置 为 本 任 务的 优
33、先 级互互 斥斥 信信 号号 量量有有 效效 ?否更 改 任 务 优 先 级重 新 填 写 就 绪 表是是调调 用用o os s_ _e ev ve en nt tt ta as sk kr re em mo ov ve e取取 消消 等等 待待是 这这 里里 任任 务务又又 一一 次次 被被 调调 度度了了 ! 从从 阻阻 塞塞 态态 回回到到 就就 绪绪 态态 又又 被被 调调度度 这这 里里 任任 务务 被被剥剥 夺夺 了了 c cp pu u!进进 入入 阻阻 塞塞 态态 !是是 否否 由由 于于超超 时时 原原 因因结结 束束 等等 待待否设设 置置 相相 应应 返返 回回 值值回回
34、 复复 t tc cb b中中 状状 态态 标标志志 、 等等 待待 标标 志志 和和 事事件件 指指 针针返返 回回 值值 设设 置置 为为对对 应应 出出 错错 信信 息息是是pip小 于 本 任 务优 先 级取 得 优 先 级 继承 优 先 级 pip将 ecb的 指 针 oseventptr指 向 本 任务 的 tcb否返返 回回 值值 设设 置置 为为p pi ip p优优 先先 级级 设设置置 过过 低低 的的 错错 误误信信 息息返返 回回 值值 设设 置置 为为正正 确确 信信 息息是是是 否否 需需 要要 做做优优 先先 级级 继继 承承占占 有有 互互 斥斥 信信 号号 量
35、量的的 任任 务务 就就 绪绪 ?是更 改 任 务 优 先 级重 新 填 写 ecb中 事件 等 待 标 志否设设 置置 本本 任任 务务 t tc cb b中中 的的 状状态态 标标 志志 和和 延延 时时 时时 间间 ,执执 行行 任任 务务 调调 度度否作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.4.3 互斥信号量的删除互斥信号量的删除互斥信号量的删除函数是osmutexdel。参数ossemdel一样,是ecb指针pevent、整型的删除选项opt和用来返回结果的指向整型的指针perr。其中o
36、pt的值为 os_del_no_pend 表示只有当没有任务等待该事件的时候才允许删除,opt的值为 os_del_always 表示无论如何都删除。osmutexdel在表4.18中解析。 开开始始返返回回参参数数检检查查、中中断断及及调调度度锁锁检检查查是是否否通通过过若若有有任任务务等等待待该该信信号号量量t ta as sk ks s_ _w wa ai it ti in ng g= =t tr ru ue e否否则则为为f fa al ls se eos_del_no_pend其其他他值值否否清除优先级指针表中pip所对应的tcb指针无无任任务务等等待待该该事事件件? ?根根据据o
37、op pt t值值进进行行分分支支转转移移是否否os_del_always取得pip送局部变量pip取得任务原来的优先级送局部变量prio占有互斥信号量的任务tcb的地址oseventptr送局部变量ptcb是是填填写写相相应应出出错错信信息息ecb初始化后归还给空闲ecb链表填填写写正正常常返返回回值值循环调用os_eventtaskrdy将所有等待该互斥信号量的任务就绪把ecb初始化后归还给空闲ecb链表清除优先级指针表中pip所对应的tcb指针作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.4.4
38、发互斥信号量发互斥信号量 当任务占有互斥信号量后就可以对互斥资源进行访问,这时候ecb中的oseventcnt高8位是优先级继承优先级,低8位占有互斥信号量的任务的优先级。任务在对互斥资源访问完成后,应调用osmutexpos提交互斥信号量,或称发互斥信号量。这时候,如果任务的优先级是经过升级的,就要恢复原来的优先级,即oseventcnt中低8位。如果有任务等待互斥信号量,就可以恢复最高优先级的等待任务为就绪态,否则只需设置互斥信号量有效然后返回即可表4.14提交信号量函数ossempost解析表4.25提交互斥信号量函数osmutexpost解析开开始始返返回回参参数数检检查查是是否否通通
39、过过是是否否否将将等等待待任任务务中中最最高高优优先先级级的的任任务务就就绪绪本本任任务务占占有有该该互互斥斥信信号号量量是返返回回值值设设置置为为对对应应出出错错信信息息优优先先级级是是否否提提升升是将将o os se ev ve en nt tc cn nt t和和o os se ev ve en nt tp pt tr r赋赋值值否优优先先级级还还原原取取得得p pi ip p送送p pi ip p, ,取取得得任任务务原原来来的的优优先先级级送送p pr ri io o是是是否否有有任任务务在在等等待待该该互互斥斥信信号号量量是任任务务切切换换初初始始化化e ec cb b为为新新创创
40、建建时时的的状状态态否返返回回值值设设置置为为正正常常信信息息作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.4.5 无等待请求互斥信号量无等待请求互斥信号量 在有些用户任务中,需要无等待的请求互斥信号量。也就是说,使用互斥信号量请求互斥资源,当互斥资源已经被占用的时候,并不阻塞自己,而是继续执行其他代码。osmutexaccept就是无等待的请求互斥信号量函数,参数是请求的信号量的ecb指针,和以地址形式传递的错误码供返回错误信息。返回值是boolean型表示否取得资源访问权 表4.26无等待地请求互斥
41、信号量函数osmutexaccept解析 作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.4.6 查询互斥信号量状态查询互斥信号量状态信号量状态查询将ecb中关于互斥信号量的信息拷贝到另一个数据结构os_sem_data,互斥信号量数据os_mutex_data的声明见下表。表4.28查询互斥信号量状态函数osmutexquery解 作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.4.7 改变任务的优先级并重新就绪改
42、变任务的优先级并重新就绪在互斥信号量的请求和删除等部分都调用了osmutex_rdyatprio函数,这个函数的功能是改变任务的优先级,并将任务按新的优先级重新就绪。因为在前面并没有详细论述,因此在互斥信号量管理的最后部分讨论这个函数。该函数有两个参数分别是任务控制块的指针和任务的优先级。表4.29改变任务的优先级并重新就绪函数osmutex_rdyatprio解析 作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.4.8 互斥信号量应用举例互斥信号量应用举例假设有高优先级任务taskmutex1和低优先级
43、任务taskmutex2,以及中任务taskprint。任务信息列如表4.30所示。表4.31互斥信号量管理应用例程 作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.5 事件标志组管理事件标志组管理 在信号量和互斥信号量的管理中,任务请求资源,如果资源未被占用就可继续运行,否则只能阻塞,等待资源释放的事件发生。这种事件是单一的事件。如果任务要等待多个事件的发生,或多个事件中的某一个事件的发生就可以继续运行,那么就应该采用本章的事件标志组管理。举例说明,若创建一个事件标志组,这个事件标志组中的事件标志定义如
44、图 :当事件a和d发生的时候,事件标志应如图 如果一个任务请求事件标志组,请求的标志为0 x03,条件是全部事件发生,因为0 x03是00000011,因此要求事件a和事件b都发生才能继续运行,因此要被阻塞。只有等待上图中的位0和位3都为1的时候才能被就绪。如果请求的标志还是0 x03,但是条件是任务事件发生,那么由于a事件已经发生,任务可以继续运行。作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式
45、实时操作系统原理与实践4.5.1事件标志组数据结构事件标志组数据结构事件标志组os_flag_grp 作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.5.1事件标志组数据结构事件标志组数据结构事件标志节点os_flag_node 作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.5.1事件标志组数据结构事件标志组数据结构事件标志组实体事件标志组实体os_flag_grp osflagtblos_max_flags。 o
46、s_max_flags是宏,默认值是是宏,默认值是5。这里是生成了数组。这里是生成了数组osflagtbl,占用了占用了s_max_flags* sizeof(os_flag_grp)那么大的存储空间。那么大的存储空间。作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.5.1事件标志组数据结构事件标志组数据结构事件标志组链表事件标志组链表 所有没有被使用的事件标志组连接为一个单向的链表,这个链表被称为空闲事件所有没有被使用的事件标志组连接为一个单向的链表,这个链表被称为空闲事件标志组链表。标志组链表。事件标
47、志组中事件标志组中osflagwaitlist用来指示空闲事件标志组链表中的下一个事件标志用来指示空闲事件标志组链表中的下一个事件标志组。如果该事件标志组是空闲事件标志组链表中的最后一个,那么组。如果该事件标志组是空闲事件标志组链表中的最后一个,那么osflagwaitlist的值就是一个空指针。的值就是一个空指针。如果要创建一个事件标志组,就需要在这个链表中取出一个。如果要创建一个事件标志组,就需要在这个链表中取出一个。为了找到这个链表,定义了全局变量为了找到这个链表,定义了全局变量osflagfreelist指示该链表的表头。指示该链表的表头。作者卢有亮作者卢有亮 图书图书ppt和全部代码
48、下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.5.1事件标志组数据结构事件标志组数据结构事件标志节点链表事件标志节点链表 等待事件标志组的任务每个都要占用一个事件标志组节点,如果等待某事件事件等待事件标志组的任务每个都要占用一个事件标志组节点,如果等待某事件事件标志组的任务数有标志组的任务数有n个,那么这个,那么这n个事件标志组节点就要手来手链接为一个双向链个事件标志组节点就要手来手链接为一个双向链表,这个链表就是事件标志节点链表。表,这个链表就是事件标志节点链表。事件标志组中的事件标志组中的osflagwaitlist这时用来找到该链表,也就是指
49、向该链表的表头。这时用来找到该链表,也就是指向该链表的表头。c/os-ii的所有的链表操作,删除和添加都是在表头进行的。的所有的链表操作,删除和添加都是在表头进行的。 作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.5.2事件标志组初始化事件标志组初始化事件标志组的初始化函数在操作系统的初始化中被调用,函数名称为os_flaginit。表4.36事件标志组初始化函数os_flaginit分析流程为:1.将所有事件标志组全部清为全0。2.使用for循环将除最后一个事件标志组osflagtblos_max_f
50、lags - 1之外的所有事件标志组初始化,并基本构建了单向的事件标志组空闲链表。作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.5.2创建事件标志组创建事件标志组和信号量或互斥信号量的管理一样,要使用事件标志组依然需要创建。创建事件标志组就是将从事件标志组空闲链表的表头取下一个事件标志组,将其各种属性进行设置。初创建事件标志组的函数名称为osflagcreate。参数是事件标志flags和为返回运行信息而传递的地址参数,perr。创建事件标志组的函数osflagcreate的代码分析见下表。表4.37事
51、件标志组创建函数osflagcreate分析 流程如下:1.判断是否在中断服务程序中调用本函数,如果是就返回。2. 取得事件标志组的链表首地址送pgrp。3.判断pgrp是否为空指针,如果是则说明是系统已经没有空闲的事件标志组可供使用,填写错误信息,返回空指针。4.从空闲事件标志组链表取下表头,对pgrp所指的事件标志组的各个域进行赋值。5.返回事件标志组的指针pgrp。 作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.5.3事件标志组阻塞函数事件标志组阻塞函数事件标志阻塞函数os_flagblock是c
52、/os-ii的内部函数,功能是将事件阻塞,直到请求的事件标志被设置。表4.38事件标志阻塞函数os_flagblock的定义表4.39事件标志阻塞函数os_flagblock分析根据对代码的分析,流程如下:1.首先是针对任务控制块tcb的操作,在ostcbstat中设置事件标志组等待标志,将ostcbstatpend初始化事件等待状态,给ostcbdly赋值为超时时间,给ostcbflagnode赋值为当前事件标志节点地址。2.然后设置节点中各个域,包括事件标志,节点类型和tcb地址。3.在事件节点等待任务链表的头部插入本节点。4.在事件标志组中修改事件等待节点链表的首地址。5.取消任务的就绪
53、标志。该函数在下小节事件请求事件标志函数中就将被调用。作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.5.4请求事件标志请求事件标志请求事件标志组函数osflagpend用于等待事件标志组中的组合条件。用户任务可以任意任务位被置位或所有位都被置位。表4.40事件标志组创请求函数osflagpend的函数声明 表4.41事件标志组请求函数osflagpend分析1.首先要说明的是事件标志节点的声明2.消费标志的提取和等待标志的提纯。3.根据wait_type执行不同的代码。 4.在以上设置完成后,执行一次任
54、务调度,本任务将进入阻塞态。5.当事件标志中满足本任务要求的事件发生,即a事件和c事件都发生的情况,任务被重新就绪,再获得运行,将而在(5)处继续执行。 作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.5.5 删除事件标志组删除事件标志组和其他事件的删除函数一样,osflagdel也要进行谨慎的操作。osflagdel的参数是事件标志组的指针pgrp、整型的删除选项opt和用来返回结果的指向整型的指针perr。其中opt的值为 os_del_no_pend 表示只有当没有任务等待该事件标志组的时候才允许删
55、除,opt的值为 os_del_always 表示无论如何都删除。perr用于返回运行过程的一些信息。返回值os_flag_grp为事件标志组的指针。下表给出osflagdel的代码解析。表4.43 事件标志组删除函数osflagdel解析1.参数检查,及判断是否在isr中调用,是否是有效的事件标志组类型,选项是否有效。2. 根据标志组中osflagwaitlist是否为空指针,判断是否有任务在等待。根据判断结果对tasks_waiting赋值。3.如果选项为os_del_no_pend,若tasks_waiting为假,可删除该事件标志组。删除方法是初始化该事件标志组的各个域,然后归还给空闲
56、事件标志组链表,然后返回0;如果tasks_waiting为真,不能删除该事件标志组,返回事件标志组的指针。4. 如果选项为os_del_no_always,找到第一个事件标志节点送pnode, 循环调用os_flagtaskrdy将所有等待事件标志组的任务就绪。初始化事件标志组的各个域,将事件标志组添加回空闲事件标志组链表,然后执行一次任务调度,最后返回0。 作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.5.6 提交事件标志组提交事件标志组提交事件标志组函数将对事件标志组中的事件标志进行操作,并根据事
57、件等待的标志,恢复阻塞的任务就绪。是事件标志组管理中的核心函数之一 表4.44 事件标志组提交函数osflagpost解析1.参数检查。2.根据选项为清除或置位,设置新的事件标志组的事件标志。3. 将sched设置为假。4. 找到第一个事件标志节点赋值给pnode。5. 遍历事件标志节点链表,根据事件标志节点任务的等待类型osflagnodewaittype和等待标志osflagnodeflags,判断是否该任务的等待条件已经满足。如果满足,就将该任务就绪,并将sched设置为真。6.如果sched为真,就执行一次任务调度。这时从阻塞态回到就绪态的任务有可能获得运行。7.返回当前事件标志的标志。作者卢有亮作者卢有亮 图书图书ppt和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统原理与实践嵌入式实时操作系统原理与实践4.5.7标志节点任务就绪标志节点任务就绪标志节点任务就绪函数os_flagtaskrdy执行的功能比较简单,实现的功能是将事件是将事件标志节点指示的任务块进行赋值,如果该任务只等待事件标志,那么由于事件标志有效,将该任务就绪。返回是否需要调度。表4.45 标志节点任务就绪函数os_flagtaskrdy代码解析 该函数首先在事件标志节点中找到事件控制块地址,然后对事件控制块中的一些域赋值,清任务
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年网络营销能力测试试卷及答案
- 2025年数字媒体与设计考试试卷及答案
- 2025年全球化与区域经济一体化试题及答案
- 2025年计算机科学知识考试试卷及答案
- 2025年电子工程与通信技术能力考核试题及答案
- 2025年儿童心理发展考试试题及答案
- 2025年公共关系学专业考试题及答案
- 一本珍贵的书400字9篇
- 写人作文勤劳的交警叔叔250字9篇
- 构建应用型人才培养模式的策略及实施路径
- 足月待产护理个案
- 2025年江苏省职业院校技能大赛中职组(食品药品检验)参考试题库资料及答案
- 礼让行车培训
- DBJ51T 008-2015 四川省建筑工业化混凝土预制构件制作 安装及质量验收规程
- 《精馏塔工作原理》课件
- 基于学科核心素养的初中历史大单元教学设计研究
- 北师大版二年级下册数学计算题每日一练带答案(共20天)
- 北师大版四年级下册数学计算题每日一练带答案(共30天)
- 建筑给排水班组劳动合同
- 中医诊所信息安全管理制度
- 工程五金知识培训课件
评论
0/150
提交评论