zoukankan      html  css  js  c++  java
  • 事件控制块

     ucos II 任务间 通信之二:事件控制块

    信号,邮箱,消息队列都是需要先创建才能使用的,创建以上三者需要用到事件控制块这一东西。

    什么是事件控制块呢?

    可以这样理解,前面学习我们已经知道,创建一个任务需要给这个任务分配一个任务控制块,这个任务控制块存储着关于这个任务的重要信息。那么,事件控制块就好比任务里的任务控制块。它存储着这个事件的重要信息,我们说创建一个事件(信号,邮箱,消息队列),其本质的过程就是初始化这个事件控制块。

    一个任务或者中断服务子程序可以通过事件控制块ECB(Event Control Blocks)来向另外的任务发信号。这里,所有的信号都被看成是事件(Event)。一个任务还可以等待另一个任务或中断服务子程序给它发送信号。这里要注意的是,只有任务可以等待事件发生,中断服务子程序是不能这样做的。这点要注意,记得mcu21刚开始的时候就傻傻地在中断处理函数里等待信号量,后果就是系统直接死机。

    对于处于等待状态的任务,还可以给它指定一个最长等待时间,以此来防止因为等待的事件没有发生而无限期地等下去。

    多个任务可以同时等待同一个事件的发生[F6.1B]。在这种情况下,当该事件发生后,所有等待该事件的任务中,优先级最高的任务得到了该事件并进入就绪状态,准备执行。上面讲到的事件,可以是信号量、邮箱或者消息队列等。当事件控制块是一个信号量时,任务可以等待它,也可以给它发送消息。

    事件控制块是一个数据结构,其定义如下:

    typedef struct {

        void   *OSEventPtr;                /* 指向消息或者消息队列的指针 */

        INT8U   OSEventTbl[OS_EVENT_TBL_SIZE]; /* 等待任务列表      */

        INT16U  OSEventCnt;               /* 计数器(当事件是信号量时) */

        INT8U   OSEventType;                   /* 时间类型  */

        INT8U   OSEventGrp;               /* 等待任务所在的组  */

    } OS_EVENT;

    .OSEventPtr指针,只有在所定义的事件是邮箱或者消息队列时才使用。当所定义的事件是邮箱时,它指向一个消息,而当所定义的事件是消息队列时,它指向一个数据结构。

    .OSEventTbl[] .OSEventGrp 很像前面讲到的OSRdyTbl[]和OSRdyGrp,只不过前两者包含的是等待某事件的任务,而后两者包含的是系统中处于就绪状态的任务。

    .OSEventCnt 当事件是一个信号量时,.OSEventCnt是用于信号量的计数器。

    .OSEventType定义了事件的具体类型。它可以是信号量(OS_EVENT_SEM)、邮箱(OS_EVENT_TYPE_MBOX)或消息队列(OS_EVENT_TYPE_Q)中的一种。用户要根据该域的具体值来调用相应的系统函数,以保证对其进行的操作的正确性。

  • 相关阅读:
    Step by step Dynamics CRM 2013安装
    SQL Server 2012 Managed Service Account
    Step by step SQL Server 2012的安装
    Step by step 活动目录中添加一个子域
    Step by step 如何创建一个新森林
    向活动目录中添加一个子域
    活动目录的信任关系
    RAID 概述
    DNS 正向查找与反向查找
    Microsoft Dynamics CRM 2013 and 2011 Update Rollups and Service Packs
  • 原文地址:https://www.cnblogs.com/wgang171412/p/5038320.html
Copyright © 2011-2022 走看看