分类:
本文讲述层次状态机实现形式中的行为继承。从行为继承与类继承之间的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
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语言的实现在线全文阅读。
相关推荐: