建立一个消息队列,OSQCreate()

2023-05-16

程序清单 L6.21是OSQCreate()函数的源代码。该函数需要一个指针数组来容纳指向各个消息的指针。该指针数组必须声名为void类型。
OSQCreate()首先从空闲事件控制块链表中取得一个事件控制块(见图F6.3)[L6.21(1)],并对剩下的空闲事件控制块列表的指针做相应的调整,使它指向下一个空闲事件控制块[L6.21(2)]。接着,OSQCreate()函数从空闲队列控制块列表中取出一个队列控制块[L6.21(3)]。如果有空闲队列控制块是可以的,就对其进行初始化[L6.21(4)]。然后该函数将事件控制块的类型设置为OS_EVENT_TYPE_Q [L6.21(5)],并使其.OSEventPtr指针指向队列控制块[L6.21(6)]。OSQCreate()还要调用OSEventWaitListInit()函数对事件控制块的等待任务列表初始化[见6.01节,初始化一个事件控制块,OSEventWaitListInit()] [L6.21(7)]。因为此时消息队列正在初始化,显然它的等待任务列表是空的。最后,OSQCreate()向它的调用函数返回一个指向事件控制块的指针[L6.21(9)]。该指针将在调用OSQPend(),OSQPost(),OSQPostFront(),OSQFlush(),OSQAccept()和OSQQuery()等消息队列处理函数时使用。因此,该指针可以被看作是对应消息队列的句柄。值得注意的是,如果此时没有空闲的事件控制块,OSQCreate()函数将返回一个NULL指针。如果没有队列控制块可以使用,为了不浪费事件控制块资源,OSQCreate()函数将把刚刚取得的事件控制块重新返还给空闲事件控制块列表 [L6.21(8)]。
另外,消息队列一旦建立就不能再删除了。试想,如果有任务正在等待某个消息队列中的消息,而此时又删除该消息队列,将是很危险的。

程序清单 L6.21 建立一个消息队列
OS_EVENT *OSQCreate (void **start, INT16U size)
{
    OS_EVENT *pevent;
    OS_Q     *pq;


    OS_ENTER_CRITICAL();
    pevent = OSEventFreeList;	                                        (1)
    if (OSEventFreeList != (OS_EVENT *)0) {
        OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;	   (2)
    }
    OS_EXIT_CRITICAL();
    if (pevent != (OS_EVENT *)0) {
        OS_ENTER_CRITICAL();
        pq = OSQFreeList;	                                            (3)
        if (OSQFreeList != (OS_Q *)0) {
            OSQFreeList = OSQFreeList->OSQPtr;
        }
        OS_EXIT_CRITICAL();
        if (pq != (OS_Q *)0) {
            pq->OSQStart        = start;	                             (4)
            pq->OSQEnd          = &start[size];
            pq->OSQIn           = start;
            pq->OSQOut          = start;
            pq->OSQSize         = size;
            pq->OSQEntries      = 0;
            pevent->OSEventType = OS_EVENT_TYPE_Q;	                   (5)
            pevent->OSEventPtr  = pq;	                                (6)
            OSEventWaitListInit(pevent);	                             (7)
        } else {
            OS_ENTER_CRITICAL();
            pevent->OSEventPtr = (void *)OSEventFreeList;	            (8)            OSEventFreeList    = pevent;
            OS_EXIT_CRITICAL();
            pevent = (OS_EVENT *)0;
        }
    }
    return (pevent);	                                                 (9)
}

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

