UCOSII消息队列
主结构体
typedef struct os_q {              /* QUEUE CONTROL BLOCK */
    struct os_q   *OSQPtr;         /* Link to next queue control block in list of free blocks */
    void         **OSQStart;       /* Ptr to start of queue data */
    void         **OSQEnd;         /* Ptr to end of queue data */
    void         **OSQIn;          /* Ptr to where next message will be inserted in the Q */
    void         **OSQOut;         /* Ptr to where next message will be extracted from the Q */
    INT16U         OSQSize;        /* Size of queue (maximum number of entries) */
    INT16U         OSQEntries;     /* Current number of entries in the queue */
} OS_Q;
typedef struct os_q_data {
    void          *OSMsg;          /* Pointer to next message to be extracted from queue */
    INT16U         OSNMsgs;        /* Number of messages in message queue */
    INT16U         OSQSize;        /* Size of message queue */
    OS_PRIO        OSEventTbl[OS_EVENT_TBL_SIZE];  /* List of tasks waiting for event to occur */
    OS_PRIO        OSEventGrp;     /* Group corresponding to tasks waiting for event to occur */
} OS_Q_DATA;
typedef struct os_event {
    INT8U    OSEventType;          /* Type of event control block (see OS_EVENT_TYPE_xxxx) */
    void    *OSEventPtr;           /* Pointer to message or queue structure */
    INT16U   OSEventCnt;           /* Semaphore Count (not used if other EVENT type) */
    OS_PRIO  OSEventGrp;           /* Group corresponding to tasks waiting for event to occur */
    OS_PRIO  OSEventTbl[OS_EVENT_TBL_SIZE]; /* List of tasks waiting for event to occur */
#if OS_EVENT_NAME_EN > 0u
    INT8U   *OSEventName;
#endif
} OS_EVENT;API函数
//无等待地从消息队列中得到一个消息
void *OSQAccept (OS_EVENT *pevent,
                 INT8U *perr);
//创建
OS_EVENT *OSQCreate (void **start,
                     INT16U size);
//删除
OS_EVENT *OSQDel (OS_EVENT *pevent,
                  INT8U opt,
                  INT8U *perr);
//清空
INT8U OSQFlush (OS_EVENT *pevent);
//等待-1,接收消息
void *OSQPend (OS_EVENT *pevent,
               INT32U timeout,
               INT8U *perr);
//取消等待
INT8U OSQPendAbort (OS_EVENT *pevent,
                    INT8U opt,
                    INT8U *perr);
//释放+1,发送消息(队列式)
INT8U OSQPost (OS_EVENT *pevent,
               void *pmsg);
//发送消息(堆栈式)
INT8U OSQPostFront (OS_EVENT *pevent,
                    void *pmsg);
//单选项的消息发送
INT8U OSQPostOpt (OS_EVENT *pevent,
                  void *pmsg,
                  INT8U opt);
//查询
INT8U OSQQuery (OS_EVENT *pevent,
                OS_Q_DATA *p_q_data);应用举例
#define OSQ_MSG_NUM 1       //消息队列消息数量
OS_EVENT *DATA_Msg;
void *MsgGrp[OSQ_MSG_NUM];
void start_task(void *pdata)
{
    OS_CRITICAL_ENTER();    //进入临界区
    DATA_Msg = OSQCreate ((void**   )&MsgGrp[0],
                         (INT16U )OSQ_MSG_NUM);
    OS_EXIT_CRITICAL();
}
void msgpost_task(void *p_arg)
{
    static u8 msg_num;
    OS_Q_DATA p_q_data;
    OSQQuery(DATA_Msg, &p_q_data);
    if(p_q_data.OSNMsgs >= OSQ_MSG_NUM)
    {
        printf("OSQQuery OSNMsgs: %d\r\n", p_q_data.OSNMsgs);
        return;
    }
    msg_num++;
    OSQPost((OS_EVENT*  )DATA_Msg,
            (void*      )&msg_num);
}
void msgpend_task(void *p_arg)
{
    void *p;
    INT8U err;
    u8 msg_num;
    p = OSQPend((OS_EVENT*  )DATA_Msg,
                (INT32U     )0,
                (INT8U*     )&err);
    msg_num = *p;
}UCOSII消息队列的更多相关文章
- ucosii事件控制块------消息邮箱与消息队列
		UCOSII 使用叫做事件控制块(ECB)的数据结构来描述诸如信号量.邮箱(消息邮箱)和消息队列这些事件 #define OS_EVENT_EN (((OS_Q_EN > 0u) &&a ... 
