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

嵌入式开发中状态模式实现

文章目录

    • 状态模式
    • 代码实现
    • 代码解释
    • 小结

状态模式

状态模式(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,虽然在给出的代码片段中并未具体使用,但在实际应用中,这些宏或类似的常量可用于指示要执行的具体动作。

小结

本文通过状态模式分离了洗衣机状态的改变和对应状态下的行为,使得状态之间的转换变得清晰且易于维护。当状态变化时,只需调用相应状态下的动作函数即可完成状态的迁移和对应行为的执行。

相关文章:

嵌入式开发中状态模式实现

文章目录 状态模式代码实现代码解释小结 状态模式 状态模式&#xff08;State Pattern&#xff09;是一种行为设计模式&#xff0c;它允许对象在内部状态改变时改变它的行为。在嵌入式系统中&#xff0c;状态模式尤其适用于那些根据外部事件或内部条件频繁改变状态并且每种状态…...

目标检测——车牌数据集

一、重要性及意义 交通安全与管理&#xff1a;车牌检测和识别技术有助于交通管理部门快速、准确地获取车辆信息&#xff0c;从而更有效地进行交通监控和执法。例如&#xff0c;在违规停车、超速行驶等交通违法行为中&#xff0c;该技术可以帮助交警迅速锁定违规车辆&#xff0…...

FOC算法中为啥用PWM触发ADC中断

在FOC&#xff08;Field Oriented Control&#xff0c;场向量控制&#xff09;算法中&#xff0c;为什么要使用PWM&#xff08;Pulse Width Modulation&#xff0c;脉宽调制&#xff09;触发ADC&#xff08;Analog-to-Digital Converter&#xff0c;模数转换器&#xff09;中断…...

2024.4.5学习记录————嵌入式学习内容

2024.4.5学习记录————嵌入式学习内容 C语言 指针&#xff0c;位操作&#xff0c;结构体字节对齐&#xff0c;位段&#xff0c;宏的高级运用 C 基础特性&#xff1a;类&#xff0c;对象&#xff0c;派生&#xff0c;继承&#xff0c;运算符重载&#xff0c;友元&#xf…...

k8s 部署 canal 集群,RocketMQ 模式

k8s 部署 canal 集群&#xff0c;RocketMQ 模式 k8s 部署 canal 集群&#xff0c;RocketMQ 模式前提MySQLRocketMQ制作 canal-admin、canal-server 镜像 部署 zookeeper部署 canal-admin部署 canal-server测试 k8s 部署 canal 集群&#xff0c;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基础介绍 文档的结构 动手操作一下 四、常用网络服务介绍…...

页面刚加载的时候显示自己定义的{{***}}然后一闪而过

这时候别用插值表达式语法了&#xff0c;直接用v-text或者v-html就能解决这个问题 但是有个问题&#xff0c;如下图所示&#xff1a; 具体bind使用方式&#xff0c;如下图所示&#xff1a; 但是v-bind也可以进行简写&#xff0c;就是去掉v-bind&#xff0c;直接写&#xff1a…...

python批量转化pdf图片为jpg图片

1.把pdf图片批量转为jpg&#xff1b;需要注意的是&#xff0c;需要先安装poppler这个软件&#xff0c;具体安装教程放在下面代码中了 2.代码 #poppler安装教程参考&#xff1a;https://blog.csdn.net/wy01415/article/details/110257130 #windows上poppler下载链接&#xff1a…...

玫瑰图和雷达图(自备)

目录 玫瑰图 数据格式 绘图基础 绘图升级&#xff08;文本调整&#xff09; 玫瑰图 下载数据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更新证书前&#xff1a; [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 类比赛】大学生学科竞赛智慧应用场景题目大全

智能应用的多彩场景&#xff1a;未来生活的无限可能 随着科技的飞速发展&#xff0c;智能应用已经渗透到我们生活的方方面面&#xff0c;它们不仅极大地提高了工作效率&#xff0c;也丰富了我们的生活体验。从家庭到工作场所&#xff0c;从城市到乡村&#xff0c;智能应用正在…...

Yarn的安装和使用(2):使用及问题解决

Yarn是JavaScript的依赖管理工具&#xff0c;它与npm类似&#xff0c;但提供了一些额外的性能优化和一致性保证。 Yarn的使用&#xff1a; 初始化项目&#xff1a; yarn init 此命令会引导您创建一个新的package.json文件&#xff0c;用于记录项目的元信息和依赖。 添加依赖&…...

如何在Bash中连接字符串变量

问题&#xff1a; 在 PHP 中&#xff0c;字符串按如下方式连接在一起&#xff1a; $foo "Hello"; $foo . " World";在这里&#xff0c;$foo 变成了 "Hello World"。 在 Bash 中如何实现这一点? 回答1&#xff1a; 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时&#xff0c;报错modprobe: module xxx.ko not found in modules.dep&#xff1a; 原因 加载模块时&#xff0c;依赖没法正确添加 解决 在使用modprobe前&#xff0c;调用一下depmod指令&#xff0c;之后再用modprobe加载驱动模块 depmod modprobe interr…...

游戏引擎中的粒子系统

一、粒子基础 粒子系统里有各种发射器&#xff08;emitter&#xff09;&#xff0c;发射器发射粒子&#xff08;particle&#xff09;。 粒子是拥有位置、速度、大小尺寸、颜色和生命周期的3D模型。 粒子的生命周期中&#xff0c;包含产生&#xff08;Spawn&#xff09;、与环…...

哈佛大学商业评论 -- 第二篇:增强现实是如何工作的?

AR将全面融入公司发展战略&#xff01; AR将成为人类和机器之间的新接口&#xff01; AR将成为人类的关键技术之一&#xff01; 请将此文转发给您的老板&#xff01; --- 本文作者&#xff1a;Michael E.Porter和James E.Heppelmann 虽然物理世界是三维的&#xff0c;但大…...

开发AI应用时如何借助Taotoken进行多模型选型与测试

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 开发AI应用时如何借助Taotoken进行多模型选型与测试 在开发一个具体的AI应用功能时&#xff0c;选择合适的模型是影响最终效果与成…...

流式深度强化学习突破“流式壁垒”:“意图更新”算法性能比肩SAC,计算量仅1/140

一脚油门&#xff0c;开出了多大的坑传统梯度学习的步长规定参数每次移动多大&#xff0c;但对函数输出改变多少缺乏控制。就像驾车学习停车入库&#xff0c;教练规定每次「踩油门0.1秒」&#xff0c;但不同路况下车子前进距离差异大&#xff0c;有时差一厘米入库&#xff0c;有…...

BooruDatasetTagManager:终极图像标签管理工具,10倍提升AI训练数据预处理效率

BooruDatasetTagManager&#xff1a;终极图像标签管理工具&#xff0c;10倍提升AI训练数据预处理效率 【免费下载链接】BooruDatasetTagManager 项目地址: https://gitcode.com/gh_mirrors/bo/BooruDatasetTagManager 还在为数千张训练图像的繁琐标注工作而烦恼吗&…...

独立开发者工具箱:2026年全栈与AI应用高效开发技术栈指南

1. 项目概述与核心价值作为一名在独立开发领域摸爬滚打了十多年的老兵&#xff0c;我深知一个道理&#xff1a;工具选型&#xff0c;是决定项目成败的第一道分水岭。你花在纠结技术栈、寻找合适API、调试部署环境上的每一分钟&#xff0c;都是从产品核心价值中偷走的时间。今天…...

2026最权威的六大AI写作平台解析与推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 作为智能写作工具来讲的 DeepSeek&#xff0c;能够高效地促进学术论文撰写效率有所提升。于选…...

怎样高效控制视频播放速度:浏览器扩展实用指南

怎样高效控制视频播放速度&#xff1a;浏览器扩展实用指南 【免费下载链接】videospeed HTML5 video speed controller (for Google Chrome) 项目地址: https://gitcode.com/gh_mirrors/vi/videospeed 在信息爆炸的时代&#xff0c;视频已经成为我们获取知识、娱乐休闲的…...

如何高效调试硬件设备:SSCom串口调试助手让你的Linux/Mac开发更简单

如何高效调试硬件设备&#xff1a;SSCom串口调试助手让你的Linux/Mac开发更简单 【免费下载链接】sscom Linux/Mac版本 串口调试助手 项目地址: https://gitcode.com/gh_mirrors/ss/sscom 你是否曾经在调试嵌入式设备时&#xff0c;因为找不到合适的串口工具而烦恼&…...

从Matlab GUI卡死到流畅交互:drawnow nocallbacks的救场指南与避坑实践

从Matlab GUI卡死到流畅交互&#xff1a;drawnow nocallbacks的救场指南与避坑实践 当你精心设计的Matlab GUI应用在用户连续点击按钮或频繁操作滑块时突然卡死&#xff0c;那种挫败感简直让人抓狂。作为一名长期与Matlab GUI打交道的开发者&#xff0c;我经历过无数次这样的崩…...

Blender Datasmith导出插件实战:打通Blender与虚幻引擎的终极桥梁

Blender Datasmith导出插件实战&#xff1a;打通Blender与虚幻引擎的终极桥梁 【免费下载链接】bl_datasmith UE Datasmith importer/exporter for Blender 项目地址: https://gitcode.com/gh_mirrors/bl/bl_datasmith 在当今3D创作领域&#xff0c;Blender和虚幻引擎无…...

esptool芯片擦除功能全解析:全擦除与区域擦除的智能选择

esptool芯片擦除功能全解析&#xff1a;全擦除与区域擦除的智能选择 【免费下载链接】esptool Serial utility for flashing, provisioning, and interacting with Espressif SoCs 项目地址: https://gitcode.com/gh_mirrors/es/esptool esptool芯片擦除是ESP系列芯片开…...