ucosii消息队列使用

2023-05-16

ucosii消息队列简介

ucosii的消息队列源码定义在os_q.c文件;接口全部声明在ucos_ii.h,总共有如下接口:

void *OSQAccept(OS_EVENT *pevent,INT8U *perr);

说明:判断消息队列里是否含有消息,与OSQPend区别的是,如果没有消息,不会挂起线程;
其中pevent是指向消息队列的指针句柄,perr是异常返回值。

OS_EVENT *OSQCreate(void **start,  INT16U size);

说明:创建消息队列。
返回值是一个消息队列的句柄;
start是一个指针数组,用于缓存消息的指针,即是说一条消息的长度是可变的,只要将地址传过来即可;
size是指缓存数组可以缓存的消息数量。

OS_EVENT *OSQDel(OS_EVENT *pevent, INT8U opt, INT8U *perr);

说明:删除消息队列;删除后会将pevent->OSEventType置为无使用类型,所以再用OSQPend和OSQPost操作消息队列都无效。
返回值,如果成功则返回0,如果失败则返回pevent;
pevent是消息队列句柄;
opt可以是两个参数,OS_DEL_NO_PEND表示没有任务在等待该消息时才会删除消息,OS_DEL_ALWAYS即表示不管有没有任务在等待,都删除消息队列,如果有任务在等待该消息,会强制让任务标志为已经接收到该消息,然后进入就绪态;
perr异常返回值;
注意:删除消息后,最好不要将原指针置为NULL,因为在OSQPend和OSQPost没有空指针判断,可能会导致意想不到的结果。

INT8U OSQFlush(OS_EVENT *pevent);

说明:直译是刷新消息队列的内容;实际是复位消息队列,即把消息队列的内容清空;
pevent指向消息队列的句柄;

void *OSQPend(OS_EVENT *pevent, INT32U timeout, INT8U *perr);

说明:等待消息;
返回值,返回最先入队的消息的指针;消息的类型是自定义的,所以用的void型指针;
pevnet,消息队列句柄;
timeout,等待消息的超时时间,如果为0,则表示一直等待有消息为止,其它值则表示经过timeout个tick(一个tick就是一个systick的中断周期)后,就不在等待消息,往下执行;
perr,异常返回值;

INT8U OSQPendAbort(OS_EVENT *pevent, INT8U opt, INT8U *perr);

说明:根据字面意思是,中止任务等待该消息,就是说如果有任务由于等待该消息而挂起,则中止等待并将任务设为就绪态;
返回值,如果执行成功,返回中止该消息的任务数;如果失败返回0;
pevent,队列句柄;
opt,中止类型,OS_PEND_OPT_NONE,让其中一个任务(处在等待列表种最前的一个)停止等待消息;OS_PEND_OPT_BROADCAST,让所有在等该消息的任务停止等待;
perr,异常返回值

INT8U OSQPost (OS_EVENT *pevent, void *pmsg);

说明:发送一个消息;如果有较高优先级的任务在等待该消息,则消息不会进入缓冲区就切换到高优先级任务;
返回值,返回错误类型;
pevent,消息队列句柄;
pmsg,指向消息的指针,该消息可以是任意类型;

INT8U OSQPostFront (OS_EVENT *pevent,  void *pmsg);

说明:从前面插入队列,通常队列是先进先出,所以入队都是从后面入队的。该函数就是提供插队功能,入队的消息就是下一个出队的消息;
如果有较高优先级的任务在等待该消息,则消息不会进入缓冲区就切换到高优先级任务;
返回值,返回错误类型;
pevent,队列句柄;
pmsg,指向消息的指针;

INT8U OSQPostOpt (OS_EVENT *pevent, void *pmsg, INT8U opt);

说明:带参数的发送消息,具体参数类型看opt的描述;
返回值,返回错误类型;
pevent,队列句柄;
pmsg,指向消息的指针;
opt,OS_POST_OPT_NONE,使用该参数就如同调用OSQPost;
OS_POST_OPT_BROADCAST,广播该条消息,即向所有等待该队列的任务发送消息;
OS_POST_OPT_FRONT,使用该参数类似调用OSQPostFront;
OS_POST_OPT_NO_SCHED,该参数表示是否立刻切换到较高优先级的任务里处理该消息,如果用了该参数则不会立刻切换,需要先把消息放到队列缓冲区,运行完该函数才切换任务;
注意:这些opt参数可以或运算后才传入到函数;

INT8U OSQQuery (OS_EVENT *pevent, OS_Q_DATA *p_q_data);

