嵌入式软件中状态机的几种操作

嵌入式软件中状态机的几种操作

1、状态机的术语

  • 现态:是指当前所处的状态。

  • 条件:又称为“事件”,当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。

  • 动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。

  • 次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。

2、当前任务需求

在这里插入图片描述
如图,是一个定时计数器,计数器存在两种状态,一种为设置状态,一种为计时状态。

  • 设置状态

“+” “-” 按键对初始倒计时进行设置
当计数值设置完成,点击确认键启动计时 ,即切换到计时状态

  • 计时状态

按下“+” “-” 会进行密码的输入“+”表示1 ,“-”表示输入0 ,密码共有4位
确认键:只有输入的密码等于默认密码,按确认键才能停止计时,否则计时直接到零,并执行相关操作

2、嵌套switch实现嵌套

/***************************************
1.列出所有的状态
***************************************/
typedef enum{SETTING,TIMING
} STATE_TYPE;/***************************************
2.列出所有的事件
***************************************/
typedef enum{UP_EVT,DOWN_EVT,ARM_EVT,TICK_EVT
} EVENT_TYPE;/***************************************
3.定义和状态机相关结构:时间显示框会出现的状态
***************************************/
struct  bomb
{uint8_t state;uint8_t timeout;uint8_t code;uint8_t defuse_code;
} bomb1;/***************************************
4.初始化状态机
***************************************/
void bomb1_init(void)
{bomb1.state = SETTING;bomb1.defuse_code = 6;    //0110 
}/***************************************
5. 状态机事件派发
***************************************/
void bomb1_fsm_dispatch(EVENT_TYPE evt ,void* param)
{switch(bomb1.state){case SETTING:{switch(evt){case UP_EVT:    // "+"   按键按下事件if(bomb1.timeout< 60)  ++bomb1.timeout;bsp_display(bomb1.timeout);break;case DOWN_EVT:  // "-"   按键按下事件if(bomb1.timeout > 0)  --bomb1.timeout;bsp_display(bomb1.timeout);break;case ARM_EVT:   // "确认" 按键按下事件bomb1.state = TIMING;bomb1.code  = 0;break;}} break; case TIMING:{switch(evt){case UP_EVT:     // "+"   按键按下事件bomb1.code = (bomb1.code <<1) | 0x01;break;case DOWN_EVT:  // "-"   按键按下事件bomb1.code = (bomb1.code <<1); break;case ARM_EVT:   // "确认" 按键按下事件if(bomb1.code == bomb1.defuse_code){bomb1.state = SETTING;}else{bsp_display("bomb!")}break;case TICK_EVT:if(bomb1.timeout){--bomb1.timeout;bsp_display(bomb1.timeout);}if(bomb1.timeout == 0){bsp_display("bomb!")}break;      }   }break;}
}-----------------------------------
优点:简单,代码阅读连贯,容易理解缺点:当状态或事件增多时,代码状态函数需要经常改动,状态事件处理函数会代码量会不断增加状态机没有进行封装,移植性差。没有实现状态的进入和退出的操作。进入和退出在状态机中尤为重要:进入事件:只会在刚进入时触发一次,主要作用是对状态进行必要的初始化退出事件:只会在状态切换时触发一次 ,主要的作用是清除状态产生的中间参数,为下次进入提供干净环境

3、二维转态表

状态机可以分为状态和事件 ,状态的跃迁都是受事件驱动的,因此可以通过一个二维表格来表示状态的跃迁。
在这里插入图片描述

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

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

相关文章

Animate软件基本概念:遮罩层和引导层

这里简单讲一下Animate软件中关于遮罩层和引导层的基本概念。 FlashASer&#xff1a;AdobeAnimate2021软件零基础入门教程https://zhuanlan.zhihu.com/p/633230084 FlashASer&#xff1a;实用的各种Adobe Animate软件教程https://zhuanlan.zhihu.com/p/675680471 FlashASer&…

Hadoop集群安装配置,spark集群安装配置

前提&#xff1a;准备3台linux服务器&#xff0c;并保证其网络可进行相互通信 假设三台机器IP分别为&#xff1a; 192.168.88.101 192.168.88.102 192.168.88.103一.配置三台服务器之间SSH免密登录,关闭防火墙&#xff0c;时间同步 三台服务器均执行以下1,2,3,4,5,6,8命令 1…

【MongoDB 】MongoDB 介绍及应用,设计到4个案例

MongoDB 介绍概述 基础概念 MongoDB 是非关系型数据库&#xff0c;也就是nosql&#xff0c;存储json数据格式会非常灵活&#xff0c;要比数据库mysql/MariaDB更好&#xff0c;同时也能为mysql/MariaDB分摊一部分的流量压力。 对于经常读写的数据他会存入内存&#xff0c;如此…

视频剪辑SDK,人脸美化与滤镜特效,焕发直播新活力

在数字化浪潮席卷全球的今天&#xff0c;直播已成为连接品牌与消费者、创作者与观众的重要桥梁。为了在激烈的直播竞争中脱颖而出&#xff0c;提供高质量、富有创意的直播内容成为关键。美摄科技&#xff0c;作为视频处理技术的先行者&#xff0c;携手其强大的视频剪辑SDK解决方…

2024年计算机类学术会议有哪些

随着科技的飞速发展&#xff0c;计算机科学与技术领域正以前所未有的速度进步&#xff0c;各类学术会议成为了交流最新研究成果、探讨前沿技术趋势的重要平台。2024年&#xff0c;全球范围内将举办多场计算机类学术会议&#xff0c;这些会议不仅汇聚了顶尖的专家学者&#xff0…

一六三、go多版本安装与切换

如何安装多版本 官方安装方法 参考链接 当已安装某个版本后&#xff0c;执行如下命令 go install golang.org/dl/go1.19.7latest go1.19.7 download执行第一行命令后&#xff0c;会在GOPATH中新增go1.19.7。执行第二行命令后&#xff0c;会在sdk目录下载完整的包。 通过sm…

制造知识普及(十)-- 常见的工业软件介绍

「 1. ERP」 企业资源计划&#xff08;enterprise resource planning&#xff0c;ERP&#xff09;是制造企业的核心管理软件。ERP系统的基本思想是以销定产&#xff0c;协同管控企业的产、供、销、人、财、物等资源&#xff0c;帮助企业按照销售订单&#xff0c;基于产品的制造…

gitlab-runner /var/run/docker.sock connect permission denied

usermod -aG docker gitlab-runner sudo service docker restart参考&#xff1a;https://gitlab.com/gitlab-org/gitlab-runner/-/issues/3492

如何在 Android 手机/平板电脑上恢复误删除的 DCIM 文件夹

DCIM 文件夹是智能手机和平板电脑上最重要的文件夹之一。许多人报告说他们在 Android 设备上遇到了 DCIM 文件夹为空的问题。实际上&#xff0c;这种情况大多数情况下都会发生&#xff0c;当您意外从 Android 设备中删除 DCIM 文件夹或因病毒攻击、应用程序问题和意外格式化等原…

1-5 C语言 - 类型修饰符关键字const和volatile的概念及使用(超详细)

本节重点讲述类型修饰符关键字const和volatile的概念及使用&#xff0c;如果想详细了解关键字的同学点击下方链接进行跳转 1-1 C语言 - 关键字及其使用(数据类型)-CSDN博客 1-2 C语言 - 控制语句关键字-CSDN博客 1-3 C语言 - 控制语句的使用注意事项&#xff08;这些绝对是您…

2024鸿蒙开发【面试题库】,转岗看这一篇就够了

鸿蒙面试浪潮来袭&#xff0c;你是否也想着利用这次机会去实现&#xff0c;跳槽涨薪的梦呢&#xff1f; 如果关注了华为鸿蒙的人应该知道&#xff1a;鸿蒙开发岗位需求飙升6倍&#xff01; 可想而知该岗位前景多么广阔&#xff0c;为此就为大家整理些&#xff08;鸿蒙HarmonyO…

springboot社区旧物回收系统-计算机毕业设计源码94813

目 录 摘要 1 绪论 1.1 研究背景 1.2研究意义 1.3论文结构与章节安排 2 社区旧物回收系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 社…

SQL面试题练习 —— 计算用户首单是即时单的比例

目录 1 题目2 建表语句3 题解 题目来源&#xff1a;美团。 1 题目 在外卖订单中&#xff0c;有时用户会指定订单的配送时间。现定义&#xff1a;如果用户下单日期与期望配送日期相同则认为是即时单&#xff0c;如果用户下单日期与期望配送时间不同则是预约单。每个用户下单时间…

gogs的安装和使用(docker)

1.docker安装gogs 1.1 拉取gogs镜像 docker pull gogs/gogs #也可改为自己需要的版本号 1.2 创建存储目录 mkdir /root/gogs 1.3 运行镜像 docker run --namegogs -d -p 10022:22 -p 13000:3000 -v /root/gogs:/data gogs/gogs 1.3.1 指令解析 --namegogs: 指定名称…

文章复现 创新点 代码改进跑通 深度学习

文章复现 创新点 代码改进跑通 深度学习 SCI代码复现 文章复现 数据处理、数据分析、算法、数据结构data structure、机器学习machine learning、深度学习deep learning。创新改进&#xff0c;算法提升 python环境配置 &#xff0c;深度学习代码调试 、代码复现&#xff0c;py…

数据库优化

文章目录 一、如何定位慢查询二、分析慢SQL&#xff08;一&#xff09;Explain 三、索引介绍&#xff08;一&#xff09;数据结构1、二叉树2、红黑树3、B树4、B 树 &#xff08;二&#xff09;聚集索引&二级索引&#xff08;三&#xff09;索引的创建原则&#xff08;四&am…

ElementUI元件库在Axure中使用

一、ElementUI元件库介绍 ElementUI 是一套为开发者、UI/UX设计师和产品经理准备的基于Vue 2.0的桌面端组件库。它以其优雅的设计和丰富的组件&#xff0c;极大地提升了Web应用的开发效率与用户体验。ElementUI的组件设计精致且符合现代UI规范&#xff0c;包括按钮、表单、弹窗…

指针(一)

指针变量&#xff1a;用来存放地址的变量。 这里讲一下为什么两位为一个字节&#xff1a;首先这是一个十六进制的地址&#xff0c;再十六进制中的F&#xff08;15&#xff09;用二进制表示是需要四位&#xff08;1111&#xff09;&#xff0c;所以一位代表四个bit&#xff0c;两…

JavaEE 第7节 线程饥饿及其解决办法

目录 一、什么是线程饥饿&#xff1f; 二、线程饥饿的解决办法 *wait()与notify()方法解决线程饥饿 1、wait(等待) 2、notify(通知) 1&#xff09;notify 2&#xff09;notifyAll 3&#xff09;关于wait方法的一些补充 1、wait的方法的三个功能是原子性的&#xff1a;…

【mysql 第二篇章】请求到真正执行 SQL 到底是一个怎么样的过程?

从用户调用到SQL执行的流程中间发生了什么事情 1、网络请求使用 线程 来处理&#xff0c;当数据库连接池中监听到有连接请求&#xff0c;这个时候会分配一个线程来处理。 2、SQL接口 负责接收 SQL 语句&#xff0c;当线程监听到有请求和读取数据的之后&#xff0c;将 SQL 语句…