层次状态机-HSM应用解析

article/2025/9/23 4:48:05

在上一面文章中分析了HSM的核心代码,本文章主要是对HSM的应用解析,以相机拍照为例子,对状态和事件的调用,实现拍照、查看照片、切换拍照模式、低电量关机等功能。

一、状态和事件

这个例子里面用了四种事件、六个状态,作用文章原文有解释:

a82cb550998c45c492b6fa2ca30ba8fa.png 总结来说也就是举了个相机拍照的例子,相机有三个按键事件,分别为电源按键(PWR)、快门按键(RELEASE)和模式选择按键(MODE),一个被动触发事件,为电池电量低(LOWBATT);

相机有五个状态,分别为相机处于电源打开状态(on)、处于电源关闭状态(off)、处于相机拍照状态(OnShoot)、处于查看照片状态(OnDisplay)、处于查看菜单状态(OnDispMenu),OnDisp应该是OnDisplay和OnDispMenu状态的父状态;

二、代码解析

首先定义了程序中会用到的四种事件和六个状态的句柄,basic最原始的父状态句柄;

#include "hsm.h"
#include <stdio.h>// Camera HSM Events
#define HSME_PWR        (HSME_START)
#define HSME_RELEASE    (HSME_START + 1)
#define HSME_MODE       (HSME_START + 2)
#define HSME_LOWBATT    (HSME_START + 3)typedef struct CAMERA_T
{/*Class that implements the Camera HSM and inherits from the HSM classCreating a HSM requires the following steps:1) Initialize the base HSM class2) Define the HSM states hierarchy3) Set the starting state4) Define the state handlersa) State handler must return "None" if the event IS handledb) State handler must return "event" if the event IS NOT handledc) State handler may handle the ENTRY event for state setupd) State handler may handle the EXIT event for state teardown/cleanupe) State handler may handle the INIT for self transition to child statef) Self transition to child state MUST NOT be handled by ENTRY or EXIT eventg) Events ENTRY, EXIT and INIT do no need to return None for brevity*/// ParentHSM parent;// Child memberschar param1;char param2;
} CAMERA;CAMERA basic;
HSM_STATE CAMERA_StateOff;
HSM_STATE CAMERA_StateOn;
HSM_STATE CAMERA_StateOnShoot;
HSM_STATE CAMERA_StateOnDisp;
HSM_STATE CAMERA_StateOnDispPlay;
HSM_STATE CAMERA_StateOnDispMenu;

 该函数注册了状态对应的回调处理函数,以"on"状态为例,使用HSM_STATE_Create函数对&CAMERA_StateOn句柄添加回调函数CAMERA_StateOnHndlr,只要处于"on"就会一直进入该函数进行事件的处理;在使用HSM_Create父状态,初始状态为&CAMERA_StateOff;

void CAMERA_Init(CAMERA *This, char *name)
{// Step 1: Create the HSM StatesHSM_STATE_Create(&CAMERA_StateOff, "Off", CAMERA_StateOffHndlr, NULL); //相机电源off 2HSM_STATE_Create(&CAMERA_StateOn, "On", CAMERA_StateOnHndlr, NULL);    //相机电源on 1HSM_STATE_Create(&CAMERA_StateOnShoot, "On.Shoot", CAMERA_StateOnShootHndlr, &CAMERA_StateOn);// 相机处于拍照状态 1-1HSM_STATE_Create(&CAMERA_StateOnDisp, "On.Disp", CAMERA_StateOnDispHndlr, &CAMERA_StateOn);   // 相机处于照片和菜单显示父状态 1-2 HSM_STATE_Create(&CAMERA_StateOnDispPlay, "On.Disp.Play", CAMERA_StateOnDispPlayHndlr, &CAMERA_StateOnDisp); //相机显示照片状态 1-2-1HSM_STATE_Create(&CAMERA_StateOnDispMenu, "On.Disp.Menu", CAMERA_StateOnDispMenuHndlr, &CAMERA_StateOnDisp); //相机显示菜单状态 1-2-2// Step 2: Initiailize the HSM and starting stateHSM_Create((HSM *)This, name, &CAMERA_StateOff);// Step 3: [Optional] Enable HSM debugHSM_SET_PREFIX((HSM *)This, "[DBG] ");HSM_SET_DEBUG((HSM *)This, HSM_SHOW_ALL);// Step 4: CAMERA member initializationThis->param1 = 0;This->param2 = 1;
}

以上六个状态的回调函数,执行代码如下

