当前位置: 首页 > news >正文

UCOS-III笔记(六)

作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习
擅长领域:驱动开发,嵌入式软件开发,BSP开发
作者主页:一个平凡而乐于分享的小比特的个人主页
文章收录专栏:UCOS-III,本专栏为UCOS-III学习记录
欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖

UCOS-III笔记(六)

消息队列

队列是任务到任务、中断到任务的数据交流的一种机制(消息传递

在OS中如果使用全局变量存在弊端:数据无保护,导致数据不安全,当多个任务同时对该变量操作时,数据易受损

在这里插入图片描述

在这里插入图片描述

写队列:
OSQPost( )
{// 进入临界区(关中断)写队列实际操作// 退出临界区(开中断)
}
读队列:
OSQPend( )
{// 进入临界区(关中断)读队列实际操作// 退出临界区(开中断)
}

队列:读写队列做好了保护,防止多任务同时访问冲突;我们只需要直接调用API函数即可,简单易用!

特点:

  1. 数据入队出队方式

    ​ 队列通常采用“先进先出”(FIFO)的数据存储缓冲机制,即先入队的数据会先从队列中被读取,UCOSIII中也可以配置为“后进先出”LIFO方式

  2. 数据传输方式

    ​ UCOSIII的队列数据是一个“万能指针”,可以指向任何数据,甚至是函数,所以发送方和接收方必须按照约定好的方式去发送和接收消息,这样才能正常解析接收到的消息

  3. 多任务访问

    队列不属于某个任务,任何任务和中断都可以向队列发送消息,但是读取消息只能在任务中,不支持中断读取消息

  4. 出队阻塞

    ​ 当任务向一个队列读取消息时,可以指定一个阻塞时间,假设此时当队列没有数据时无法读取。

    ①若阻塞时间 = 0 :死等,一直等到可以队列有数据可以出队为止;

    ①若阻塞时间 > 0 :等待设定的阻塞时间,若在该时间内还未接收到数据,超时后直接返回不再等待;

注意:写队列不支持阻塞,读队列支持阻塞

队列相关API函数介绍

队列的主要流程:创建队列 -->写队列 --> 读队列

函数描述
OSQCreate()创建一个消息队列
OSQDel()删除一个消息队列
OSQFlush()清空消息队列中的所有消息
OSQPend()获取消息队列中的消息
OSQPendAbort()终止任务挂起等待消息队列
OSQPost()发送消息到消息队列

OSQCreate():创建一个消息队列

void OSQCreate(	   OS_Q* 			p_q,			//指向消息队列结构体的指针CPU_CHAR* 		p_name,			//指向作为消息队列名的 ASCII 字符串的指针OS_MSG_QTY 		max_qty,		//消息队列的大小OS_ERR* 			p_err			//指向接收错误代码变量的指针)

OSQPost():发送消息到消息队列中

void  OSQPost(  	OS_Q*			p_q,			//指向消息队列结构体的指针void* 			p_void,			//指向消息的指针OS_MSG_SIZE		msg_size,		//消息的大小,单位: 字节OS_OPT 			opt,			//函数操作选项://OS_OPT_POST_FIFO :将发送的消息保存在队列的末尾			  													  //OS_OPT_POST_LIFO :将发送的消息保存在队列的开头//OS_OPT_POST_ALL :将消息发送给所有等待该消息的任务																//OS_OPT_POST_NO_SCHED :禁止在本函数内执行任务调度//以上的几种类型可以进行组合OS_ERR* 		p_err			//指向接收错误代码变量的指针) 

OSQPend():获取消息队列中的消息

void * OSQPend (	OS_Q* 			p_q,			//指向消息队列结构体的指针OS_TICK 		timeout,		//任务挂起等待消息队列的最大允许时间,当为0时,表示将一直等待,直到接收到消息OS_OPT 			opt,			//OS_OPT_PEND_BLOCKING   :如果没有任何消息存在的话就阻塞任务//OS_OPT_PEND_NON_BLOCKING :如果消息队列没有任何消息的话任务就直接返回OS_MSG_SIZE*	p_msg_size,		//指向一个变量用来表示接收到的消息长度(字节数)CPU_TS* 		p_ts,			//指向接收消息队列接收时的时间戳的变量的指针,为NULL,说明用户没有要求时间戳OS_ERR* 		p_err   		//指向接收错误代码变量的指针) 
http://www.dtcms.com/a/605002.html

相关文章:

  • 企业小型网站要多少钱百度怎么做网站广告
  • macos HbuildX 使用cli脚本创建uniapp 运行时报错“cli项目运行依赖本地的Nodejs环境,请先安装并配置到系统环境变量后重试。”
  • Android MediaCodec 硬编解码实战:从Camera预览到H264流与回环渲染
  • 大数据时代时序数据库选型指南:从技术架构到实战案例
  • STM32MP1 没有硬件编解码,如何用 CPU 实现 H.264 编码支持 WebRTC?
  • 完整事务性能瓶颈分析案例:支付系统事务雪崩优化
  • Java后端常用技术选型 |(三)分布式篇
  • el-table动态添加行,删除行
  • 房产网站制作流程搞一个网站需要多少钱
  • 怎么做仲博注册网站黄冈网站seo
  • 回顾-大语言模型分类
  • MTK平台蓝牙学习-- 如何将BLE功率调整参数对应CFG_BT_Default.h合入软件
  • 零基础学AI大模型之Milvus部署架构选型+Linux实战:Docker一键部署+WebUI使用
  • 长春找工作哪个网站好西安高端网站制作
  • TCP/IP协议族详细介绍
  • 将现有项目从生成git init开始, 到推送到gitcode 全流程步骤
  • js递归找label
  • Python自动化:MiniMind本地部署与测试
  • 机器学习驱动的智能光子学器件:逆向设计、光学神经网络与片上系统应用
  • 苍穹外卖资源点整理+个人错误解析-Day07-缓存商品、购物车
  • 自己做网站还是开通阿里巴巴诚信通安徽科技学院
  • 【033】Dubbo3从0到1系列之dubbo协议支持的序列化方式
  • 开源 Objective-C IOS 应用开发(五)iOS操作(action)和输出口(Outlet)
  • openEuler系统部署Node.js开发环境指南
  • 杭州网站建设市场青岛餐饮加盟网站建设
  • 手动清除Ubuntu系统中的内存缓存的步骤
  • 花店微信小程序怎么做,创建一个小程序需要多少钱
  • c# 异步编程详细说明及实践
  • 系统架构设计师论文分享-论设计模式的应用
  • 漫谈我与C++