【小黑嵌入式系统第十五课】μC/OS-III程序设计基础(四)——消息队列(工作方式数据通信生产者消费者模型)、动态内存管理、定时器管理

news2024/11/19 20:34:26

上一课:
【小黑嵌入式系统第十四课】μC/OS-III程序设计基础(三)——信号量(任务同步&资源同步)、事件标记组(与&或&多个任务)



前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:人工智能

在这里插入图片描述



文章目录

    • 1 消息队列
      • 1.1 简介
        • 1.1.1 向消息队列发送消息
        • 1.1.2 从消息队列接收消息
      • 1.2 消息队列的状态
      • 1.3 消息队列的工作方式
        • 1.一对一
        • 2.多对一
        • 3.一对多
      • 1.3 数据通信
      • 1.4 多任务接收数据
      • 1.5 任务间同步
      • 1.6 任务消息队列
      • 1.7生产者消费者模型
    • 2 动态内存管理
      • 2.1 简介
      • 2.2 函数列表
      • 2.3 数据通信
    • 3 定时器管理
      • 3.1 简介


1 消息队列

1.1 简介

一个任务或者ISR有时需要和另一个任务交流信息,这个信息传递的过程称为任务间(或ISR与任务间)的通信。有两种途径可实现:全局变量消息队列

方式1:通过全局变量

全局变量为共享资源,每个任务或ISR在使用它时都必须保证对其的独占性。若有ISR参与使用,则唯一能保证对共享变量独占访问的方法就是关中断;如果只是任务间共享全局变量,则可通过——关中断、给调度器上锁、使用信号量或者互斥信号量。

(这里假定对全局变量的操作不能在一条CPU指令中完成)

注意:
任务要想与ISR通信(发送信息ISR,注意方向),只能通过全局变量;
若ISR修改了全局变量值,任务并不能知道,除非ISR通知任务(如发送信号量等方式),或者任务定期地查询全局变量的值。


方式2:通过消息队列

消息可以通过消息队列作为中介发送给任务,也可直接发送给任务(μC/OS-III中,每个任务都有其内建的消息队列,称为任务消息队列,任务消息队列在任务创建时自动建立)。

  • 当有多个任务在等待消息的时候,使用外部的消息队列;
  • 如果只有一个任务需要接收消息,可以使用该任务的任务消息队列直接向其发送消息。

任务在等待消息时不占用CPU时间

另外需注意:发送的消息不会被复制一份再放置到消息队列中,而是使用引用传递。因此需保证消息内容在接收消息的任务代码内可见。(不能在任务接收到消息时,该消息内容已无效了(如用自动变量保存消息内容而此时自动变量却已被释放))


在这里插入图片描述

消息队列就象一个类似于缓冲区的对象,可以实现同步和数据通信。

消息队列具有一定的容量,可以容纳多条消息。

消息队列中的消息一般按照先入先出(FIFO)的方式放置,但在需要时也可安排为后入先出(LIFO,在发布消息时选择)。

在这里插入图片描述


1.1.1 向消息队列发送消息

当任务往消息队列中发送消息时,可选择只将该消息发送给一个任务。当前等待消息的任务中只有最高优先级的那个将接收到消息,或最先进入等待消息列表的(同优先级)任务。

在这里插入图片描述

注:也可选择以广播的形式发送消息,那么所有“等待此消息的”任务都将获得该消息。


如果没有任务在等待消息队列的消息,则发送消息时会判断消息队列当前是否已满 。

在这里插入图片描述


1.1.2 从消息队列接收消息

消息队列中已存在消息,通过内核服务将消息传递给等待消息的任务中优先级最高的任务,或最先进入等待消息任务列表的(同优先级)任务。

在这里插入图片描述


如果消息队列为空,则等待消息的任务被放入等待消息的任务列表中,直到有其它任务向消息队列发送消息后,该任务才能结束等待状态或在等待超时的情况下运行。

在这里插入图片描述


OSQPend()函数允许用户定义一个最长的等待时间Timeout作为它的参数,这样可以避免该任务无休止地等待下去。