HSM_EVENT CAMERA_StateOffHndlr(HSM *This, HSM_EVENT event, void *param)
{if (event == HSME_ENTRY){printf("\tEnter Low Power Mode\n");}else if (event == HSME_EXIT){printf("\tExit Low Power Mode\n");}else if (event == HSME_PWR){HSM_Tran(This, &CAMERA_StateOn, 0, NULL);return 0;}return event;
}HSM_EVENT CAMERA_StateOnHndlr(HSM *This, HSM_EVENT event, void *param)
{if (event == HSME_ENTRY){printf ("\tOpen Lens\n");}else if (event == HSME_EXIT){printf ("\tClose Lens\n");}else if (event == HSME_INIT){HSM_Tran(This, &CAMERA_StateOnShoot, 0, NULL);}else if (event == HSME_PWR){HSM_Tran(This, &CAMERA_StateOff, 0, NULL);return 0;}else if (event == HSME_LOWBATT){printf("\tBeep low battery warning\n");return 0;}return event;
}HSM_EVENT CAMERA_StateOnShootHndlr(HSM *This, HSM_EVENT event, void *param)
{if (event == HSME_ENTRY){printf("\tEnable Sensor\n");}else if (event == HSME_EXIT){printf("\tDisable Sensor\n");}else if (event == HSME_RELEASE){printf("\tCLICK!, save photo\n");return 0;}else if (event == HSME_MODE){HSM_Tran(This, &CAMERA_StateOnDispPlay, 0, NULL);return 0;}return event;
}HSM_EVENT CAMERA_StateOnDispHndlr(HSM *This, HSM_EVENT event, void *param)
{if (event == HSME_ENTRY){printf("\tTurn on LCD\n");}else if (event == HSME_EXIT){printf("\tTurn off LCD\n");}return event;
}HSM_EVENT CAMERA_StateOnDispPlayHndlr(HSM *This, HSM_EVENT event, void *param)
{if (event == HSME_ENTRY){printf("\tDisplay Pictures\n");}else if (event == HSME_MODE){HSM_Tran(This, &CAMERA_StateOnDispMenu, 0, NULL);return 0;}return event;
}HSM_EVENT CAMERA_StateOnDispMenuHndlr(HSM *This, HSM_EVENT event, void *param)
{if (event == HSME_ENTRY){printf("\tDisplay Menu\n");}else if (event == HSME_MODE){HSM_Tran(This, &CAMERA_StateOnShoot, 0, NULL);return 0;}return event;
}

下面开始介绍程序主函数,执行步骤如注释

void main(void)
{// 1-Instantiate CameraCAMERA_Init(&basic, "Canon");// 2-Turn on the PowerCAMERA_Run(&basic, HSME_PWR, 0);// 3-Take a pictureCAMERA_Run(&basic, HSME_RELEASE, 0);// 4-Take another pictureCAMERA_Run(&basic, HSME_RELEASE, 0);// 5-Playback the photoCAMERA_Run(&basic, HSME_MODE, 0);// 6-Oops, pushed the release button by accidentCAMERA_Run(&basic, HSME_RELEASE, 0);// 7-Go to menu settingsCAMERA_Run(&basic, HSME_MODE, 0);// 8-Uh oh, low batteryCAMERA_Run(&basic, HSME_LOWBATT, 0);// 9-Time to turn it offCAMERA_Run(&basic, HSME_PWR, 0);
}

三、编译运行验证

查看源码文件

5975adf99b3c4f5fbd000355cb661afb.png

编译源码

d4393609770d4d2ea93a177193fe7e66.png

 运行代码

4be2ef52bc3b407194a684edb74caaa0.png

 步骤1:处于低电量关机模式。初始化一个相机HSM实例为Canon,默认进入Canon[off]状态。

 步骤2:等待拍照,打开相机电源开关,打开传感器,。Canon[off](HSME_PWR)事件触发,最终进入Canon[on](INIT)状态,再进入Canon[on.shoot](INIT)状态。

 步骤3:拍照按键触发,拍下一张照片。触发Canon[on.shoot](HSME_RELEASE)事件。

 步骤4:拍照按键触发,拍下另一张照片。触发Canon[on.shoot](HSME_RELEASE)事件。

 步骤5:屏幕查看照片,关闭镜头传感器,打开屏幕LCD,显示图片。Canon[on.shoot](HSME_MODE)事件触发,进入Canon[on.Dis.Play](HSME_MODE)事件。

 步骤6:拍照按键触发,由于处于查看照片模式,不响应拍照事件。Canon[on.Dis.Play](HSME_RELEASE)事件触发,但是遍历Canon[on.shoot]的状态和父状态都找不到该事件,不做处理。

 步骤7:屏幕切换到菜单模式。Canon[on.Dis.Play](HSME_MODE)触发,切换到Canon[on.Disp.Memu](INIT)。

 步骤8:相机电池电量低,蜂鸣器报警。触发HSME_LOWBATT事件,Canon[on.Disp.Memu]没有该事件,遍历其父状态,在Canon[on](HSME_LOWBATT)触发。

 步骤9:相机电源按键触发,屏幕LCD关闭,镜头传感器关闭,切换回关机模式。HSME_PWR事件触发,Canon[on.Disp.Memu]找不到该状态,遍历其父状态在Canon[on](HSME_PWR)触发关机。

