单片机编程魔法师-消息处理

news2024/9/21 16:44:26

消息机制

消息处理的编程思路是当某件事产生后只发送一条事件产生消息以通知相应执行机构执行的一种编程思路。
在这里插入图片描述


消息定义

什么是消息,消息是一个指示,可以是数字,字符串,字符或者是任何形式的其他标识符

消息定义的形式与消息检读的方式相对应,通常我们可以将其定义为一些常量,常量可以是各种类型,甚至可以是是复合类型。

 #define MSG_KEY1DOWN     1
 #define MAG_CMD0        "OPEN" 
 #define MSG_STATE_OVER   'V'





消息处理

定义消息处理的方式并不难,难在如何检读消息、处理消息

因为在一个并行任务程序中,通常会有很多消息处理的任务,因此消息也绝对不只一个,如何把那些相关的或不相关的消息分门别类地处理好,还真不是一个容易的事情。不过不容易不可怕,可怕的是没有好的魔法。现在我们来修炼消息处理的魔法在小规模的消息处理中,可以使用不同的变量来收/发不同类型的消息。


案例代码

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

在这里插入图片描述


问题分析

3.10.2节所示的消息处理机制分类简单,代码易懂,但是重复代码多,这种做法只适合那种消息种类少的应用场合,如果消息种类很多,那么在消息检读时将会出现很多switch语句,这显然不合理,这时就需要另一种消息收发检读策略–消息队列。

在小规模的消息处理中,由于不同类型的消息由不同的变量来指示,所以不同的消息可能会使用相同的编码,如消息 MSG TASKI RUN与消息 MSG TASK2 RUN 的编码都是 1.由于它们使用的是不同的编码空间,所以可以使用相同的编码而不会产生消息检读错乱。

在大规模的消息处理中,由于我们将简化代码,不希望出现众多的检读switch,所以不能出现很多的编码空间。理想的编码空间只能有一个,所有消息不分类型,统一编码,在一个统一的检读器中检读。

这种策略需要一个足够长度的队列,以保存随机产生而来不及处理的消息。所有的消息产生都先发送到队列,然后在检读时从队列中按照先入先出的原则来检读并处理它们。


消息队列

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


回顾思考

在 3.10.4节中,有着稍微复杂一些的队列处理机制,这似乎为我们的工作额外增加了一些麻烦,但事实上,使用了这种机制之后,在使用上会无比简单。一旦我们向系统发送了一个消息,我们甚至不用担心消息发到了哪里,由谁来响应消息,我们所要做的,就只是把消息发送出去。消息被发送出去后就进入消息队列排队等候它的主人。排队的消息遵循先进先出的原则,来不及被主人认领的消息将在队列中等候,直到轮到它出队并被主人领走。不同的消息通常会有不同的主人,它们的主人会一直盯着消息队列最前面出队的消息。一旦消息从队列头出来,就会马上被主人响应。消息被响应后就会被遗弃,并把处理机会留给队列中的其他成员。

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

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

相关文章

模型 冯/诺依曼思维模型

系列文章 分享 模型,了解更多👉 模型_思维模型目录。分解问题,创新整合,高效解决。 1 冯/诺依曼思维模型的应用 1.1 景区创建5A级旅游景区提升规划 在面对如何将某个景区创建为5A级旅游景区的复杂任务时,可以采用冯诺…

MySQL7 SQL执行顺序、SQL语句执行顺序、学生选课表练习

文章目录 一、SQL执行顺序二、MySQL执行过程三、SQL执行顺序四、学生选课表练习创建表1. 查询” 01 “课程比” 02 “课程成绩高的学生的信息及课程分数2. 查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩3. 查询在 SC 表存在成绩的学生信息4. 查询所有同学的…

大二必做项目贪吃蛇超详解之中篇游戏设计与分析

贪吃蛇系列文章 上篇win32 中篇设计与分析 文章目录 贪吃蛇系列文章1. 地图1. 1 <locale.h>本地化1. 2 类项1. 3 setlocale函数1. 4 宽字符的打印1. 5 地图坐标 2. 蛇身和食物3. 数据结构设计4. 游戏流程设计5. 核心逻辑实现分析5. 1 游戏主逻辑5. 2 GameStart5. 2. 1 S…

51单片机——蜂鸣器

1、蜂鸣器简介 蜂鸣器是一种将电信号转换为声音信号的器件&#xff0c;常用来产生设备的按键音、报警音等提示信号。 蜂鸣器按驱动方式可分为有源蜂鸣器和无源蜂鸣器 。 有源蜂鸣器&#xff1a;内部自带振荡源&#xff0c;将正负极接上直流电压即可持续发声&#xff0c;频率…

Python青少年简明教程:列表(List)、元组(tuple)和字典(dict)

Python青少年简明教程&#xff1a;列表&#xff08;List&#xff09;、元组&#xff08;tuple&#xff09;和字典&#xff08;dict&#xff09; 在Python中&#xff0c;列表&#xff08;List&#xff09;、元组&#xff08;Tuple&#xff09;和字典&#xff08;Dict&#xff09…

防火墙基本原理入门篇,小白一看就懂!

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330&scene21#wechat_redirect 《网安面试指南》…

基于FPGA实现SD卡的数据读写(SD NAND FLASH)

文章目录 存储芯片 SD卡 FPGA实现SD NAND读写 设计思路 程序架构 代码实现 实验结果 存储芯片 目前市面上的存储芯片&#xff0c;大致可以将其分为3大类&#xff1a; EEPROM EEPROM (Electrically Erasable Programmable read only memory)是指带电可擦可编程只读存储器…