在这里插入图片描述


内核提供以下消息队列服务:

在这里插入图片描述

  • 等待消息的到来(PEND);
  • 将消息放入队列中去(POST);
  • 清空消息队列
  • 消息队列初始化,队列初始化时总是清为空;

与信号量相比,消息队列不仅可以实现同步,而且通过缓冲的方式来传递多个数据信息,从而避免了信息的丢失或混乱。


1.2 消息队列的状态

消息队列有3种状态,即空状态(消息队列中没有任何消息)、满状态(消息队列中的每个存储单元都存放了消息)、正常状态(消息队列中消息但又没有到满的状态)。

在这里插入图片描述


1.3 消息队列的工作方式

1.一对一

在这里插入图片描述

2.多对一

在这里插入图片描述

3.一对多

在这里插入图片描述

多对多与全双工的工作方式也可实现,但不常见。


1.3 数据通信

让一个LED以传递过来的参数确定点亮时间,以此示例来说明如何使用消息队列来实现任务之间的数据通信,假设TaskLED为高优先级的任务。两个任务的处理流程如下。

在这里插入图片描述


LED任务的代码如下。

在这里插入图片描述


发送延时参数任务SendDly的代码如下。

在这里插入图片描述


1.4 多任务接收数据

为了说明如何使用消息队列来实现多任务接收数据,我们设计一个系统,按键一按下,LED按照指定节奏闪烁,蜂鸣器按照指定节奏鸣响。三个任务的处理流程如下。

在这里插入图片描述


1.5 任务间同步

TaskKEY任务主要代码如下。

在这里插入图片描述


LED任务的代码如下。

在这里插入图片描述


Beep任务主要代码如下。

在这里插入图片描述


1.6 任务消息队列

在μC/OS-III中,每个任务都有它自己的内嵌消息队列,称为任务消息队列。任务消息队列是在任务创建OSTaskCreate()时创建的,因此任务创建之后便可以直接使用。

任务消息队列使用起来更方便。

当用户明确知道该给哪个任务发消息时,此时就可以使用任务消息队列。

在这里插入图片描述

μC/OS-III中的任务消息队列服务函数以OSTaskQ???()命名。

在这里插入图片描述

使用任务消息队列做任务间的通信,可参考示例程序:“Micrium_CY8CKIT-050B_uCOS-III-Q_GNU(PSoC Creator 4.0).rar


1.7生产者消费者模型

在这里插入图片描述

使用一个计数型信号量,初值为允许生产者发布的消息数目。如:消费者最多缓存10则消息,则该计数型信号量的初值为10。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


2 动态内存管理

2.1 简介

ANSI C中,可以使用malloc()free()两个函数来动态分配内存,在嵌入式系统中,它们一般也是可用的,但并不适合。如图为被两个函数分配过的内存区。

在这里插入图片描述

为了避免上面的问题,μC/OS-III自己设计了一套动态内存分配系统。μC/OS-III的动态内存分配是以块为单位分配的,一次只能分配一个块,块的大小可以由用户来定义。

在这里插入图片描述

μC/OS-III的动态内存管理是数据队列的绝佳伴侣,配合使用异常方便 。


2.2 函数列表

将os_cfg.h中的宏OS_CFG_MEM_EN设置为1即可使能存储管理服务。

动态内存管理的3个系统函数:

在这里插入图片描述


2.3 数据通信

让一个LED以传递过来的参数确定点亮时间,以此示例来说明如何用动态内存管理来实现数据通信。两个任务的处理流程如下。

在这里插入图片描述


LED任务的代码如下。

在这里插入图片描述


发送消息任务SendDly的代码如下。

在这里插入图片描述


3 定时器管理

3.1 简介

μC/OS-III可为应用程序提供定时器及相关服务,它和系统内部任务“定时器任务”相关,定时器服务的启动由os_cfg.h中的宏OS_CFG_TMR_EN设定。

这里的定时器是软件方式实现的递减定时器,共用时钟节拍任务中的时钟节拍硬件定时器。因此时间分辨率不会超过时钟节拍定时器。通常设置为比较粗的时间分辨率。

