书摘:C 嵌入式系统设计模式 05

本书的原著为:《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》,讲解的是嵌入式系统设计模式,是一本不可多得的好书。

本系列描述我对书中内容的理解。

书中大量使用了 UML 表示法,之前讲述过了 类图,这篇文章讲述 状态图

有限状态机

有限状态机 是一个模型,在编程领域非常重要和有用。有限状态机的三个特征:

  1. 状态是有限的
  2. 任一时刻,只处在一种状态中
  3. 在某种事件触发下,会从一种状态转换到另一种状态。

状态图

状态图 是九种常见 UML 图中的一种,它是一个有向图,由 状态转换 组成。状态图常用于对类和用例的 行为 进行建模,类和用例在某种 状态 中等待,直到感兴趣的 事件 发生(wait in a state until an event of interest occurs)。此时,处理 事件、执行 动作,并且 转换 状态。

有向图 是一种特殊的图,它的边具有起点和终点的概念,不能逆转方向。有向图适合描述具有明确方向的关系。

状态

在 UML 中,状态 用圆角矩形表示。
在这里插入图片描述

状态可能包含 进入动作退出动作内部转换

  • 进入动作:仅当进入状态时,执行一次进入动作;
  • 退出动作:仅当退出状态时,执行一次退出动作;
  • 内部转换:内部转换不会改变状态机的状态,只是在其内部逻辑中进行了某种处理或计算。举例来说明:假设有一个状态机,它有两个状态:状态A和状态 B。当状态机处于状态 A 时,如果发生内部转换,它仍然保持在状态 A,而不会进入状态 B。这个内部转换可能是在状态A的某个条件下触发,并进行一些内部处理或计算,但不会改变状态机的状态。

状态是可以嵌套的,称为 复合状态

在 UML 中,初始状态使用实心圆点表示,终止状态使用内嵌圆点表示:
在这里插入图片描述

动作

动作 是指在状态转换过程中需要执行的操作或行为。动作是与状态相关联的,当状态机从一种状态转换到另一种状态时,会执行相应的动作。动作一般包括:进入动作、退出动作和转换动作。

动作的执行顺序是:先执行前一个状态的 退出 动作,然后执行 转换 动作,最后执行后续状态的 进入 动作。

常见的动作有:

  1. 函数调用,如 foo();
  2. 基本动作,如 x += 10;
  3. 生成事件

转换和事件

状态机中的 转换 指的是状态之间的迁移,即从一个状态转换到另一个状态。转换由特定的 事件 触发,并且可以在执行一系列动作后完成。

事件 是指能够触发状态机行为变化的情况或条件。事件可以是外部的,例如用户输入、定时器超时、接收到其他系统的消息等;也可以是内部的,例如变量值的改变、程序流程的控制转移等。当事件发生时,状态机会根据当前状态和事件的类型执行相应的动作,并可能触发状态转换。

在状态机中,转换和事件是相互关联的。事件是触发状态转换的条件或原因,而转换则是状态机从一个状态转移到另一个状态的机制。

在 UML 中,转换 是一个带箭头的线(→),始于前一个状态,终于后一个状态。转换通常具有可选的 事件签名转换动作列表 ,基本形式是:

转换事件名称 ( 参数列表 ) [ 监护条件 ] / 转换动作列表 转换事件名称 (参数列表) [监护条件] / 转换动作列表 转换事件名称(参数列表)[监护条件]/转换动作列表

其中,转换事件名称 可以为空。监护条件 是一个布尔表达式,只能为真或假,也可以为空。只有发生了事件,并且 监护条件 为真时,进行状态转换,此时执行 转换动作列表 ,转换动作列表也可以为空。

如果没有转换事件,则认为是“无条件转换”,一旦前一个状态的进入动作执行完成,立即触发转换。

比如一个事件是 按下按键,监护条件是 按键是取消键 ,转换动作是 显示消息:取消 。那么每当有按键按下时,触发事件,如果按键是“取消键”则显示一条消息,否则忽略这次触发事件。

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

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

相关文章

FTP简介及搭建计算机端口的介绍

