zoukankan      html  css  js  c++  java
  • μC/OS-II 任务的同步与通信 --- 消息队列

    简介

    使用消息队列可以在任务之间传递多条消息。消息队列由三个部分组成:事件控制块、消息队列和消息。
    当把事件控制块成员 OSEventType 的值置为 OS_EVENT_TYPE_Q 时,该事件控制块描述的就是一个消息队列。
    消息队列相当于一个共用一个任务等待列表的消息邮箱数组,事件控制块成员 OSEventPtr 指向了一个叫做队列控制块(OS_Q)的结构,该结构管理了一个数组 MsgTbl[ ],该数组中的元素都是一些指向消息的指针。

    消息队列的数据结构

    其中,可以移动的指针为 OSQIn 和 OSQOut,而指针 OSQStart 和 OSQEnd 只是一个标志(常指针)。当可移动的指针 OSQIn 或 OSQOut 移动到数组末尾,也就是与 OSQEnd 相等时,可移动的指针将会被调整到数组的起始位置 OSQStart。也就是说,从效果上来看,指针 OSQEnd 与 OSQStart 等值。于是,这个由消息指针构成的数组就头尾衔接起来形成了一个如下图所示的循环的队列。

    为了对图所示的消息指针数组进行有效的管理,μC/OS-II 把消息指针数组的基本参数都记录在一个叫做队列控制块的结构中,队列控制块的结构如下:

    typedef struct os_q 
    {
        struct os_q *OSQPtr; 
        void **OSQStart;
        void **OSQEnd;
        void **OSQIn;
        void **OSQOut;
        INT16U  OSQSize;
        INT16U  OSQEntries;
    } OS_Q;
    

    消息队列的创建

    创建一个消息队列首先需要定义一指针数组,然后把各个消息数据缓冲区的首地址存入这个数组中,然后再调用函数 OSQCreate( ) 来创建消息队列。创建消息队列函数 OSQCreate( ) 的原型为:

    OS_EVENT OSQCreate(
    void **start, //指针数组的地址
    INT16U size //数组长度
    ); 
    

    请求消息队列

    请求消息队列的目的是为了从消息队列中获取消息。任务请求消息队列需要调用函数 OSQPend( ),该函数的原型为:

    void *OSQPend(
    OS_EVENT *pevent,	//所请求的消息队列的指针
    INT16U timeout,		//等待时限
    INT8U *err			//错误信息
    );
    

    向消息队列发送消息

    任务需要通过调用函数 OSQPost( ) 或 OSQPostFront( ) 来向消息队列发送消息。函数 OSQPost( ) 以 FIFO(先进先出)的方式组织消息队列,函数 OSQPostFront( ) 以 LIFO(后进先出)的方式组织消息队列。这两个函数的原型分别为:

    INT8U OSQPost(
    OS_EVENT *pevent,	//消息队列的指针
    void *msg			//消息指针
    );
    
    INT8U OSQPostFront(
    OS_EVENT *pevent, 	//消息队列的指针
    void *msg			//消息指针
    );
    

    函数中的参数 msg 为待发消息的指针。

    参考自:《μC/OS-II 入门教程》

  • 相关阅读:
    列表的内置方法
    oracle安装教程
    大二暑假假期周进度01
    win 10安装Linux虚拟机教程
    需求工程——软件建模与分析阅读笔记05
    网络爬虫阅读笔记01
    Java 测试连接Oracle数据库是否成功,ojdbc7.jar包下载
    河北创新年报统计平台系统整体界面展示,与数据下钻
    java 三大框架 struct2部分 实现增删该查操作
    itextsharp生成pdf
  • 原文地址:https://www.cnblogs.com/GyForever1004/p/8728692.html
Copyright © 2011-2022 走看看