说明:获取消息队列的信息;具体有哪些信息,可以看OS_Q_DATA结构体里面的成员;根据源码也可以分析得出;
返回值,返回错误类型;
pevent,队列句柄;
p_q_data,消息队列信息,1.等待该消息的任务列表(占用结构体两个成员);2.下一条出队的消息(FIFO规则);3.缓存的消息数量;4.消息队列的最大缓存数量;
注意:由于没用过该接口,分析可能有错

上述分析大多数都是从源码文件中的注释翻译得出,部分解析是根据源码逻辑分析得出,有些接口并不经常用到,所以可能分析的不够全面或有错误的地方,欢迎指正!

使用示例

#include "ucos_ii.h"
#define QUEUE_NUM 32 // 定义信息数量

static OS_EVENT * _msgQueue; //消息队列句柄
static void * _msgQueueCache[QUEUE_NUM]; //消息队列缓存区指针数值,每个元素指向一条消息,每条消息的内存最好是全局变量;

int isMsgInQueue(OS_EVENT *pevent, void *msg)
{
    if(pevent == NULL || msg == NULL)
    {
        return -1;
    }

    OS_Q *pq = NULL;
    pq = (OS_Q *)pevent->OSEventPtr;

    if(pq->OSQEntries == 0){
        return 0;
    }

    void ** msg_q = pq->OSQOut;
    while(msg_q != pq->OSQIn)
    {
        if(*msg_q == msg){
            return 1;
        }
        msg_q++;
        (msg_q == pq->OSQEnd) ? (msg_q = pq->OSQStart) : 0;
    }

    return 0;
}
/**
 * @brief 发送一条消息到缓存区,去重处理
 * @param[msg] 指向一条消息的地址,这个地址所在内存最好是全局变量
 * @return 1表示成功, 其它失败
 */
int sendMsgQueue(void * msg)
{
    if(isMsgInQueue(_msgQueue, msg))
    {
        return 1;
    }
    return (OSQPost(_msgQueue, msg) == OS_ERR_NONE);
}
/**
 * @brief 测试代码
 */
