主结构体

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消息队列的更多相关文章

  1. ucosii事件控制块------消息邮箱与消息队列

    UCOSII 使用叫做事件控制块(ECB)的数据结构来描述诸如信号量.邮箱(消息邮箱)和消息队列这些事件 #define OS_EVENT_EN (((OS_Q_EN > 0u) &&a ...

  2. FreeRTOS 消息队列

    以下基础内容转载自安富莱电子: http://forum.armfly.com/forum.php 本章节为大家讲解 FreeRTOS 的一个重要的通信机制----消息队列,初学者要熟练掌握,因为消息 ...

  3. FreeRTOS消息队列

    FreeRTOS 的一个重要的通信机制----消息队列,消息队列在实际项目中应用较多. 一.消息队列的作用及概念: 消息队列就是通过 RTOS 内核提供的服务,任务或中断服务子程序可以将一个消息(注意 ...

  4. 消息队列——RabbitMQ学习笔记

    消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...

  5. 消息队列 Kafka 的基本知识及 .NET Core 客户端

    前言 最新项目中要用到消息队列来做消息的传输,之所以选着 Kafka 是因为要配合其他 java 项目中,所以就对 Kafka 了解了一下,也算是做个笔记吧. 本篇不谈论 Kafka 和其他的一些消息 ...

  6. .net 分布式架构之业务消息队列

    开源QQ群: .net 开源基础服务  238543768 开源地址: http://git.oschina.net/chejiangyi/Dyd.BusinessMQ ## 业务消息队列 ##业务消 ...

  7. 【原创经验分享】WCF之消息队列

    最近都在鼓捣这个WCF,因为看到说WCF比WebService功能要强大许多,另外也看了一些公司的招聘信息,貌似一些中.高级的程序员招聘,都有提及到WCF这一块,所以,自己也关心关心一下,虽然目前工作 ...

  8. Java消息队列--ActiveMq 实战

    1.下载安装ActiveMQ ActiveMQ官网下载地址:http://activemq.apache.org/download.html ActiveMQ 提供了Windows 和Linux.Un ...

  9. Java消息队列--JMS概述

    1.什么是JMS JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送 ...

随机推荐

  1. _nl_intern_locale_data: Assertion `cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))' failed

    在Ubuntu18上使用交叉编译工具,报这个错.研究之下发现,工具的绝对路径过长,ubuntu18对其优化,修改路径,导致报错. 使用命令:export LC_ALL=C

  2. Python模块安装方法

    安装Python模块 电子邮件 distutils-sig @ python .组织 作为一个受欢迎的开源开发项目,Python具有活跃的贡献者和用户支持社区,并且根据开放源代码许可条款,其软件可供其 ...

  3. Spring中查看加载配置文件中 加载类的个数及详情

    断点到: org.springframework.beans.factory.support.DefaultListableBeanFactory#getBeanDefinitionCount 显示该 ...

  4. leetcode 10. Regular Expression Matching 、44. Wildcard Matching

    10. Regular Expression Matching https://www.cnblogs.com/grandyang/p/4461713.html class Solution { pu ...

  5. python语言使用yaml 管理selenium元素

    1.所有元素都在PageElement下的.yaml,如图 login_page.yaml文件: username: dec: 登录页 type: xpath value: //input[@clas ...

  6. java内存泄露/溢出等常见问题模拟及原因分析

    Java 8:从持久代到metaspace 系统稳定性--OutOfMemoryError 常见原因及解决方法 java各种异常问题示例(附pdf下载): java.lang.OutOfMemoryE ...

  7. 算法练习之合并两个有序链表, 删除排序数组中的重复项,移除元素,实现strStr(),搜索插入位置,无重复字符的最长子串

    最近在学习java,但是对于数据操作那部分还是不熟悉 因此决定找几个简单的算法写,用php和java分别实现 1.合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两 ...

  8. Java程序运行机制

    Java程序运行机制 编译型(compile) 它有一个负责翻译的程序(编译器),将我们写的 Java 源代码转为计算机可执行的代码 举个例子:把一本中文书翻译成英文书 应用:操作系统.C.C++ 解 ...

  9. Nginx是什么及作用?代理和反向代理解析

    一:介绍 nginx是一个高性能的HTTP和反向代理服务器,其特点是占用内存少,并发能力强. 二:名词介绍 代理服务器: 代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络 ...

  10. [08]Go设计模式:代理模式(ProxyPattern)

    目录 proxy 一.简介 二.代码 三.参考资料 proxy 一.简介 代理设计模式是一种结构设计模式.这种模式建议为控制和访问主要对象提供额外的间接层. 在这种模式下,将创建一个新的代理类,该类实 ...