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学习---五、任务通信之信号量

    一 xff1a 信号量的理解 xff1a 信号量的本质是数据操作锁 xff0c 它本身不具有数据交换的功能 xff0c 而是通过控制其他的通信资源 xff08 文件 xff0c 外部设备 xff09 来实现进程间通信 xff0c 它本身只是
  • stm32 ucosii消息队列 串口_UC/OSII消息队列、信号量集和软件定时器

    UCOSII消息队列 信号量集和软件定时器简介 上一章 xff0c 我们介绍了信号量和邮箱的使用 xff0c 本章我们介绍比较复杂消息队列 信号量集以及软件定时器的使用 消息队列 使用消息队列可以在任务之间传递多条消息 消息队列由三个部分组
  • ucosii使用

    当需要同时跑多个任务的时候裸机显然不能很好的完成使命 xff0c 这个时候我们可以给单片机上系统 xff0c 创建多任务 xff0c 完成复杂逻辑 一 首先移植uocii在我们的板上 xff0c 根据mcu型号移植ucosii xff0c
  • UCOSII-信号量与信号量集

    文章目录 一 前言1 任务间的同步2 事件 二 信号量1 信号与信号量介绍2 信号量常用函数3 信号量使用流程 xff08 互斥信号量和信号量两种 xff09 4 互斥型信号量使用5 使用一般信号量做任务同步 三 信号量集 事件标志组 1
  • UCOSII-消息邮箱与消息队列

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

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

    1 用信号量进行行为同步时 xff0c 只能提供同步的时刻信息 xff0c 不能提供内容信息 若被控制方要求得到控制方的内容信息时 xff0c 可以使用消息邮箱或消息队列 2 但由于消息邮箱里只能存放一条消息 xff0c 所以使用消息邮箱进
  • 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要用到的几本书和软件

    原帖地址 xff1a http bbs ednchina com BLOG ARTICLE 2020186 HTM 打算学习一个嵌入式操作系统 xff0c 研究了一下决定还是先研究一下ucosii xff0c 一方面权当学习C语言 xff0
  • 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 信号量使用总结(举例讲解)

    概述 信号量用于 xff1a 1 控制共享资源的使用权 xff08 满足互斥条件 xff09 2 标志某时间的发生 3 使2个任务的行为同步 OSSemCreate 赋初值 OSSemCreate INT16U cnt xff0c cnt为
  • 再读 ucosII源码(邵贝贝):任务之间的通讯与同步--邮箱

    邮箱简介 xff1a 邮箱是 C OS II中另一种通讯机制 xff0c 它可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量 该指针指向一个包含了特定 消息 的数据结构 为了在 C OS II中使用邮箱 xff0c 必须将O
  • UCOSII里面为什么调用OS_ENTER_CRITICAL()或OS_EXIT_CRITICAL()会出错,出错信息为:undeclared identifier `cpu_sr‘

    可以观察到OSTickISR Init 函数内部调用了OS ENTER CRITICAL 和OS EXIT CRITICAL 并且 1 该OSTickISR Init 函数所在的 C文件包含了includes h文件 include inc
  • 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