定时器的计数值减为0时,会引发一个操作,该操作由操作系统调用一个用户定义的回调函数(运行在定时器任务环境中)来实现。

定时器的使用比较简单,详情请见μC/OS-III电子书的第12章“定时器管理”。

关于(软件)定时器的使用,可参考示例程序:
Micrium_CY8CKIT-050B_uCOS-III-Sem-ISR-Tmr_GNU(PSoC Creator 4.0).rar

关于任务信号量、任务消息队列,最后提供一个实际应用示例项目:
CY8CKIT-050B_uCOS-III-DispShift-TkQ_GNU(PSoC Creator 4.0).rar

该项目基于μC/OS-III 操作系统实现,它使用LCD1602,演示了当 LCD 显示区域不足以显示出全部文字时,如何对 LCD 显示内容进行循环移动,分批显示出文字的各个部分。在无操作系统的情况下,要实现令人满意的同样效果,则会遇到许多不易解决的麻烦。

LCD 的显示内容可以在运行时更改,通过给 LCD 显示任务发任务消息的方式来告知新的显示数据和请求源的属性。

程序适用于具有1~4行显示能力的、HD44780 控制器兼容的 LCD 模块。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1389618.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

美媒:OpenAI删除了禁止其技术被用于军事用途的条款

据美国调查新闻网站“拦截者”(The Intercept)1月12日报道,美国知名人工智能企业、ChatGPT母公司OpenAI近日悄悄修改了其产品的使用条款,删除了禁止将OpenAI技术用于军事用途的条文。 报道称,在今年1月10日之前&#…

Springboot+vue的智能无人仓库管理(有报告),Javaee项目,springboot vue前后端分离项目

演示视频: Springbootvue的智能无人仓库管理(有报告),Javaee项目,springboot vue前后端分离项目 项目介绍: 本文设计了一个基于Springbootvue的前后端分离的智能无人仓库管理,采用M&#xff08…

基于Springboot的私人健身与教练预约管理系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的私人健身与教练预约管理系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三…

java基础:求数组的和以及平均数案例分析

/* * * 解题思路:首先定义一个包含数字的数组hens, * 然后使用循环遍历数组中的每个元素,并将其累加到sum变量中。 * 最后,将sum除以数组长度得到平均值avg。最终将结果打印输出到控制台。*/ 代码如下: package idea;…

机器学习算法实战案例:GRU 实现多变量多步光伏预测

文章目录 1 数据处理1.1 数据集简介1.2 导入库文件1.3 数据集处理1.4 训练数据构造 2 模型训练与预测2.1 模型训练2.2 模型多步预测2.3 预测可视化 答疑&技术交流机器学习算法实战案例系列 1 数据处理 1.1 数据集简介 实验数据集采用数据集7:常州普利司通光伏…

[linux]同步缓冲区数据到flash

一、需求 由于linux自身策略问题,在某些情况下需主动同步数据到flash。 二、方案 同步数据的两种方式:sync和fsync 2.1sync 将整个缓冲区同步至flash。性能较差。 2.2fsync -d [file] 将某一文件的数据同步至flash。 三、应用实例 3.1sync 3.2f…

虚拟服务器的监控和管理

IT 网络中虚拟环境的出现给 IT 管理员带来了一些挑战,虚拟环境降低了管理硬件和软件的成本和复杂性,同时,他们通常需要 IT 管理员管理更多的空间,以确保完全可见和快速解决问题。 虚拟服务器在现代 IT 基础架构中越来越普遍&…

NXP采用RS RTS测试系统,验证28纳米RFCMOS雷达单芯片 |百能云芯

Rohde & Schwarz的雷达目标模拟器R&S RTS,作为汽车雷达的颠覆性解决方案,尤其是其能够电子模拟非常近距离物体的能力,已被用于验证NXP半导体的下一代雷达传感器参考设计的性能。 这一合作使汽车行业在汽车雷达的发展上迈出了一步&…

.net core 6 集成nacos的服务注册和配置中心

