多值信号量和和互斥信号量主要用来标志事件是否发生和协调资源的访问。如果要给资源赋予内容进行传递,

信号量就力有所不及了。这时候就需要用到 uC/OS 操作系统的另一个内核机制了,那就是消息队列。

2.原理

如果想要使用消息队列,就必须事先使能消息队列。 消息队列的使能位于“os_cfg.h”。

消息队列的消息都是从消息池获取的。 消息队列可以有一个或多个,但消息池却只有一个。 当有消息队列要发布消息时,

就从消息池(OS_MSG 类型数组的元素依次组成的单向列表)获取一个元素用于存放消息,并将该消息插入到消息队列。

当有消息队列释放(等到)消息时,又会把这个元素释放回消息池,该元素又可以继续供发布消息使用。

3.初始化

如果用户使能了消息队列,在调用 OSInit() 函数对系统进行初始化时,就会初始化消息池。

其中, OS_MsgPoolInit() 函数就是用来初始化消息池的。 OS_MsgPoolInit() 函数的定义
位于“os_msg.c”。

4.OSQCreate ()

要使用 uC/OS 的消息队列必须先声明和创建消息队列,调用 OSQCreate () 函数可以创
建一个消息队列。OSQCreate () 函数的定义位于“os_q.c”。
其中,OSQCreate () 函数调用了 OS_MsgQInit () 函数初始化了消息队列。OS_MsgQInit()
函数的定义位于“os_msg.c”。

另外, OSQCreate () 函数还调用了 OS_PendListInit() 函数初始化了消息队列的等待列表。
每个消息队列都有一个等待列表,凡是等待该消息队列的的任务都会被插入到这个等待列表,
方便高效管理。 OS_PendListInit() 函数的定义位于“os_core.c”。

5.OSQPost ()

OSQPost () 函数用于向消息队列发布一个消息。SQPost () 函数的定义也位于“os_q.c”。 
其实,不管是否使能了中断延迟发布,最终都是调用 OS_QPost () 函数进行发布消息。
在 OS_QPost () 函数中,会调用 OS_MsgQPut () 函数从消息池获取一个消息插入到消息
队列。 OS_MsgQPut () 函数的定义位于“os_msg.c”。

6.OSQPend ()
与 OSQPost () 消息队列发布消息函数相对应, OSQPend () 函数用于等待获取消息队列
的消息。

OSQPend () 函数的定义也位于“os_q.c”。
7.OSQPendAbort ()
OSQPendAbort () 函数用于中止任务对一个消息队列的等待。要使用 OSQPendAbort ()
函数,还得事先使能 OS_CFG_Q_PEND_ABORT_EN(位于“os_cfg.h”)。

OSQPendAbort () 函数会调用一个更加底层的中止等待函数来执行当前任务对消息队列
的等待,该函数就是 OS_PendAbort()。 OS_PendAbort() 函数不仅仅用来中止对消息队列的等
待,还可以中止对多值信号量、 互斥信号量、 事件标志组、 任务消息队列或任务信号量的等
待。 OS_PendAbort() 函数的定义位于“os_core.c”。

8.OSQDel ()

OSQDel() 函数用于删除一个消息队列。要使用 OSQDel () 函数,还得事先使能
OS_CFG_Q_DEL_EN(位于“os_cfg.h”)。

9.OSQFlush ()

OSQFlush () 函数用于清空一个消息队列。要使用 OSQFlush () 函数,还得事先使能
OS_CFG_Q_FLUSH_EN(位于“os_cfg.h”)。

OSQFlush () 函数的定义也位于“os_q.c”。