四、总结

至此层次状态机-HSM应用解析到此结束,上一篇文章和本文章是紧密结合的,必须看懂前者才能看明白上述的相机工作例子。理解HSM的状态调度机制和事件调度机制非常重要,笔者总结能力有限,可能没办法很清晰的描述出来,但是建议读者使用笔将整个状态和事件关系列举出来,相信会有不一样的收获哦。后续估计会再写一篇关于HSM的文章,不过是在C++中使用HSM,本人觉得HSM更适合结合C++封装继承特性去使用。

 

GitHub源码链接:GitHub - howard-chan/HSM: Hierarchical State Machine

 


http://chatgpt.dhexx.cn/article/RuX9LtAm.shtml

相关文章

HSM加密机 (分级密钥管理)

参考自 三级密钥体制示意图 主密钥用于加密密钥交换密钥和数据密钥作本地存储&#xff1b;密钥交换密钥用于加密数据密钥作网络传输&#xff1b;数据密钥用于对数据进行加解密。 三级密钥体制说明 1. 第一层&#xff0c;LMK为本地主密钥,&#xff0c;它是存放在HSM机内的&…

英飞凌 AURIX 系列单片机的HSM详解(4)——Tricore核与HSM核之间的通信方法

本系列的其它几篇文章&#xff1a; 《英飞凌 AURIX 系列单片机的HSM详解&#xff08;1&#xff09;——何为HSM》 《英飞凌 AURIX 系列单片机的HSM详解&#xff08;2&#xff09;——与HSM相关的UCB和寄存器》 《英飞凌 AURIX 系列单片机的HSM详解&#xff08;3&#xff09;—…

层次状态机-HSM代码解析

有限状态机在学习和工作中经常能够遇到&#xff0c;前面的文章也有使用到。但是对于层次状态机网上的学习资源却很少&#xff0c;导致一直不理解这个工作机制&#xff0c;后面偶然在GitHub看到一篇文章&#xff0c;深入学习后发现层次状态机太实用了&#xff0c;如果将其在项目…

车规级安全芯片HSM、SE等:

目录 1、相关标准 2、汽车安全芯片应用 3、安全芯片供应商 4、安全芯片测试 5、针对控制器的安全测试 给学习做个总结&#xff0c;写的不对处希望大家指出。 说明&#xff1a;关于汽车安全中可以使用SE安全单元针对外部通信的安全形式&#xff0c;可以是内嵌HSM硬件安全模…

Infineon TC3XX的 通过HSM 实现Secure Debug

AURIX™ 调试接口保护- 内部开关概览 Gate1: 通过OCDS模块控制TriCoreTM 调试访问接口&#xff1b; Gate2: 通过DMU模块控制TriCoreTM 调试访问接口&#xff1b; Gate3和Gate4: HSM直接控制。控制Host CPU的访问并且也可以支持禁用HSM自身的调试功能。 AURIX™ 挑战应答机制-…

汽车信息安全系列-3.TI HSM笔记(更新中)

HSE 相对于 SHE 主要多了独立的CPU 并且支持非对称算法 HSM 架构的安全目标: 安全启动,安全运行,安全debug,算法加速 HSM 架构有以下feature: 防火墙保护 独立CPU,保护efuse和密匙并且给其他内核提供认证和解密服务 安全Boot ROM 建立可信任硬件和外部软件镜像加解密…

hsm加密机

1.三级密钥体制示意图&#xff1a; 1. 主密钥用于加密密钥交换密钥和数据密钥作本地存储&#xff1b; 2. 密钥交换密钥用于加密数据密钥作网络传输&#xff1b; 3. 数据密钥用于对数据进行加解密。 2.三级密钥体制 3.三级密钥体制说明 第一层&#xff0c;LMK为本地主密钥,&…

HSM和AsyncChannel介绍

HSM(hierarchical state machine, 层次状态机)和AsyncChannel是Android Java Framework中两个重要的类。 这两个类的作用如下。 HSM在传统状态机对所有状态都一视同仁的基础上做了一些改变,使得状态和状态之间有了层级关系。HSM中的状态层级关系与Java中父子类的派生和继承关…

英飞凌 AURIX 系列单片机的HSM详解(2)——与HSM相关的UCB和寄存器

