嵌入式开发中状态模式实现
文章目录
- 状态模式
- 代码实现
- 代码解释
- 小结
状态模式
状态模式(State Pattern)是一种行为设计模式,它允许对象在内部状态改变时改变它的行为。在嵌入式系统中,状态模式尤其适用于那些根据外部事件或内部条件频繁改变状态并且每种状态下行为不同的场景,例如设备的不同工作模式切换、任务调度、传感器状态管理、通信协议状态机等。
代码实现
#include <stdio.h>// 定义ACTION_PREPARE, ACTION_RUN, ACTION_END为合适的宏或整数值
#define ACTION_PREPARE 1
#define ACTION_RUN 2
#define ACTION_END 3// 首先声明 WashingMachine 结构体
typedef struct WashingMachineTag WashingMachine;// 定义状态枚举
typedef enum {STATE_STANDBY,STATE_PREPARING,STATE_RUNNING,STATE_FINISHED
} WashingMachineState;// 定义指向处理函数的指针类型
typedef void (*StateMachineAction)(WashingMachine *);// 洗衣机结构体
struct WashingMachineTag {WashingMachineState state;StateMachineAction on_prepare;StateMachineAction on_run;StateMachineAction on_end;
} ;// 待机状态下准备
static void standby_prepare(WashingMachine *machine) {printf("Machine is preparing for washing.\n");machine->state = STATE_PREPARING;
}// 准备状态下运行
static void preparing_run(WashingMachine *machine) {printf("Machine has started running.\n");machine->state = STATE_RUNNING;
}// 运行状态下结束
static void running_end(WashingMachine *machine) {printf("Washing cycle completed.\n");machine->state = STATE_FINISHED;
}// 初始化洗衣机状态及其对应的处理函数
void init_washing_machine(WashingMachine *machine) {machine->state = STATE_STANDBY;machine->on_prepare = standby_prepare;machine->on_run = preparing_run;machine->on_end = running_end;
}// 根据当前状态执行相应操作
void operate_washing_machine(WashingMachine *machine, int action) {switch (machine->state) {case STATE_STANDBY:if (action == ACTION_PREPARE) {machine->on_prepare(machine);} else {printf("Invalid action in STANDBY state.\n");}break;case STATE_PREPARING:if (action == ACTION_RUN) {machine->on_run(machine);} else {printf("Invalid action in PREPARING state.\n");}break;case STATE_RUNNING:if (action == ACTION_END) {machine->on_end(machine);} else {printf("Invalid action in RUNNING state.\n");}break;case STATE_FINISHED:printf("Machine is already in FINISHED state.\n");break;default:printf("Unknown machine state.\n");break;}
}int main() {WashingMachine machine;init_washing_machine(&machine);// 根据实际需求调用操作函数operate_washing_machine(&machine, ACTION_PREPARE);operate_washing_machine(&machine, ACTION_RUN);operate_washing_machine(&machine, ACTION_END);return 0;
}
代码解释
代码示例展示了如何使用状态模式来模拟一个具有待机、准备、运行和结束四种状态的洗衣机设备。总结要点如下:
定义了WashingMachineState枚举类型,用于表示洗衣机的不同状态(待机、准备、运行和结束)。
定义了一个指向函数的指针类型StateMachineAction,该类型表示在不同状态下执行动作的函数指针。
创建了WashingMachine结构体,其中包含当前状态字段和三个函数指针成员,分别对应在不同状态下需要执行的动作。
定义了三个静态函数,分别是standby_prepare、preparing_run和running_end,这三个函数分别对应洗衣机从待机到准备、从准备到运行、从运行到结束状态的转换。
init_washing_machine函数用于初始化洗衣机对象,设置初始状态和对应状态下的动作函数。
operate_washing_machine函数根据当前洗衣机的状态执行相应的动作。在本示例中,动作的选择依赖于传入的action参数,但是实际上可能根据状态机的规则自行定义。
定义了宏ACTION_PREPARE、ACTION_RUN和ACTION_END,虽然在给出的代码片段中并未具体使用,但在实际应用中,这些宏或类似的常量可用于指示要执行的具体动作。
小结
本文通过状态模式分离了洗衣机状态的改变和对应状态下的行为,使得状态之间的转换变得清晰且易于维护。当状态变化时,只需调用相应状态下的动作函数即可完成状态的迁移和对应行为的执行。
相关文章:
嵌入式开发中状态模式实现
文章目录 状态模式代码实现代码解释小结 状态模式 状态模式(State Pattern)是一种行为设计模式,它允许对象在内部状态改变时改变它的行为。在嵌入式系统中,状态模式尤其适用于那些根据外部事件或内部条件频繁改变状态并且每种状态…...
目标检测——车牌数据集
一、重要性及意义 交通安全与管理:车牌检测和识别技术有助于交通管理部门快速、准确地获取车辆信息,从而更有效地进行交通监控和执法。例如,在违规停车、超速行驶等交通违法行为中,该技术可以帮助交警迅速锁定违规车辆࿰…...
FOC算法中为啥用PWM触发ADC中断
在FOC(Field Oriented Control,场向量控制)算法中,为什么要使用PWM(Pulse Width Modulation,脉宽调制)触发ADC(Analog-to-Digital Converter,模数转换器)中断…...
2024.4.5学习记录————嵌入式学习内容
2024.4.5学习记录————嵌入式学习内容 C语言 指针,位操作,结构体字节对齐,位段,宏的高级运用 C 基础特性:类,对象,派生,继承,运算符重载,友元…...
k8s 部署 canal 集群,RocketMQ 模式
k8s 部署 canal 集群,RocketMQ 模式 k8s 部署 canal 集群,RocketMQ 模式前提MySQLRocketMQ制作 canal-admin、canal-server 镜像 部署 zookeeper部署 canal-admin部署 canal-server测试 k8s 部署 canal 集群,RocketMQ 模式 前提 MySQL 开启…...
Android+OnnxRuntime+Opencv+Onnx模型操作图片擦除多余内容
今年来AI的发展非常迅速,在工业、医疗等等行业逐渐出现相应的解决方案,AI也逐渐成为各行业基础设施建设重要的一环,未来发展的大趋势,不过这也需要一个漫长的过程,需要很多技术型人才加入其中,除了工业设施的基础建设,在娱乐方向也有很多有趣的能力,不如图片/视频换背景…...
【CANoe】CAPL_E2E测试-验证报文中的CRC值是否正确
文章目录 一、背景二、CRC校验算法实现_dll制作三、CAPL脚本编写四、测试结果4.1、Write输出窗口4.2、测试报告截图一、背景 在嵌入式软件开发过程中,对于一些报文,需要实现安全发送与安全接收,这就涉及到CRC和RollingCounter。整车和MCU通讯的报文需要对方进行校验才能正确…...
Linux云计算之网络基础8——IPV6和常用网络服务
目录 一、IPV6基础 IPV6详解 IPv6数据报的基本首部 IPv6数据报的扩展首部 IPv6地址的表示方法 IPv6地址分类 网际控制报文协议ICMPv6 二、cisco基于IPV6的配置 cisco基于IPV6的配置步骤 模拟配置 三、HTML基础介绍 文档的结构 动手操作一下 四、常用网络服务介绍…...
页面刚加载的时候显示自己定义的{{***}}然后一闪而过
这时候别用插值表达式语法了,直接用v-text或者v-html就能解决这个问题 但是有个问题,如下图所示: 具体bind使用方式,如下图所示: 但是v-bind也可以进行简写,就是去掉v-bind,直接写:…...
python批量转化pdf图片为jpg图片
1.把pdf图片批量转为jpg;需要注意的是,需要先安装poppler这个软件,具体安装教程放在下面代码中了 2.代码 #poppler安装教程参考:https://blog.csdn.net/wy01415/article/details/110257130 #windows上poppler下载链接:…...
玫瑰图和雷达图(自备)
目录 玫瑰图 数据格式 绘图基础 绘图升级(文本调整) 玫瑰图 下载数据data/2020/2020-11-24 mirrors_rfordatascience/tidytuesday - 码云 - 开源中国 (gitee.com) R语言绘图—南丁格尔玫瑰图 - 知乎 (zhihu.com) 数据格式 rm(list ls()) libr…...
动态规划基础
动态规划 1、动态规划的概念 简称DP,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。常常适用于有重叠子问题和最优子结构性质的问题。 简单来说,就是给定一个问题,把它拆成一个个子问题,查到子问题可以直接解决。然后把子问题答案保存起来,以减少重复计算…...
kubeadm部署的k8s1.29集群证书更新
1、查看证书有效期 kubeadm certs check-expiration更新证书前: [check-expiration] Reading configuration from the cluster... [check-expiration] FYI: You can look at this config file with kubectl -n kube-system get cm kubeadm-config -o yamlCERTIFIC…...
【A 类比赛】大学生学科竞赛智慧应用场景题目大全
智能应用的多彩场景:未来生活的无限可能 随着科技的飞速发展,智能应用已经渗透到我们生活的方方面面,它们不仅极大地提高了工作效率,也丰富了我们的生活体验。从家庭到工作场所,从城市到乡村,智能应用正在…...
Yarn的安装和使用(2):使用及问题解决
Yarn是JavaScript的依赖管理工具,它与npm类似,但提供了一些额外的性能优化和一致性保证。 Yarn的使用: 初始化项目: yarn init 此命令会引导您创建一个新的package.json文件,用于记录项目的元信息和依赖。 添加依赖&…...
如何在Bash中连接字符串变量
问题: 在 PHP 中,字符串按如下方式连接在一起: $foo "Hello"; $foo . " World";在这里,$foo 变成了 "Hello World"。 在 Bash 中如何实现这一点? 回答1: foo"Hello" fo…...
doesn‘t contain a valid partition table
查看硬盘空间 $ fdisk -l Disk /dev/mmcblk0: 29 GB, 31037849600 bytes, 60620800 sectors 947200 cylinders, 4 heads, 16 sectors/track Units: sectors of 1 * 512 512 bytesDisk /dev/mmcblk0 doesnt contain a valid partition table Disk /dev/mmcblk0p1: 1 MB, 10485…...
modprobe加载驱动模块时报错:modprobe: module xxx.ko not found in modules.dep
问题 使用modprobe时,报错modprobe: module xxx.ko not found in modules.dep: 原因 加载模块时,依赖没法正确添加 解决 在使用modprobe前,调用一下depmod指令,之后再用modprobe加载驱动模块 depmod modprobe interr…...
游戏引擎中的粒子系统
一、粒子基础 粒子系统里有各种发射器(emitter),发射器发射粒子(particle)。 粒子是拥有位置、速度、大小尺寸、颜色和生命周期的3D模型。 粒子的生命周期中,包含产生(Spawn)、与环…...
哈佛大学商业评论 -- 第二篇:增强现实是如何工作的?
AR将全面融入公司发展战略! AR将成为人类和机器之间的新接口! AR将成为人类的关键技术之一! 请将此文转发给您的老板! --- 本文作者:Michael E.Porter和James E.Heppelmann 虽然物理世界是三维的,但大…...
SpringBoot+Vue 毕业设计效率提升实战:从脚手架到自动化部署的全链路优化
SpringBootVue 毕业设计效率提升实战:从脚手架到自动化部署的全链路优化 毕业设计是每个计算机相关专业学生必须跨越的一道坎。回想我自己的经历,以及身边同学的故事,一个普遍的现象是:大家往往在技术选型和环境搭建上就耗费了大量…...
神经高利贷:预支未来技能导致认知崩溃
在软件测试领域,从业者常面临一个隐形威胁:过度追求新技能而忽视认知极限,最终引发崩溃。这种现象被称为“神经高利贷”,即通过预支未来学习能力来应对当前挑战,结果导致认知资源枯竭、错误率飙升,甚至职业…...
# Trae IDE `settings.json` 配置详解与教学文档
Trae IDE settings.json 配置详解与教学文档 一、文档说明 本文档针对 Trae IDE 中 Java 开发核心配置文件 settings.json 进行逐字段解读,结合实际开发场景说明配置目的、作用及最佳实践,适配 Spring Boot + Maven + JDK21 技术栈。 二、配置文件整体作用 settings.json…...
熵值法实战避坑指南:从数据标准化到权重计算,新手最容易踩的3个雷
熵值法实战避坑指南:从数据标准化到权重计算,新手最容易踩的3个雷 第一次用熵值法做综合评价时,我盯着屏幕上几乎相同的权重值发愣——这和教科书上"差异越大权重越高"的描述完全不符。直到深夜排查才发现,原来在数据标…...
Simulink新手必看:Enable和Trigger模块的5种实战用法(附模型下载)
Simulink新手必看:Enable和Trigger模块的5种实战用法(附模型下载) 在工业自动化、信号处理和控制系统设计中,Simulink作为一款强大的仿真工具,其子系统控制功能尤为重要。Enable和Trigger模块作为Simulink中的两大核心…...
html+css+js创意小游戏~记忆卡片配对(附源码)
1. 从零开始打造记忆卡片配对游戏 最近在教家里小朋友认动物,突然想到可以用前端三件套做个记忆卡片小游戏。这个项目特别适合刚学完HTML/CSS基础,想练手JavaScript的朋友。我自己第一次写这个游戏时,只用了不到100行代码就实现了核心功能&am…...
Vue-Vben-Admin主题定制实战指南:从原理到实现的深度探索
Vue-Vben-Admin主题定制实战指南:从原理到实现的深度探索 【免费下载链接】vue-vben-admin vbenjs/vue-vben-admin: 是一个基于 Vue.js 和 Element UI 的后台管理系统,支持多种数据源和插件扩展。该项目提供了一个完整的后台管理系统,可以方便…...
如何用机器学习评估专利价值?专利权利要求广度分析实战指南
如何用机器学习评估专利价值?专利权利要求广度分析实战指南 【免费下载链接】patents-public-data Patent analysis using the Google Patents Public Datasets on BigQuery 项目地址: https://gitcode.com/gh_mirrors/pa/patents-public-data 在知识产权竞争…...
Stable Diffusion炼丹指南:从Classifier Guidance到Classifier-Free Guidance,一文搞懂两种主流引导方式的区别与实战选择
Stable Diffusion条件生成实战:Classifier Guidance与Classifier-Free Guidance深度解析 在AIGC技术爆发的今天,Stable Diffusion等开源模型已成为内容创作的重要工具。但当你需要精确控制生成结果时——比如指定生成"穿红色连衣裙的亚洲女性"…...
重塑前端图片处理流程:compressorjs的高效压缩技术突破之路
重塑前端图片处理流程:compressorjs的高效压缩技术突破之路 【免费下载链接】compressorjs compressorjs: 是一个JavaScript图像压缩库,使用浏览器原生的canvas.toBlob API进行图像压缩。 项目地址: https://gitcode.com/gh_mirrors/co/compressorjs …...