void testHalfDuplexTask(void *arg)
{
    INT8U err = OS_ERR_NONE;

    //创建消息队列。 第一个参数指定消息队列缓存区的起始地址;第二个参数指定缓存区的大小,即消息的数量
    _msgQueue = OSQCreate(&_msgQueueCache[0], QUEUE_NUM);

    uint8_t * msg = NULL;
    while(1)
    {
        msg = (uint8_t *)OSQPend(_msgQueue, 0, &err);
        if(msg != NULL && err == OS_ERR_NONE)
        {
            /*正常获取到一条消息*/
        }
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ucosii消息队列使用 的相关文章

  • UCOSII中的任务切换原理介绍

    1 多任务的引入 之所以引入多任务 xff0c 主要在于提高程序运行的效率 多任务的过程 xff0c 能够有效地发挥交换式任务的运作效率 类似的 xff0c 由于一个任务里面也有瓶颈的地方 xff0c 为了把瓶颈的地方抠出来 xff0c 让
  • UCOSII-消息邮箱与消息队列

    文章目录 一 事件控制块及事件处理函数1 等待任务列表2 事件控制块的结构3 操作事件控制块的函数4 空事件控制块列表 二 消息邮箱1 消息邮箱介绍2 消息邮箱操作步骤 三 消息队列1 消息指针数组2 队列控制块3 消息队列的操作流程 四
  • STM32上使用UCOSII--消息队列和信号量集

    有关UCOS任务的介绍 xff1a STM32上使用UCOSII 任务 有关UCOS信号量和邮箱的介绍 xff1a STM32上使用UCOSII 信号量和邮箱 一 消息队列 使用消息队列可以在任务之间传递多条消息 消息队列由三个部分组成 x
  • ucosii消息队列学习

    近期在学习ucosii的内容使用的平台为STM32F103C8T6最小系统板 今日关于消息队列的使用遇到了一些问题 基本情况 xff1a 移植代码为正点原子ucosiii消息队列 信号量集和软件定时器例程 主要新建两个任务post task
  • UCOSII 消息队列、信号量集、软件定时器

    1 消息队列 xff1a 作用 xff1a 在任务之间传递多条信息 组成 xff1a 事件控制块 消息队列 消息 消息队列数据结构 队列控制块的结构定义 xff1a typedef struct os q struct os q OSQPt
  • Ucosii消息邮箱使用

    设置任务优先级 define LED TASK Prio 6 define LED1 TASK Prio 5 用到的UCOSII函数 消息邮箱创建函数 xff1a OS EVENT OSMboxCreate void msg 请求消息邮箱函
  • ucosii消息队列使用

    ucosii消息队列简介 ucosii的消息队列源码定义在os q c文件 xff1b 接口全部声明在ucos ii h xff0c 总共有如下接口 xff1a span class token keyword void span span
  • rtthrea-ucosii-freertos三系统学习总结

    三系统基本功能对比 RT thread ucosii freertos 任务调度 抢占式 时间片式 xff08 多级队列位图调度 xff09 抢占式 xff08 纯位图调度 xff09 抢占式 时间片式 xff08 遍历列表调度 xff09
  • UCOSii中的信号量

    任务间简单通个信 xff0c A告诉B你LED亮一下 这种问题可以用信号量来处理 xff0c UCOSii中关于信号量的函数也就八个 xff0c 今天简单总结下 函数列表 CREATE A SEMAPHORE Description Thi
  • 基于UCOSII的RS485通信(STM32F107)

    一 实现效果 基于ucosii实时操作系统的RS485通信 xff0c 采用USART 43 DMA进行收发 xff0c 二 开发环境 开发工具 xff1a KEIL V5开发板 STM32f107RC采用方式 xff1a USART 43
  • UCOSII 使用笔记

    UCOS使用总结 1 UCOS 是抢占式系统 xff0c 换句话来说 xff0c 优先级高的能够被准时执行 xff0c 优先级低的很容易被高优先级抢占 xff0c 导致执行任务延迟 2 UCOS一般为64个优先级 xff0c 有些可以到25
  • 从零开始学习UCOSII操作系统4--任务管理

    从零开始学习UCOSII操作系统4 任务管理 1 重讲任务 1 任务可以是一个无限的循环 xff0c 也可以在一次执行完毕后被删除 这里需要注意的是 xff0c 任务的代码并不是真正的删除了 xff0c 而是UCOSII不再理会该任务代码
  • 从零开始学习UCOSII操作系统7--信号量

    从零开始学习UCOSII操作系统7 信号量 参考博客 xff1a 64 http blog csdn net gatiemehttps blog csdn net gatieme article details 21071379 前言 xf
  • 从零开始学习UCOSII操作系统15--总结篇

    从零开始学习UCOSII操作系统15 总结篇 前言 xff1a 在大学的时候 xff0c 我们班级上面都有很多人觉得学习UCOSII 包括UCOSIII 是没什么厉害的 xff0c 因为很多人都喜欢去学习Linux操作系统 xff0c 但是
  • UCOSII之项目实战总结

    电子IT行业博大精深 xff0c 没有人能够用笔记本天天记录自己所学的知识 xff0c 于是乎 xff0c 撰写博客就成了每个 IT民工 的专长 再者 xff0c 写一篇博客 xff0c 其意义与不但记录了自己所需的知识 xff0c 更提高
  • ucosII的书籍

  • UCOSII 信号量和信号量集实例

    代码来自于书本光盘 嵌入式操作系统UCOSII原理及应用 实例1信号量 include 34 includes h 34 define TASK STK SIZE 512 任务堆栈长度 OS STK StartTaskStk TASK ST
  • stm32 ucos/ii移植,程序执行到OSStart()内部的OSStartHighRdy()语句时跑飞问题解决方法之一

    stm32 ucos ii移植 程序执行到OSStart 内部的OSStartHighRdy 语句时跑飞问题解决办法之一 网络上的一些解决办法 stm32程序遇到OSStartHang的问题解决方法总结 但并不适合我遇到的情况 我的情况是已
  • os_mutex.c(全)

    无等待地获取互斥型信号量 OSMutexAccept OS EVENT pevent INT8U perr 创建互斥型信号量OS EVENT OSMutexCreate INT8U prio INT8U perr 删除信号量OS EVENT
  • uCOSii中的互斥信号量

    uCOSii中的互斥信号量 一 互斥型信号量项管理 MUTUAL EXCLUSION SEMAPHORE MANAGEMENT OSMutexAccept 无条件等待地获取互斥型信号量 OSMutexCreate 建立并初始化一个互斥型信号

随机推荐

  • 串级PID控制四轴飞行器状态-实现

    参考网页 xff1a http blog csdn net nemol1990 article details 45131603 一 上下运动 向上运动 xff0c 四个轴的速度同时增加向下运行 xff0c 四个轴的速度同时减小 二 前后运
  • c和c++调用Python

    参考网页 xff1a https docs python org 3 6 c api index html http blog csdn net taiyang1987912 article details 44779719 http bl
  • yoloV3 darknet GPU手把手从编译到训练再到C++调用API

    我要先声明一下 xff0c 系统是Ubuntu18 04 xff0c 我的机器已经装好了opencv4 1 1 和 cuda10 0 的 xff0c 过程可参考我另一篇博客 xff0c 这部分不再说明 IDE使用qtcreator 1 下载
  • 使用Git命令创建新分支

    1 进入Git Bash Here xff0c 查看仓库所有分支git branch a 2 使用命令 git checkout master xff0c 表示切换到master分支 xff0c 并git pull拉取最新代码 3 由于的所
  • VINS-初探(一)

    vins是香港科技大学开源的一个单目相机结合IMU的一个VIO xff0c 在github上可以下载源码 xff0c 分为iOS系统下的和ros系统下的两种 xff0c ros下的为 span class hljs label https
  • ROS使用官方包进行串口通信

    https www jianshu com p c30f390427e7 参考http span class hljs comment www roswiki com read php tid 61 557 amp fid 61 39 sp
  • STM32F446ZET6关于使用PA11,PA12,PB14,PB15的使用注意事项

    STM32F446ZET6关于使用PA11 xff0c PA12 xff0c PB14 xff0c PB15的使用注意事项 这两天在用PB14做输入时 xff0c 发现总是不灵敏 xff0c 开始还以为布线有问题 xff0c 检查后发现不是
  • numpy基本方法总结

    NumPy基本方法 一 数组方法 创建数组 xff1a arange 创建一维数组 xff1b array 创建一维或多维数组 xff0c 其参数是类似于数组的对象 xff0c 如列表等 读取数组元素 xff1a 如a 0 a 0 0 数组
  • 如何实现Qt上位机软件串口的按字节数据处理?

    1 Qt串口类的选择 最近在做一个小项目 xff0c 需要用到Qt做上位机软件 xff0c 本人也是边学边做 xff0c 买了本 QtCreator快速入门 看了看就动手了 xff0c 由于初学不是很了解Qt5的官方资源 xff0c 一开始
  • 如何使用HAL库手动修改OSC引脚为PD0/1?

    CubeMX不能直接重映射OSC引脚为PD0 1 xff0c 那么 xff0c 如何使用HAL库手动修改OSC引脚为PD0 1 如下图所示配置即可 xff1a
  • “野火FreeRTOS教程”第7章补充知识点-异常流程

    一 知识点 1 Cortex M3 4在复位后CONTROL寄存器初始值为0 xff0c 也就是说MCU会处于线程模式 具有特权访问权限且使用主栈指针 MSP 2 当进入异常时CM3会自动入栈 xff0c 如下图所示 xff1a 3 当异常
  • mini四旋翼飞行器DIY日志

    一 方案 功能描述 xff1a 具备mini四旋翼飞行器的基本功能 xff0c 可以拓展其他模块实现定高 对航向角yaw的校准 xff0c 将所有io引出并设计出最小系统板子功能 xff0c 将设计I2C总线挂载选择电路便于调试和使用 可以
  • Quartus II 13.1.0.162三件套安装包

    QuartusSetup 13 1 0 162 链接 https pan baidu com s 1B01zWG76kfNcGLA0VmwyMw 提取码 jjdd ModelSimSetup 13 1 0 162 链接 https pan
  • DSP Builder安装时的注意事项

    注意事项1 DSP Builder是以组件的形式安装在altera下面的 xff0c 并且altera要与matlab 32位 xff01 xff01 安装在同一路径下 xff0c 这个路径不要带有中文 xff0c 或者空格字符 xff0c
  • Maven3.6.1下载与配置,超详细

    Maven3 6 1下载与配置 xff0c 超详细Maven3 6 1下载与配置 xff0c 超详细Maven3 6 1下载与配置 xff0c 超详细 Maven下载与配置 1 官网下载对应版本 xff0c 推荐下载免安装版 下载地址 ht
  • 【GIS】GIS矢量空间分析(上)

    0 GIS的基本概念 栅格数据与矢量数据 上图中 xff0c a为图形模拟表示的地理对象 xff0c b为控件对象对应的栅格数据模型表示 xff0c c为对应的矢量数据模型表示 矢量模型的表达源于原型空间实体本身 xff0c 通常以坐标来定
  • ROS简介-从零开始讲解ROS(适合超零基础阅读)

    1 前言 笔者以前是机械专业 xff0c 对于计算机方面的学习是少之又少 xff0c 接触机器人的学习之后 xff0c 比如路径规划 算法等 xff0c 发现很难入门 xff0c 不过慢慢摸爬滚打之后还是有了一些认识 xff0c 俗话说的好
  • C++primer plus第六版课后编程练习答案14.1

    include lt iostream gt include lt string gt using namespace std template lt class T1 class T2 gt class Pair private T1 a
  • 区块链——脱坑truffle

    使用truffle构建一个智能合约 实现输出 helloworld 的功能 网上有很多帖子 但也有很多坑 这里展示我的搭建过程 帮助大家绕过那些麻烦 一 安装web3 solc truffle npm g install solc npm
  • ucosii消息队列使用

    ucosii消息队列简介 ucosii的消息队列源码定义在os q c文件 xff1b 接口全部声明在ucos ii h xff0c 总共有如下接口 xff1a span class token keyword void span span