17.3-uC/OS-III消息管理(消息队列使用)的更多相关文章

  1. uc/os iii移植到STM32F4---IAR开发环境

    也许是先入为主的原因,时钟用不惯Keil环境,大多数的教程都是拿keil写的,尝试将官方的uc/os iii 移植到IAR环境. 1.首先尝试从官网上下载的官方移植的代码,编译通过,但是执行会报堆栈溢 ...

  2. uC/OS - III 移植 IAR平台

    关于移植uC/OS-III 网上已经有很多教程了此处只是做个记录 首先下载源码然后解压得到下面的文件: 然后在模版工程里新建各种文件夹: 最后全部都添加进工程: OK了,编译一下,惊呆了,竟然 0错误 ...

  3. 17.1-uC/OS-III消息管理(两种消息队列)

    1.使用消息队列 消息队列函数: 函数名 功能 OSQCreate() 创建一个消息队列 OSQDel() 删除一个消息队列 OSQFlush() 清空一个消息队列 OSQPend() 任务等待消息 ...

  4. 17.2-uC/OS-III消息管理(任务消息队列)

    1.任务的消息队列 uC/OS-III在任务中内建了一个消息队列.用户可以直接发送消息给任务而不通过外部消息队列. 这个特性不仅简化了代码, 还提供了效率.每个任务都内建一个消息队列. uC/OS-I ...

  5. 17.0-uC/OS-III消息管理

    消息传递 有些情况下任务或ISR与另一个任务间进行通信,这种信息交换叫做作业间的通信. 可以有两种方法实现这种通信: 全局变量. 发送消息. 1.果使用全局变量,任务或ISR就须确保它独占该变量.如果 ...

  6. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.0 版新增消息管理

    在V3.0版本的Web(Mvc.WebForm)与WinForm中我们新增了“消息管理”模块.“消息管理”模块是对框架的所有消息进行管理.通过左侧的消息分类可以查看所选分类的所有消息列表.在主界面上我 ...

  7. 4.Node.js 微信消息管理

    一.写在前面的话   当用户发送消息给公众号时(或某些特定的用户操作引发的事件推送时),会产生一个POST请求,开发者可以在响应包(Get)中返回特定XML结构,来对该消息进行响应.   消息推送也是 ...

  8. 微信公众号开发C#系列-7、消息管理-接收事件推送

    1.概述 在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,从而开发者可以获取到该信息.其中,某些事件推送在发生后,是允许 ...

  9. 微信公众号开发C#系列-6、消息管理-普通消息接受处理

    1.概述 通过前面章节的学习,我们已经对微信的开发有了基本的掌握与熟悉,基本可以上手做复杂的应用了.本篇我们将详细讲解微信消息管理中普通消息的接收与处理.当普通微信用户向公众账号发消息时,微信服务器将 ...

随机推荐

  1. Vue在线客服系统【开源项目】

    1. 项目介绍 一个基于Vue2.0的在线客服系统. 技术栈包含:Vue.VueX.Vue Router.Element UI. 2. 功能介绍 项目包含了2个模块:客服端和访客端. 2.1 客服端功 ...

  2. activiti自己定义流程之整合(四):整合自己定义表单部署流程定义

    综合前几篇博文内容.我想在整合这一部分中应该会有非常多模块会跳过不讲,就如自己定义表单的表单列表那一块,由于这些模块在整合的过程中都差点儿没有什么修改,再多讲也是反复无用功. 正由于如此,在创建了流程 ...

  3. sed用法去除行首和行末的中括号

    sed去掉行首和行末的中括号: sed -i 's:^\[::; s:\]$::;' newtrace_nlp.log.2018-08-02.bak 其余可依次类推.

  4. 【网络编程】——Lighttpd 返回HTTP/1.1 417 Expectation Failed

    最近在使用python 的 pcurl 发送 post 请求到服务端的时候[服务端使用的服务是Lighttpd],发现只要 post 请求的数据超过 1024 之后,就会返回如下错误: * Hostn ...

  5. MySQL 表中添加 时间戳 字段

    场景: 有张表的数据需要用同步工具同步至其他库,需要 update_time 时间戳字段 来做增量同步. 解决方法: alter table quant_stk_calc_d_wxcp add upd ...

  6. shell脚本 切换用户

    如下: #!/usr/bin/expect -f spawn su root expect "Password:" send "mypasswd\r" inte ...

  7. [转]springboot2 webflux 响应式编程学习路径

    原文链接 spring官方文档 springboot2 已经发布,其中最亮眼的非webflux响应式编程莫属了!响应式的weblfux可以支持高吞吐量,意味着使用相同的资源可以处理更加多的请求,毫无疑 ...

  8. 乾坤合一~Linux设备驱动之块设备驱动

    1. 题外话 在蜕变成蝶的一系列学习当中,我们已经掌握了大部分Linux驱动的知识,在乾坤合一的分享当中,以综合实例为主要讲解,在一个月的蜕茧成蝶的学习探索当中,觉得数据结构,指针,链表等等占据了代码 ...

  9. 【多媒体封装格式详解】--- AAC ADTS格式分析

    ADTS全称是(Audio Data Transport Stream),是AAC的一种十分常见的传输格式. 记得第一次做demux的时候,把AAC音频的ES流从FLV封装格式中抽出来送给硬件解码器时 ...

  10. JS备忘

    1. Promise用法 js异步调用较多,如果某个操作是基于上个异步结果才能执行的,再有一个操作又是基于此操作的,则需要嵌套多层代码,在ES6中引入了Promise写法,可以比较优雅的解决这个问题: ...