1、安装nuget包 2、加上配置文件 "nacos": {"ServerAddresses": [ "http://127.0.0.1:8848" ],"GroupName": "DEFAULT_GROUP","ClusterName": "DEFAULT","ServiceName": "webapi"…

【Linux实用篇】项目部署 基于Shell脚本自动部署

目录 1. 项目部署 1.1 手动部署项目 1.2 基于Shell脚本自动部署 1.2.1 介绍 1.2.2 推送代码到远程 1.2.3 Git操作 1.2.4 Maven安装 1.2.5 Shell脚本准备 1.2.6 Linux权限 1.2.7 授权并执行脚本 1.2.8 设置静态IP 1. 项目部署 之前我们讲解Linux操作系统时&#xff0…

基于拓扑图与领导跟随法的编队控制算法

matlab2020可运行 https://download.csdn.net/download/ljjjjjjjjjjj/88750436

导航与定位技术已成为移动机器人的核心技术之一

随着移动机器人技术的不断发展和应用领域的扩大,导航与定位技术已成为移动机器人的核心技术之一。本文将介绍移动机器人导航与定位技术的发展现状、技术前沿和面临的挑战。 ​ 一、导航与定位技术的发展现状 移动机器人的导航与定位技术是实现自主移动的关键。目前…

Vscode——运行java项目

1、安装JDK(已安装请忽略) 教程:https://blog.csdn.net/qq812457115/article/details/117451011 验证是否已安装,命令符输入 java -version2、安装Maven(已安装请忽略) 教程:https://blog.csdn…

LeetCode刷题---反转链表II

LeetCode官方给出的解题思路 在需要反转的区间里,每遍历到一个节点,让这个新节点来到反转部分的起始位置。 使用了三指针的思想。 定义三个节点: curr:指向待反转区域的第一个节点 left; next:永远指向 curr 的下一个节…

怎样实现安全便捷的网间数据安全交换?

数据安全交换是指在数据传输过程中采取一系列措施来保护数据的完整性、机密性和可用性。网间数据安全交换,则是需要进行跨网络、跨网段甚至跨组织地进行数据交互,对于数据的传输要求会更高。 大部分企业都是通过网闸、DMZ区、VLAN、双网云桌面等方式实现…

电脑软件:沙盒 Sandboxie 快速上手使用教程

目录 一、软件简介 二、软件功能 三、安装步骤 四、 软件使用 一、软件简介 沙盘Sandboxie中文版是一款非常好用的系统安全工具软件,沙盘Sandboxie中文版能够很好的进行安全测试,拥有一个安全的环境,你不用担心自己的浏览记录被曝光&am…

用 YAML 文件配置 CI/CD 管道

MSBuild 参数: 在使用 MSBuild 命令行生成打包项目(就像在 Visual Studio 中使用向导生成项目一样)之前,生成过程可以通过编辑 Package.appxmanifest 文件中 Package 元素的 Version 属性,来对生成的 MSIX 包进行版本控制。 在 Azure Pipelines 中,可以使用某个表达式来…

【第七在线】打破传统束缚:智能商品计划助力服装企业创新发展

在当今快速变化的市场环境中,服装企业面临着前所未有的挑战和机遇。传统的商品管理模式已无法满足现代市场的需求,企业需要寻求创新的发展路径。智能商品计划作为数字化转型的核心要素,正在为服装企业提供强大的助力,帮助企业打破…

linux基础学习(2):磁盘管理、分区、格式化

1.一些基本概念 一块磁盘从加入到可使用,需要经过3个阶段:分区-格式化-挂载。 1.1分区方式 linux有2种分区方式: (1)mbr:最大支持2.1T硬盘,最多支持4个分区。这4个分区可以全部为主分区&…

基于位的权限系统

基于位的权限系统是一种利用二进制位运算进行权限管理的技术。在这种系统中,不同的权限被编码为2的幂次方 (例如1、2、4、8等),每个权限对应一个独立的二进制位(可想而知运算速度是非常快的)。通过将这些权限值组合在一起形成一个…