本系列的其它几篇文章&#xff1a; 《英飞凌 AURIX 系列单片机的HSM详解&#xff08;1&#xff09;——何为HSM》 《英飞凌 AURIX 系列单片机的HSM详解&#xff08;3&#xff09;——开发方法》 《英飞凌 AURIX 系列单片机的HSM详解&#xff08;4&#xff09;——Tricore核与H…

英飞凌 AURIX 系列单片机的HSM详解(3)——开发方法

本系列的其它几篇文章&#xff1a; 《英飞凌 AURIX 系列单片机的HSM详解&#xff08;1&#xff09;——何为HSM》 《英飞凌 AURIX 系列单片机的HSM详解&#xff08;2&#xff09;——与HSM相关的UCB和寄存器》 《英飞凌 AURIX 系列单片机的HSM详解&#xff08;4&#xff09;—…

HSM硬件加密机国密标准解读

HSM全称硬件安全模块&#xff0c;是数据安全领域的关键硬件设备&#xff0c;是公钥基础设施的一部分。本文从国密0054出发&#xff0c;概要分析了HSM也就是通常说的服务器密码机需要遵循的国密相关标准&#xff0c;以及与等保的关系。 一、信息系统密钥应用的基本要求 1、总体…

HSM和TEE

本文摘自牛咖网文章 HSM和TEE HSM为其他应用程序提供密钥管理和加密功能。 TEE还提供让应用程序&#xff08;或应用程序的安全相关部分&#xff09;在其隔离环境中执行的功能。 常规执行环境 (REE)是TEE社区中的术语&#xff0c;用于表示设备中特定TEE之外的所有内容。 HSM如何…

满足AUTOSAR基础软件要求的硬件安全模块(HSM)加密运算

随着软件日益复杂&#xff0c;并且车载系统和传感器数量稳步增加&#xff0c;车内系统的通讯成几何增长&#xff0c;必须加强密码保护。这种保护可以通过经典的实时汽车开放系统架构&#xff08;AUTOSAR&#xff09;来实现。即便在资源稀缺的情况下&#xff0c;安装合适固件的硬…

硬件安全模块- HSM

目录 一、什么是硬件安全模块 二、HSM是如何工作的 三、HSM的应用 公钥基础设施&#xff08;Public Key Infrastructure - PKI&#xff09; 卡支付系统&#xff08;Card Payment HSM&#xff09; 安全套接字协议&#xff08;Secure Sockets Layer - SSL&#xff09; 车载…

鉴源实验室丨HSM技术浅述

作者 | 徐奕华 上海控安可信软件创新研究院汽车网络安全组 来源 | 鉴源实验室 引言&#xff1a;2023年5月初&#xff0c;工业和信息化部装备工业一司组织全国汽车标准化技术委员会开展《汽车整车信息安全技术要求》等四项强制性国家标准的制修订[1]。这意味着车辆信息安全管理…

英飞凌 AURIX 系列单片机的HSM详解(1)——何为HSM

本系列的其它几篇文章&#xff1a; 《英飞凌 AURIX 系列单片机的HSM详解&#xff08;2&#xff09;——与HSM相关的UCB和寄存器》 《英飞凌 AURIX 系列单片机的HSM详解&#xff08;3&#xff09;——开发方法》 《英飞凌 AURIX 系列单片机的HSM详解&#xff08;4&#xff09;—…

硬件安全模块(HSM)

一、什么是HSM 说起信息安全和加解密&#xff0c;我们很容易会在脑海中浮现出锁和钥匙。那我们来想象一个场景&#xff1a; 假设一位父亲有三个儿子&#xff0c;他给每个儿子各买了一台掌上游戏机。为避免他们沉迷游戏&#xff0c;父亲把每台游戏机都锁到一个小盒子里。盒子归…

什么是WSDL?

WSDL&#xff08;Web Service Description Language&#xff09;Web服务器描述语言是用XML文档来描述Web服务的标准&#xff0c;是Web服务的接口定义语言&#xff0c;由Ariba、Intel、IBM、MS等共同提出&#xff0c;通过WSDL&#xff0c;可描述Web服务的三个基本属性&#xff1…

已有wsdl,怎么去调用他的方法

1&#xff0c;在浏览器验证该wsdl地址是否可以打开&#xff0c;显示为该模式 2&#xff0c;新建一个项目&#xff0c;右击该项目&#xff0c;other&#xff0c;webservice,webservice clent , 讲该wsdl地址输入&#xff0c;finish 3,新建一个类&#xff0c;实例化impl,调用一个…

WSDL的文件结构(WSDL 1.1规范

为能将一个WebService描述清楚&#xff0c;WSDL从三个层面对一个服务进行了描述&#xff1a; 一&#xff1a;描述服务的接口(<wsdl:portType/>部分)&#xff0c;也就是服务有哪些操作(<wsdl:operation/>部分)以及每个操作的输入输出参数(<wsdl:message/>部分…