层次状态机(HSM)用c语言的实现

来源:网络收集 时间:2025-04-25 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xuecool-com或QQ:370150219 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

分类:

本文讲述层次状态机实现形式中的行为继承。从行为继承与类继承之间的OO类相似来看,一个成功的层次状态机应该能够模拟下列属于C++对象模型。 ? 使用和维护简单

? 应允许转态机拓扑容易改变,不应要求转换连接的人工代码,所需要的修

改限制在代码的一个地方。

? 提供好的运行-时间效率和小的存储。 ? 遵守C++中的“零额外开销”原则。

为了满足上面的要求,层次状态机的实现着重于下面的主要元素: ? 完全支持行为继承的层次关系

? 用状态进入和退出动作实现有保证得初始化和清除 ? 通过类继承支持规定的状态模型 1. 基本要素

(1) 状态:在层次状态的情形下,状态处理器必须返回朝状态,这导致层次

状态处理特征标记的递归定义。构造这种特征标记在C++是不可能的,于是定义下面宏来近似:

typedef void (* QPseudoState)(QEVENT const *pEvent); typedef QPseudoState (* QState)(QEVENT const *pEvent);

(2) 进入/退出动作和初始状态:这些元素是状态专有的特征,在转态中他

们被定义,而特别的是与到达状态所进过的路径无关。保留信号的转态定义为:

typedef enum tagQSIG {

Q_EMPTY_SIG = 1, Q_INIT_SIG, Q_ENTRY_SIG, Q_EXIT_SIG, Q_USER_SIG,

} QSIG;

状态处理机可以用一般的switch语句规定适当的用例处理这些信号,可以自由的执行相应信号的操作。

(3) 状态转换:状态处理机用Q_TRAN实现状态转换,并且在原状态的上

下文中执行动作,即:改变状态之前调用Q_TRAN(和UML规定不一致)。

#define Q_TRAN(target_) Q_TranDyc((QState)(target_))

(4) Top状态和初始伪状态:每个层次状态机都有一个Top状态,包括整

个状态的所有其它元素。Top状态没有超状态,用户也不能覆盖;Top状态的唯一目的是提供状态层次的最高的根,使最高处理器能返回Top; Top状态唯一能订制的是初始化。初始化伪状态处理机仅规定初始化转换,必须指明被窃套的Top状态的状态机的缺省状态。

2. 实现代码: (1) 头文件代码:

#ifndef STATE_INHERIT_H #define STATE_INHERIT_H

typedef unsigned short QSIG;

// Define the signal of state machine enum {

Q_EMPTY_SIG = 0, Q_INIT_SIG = 1,

Q_ENTRY_SIG, Q_EXIT_SIG, Q_USER_SIG };

// Define the signal of state machine typedef struct tagQEVENT {

QSIG sig;

unsigned char *pEvent1; unsigned char *pEvent2;

// TODO: add fields to the event } QEVENT;

// define state data type

typedef void (* QPseudoState)(QEVENT const *pEvent); typedef QPseudoState (* QState)(QEVENT const *pEvent); typedef QPseudoState QSTATE;

#define Q_TRIGGER(state, sig) \\

(QState)(*(state))((QEVENT*)&pkgStdEvt[sig])

// define a transation that don't change the state, // just treat the pEvent with the target state. // this is used by concurrent state

#define Q_INIT(target_) Init_((QState)(target_)); #define Q_TRAN(target_) Q_TranDyc((QState)(target_));

void Init_(QState target); void Q_Init(QSTATE target);

void Q_Initial(QEVENT const* pQevt); void Q_Dispatch(QEVENT const* pQevt); void Q_TranDyc(QState target);

#endif //STATE_INHERIT_H

(2) 实体代码:

#include #include #include \

static QStatesrcState; // source state static QStateactState; // active state static QEVENT const pkgStdEvt[] = {

{Q_EMPTY_SIG, 0, 0}, {Q_INIT_SIG, 0, 0}, {Q_ENTRY_SIG, 0, 0}, {Q_EXIT_SIG, 0, 0} };

void Q_Initial(QEVENT const* pQevt) {

printf(\ }

void Q_Dispatch(QEVENT const* pQevt) {

for (srcState = actState; srcState; srcState = (QState)(*srcState)(pQevt)) {} }

void Init_(QState target) {

actState = target; }

void Q_Init(QSTATE target) {

register QState s;

actState = (QState)target; srcState = (QState)Q_Initial;

s = actState; // save actState in a temporary

(*(QPseudoState)srcState)((QEVENT*)0); // top-most initial tran.

// initial transition must go one level deep

s = actState; // update the temporary

Q_TRIGGER(s, Q_ENTRY_SIG); // enter the state while (0 == Q_TRIGGER(s, Q_INIT_SIG)) {

// init handled

// initial transition must go one level deep s = actState;

Q_TRIGGER(s, Q_ENTRY_SIG); // enter the substate } }

void Q_TranDyc(QState target) {

QStateentry[8], p, q, s, *e, *lca;

for (s = actState; s != srcState; ) {

QState t;

t = Q_TRIGGER(s, Q_EXIT_SIG); if (t) {

// exit action unhandled, t points to superstate s = t;

百度搜索“70edu”或“70教育网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,70教育网,提供经典教育范文层次状态机(HSM)用c语言的实现在线全文阅读。

层次状态机(HSM)用c语言的实现.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.70edu.com/fanwen/930975.html(转载请注明文章来源)

相关推荐:

Copyright © 2020-2025 70教育网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:370150219 邮箱:370150219@qq.com
苏ICP备16052595号-17
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:7 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219