uC/OS-II时间控制块1

任务或中断服务程序可以通过事件控制块(ECB)向另外的任务发信号,这里的信号被看成是事件。(1)中断服务程序不能等待事件控制块给它发送信号;(2)处于等待状态状态的任务可以设置等待超时;(3)多个任务同时等待一事件的发生,当事件发生时,只有优先级最高的任务得到该事件并进入就绪状态;

Ucosii通过ucos_ii.h中定义的OS_EVENT数据结构,维护一个事件控制块ECB的所有信息。该结构中除了包含事件本身的定义外,还定义了等待该事件的所有任务列表。 每个信号量、互斥型信号量、消息邮箱、消息队列都应分配到一个事件控制块。

600 将任务置于等待事件的任务列表

Pevent->OSEventGrp |= OSMapTbl[prio>>3];

Pevent->OSEventTbl[prio>>3] |= OSMapTbl[prio&0x07];

601 从等待事件的任务列表中使任务脱离等待状态

清除任务在OSEventTbl[]中的相应位,并且如果其所在组中没有其他处于等待事件的任务,OSEventGrp中的相应位也要清除掉。

602 在等待事件的任务列表中查找优先级最高的任务

和查找处于就绪状态的任务列表一样,通过查OSUnMapTbl[]得出。

603 空余事件控制块链表

事件控制块的总数由应用程序所需要的信号量、互斥型信号量、邮箱、消息队列的总数决定。所有事件控制块ECB被链接成一个单向链表---空余事件控制块链表。

604 初始化一个事件控制块 OS_EventWaitListInit()

当建立一个信号量、邮箱、消息队列时,相应的建立函数OS??Create()通过调用OS_EventWaitListInit(),对事件控制块中的等待任务列表进行初始化。该函数初始化一个空的等待任务列表,初始化完成时,表中没有任何等待事件的任务。函数传递一个指针变量给事件控制块,这个指针变量就是创建信号量、邮箱等时分配的事件控制块指针pevent.

605 使一个任务进入就绪态  OS_EventTaskRdy()

当某个事件发生了,要将等待该事件任务列表中最高优先级任务置于就绪态时,信号量、邮箱等所对应的POST函数调用OS_EventTaskRdy(),以实现该操作。

 

606 使一个任务进入等待某事件发生状态 OS_EventTaskWait()

当某任务须等待一个事件的发生时,信号量、邮箱等会通过相应的PEND函数调用函数OSEventTaskWait(),使当前任务从就绪任务列表中脱离就绪态,并放到相应事件的事件控制块ECB的等待任务表中。

607 由于等待超时而将任务置为就绪态 OS_EventTO()

如果在预先指定的等待时限内任务等待的事件没有发生,那么OSTimeTick()函数会因为等待超时而将任务的状态置为就绪态。这种情况下,信号量、邮箱等通过PEND函数调用OS_EventTO()函数,以完成这项工作。

 

                                第七章  信号量管理

信号量有2部分组成:(1)16位的无符号整型信号量的计数值(0-65535);(2)由等待该信号量的任务组成的等待任务表。

Ucosii提供了6个对信号量进行操作的函数,当OS_CFG.H中OS_SEM_EN设为0时,所有的信号量函数都不能用,若配置为1时,OSSemCreate(),OSSemPend(),OSSemPost()必须有。

700 建立一个信号量 OSSemCreate()

该函数用来建立一个信号量,并对它付初值。中断服务程序不能调用该函数

701 删除一个信号量 OSSemDel()

当OS_CFG.H中的OS_SEM_DEL_EN=1时,该函数才被编译。在删除信号量之前,必须首先删除操作该信号量的所有任务。中断服务程序不能调用该函数。

702 等待一个信号量 OSSemPend()

真正将任务置入睡眠状态的操作在OS_EventTaskWait()函数中执行;由于得不到信号量,当前任务就不能再处于就绪态了,于是调用任务调度函数让下一个处于最高优先级的任务运行,这样调用OSSempend()函数的任务被挂起了,直到信号量出现才能继续运行。中断服务程序不能调用该函数。

703 发出一个信号量 OSSemPost()

因为这个函数使更重要的任务进入了就绪态,故调用这个函数的任务就不能继续执行了。当中断服务子程序调用这个函数时,不会发生任务切换,要等到最外层的中断服务程序调用了OSIntExit()后才能进行。

704 无等待的请求一个信号量 OSSemAccept()

当任务请求一个信号量时,如果该信号量暂时无效,也可以让该任务简单的返回,而不是进入睡眠等待状态。

705 查询一个信号量的当前状态  OSSemQuery()

在应用程序中,随时可以调用函数OSSemQuery()来查询一个信号量的当前状态。该函数有2个参数:(1)指向信号量对应的事件控制块的指针pevent ;(2)指向用于记录信号量信息的数据结构OS_SEM_DATA的指针pdata.

 

                                   第八章  互斥型信号量管理

任务可以用互斥型信号量实现对共享资源的独占式处理,互斥型信号量也称作mutex,mutex是二值信号量,除了有普通信号量的机制外,还有些其他特性(如降解优先级反转的问题)。

互斥型信号量由3个元素组成:

       (1)1个标志,指示mutex是否可以使用(0或1);

       (2)1个优先级,准备一旦高优先级的任务需要这个mutex,赋给占有mutex的任务; (3)一个等待该mutex的任务列表。

800 建立一个互斥型信号量 OSMutexCreate()

801 删除一个互斥型信号量 OSMutexDel()

802 等待一个互斥型信号量 OSMutexPend()

803 释放一个互斥型信号量 OSMmtexPost()

804 无等待的获取互斥型信号量(任务不挂起)  OSMutexAccept()

805 获取互斥型信号量的当前状态  OSMutexQuery()

这章里变得6个函数和上一章的主要区别就在于: 互斥型信号量主要用于对共享资源进行独占式处理;并且增加了一个用于解决优先级反转的优先级。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值