建立一个消息队列,OSQCreate() 的相关文章

  • Doxygen + Graphviz 代码自动化分析

    Doxygen 43 Graphviz 代码自动化分析 目录 1 实际需求2 工具简介3 使用说明4 代码注释规范5 参考 1 实际需求 在开发程序时 xff0c 需要编写对应的说明文档 在阅读现有的项目源代码时 xff0c 需要梳理函数间
  • Microsoft Learn: Docker入门教程

    Microsoft Learn Docker入门教程 1 Introduction2 What is Docker3 How Docker images work4 How Docker containers work5 When to u
  • 将kitti数据集中的velodyne points转换为ROS bag文件

    kitti数据集中包含了相机图像 激光扫描得到的点云信息 高精度GPS测量信息和IMU加速度信息 xff0c 用于移动机器人与自动驾驶方面的研究 如下为数据采集平台示意图 kitti数据集中的激光扫描数据是以二进制文件形式存储的 xff0c
  • 使用 Dockerfile 创建一个简单的容器

    Dockerfile Dockerfile 是用于指导 docker 创建自定义 image 的一系列指令 xff0c 是用于创建 image 的蓝图 现在有一个简单的 node 项目 其中Dockerfile 是后面加的 xff0c 初始
  • 导航英语专业词汇——不停更新

    惯性导航 inertia 惯性INS 惯性导航系统GINS 平台惯性导航系统SINS 捷联惯性导航系统IMU 惯性导航元件gyroscope 陀螺仪accelerometer 加速度计 SLAM 词汇词性意思 导航中用 SLAM词组同步定位
  • 不止于linux SSH 基本用法-正反向代理-内外网穿透

    最近小伙伴们纷纷进了实验室 xff0c 就冒出了一系列关于控制远程机器的问题 xff0c 我觉得我还是有必要科普一下的 约定 本文不讲解 Linux 使用方法 xff0c 只讲解机器之间的通信方法 下文中行首的 local 以及 remot
  • 传感器数据滤波算法

    嵌入式应用中 xff0c 系统获取的传感器数据通常不能够直接供应用使用 xff08 存在噪声干扰 xff1a 低频噪声或高频噪声 xff09 xff0c 一般通过一种或者多种滤波算法结合 xff0c 对原始数据进行滤波处理 xff0c 在保
  • 写了一个生成reStructuredText表格的vim插件

    vim官网上有一个rst table xff0c 不过不太好用 xff0c 最大的问题是对中文的支持有欠缺在 f后 xff0c 中文所在的cell的长度会计算错误 扫了一眼它的源码使用了python写的插件 xff0c 所以我就心血来潮也想
  • Ubuntu 16.04 一系列软件安装命令,包括QQ、搜狗、Chrome、vlc、网易云音乐安装方法

    1 简介 Ubuntu 16 04安装完后 还需要做一些配置才能愉快的使用 包括添加软件源 安装搜狗输入法 Chrome浏览器 网易云音乐 配置快捷键 安装git等等 下面就跟着我来配置吧 just do it 2 版本选择 如果你是小白
  • 从入门到放弃之生产环境基于Kubernetes V1.21.10搭建高可用集群

    1 资源规划 名称系统配置IP组件k8s master01CentOS 7 94核8G 500G存储172 16 97 27kube apiserver lt br gt kube controller manager lt br gt k
  • ros c++ 开发错误“集锦”

    集锦 xff0c 才能经常回放 1 error s getMD5Sum is not a member2 ROS datatype md5sum错误 持续更新 1 error s getMD5Sum is not a member 目前观测
  • 嵌入式ARM算法移植与优化

    目录 一 算法优化指导思想 1 算法优化基本原则 2 算法优化方法 二 编译器优化 1 xff0c 函数内联 2 xff0c 消除公共子表达式 3 xff0c 循环展开 4 xff0c GCC优化选项 5 xff0c ARMCC优化选项 三
  • OV2640摄像头驱动与应用代码

    目录 一 摄像头基础 1 1 OV2640参数 1 2 视场角与镜头 二 OV2640驱动 三 OV2640视频接入
  • ubuntu16.04常用软件安装

    目录 1 办公软件 xff1a WPS 2 文本比较工具 Meld 3 版本管理 xff1a git 4 安装wine 5 安装常用库 6 配置阿里源 7 vim 8 OpenCV 9 QT 10 VSCode 11 gparted 1 办
  • RK1109 NPU算法测试demo

    目录 一 矩阵乘法测试 二 测试结果 一 矩阵乘法测试 通过一个简单的矩阵乘法 xff0c 和L2距离计算来测试NPU计算性能与启动NPU的一般方法 具体代码如下 xff1a Example Calculate x y 2 using Ma
  • VS2015远程连接虚拟机

    目录 一 安装VC Linux exe 二 打开VS 选择新建项目 三 配置VS 四 创建项目 一 安装VC Linux exe 下载地址 xff1a 二 打开VS 选择新建项目 三 配置VS 打开VS xff0c 菜单栏点击工具 gt 选
  • MiniFly微型四轴学习与开发日志(四)

    文章目录 任务创建和删除 API 函数任务调度器开启函数分析临界区atkp c 任务创建和删除 API 函数 FreeRTOS 最基本的功能就是任务管理 xff0c 而任务管理最基本的操作就是创建和删除任务 xff0c FreeRTOS 的
  • Git常用命令

    目录 一 提交代码 二 更新本地代码 三 修改项目中Git远程仓库地址 1 开启Git Bash 2 查看git远程仓库地址 3 修改远程仓库地址 4 检查新地址 Git常用命令备忘 一 提交代码 1 在项目内点击Git Bash Here
  • linux动态库找不到

    linux动态库找不到 一 分析二 解决方式一方式二方式三 三 如何检查RPATH的值 问题状态 xff1a xxx so cannot open shared object file No such file or directory 一
  • ubuntu14.04LTS下创建Qt5.5.1桌面快捷方式

    以下是网上的方法 xff0c 我试了一下 xff0c 反正没成功 Ubuntu14 04LTS在桌面上创建Qt5 4 1快捷方式 1 下载并安装Qt5 4 1 xff0c 我的安装路径时home cao Qt5 4 1 xff08 默认路径