package.json文件解析

【图书介绍】《Node.jsMongoDBVue.js全栈开发实战》-CSDN博客 《Node.jsMongoDBVue.js全栈开发实战&#xff08;Web前端技术丛书&#xff09;》(邹琼俊)【摘要 书评 试读】- 京东图书 (jd.com) 本节主要介绍package.json文件的作用及文件中各个选项的含义。 2.4.1 node_mod…

【一个简单的整数问题】

问题 TLE代码 #include <bits/stdc.h> using namespace std; const int N 1e510; int b[N]; void add(int l, int r, int d) {b[r1] - d;b[l] d; } int query(int x) {int retval 0;for(int i 1; i < x; i){retval b[i];}return retval; } int main() {int n, m…

【Kubernetes】持久卷声明 PVC

持久卷声明 PVC 1.持久卷和持久卷声明的区别2.在 Pod 中使用持久卷声明3.storageClass 详解 持久卷声明&#xff08;Persistent Volume Claim&#xff0c;PVC&#xff09;&#xff0c;是用户对 Kubernetes 存储资源的一种请求。 通过使用 持久卷声明&#xff08;PVC&#xff0…

yolo训练策略--使用 Python 和 OpenCV 进行图像亮度增强与批量文件复制

简介 在计算机视觉和深度学习项目中&#xff0c;数据增强是一种常用的技术&#xff0c;通过对原始图像进行多种变换&#xff0c;可以增加数据集的多样性&#xff0c;从而提高模型的泛化能力。本文将介绍如何使用 Python 和 OpenCV 实现图像的亮度增强&#xff0c;并将增强后的…

驱动(RK3588S)第二课时:引导程序和内核

目录 一、引导程序&#xff08;uboot&#xff09;1、uboot介绍2、A 系列通用芯片启动流程3、uboot的配置与使用 二、内核&#xff08;kernel&#xff09;1、内核的介绍2、内核的配置、裁剪和编译 三、其他知识点 一、引导程序&#xff08;uboot&#xff09; 1、uboot介绍 ubo…

PDF转CAD必备工具:四款转换神器对比推荐

随着数字办公的普及&#xff0c;我们常常需要处理不同格式的文档。在工程和设计领域&#xff0c;PDF转CAD的转换工具更是必备之选。本文将为大家介绍四款高效、便捷的PDF转CAD工具&#xff1a; 一、福昕PDF在线转换器 直通车&#xff08;粘贴到浏览器打开&#xff09;&#x…

软件测试 - 性能测试 (概念)(并发数、吞吐量、响应时间、TPS、QPS、基准测试、并发测试、负载测试、压力测试、稳定性测试)

一、性能测试 目标&#xff1a;能够对个人编写的项目进行接口的性能测试。 一般是功能测试完成之后&#xff0c;最后做性能测试。性能测试是一个很大的范围&#xff0c;在学习过程中很难直观感受到性能。 以购物软件为例&#xff1a; 1&#xff09;购物过程中⻚⾯突然⽆法打开…

PCB设计中” 铺铜的方式“导致电焊机设计失败

发现这个问题的背景 在看到网上视频设计一个小电池的点焊机很容易&#xff0c;在一些需要电力的小设计少不了点焊&#xff0c;就想尝试一下。当然其中遇到很多坑&#xff0c;后面会一起总结。这里遇到的一个小坑&#xff0c;但让人有点苦笑不得。 首先&#xff0c;点焊需要大…

【SQL】统一字符格式

目录 语法 需求 示例 分析 代码 语法 substring(column_name, start, length)用于从一个字符串中提取子字符串 column_name&#xff08;或任何字符串表达式&#xff09;&#xff1a;这是要从中提取子字符串的列名或字符串表达式。start&#xff1a;这是子字符串开始的位置…

用Python实现时间序列模型实战——Day 3: 时间序列数据预处理

一、学习内容 1. 时间序列的差分运算 差分运算&#xff1a; 差分运算是时间序列平稳化的一种方法&#xff0c;通过计算相邻时间点的差值来消除序列中的趋势和季节性成分。 一阶差分用于去除线性趋势&#xff0c;公式为&#xff1a; 其中&#xff1a; 是时间 的原始值&…

【网络安全】服务基础第一阶段——第三节:Windows系统管理基础----服务器远程管理与安全权限

服务器远程管理是一种技术&#xff0c;服务器远程管理是指通过远程连接来监控、配置和维护服务器的过程&#xff0c;而无需直接在物理服务器前操作。它允许IT管理员在不同的地点对服务器进行配置、监控和维护&#xff0c;无需物理上接触到服务器本身。这种能力对于管理分布在多…

LLaVA-MoLE:解决多模态大型语言模型指令微调中的数据冲突问题

人工智能咨询培训老师叶梓 转载标明出处 多模态大模型&#xff08;MLLMs&#xff09;通过指令微调&#xff08;instruction finetuning&#xff09;&#xff0c;能够执行各种任务&#xff0c;如理解图表、处理文档和回答基于图像的问题。但是&#xff0c;当从不同领域混合指令…

算法——K-means算法和算法改进

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 一、什么是K-means算法&#xff1f; K-means算法是一种无监督的聚类算法&#xff0c;用于将一组数据点分为K个簇&#xff08;cluster&#xff09;。其核心目标是将数据点划分到K个不同的簇中&…