继续说任务间的通信。

本次的任务是在ISR中发送一个消息给任务,ucos的代码中的是非常之简洁和容易理解啊。创建,释放,等待,非常好理解,不再赘述。

说说我遇到的问题,数据帧接收完之后,向消息队列发送了消息,任务中等待接收,设置为阻塞模式,代码非常简单。

//ISR中释放
OSQPost((OS_Q *)&Msg_Que_Uart2,
(void *)&end_flag,
(OS_MSG_SIZE )1,
(OS_OPT )OS_OPT_POST_FIFO,
(OS_ERR *)&err); //任务中请求
while (DEF_TRUE) { pEndflag = OSQPend ((OS_Q *)&Msg_Que_Uart2,
(OS_TICK )0,
(OS_OPT )OS_OPT_PEND_BLOCKING,
(OS_MSG_SIZE *)&size,
(CPU_TS *)NULL,
(OS_ERR *)&err);    GPSorBD_Data_read(); OSTimeDlyHMSM(0, 0, 0, 10,
OS_OPT_TIME_HMSM_STRICT,
&err); }

  代码真是无比简洁,看起来倍舒服。然而就是这几行代码还遇到了一个大问题,花费了两天时间才解决这个问题。调试的时候请求那边死活收不到释放那边的消息内容,一直是0,进去看消息队列的结构体

struct  os_msg_q {                                          /* OS_MSG_Q                                               */
OS_MSG *InPtr; /* Pointer to next OS_MSG to be inserted in the queue */
OS_MSG *OutPtr; /* Pointer to next OS_MSG to be extracted from the queue */
OS_MSG_QTY NbrEntriesSize; /* Maximum allowable number of entries in the queue */
OS_MSG_QTY NbrEntries; /* Current number of entries in the queue */
OS_MSG_QTY NbrEntriesMax; /* Peak number of entries in the queue */
};

  我定义的消息队列只接受一个字节的内容,只有接收到以后,下一个消息才能传进来。调试中NbrEntries这个值(指的是当前队列中的消息数量)一直为0,也就是释放信号量那边的数据一直没有传送过来。百思不得其解。

我尝试着把释放消息这段放到任务中间去,变成任务与任务之间的消息传递,通信正常了。应该是中断中传送的数据没有送到,为什么呢,请注意仔细的看消息内容的这段定义:消息的内容必须一直保持可见性,可见性是指代表消息的变量必须在接收消息的任务代码范围内有效。这是因为发布的数据采用的是指针传递,也就是引用传递,并不是值传递。也就是说,发布的消息本身并不产生拷贝,我们可以使用动态内存分配的方式来给消息分配一个内存块,或者,也可以传递一个指向全局变量、全局数据结构、全局数组或者函数的指针。