随机推荐

  • Linux操作系统之一:简述Linux系统开机引导和启动过程

    Linux操作系统之一 xff1a 简述Linux系统开机引导和启动过程 操作系统的启动分为两个阶段 xff1a 引导boot 启动startup 引导阶段开始于打开电源开关 xff0c 结束于内核初始化完成和 systemd 进程成功运行
  • TCP IP与UDP含义 区别 总结

    TCP IP协议 xff08 一 xff09 网络基础知识 OSI参考模型中每个分层的作用 1 3 1 应用层 xff1a 为应用程序提供服务并规定应用程序中通信相关的细节 xff1b 包括的协议如下 xff1a xff1a 超文本传输协议
  • STM32F103 CAN总线配置总结

    stm32的can总线的配置如下 xff1a CAN InitStructure CAN TTCM 61 DISABLE 禁止时间触发通信模式 CAN InitStructure CAN ABOM 61 DISABLE CAN InitSt
  • 新版标准日本语初级_第四十八课

    语法 1 自谦语 xff1a 自谦语是通过压低说话人自身或说话人一方的形式表示敬意的表达方式 如跟别人谈到自己的家人或自己公司的上级时 xff0c 也使用自谦语 2 43 一类动 二类动 或 43 三类动的汉字部分 xff1a 这是自谦语中
  • STM32同时使用多个定时器

    代码如下 xff1a span class token keyword void span span class token function TIM2 IRQHandler span span class token punctuatio
  • Qt之定时器

    文章目录 QObject类的定时器定时器类QTimer Qt使用定时器有两种方法 xff0c 一种是使用QObiect类的定时器 xff0c 一种是使用QTimer类 定时器的精确性依赖于操作系统和硬件 xff0c 大多数平台支持20ms的
  • ucos信号量集

    事件标志组 信号量集 的使用 xff1a span class token keyword static span OS STK task testled span class token punctuation span STARTUP
  • Ubuntu 18.04 swap分区扩展

    在开始之前 xff0c 请先使用命令检查您的 Ubuntu 系统的SWAP 分区 sudo swapon show 创建 swap 的文件 xff08 分配 1G 的swap分区大小 xff09 sudo fallocate l 1G sw
  • ping通ipv6地址

    文章目录 WindowsLinux为什么Link local地址后面要有百分号 xff1f Windows ping ipv6主机名的方法如下 xff1a span class token function ping span 6 ipv6
  • STM32_串口的DMA接收

    STM32使用DMA在串口接收数据的方法如下 xff1a span class token macro property span class token directive hash span span class token direc
  • CopyMakeBorder函数

    其作用是复制图像并且制作边界 处理边界卷积 xff1a span class token keyword void span span class token function cvCopyMakeBorder span span clas
  • Altium designer中文化设置

    Altium designer中文化设置的步骤如下 xff0c 然后重启软件即可 xff1a
  • zipfile.BadZipFile: File is not a zip file

    zipfile BadZipFile File is not a zip file的问题复现步骤 xff1a 使用openpyxl的save函数 xff0c 将数据保存在Excel文件中 在没有保存完成的情况下 xff0c 又使用load
  • OpenCV_图像二值化

    对图像进行二值化的关键函数为cvThreshold xff0c 它采用Canny方法对图像进行边缘检测 xff1a span class token keyword void span span class token function c
  • cvSetImageROI函数

    有时候我们需要从一幅图像中获取感兴趣的区域 region of interesting xff0c ROI xff0c 将该区域裁剪成小图像 xff0c 作为后期处理的输入 利用cvSetImageROI函数便可以轻松搞定 xff1a sp
  • 原码、反码和补码

    文章目录 机器数和真值机器数真值 原码 反码和补码原码反码补码 编码原因 机器数和真值 机器数 一个数在计算机中的二进制表示形式叫做这个数的机器数 机器数是带符号的 xff0c 计算机用一个数的最高位来存放符号 xff0c 正数为0 xff
  • 阿里云服务器为Ubuntu配置图形化界面

    准备工作 xff1a 台云服务器 ubuntu系统20 04 连接网络 首先打开控制台 紧接着连接服务器 第一次登录需设置登录密码 xff0c 设置好之后会出现以下界面 xff0c 点击确定 配置图形界面 登陆好之后先切换root用户 su
  • 信用卡欺诈检测:2021 年顶级机器学习解决方案

    在公众号 python风控模型 里回复关键字 xff1a 学习资料 从电子商务支付系统出现的那一刻起 xff0c 总是有人会找到新的方法来非法获取某人的资金 这已成为现代时代的一个主要问题 xff0c 因为只需输入您的信用卡信息即可轻松在线
  • 矩阵分解

    1 先了解一下 矩阵乘法 xff08 内积 点乘 矩阵的内积参照向量的内积的定义的 xff0c 先说说向量 xff1a 两个向量对应乘积之和 比如 61 1 2 3 61 4 5 6 xff0c 则 的内积等于 1 4 43 2 5 43
  • 建立一个消息队列,OSQCreate()

    程序清单 L6 21是OSQCreate 函数的源代码 该函数需要一个指针数组来容纳指向各个消息的指针 该指针数组必须声名为void类型 OSQCreate 首先从空闲事件控制块链表中取得一个事件控制块 xff08 见图F6 3 xff09