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

上一课:
【小黑嵌入式系统第十四课】μ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.mzph.cn/news/627582.shtml

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

相关文章

【备战蓝桥杯】如何使用Python 内置模块datetime去计算我与CSDN相遇的天数

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-6gfBeOb6YRf7C52d {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

倒计时1天|解锁「PolarDB开发者大会」正确打开方式

1月17日 9:30-16:30 北京嘉瑞文化中心 PolarDB开发者大会 明天就要和大家就见面啦~ 大会参会指南现已出炉 各位开发者们,请查收~ 👇👇👇 点击 大会主页 or 扫描上方二维码 一键抵达大会官网👇 查看…

Java方法及方法重载的详解

目录 一、方法的概念及使用 1.1 方法的概念 1.2 方法的定义 1.3 方法调用的执行过程 1.4 实参和形参的关系 1.5 没有返回值的方法 二、方法的重载 2.1 方法重载存在的原因 2.2 方法重载的概念 一、方法的概念及使用 1.1 方法的概念 方法就是一个代码片段. 类似于 C …

GZ075 云计算应用赛题第8套

2023年全国职业院校技能大赛(高职组) “云计算应用”赛项赛卷8 某企业根据自身业务需求,实施数字化转型,规划和建设数字化平台,平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”,拟采用开源OpenSt…

x-cmd pkg | tokei - 代码行数统计工具

目录 简介首次用户技术特点竞品和相关作品进一步阅读 简介 tokei 是一个使用 Rust 编写的显示有关代码统计信息的命令行工具,可以分门别类的统计目录内的代码行数。 tokei 具有良好的跨平台性,可以在 Linux、macOS、Windows 等多种平台上安装运行。 首…

林江院长:让斜视的孩子改“斜”归正,“正视”未来

读写时跳行、不敢和别人对视、拍照时不敢看镜头......这些不便是不少斜视患儿每天都在经历的日常。 斜视是目前儿童常见的眼科疾病之一,该眼病不仅给孩子的外在形象带来影响,更重要的是会影响双眼视功能及身心健康,其危害不容小觑。 7岁男孩晓…

程序员晋升管理者后的自我修养

谈到技术管理,首要的一点就是管理者的角色认知问题,因此本篇文章的主要内容就是如何增强管理者的角色认知,持续提升自我管理能力。 作为管理者,首要任务就是要认清自我并管理好自己,要树立对管理者角色的正确认知&…

【线路图】 DC-DC升压恒压控制驱动芯片 2.8-40V AP8100

说明 AP8100 是一款外围电路简单的 BOOST 升压恒压控 制驱动芯片,适用于 2.8-40V 输入电压范围的升压恒 压电源应用领域,启动电压可以低至 2.5V 。 芯片会根据负载的大小自动切换 PWM , PFM 和 BURST 模式以提高各个负载端的…

AI魔幻巨制电影《权力的游戏:重生之战》

AI魔幻巨制电影《权力的游戏:重生之战》 《冰与火之歌》龙妈雪诺后裔是谁?你相信龙族的力量可以改变维斯特洛大陆的命运吗? 在《权力的游戏:重生之战》中,维斯特洛大陆再次陷入混乱之中,但这一次的混乱并非…

Python单元测试框架:pytest常用测试报告类型

🍅 视频学习:文末有免费的配套视频可观看 🍅 关注公众号【互联网杂货铺】,回复 1 ,免费获取软件测试全套资料,资料在手,涨薪更快 先前博客有介绍pytest测试框架的安装及使用,现在来聊…

Linux用户提权

新建用户 用root账户修改文件,添加信任用户 使用sudo提权,可以使用 **root删除新建账户**

联想小新M7268一体机常用功能和操作步骤

联想小新M7268黑白激光多功能打印一体机,小身材、大智慧,小心M7268身材十分娇小,净尺寸方面为350*275*135mm(长*宽*高)(手工测量),在实际使用时,小新M7268所占空间要略大…

【笔记】认识电机

认识电机 电机一些概念永磁同步电机永磁体定子和转子励磁电磁感应定律 AC Optimal Power Flow功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右Smart…

基于4G数采终端的供热管网在线监测方案

我国大部地区全面进入到冬季,北方各地已开启冬季供暖,以保障居民生活所需。由于城市化的发展,城市内各供热区域愈发分散、供热管道漫长、供热环境复杂,对于供热管网及换热站点的监测和维护提出了诸多挑战。 方案介绍 针对提高供热…

浅析五种 React 组件设计模式

作为一名 React 开发者,你可能会面临下面几个问题: 如何构建一个高复用度性的组件,使其适应不同的业务场景?如何构建一个具有简单 API的组件,使其易于使用?如何构建一个在 UI 和功能方面具有可扩展性的组件…

代码随想录算法训练营第三十五天|860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球

题目&#xff1a;860.柠檬水找零 文章链接&#xff1a;代码随想录 视频链接&#xff1a;LeetCode:860.柠檬水找零 题目链接&#xff1a;力扣题目链接 图释&#xff1a; class Solution { public:bool lemonadeChange(vector<int>& bills) {unordered_map<int…

知存科技助力AI应用落地:WTMDK2101-ZT1评估板实地评测与性能揭秘

文章目录 一、前言二、深入了解存算一体技术2.1 什么是存算一体2.2 存算一体技术发展历程2.3 基于不同存储介质的存内计算芯片性能比较 三、国产存算一体&#xff0c;重大进展3.1 知存科技&#xff1a;我国存算一体领域的研发领导者 四、知存科技新型 WTM2101 SOC 评估板使用评…

Node.js基础知识点(四)

本节介绍一下最简单的http服务 一.http 可以使用Node 非常轻松的构建一个web服务器&#xff0c;在 Node 中专门提供了一个核心模块&#xff1a;http http 这个模块的就可以帮你创建编写服务器。 1. 加载 http 核心模块 var http require(http) 2. 使用 http.createServe…

虾皮电商 电商平台:虾皮(Shopee)东南亚领先的电子商务平台

在当今数字化时代&#xff0c;电子商务平台的兴起改变了人们的购物方式。虾皮&#xff08;Shopee&#xff09;作为东南亚地区领先的电子商务平台&#xff0c;为消费者提供了便捷、多样化的购物体验。由新加坡的Sea Group&#xff08;前称Garena&#xff09;于2015年创立&#x…

学习c语言,奇偶排序

如果左边是奇数右边是偶数就不管他&#xff0c;如果左边找到偶数右边是奇数则互相交换。