ucos中消息队列的应用(二)的更多相关文章

  1. 消息队列中间件(二)使用 ActiveMQ

    ActiveMQ 介绍 Active MQ 是由 Apache 出品的一款流行的功能强大的开源消息中间件,它速度快,支持跨语言的客户端,具有易于使用的企业集成模式和许多的高级功能,同时完全支持 JSM ...

  2. SpringBoot日记——MQ消息队列整合(二)

    基于第一篇文章搭建好环境以后,我们这篇文章继续介绍如何在springboot中使用RabbitMQ. 1).单播:添加好pom文件和自定义配置后,来看: @Autowired RabbitTempla ...

  3. 一起talk C栗子吧(第九十八回:C语言实例--使用消息队列进行进程间通信二)

    各位看官们,大家好,上一回中咱们说的是使用消息队列进行进程间通信的样例.这一回咱们接着上一回的内容继续说使用消息队列进行进程间通信.闲话休提.言归正转.让我们一起talk C栗子吧! 我们在上一回中介 ...

  4. 消息队列的使用<二>:ActiveMQ的基本使用(Java)

    目录 ActiveMQ 介绍 下载.安装和初次运行 Java上初次使用activeMQ 设置请求属性: 可靠性机制 事务 消息消费方式 receive 监听器: 消息类型 发布/订阅模式 非持久订阅 ...

  5. 消息队列RabbitMQ(二):RabbitMQ的系统架构概述

    前言 RabbitMQ是基于AMQP协议的,要想深入理解RabbitMQ,就必须先了解AMQP是个什么东东? AMQP协议 AMQP即Advanced Message Queuing Protocol ...

  6. linux中消息队列<一>

    1 概念 (1)链表式结构组织,存放于内核. (2)通过队列标识来引用. (3)通过一个消息类型来索引指定的数据 2 创建消息队列 #include <sys/msg.h> int msg ...

  7. 消息队列系列(二):.Rabbitmq的使用及Web监控工具使用

    一.文档资料        1.官方网站:http://www.rabbitmq.com/        2.安装教程:http://www.rabbitmq.com/install-windows. ...

  8. RabbitMQ消息队列(十二)-性能测试

    硬件配置 宿主机用的联想3850X6的服务器四颗E7-4850v3的处理器,DDR4内存,两块1.25TB的pcie固态.在宿主机上使用的事esxi5.5的虚拟化平台,在子系统中安装RabbitMQ和 ...

  9. Rabbit五种消息队列学习(二) – 简单队列

    队列结构图 P:消息的生产者 C:消息的消费者 红色:队列 生产者将消息发送到队列,消费者从队列中获取消息. 测试 1.连接MQ public static Connection getConnect ...

随机推荐

  1. Excel与Google Sheets中实现线性规划求解

    很久没更新过APS系列文章了,这段时间项目工作确实非常紧,所以只能抽点时间学习一下运筹学的入门知识,算是为以后的APS项目积累点基础.看了一些运筹学的书(都是科普级别的)发现原来我目前面对的很多排产. ...

  2. docker-compose hello word

    Compose 是 Docker 容器进行编排的工具, 是一个整合发布docker应用的利器,可定义和运行多容器的应用,在 Compose 中你可以使用 YAML 文件来配置你的应用服务.然后,只需要 ...

  3. 如何以system身份运行指定的程序?

    Local System(本地系统)是Windows操作系统内置的特殊账户.它拥有比Administartor更高的权限.smss.exe(会话管理器).csrss.exe(客户端/服务器运行时子系统 ...

  4. AJAX注册

    注册的时候,编号自动生成,需要在数据库查询出当前的最大编号是多少,然后在此基础上+1//绑定编号 $.ajax({ url: "ajax/returnUcode.ashx", da ...

  5. RN-进阶

    ActivityIndicator 显示一个圆形的loading的提示符 react-native-tab-navigator npm install react-native-tab-navigat ...

  6. uniapp仿h5+fire自定义事件触发监听

    仿h5+fire自定义事件触发监听 uni-app调用 event.js 源码记录(点击查看) 1.js下载地址 [event.js](https://ext.dcloud.net.cn/plugin ...

  7. 关于Jupyter Notebook快捷操作

    Jupyter Notebook 的快捷键 Jupyter Notebook 有两种键盘输入模式.编辑模式,允许你往单元中键入代码或文本:这时的单元框线是绿色的.命令模式,键盘输入运行程序命令:这时的 ...

  8. C++实现根据路径读取文件内容

    已知文件路径,用C++实现读取对应文件的内容,代码如下: bool LoadShaderStr(const char* szShaderPath,string& strShaderStr) { ...

  9. Docker 开启 remoter api

    debian 环境: vi /lib/systemd/system/dcoker.service 修改: ExecStart=/usr/bin/dockerd -H fd://为 ExecStart= ...

  10. 如何才能成为一个合格的web前端工程师

    转载原文地址:https://juejin.im/post/5cc1da82f265da036023b628 开篇前端开发是一个非常特殊的行业,它的历史实际上不是很长,但是知识之繁杂,技术迭代速度之快 ...