- FreeRTOS 消息队列
		以下基础内容转载自安富莱电子: http://forum.armfly.com/forum.php 本章节为大家讲解 FreeRTOS 的一个重要的通信机制----消息队列,初学者要熟练掌握,因为消息 ... 
- FreeRTOS消息队列
		FreeRTOS 的一个重要的通信机制----消息队列,消息队列在实际项目中应用较多. 一.消息队列的作用及概念: 消息队列就是通过 RTOS 内核提供的服务,任务或中断服务子程序可以将一个消息(注意 ... 
- 消息队列——RabbitMQ学习笔记
		消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ... 
- 消息队列 Kafka 的基本知识及 .NET Core 客户端
		前言 最新项目中要用到消息队列来做消息的传输,之所以选着 Kafka 是因为要配合其他 java 项目中,所以就对 Kafka 了解了一下,也算是做个笔记吧. 本篇不谈论 Kafka 和其他的一些消息 ... 
- .net 分布式架构之业务消息队列
		开源QQ群: .net 开源基础服务 238543768 开源地址: http://git.oschina.net/chejiangyi/Dyd.BusinessMQ ## 业务消息队列 ##业务消 ... 
- 【原创经验分享】WCF之消息队列
		最近都在鼓捣这个WCF,因为看到说WCF比WebService功能要强大许多,另外也看了一些公司的招聘信息,貌似一些中.高级的程序员招聘,都有提及到WCF这一块,所以,自己也关心关心一下,虽然目前工作 ... 
- Java消息队列--ActiveMq 实战
		1.下载安装ActiveMQ ActiveMQ官网下载地址:http://activemq.apache.org/download.html ActiveMQ 提供了Windows 和Linux.Un ... 
- Java消息队列--JMS概述
		1.什么是JMS JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送 ... 
随机推荐
- 信用卡号码格式验证-C#实现
			/// <summary> /// Is valid? /// </summary> /// <param name="context">Val ... 
- 在Nginx容器安装Keepalived后端项目双机热备
			docker exec -it n1 bash apt-get update apt-get install keepalived apt-get install vim 再次之前要配置VIP虚拟IP ... 
- python问题集
			1.selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in P ... 
- 【Log】logback实现每个类和包自定义级别输出
			本例想实现对类或者包中的日志,自定义级别输出 方法一 1.自定义日志级别方式如下: 代码文件:Logger monitorLogger = LoggerFactory.getLogger(" ... 
- 树莓派插入U盘自动拷贝系统日志到U盘或通过U盘升级程序
			注意,U盘用Fat32格式,NTFS格式的话,需要在Linux另外安装相应驱动. 可通过udev实现如题的功能. 在/etc/udev/rules.d/目录下新建规则文件98-logcopy.rule ... 
- AutoResetEvent   学生考试,老师阅卷,学生等待考试结果
			class Program { static void Main(string[] args) { )); t.Start(); Console.WriteLine("老师等待提交试卷&qu ... 
- docker下安装nginx并实现https访问
			一.启动容器 docker run --detach --name wx-nginx -p 443:443 -p 80:80 -v /home/nginx/data:/usr/share/nginx/ ... 
- Apache JMeter 做接口并发测试
			获知来源:查找如何使用Postman进行接口并发测试时,在StackOverflow上看到,说postman只能做串行测试,而且postman并不是被设计做这种测试的:而jmeter就是为了测试而开发 ... 
- (转)深入浅出Redis-redis哨兵集群
			背景:对于后台开发,需要了解与集群相关的工作. 深入浅出Redis-redis哨兵集群 Sentinel(哨兵)是Redis 的高可用性解决方案:由一个或多个Sentinel 实例 组成的Sentin ... 
- Influx Sql系列教程七:delete 删除数据
			前面介绍了使用insert实现新增和修改记录的使用姿势,接下来我们看一下另外一个简单的使用方式,如何删除数据 1. delete 语句 delete的官方语法如下 DELETE FROM <me ... 