目录 一. FTP的简介 二. FTP的主要作用 三. 搭建FTP服务器 3.1 开启防火墙 3.2 创建组 3.3 创建用户 3.4 用户绑定组 3.5 安装FTP服务器 3.6 配置FTP服务器 3.7 配置FTP文件夹的权限 3.8 连接测试 3.8.1 服务器本机测试 3.8.2 外部服务器测试 3.8.3 借助工具MobalXterm 四…

7.12全排列②(LC47-M)

算法: 这道题目和46.全排列 (opens new window)的区别在与给定一个可包含重复数字的序列,要返回所有不重复的全排列。 所以就是多了个去重操作。 还是一样的套路: 先排序: Arrays.sort(nums); 再去重: // used[…

RainBond 构建组件 rbd-chaos 故障解决 【真实案例】

文章目录 背景分析官方排查说明尝试进一步分析解决参考背景 在 RainBond 中把所有组件都部署了至少 2 个实例后,开始出现构建/滚动更新直接报错,且没有日志(查看日志按钮点击后,里面啥也没有)。 然后再平台管理主界面,可以看到提示 rbd-chaos 组件故障: 分析 官方排…

中小微医院机构云服务(云HIS)平台源码

云HIS(Cloud-Based Healthcare Information System)重新定义了HIS,目标是为中小型医疗卫生机构提供优质经济的医疗卫生信息化产品及服务;是以健康档案为主线、以电子病历为核心、以云计算技术为基础的医疗卫生系统。云HIS作为基于…

【已解决】若依系统前端打包后,部署在nginx上,点击菜单错误:@/views/system/role/index

​ 上面错误,是因为/views/system/role/index动态路由按需加载时候,错误导致。 解决办法: 如果您的前端项目访问时候,需要带有项目名称的话,参考凯哥上一篇文章:【已解决】若依前后端分离版本&#xff0…

Django 学习教程- Hello world入门案例

系列 Django学习教程-介绍与安装 欢迎来到第Djagno学习教程第二章Hello World 入门案例。 在本教程中,我将引导您完成django的Hello World入门案例。 让我们开始吧! 版本 Django 5.0Python 3.10 创建项目 安装 Django 之后,您现在应该…

C++数据结构-栈

目录 栈顺序栈链栈 栈 栈是允许在表的一端进行插入和删除的线性表。表中允许插入删除的一端是栈顶,栈顶的当前位置是动态变化的;不允许插入和删除的一端是栈底,栈底的位置是不变的。当表中没有元素时称为空栈,插入数据的运算称为…

【STM32F103】SysTick系统定时器延时函数

SysTick SysTick是Cortex-M3内核中的一个外设,内嵌在NVIC中,叫系统定时器。 当处理器在调试期间被喊停时,SysTick也将暂停运作。 一共有四个寄存器,不过我们通常用前三个,不需要校准。下图出自《STM32F10xxx Cortex…

35--JDK新特性

1、新语法结构 新的语法结构,为我们勾勒出了 Java 语法进化的一个趋势,将开发者从复杂、繁琐的低层次抽象中逐渐解放出来,以更高层次、更优雅的抽象,既降低代码量,又避免意外编程错误的出现,进而提高代码质…

Linux软件包管理器——yum命令

如何使用yum 一、快速认识yum(简单介绍)二、快速使用yum2.1 rzsz2.2 linux命令行小游戏和彩蛋 三、yum的整个生态问题 一、快速认识yum(简单介绍) Linux中我们也要进行工具/指令/程序,安装,检查卸载等,需要yum的软件 安装软件的方式&#xf…

<Icon-ResizER>support

If you get any questions in using app, email me caohechunhotmail.com.

Unity坦克大战开发全流程——开始场景——排行榜数据逻辑

开始场景——排行榜数据逻辑 排行榜单条数据 排行榜列表 然后在数据管理类中声明一个对应的字段 初始化数据 然后再在上一节课所编写的UpdatePanelInfo函数中处理数据更新的逻辑 时间换算算法 然后再在数据管理类中编写一个在排行榜中添加数据的方法以提供给外部 直到当前RankI…