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

上传人:壹****1 文档编号:513827084 上传时间:2022-10-14 格式:DOCX 页数:13 大小:113.87KB
返回 下载 相关 举报
层次状态机(HSM)用c语言的实现_第1页
第1页 / 共13页
层次状态机(HSM)用c语言的实现_第2页
第2页 / 共13页
层次状态机(HSM)用c语言的实现_第3页
第3页 / 共13页
层次状态机(HSM)用c语言的实现_第4页
第4页 / 共13页
层次状态机(HSM)用c语言的实现_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《层次状态机(HSM)用c语言的实现》由会员分享,可在线阅读,更多相关《层次状态机(HSM)用c语言的实现(13页珍藏版)》请在金锄头文库上搜索。

1、本文讲述层次状态机实现形式中的行为继承。从行为继承与类继承之间的OO类相似来看,一个成功的层次状态机应该能够模拟下列属于C+对象模型。 使用和维护简单 应允许转态机拓扑容易改变,不应要求转换连接的人工代码,所需要的修 改限制在代码的一个地方。 提供好的运行-时间效率和小的存储。 遵守C+中的“零额外开销”原则。为了满足上面的要求,层次状态机的实现着重于下面的主要元素: 完全支持行为继承的层次关系 用状态进入和退出动作实现有保证得初始化和清除 通过类继承支持规定的状态模型1. 基本要素(1) 状态:在层次状态的情形下,状态处理器必须返回朝状态,这导致层次 状态处理特征标记的递归定义。构造这种特征

2、标记在C+是不可能的, 于是定义下面宏来近似:typedef void (* QPseudoState)(QEVENT const *pEvent);typedef QPseudoState (* QState)(QEVENT const *pEvent);(2) 进入/退出动作和初始状态:这些元素是状态专有的特征,在转态中他 们被定义,而特别的是与到达状态所进过的路径无关。保留信号的转态 定义为:typedef enum tagQSIGQ_EMPTY_SIG = 1,Q_INIT_SIG,Q_ENTRY_SIG,Q_EXIT_SIG,Q_USER_SIG, QSIG;状态处理机可以用一般的s

3、witch语句规定适当的用例处理这些信号, 可以自由的执行相应信号的操作。(3) 状态转换:状态处理机用Q_TRAN实现状态转换,并且在原状态的上下文中执行动作,即:改变状态之前调用Q_TRAN(和UML规定不一致)。#define Q_TRAN(target_) Q_TranDyc(QState)(target_)(4) Top状态和初始伪状态:每个层次状态机都有一个Top状态,包括整 个状态的所有其它元素。Top状态没有超状态,用户也不能覆盖;Top 状态的唯一目的是提供状态层次的最高的根,使最高处理器能返回Top; Top状态唯一能订制的是初始化。初始化伪状态处理机仅规定初始化转 换,必

4、须指明被窃套的Top状态的状态机的缺省状态。2. 实现代码:(1) 头文件代码:#ifndef STATE_INHERIT_H#define STATE_INHERIT_H typedef unsigned short QSIG;/ Define the signal of state machine enumQ_EMPTY_SIG = 0,Q_INIT_SIG = 1,Q ENTRY SIG,Q EXIT SIG,Q USER SIG;/ Define the signal of state machinetypedef struet tagQEVENTQSIG sig;unsigned c

5、har *pEvent1;unsigned char *pEvent2;/ TODO: add fields to the event QEVENT;/ define state data typetypedef void (* QPseudoState)(QEVENT const *pEvent);typedef QPseudoState (* QState)(QEVENT const *pEvent);typedef QPseudoState QSTATE;#define Q_TRIGGER(state, sig) (QState)(*(state)(QEVENT*)&pkgStdEvts

6、ig)/ define a transation that dont 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(QE

7、VENT const* pQevt);void Q_Dispatch(QEVENT const* pQevt);void Q_TranDyc(QState target);#endif /STATE_INHERIT_H(2) 实体代码:#include#include#includestate inherit.hstatic QState srcState;/ source statestatic QState actState;/ active statestatic QEVENT const pkgStdEvt=Q_EMPTY_SIG, 0, 0,Q_INIT_SIG, 0, 0,Q_EN

8、TRY_SIG, 0, 0,Q_EXIT_SIG, 0, 0;void Q_Initial(QEVENT const* pQevt) printf(Top_Init;); 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)

9、target;srcState = (QState)Q Initial;s = actState;/ save actState in atemporary(*(QPseudoState)srcState)(QEVENT*)0);/ top-most initialt ran./ initial transition must go one level deeps = actState;/ update thetemporaryQ_TRIGGER(s, Q_ENTRY_SIG);/ enter the statewhile (0 = Q_TRIGGER(s, Q_INIT_SIG)/ init

10、 handled/ initial transition must go one level deeps = actState;Q_TRIGGER(s, Q_ENTRY_SIG);/ enter the substate void Q_TranDyc(QState target)QState entry8, 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

11、 = t;else / exit action handled, elicit superstate s = Q_TRIGGER(s, Q_EMPTY_SIG);*(e = &entry0) = 0;/ assume entry to*(+e) = target;target/(a) check source = target (transition to self)if (srcState = target)Q_TRIGGER(srcState, Q_EXIT_SIG);/ exit sourcegoto inLCA;/(b) check source = target-superp = Q

12、_TRIGGER(target, Q_EMPTY_SIG);if (srcState = p) goto inLCA;/(c) check source-super = target-super (most common)q = Q_TRIGGER(srcState, Q_EMPTY_SIG); if (q = p)/ exit source/ exit source/ not enter the LCAQ_TRIGGER(srcState, Q_EXIT_SIG); goto inLCA;/(d) check source-super = targetif (q = target)Q_TRI

13、GGER(srcState, Q_EXIT_SIG);_e;goto inLCA;/(e) check rest of source= target-super-super. hierarchy*(+e) = p;for (s = Q_TRIGGER(p, Q_EMPTY_SIG); s; s = Q_TRIGGER(s, Q_EMPTY_SIG)if (srcState = s)goto inLCA;*(+e) = s;Q_TRIGGER(srcState, Q_EXIT_SIG);/ exit source/(f) check rest of source-super = target-s

14、uper-super.for (lca = e; *lca; -lca)if (q = *lca)e = lca - 1;/ do not enter the LCAgoto inLCA;/(g) check each srcState-super-super.for each target.for (s = q; s; s = Q_TRIGGER(s, Q_EMPTY_SIG)for (lca = e; *lca;-lca)if (s = *lca)e = lca 一 1;/ donot enterthe LCAgoto inLCA;Q_TRIGGER(s, Q EXITSIG);/exit s/ malformedassert(0);HSMinLCA:/ now we are in the LCA of srcState and targetassert(e &entrysizeof(entry) / sizeof(*entry);/ entry f

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号