层次状态机hsm用c语言的实现Word文档下载推荐.docx
- 文档编号:18781519
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:14
- 大小:44.23KB
层次状态机hsm用c语言的实现Word文档下载推荐.docx
《层次状态机hsm用c语言的实现Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《层次状态机hsm用c语言的实现Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。
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.
实现代码:
头文件代码:
#ifndef
STATE_INHERIT_H
unsigned
short
QSIG;
//Definethesignalofstatemachine
enum
Q_EMPTY_SIG=0,
Q_INIT_SIG=1,
Q_USER_SIG
};
struct
tagQEVENT
QSIGsig;
char
*pEvent1;
*pEvent2;
//TODO:
addfieldstotheevent
}QEVENT;
//definestatedatatype
QPseudoStateQSTATE;
Q_TRIGGER(state,sig)\
(QState)(*(state))((QEVENT*)&
pkgStdEvt[sig])
//defineatransationthatdon'
tchangethestate,
//justtreatthepEventwiththetargetstate.
//thisisusedbyconcurrentstate
Q_INIT(target_)Init_((QState)(target_));
Q_TRAN(target_)Q_TranDyc((QState)(target_));
Init_(QStatetarget);
Q_Init(QSTATEtarget);
Q_Initial(QEVENT
const*pQevt);
Q_Dispatch(QEVENT
Q_TranDyc(QStatetarget);
#endif
//STATE_INHERIT_H
实体代码:
#include
<
stdio.h>
assert.h>
"
state_inherit.h"
static
QStatesrcState;
//sourcestate
QStateactState;
//activestate
QEVENT
pkgStdEvt[]=
{Q_EMPTY_SIG,0,0},
{Q_INIT_SIG,0,0},
{Q_ENTRY_SIG,0,0},
{Q_EXIT_SIG,0,0}
const*pQevt)
printf("
Top_Init;
);
}
for
(srcState=actState;
srcState;
srcState=(QState)(*srcState)(pQevt))
{}
Init_(QStatetarget)
actState=target;
Q_Init(QSTATEtarget)
register
QStates;
actState=(QState)target;
srcState=(QState)Q_Initial;
s=actState;
//saveactStateinatemporary
(*(QPseudoState)srcState)((QEVENT*)0);
//top-mostinitialtran.
//initialtransitionmustgooneleveldeep
//updatethetemporary
Q_TRIGGER(s,Q_ENTRY_SIG);
//enterthestate
while
(0==Q_TRIGGER(s,Q_INIT_SIG))
//inithandled
//enterthesubstate
Q_TranDyc(QStatetarget)
QStateentry[8],p,q,s,*e,*lca;
(s=actState;
s!
=srcState;
)
QStatet;
t=Q_TRIGGER(s,Q_EXIT_SIG);
if
(t)
//exitactionunhandled,tpointstosuperstate
s=t;
else
//exitactionhandled,elicitsuperstate
s=Q_TRIGGER(s,Q_EMPTY_SIG);
*(e=&
entry[0])=0;
*(++e)=target;
//assumeentrytotarget
//(a)checksource==target(transitiontoself)
(srcState==target)
Q_TRIGGER(srcState,Q_EXIT_SIG);
//exitsource
goto
inLCA;
//(b)checksource==target->
super
p=Q_TRIGGER(target,Q_EMPTY_SIG);
(srcState==p)
//(c)checksource->
super==target->
super(mostcommon)
q=Q_TRIGGER(srcState,Q_EMPTY_SIG);
(q==p)
//(d)checksource->
super==target
(q==target)
--e;
//notentertheLCA
//(e)checkrestofsource==target->
super->
super...hierarchy
*(++e)=p;
(s=Q_TRIGGER(p,Q_EMPTY_SIG);
s;
s=Q_TRIGGER(s,Q_EMPTY_SIG))
(srcState==s)
*(++e)=s;
//(f)checkrestofsource->
super...
(lca=e;
*lca;
--lca)
(q==*lca)
e=lca-1;
//donotentertheLCA
//(g)checkeachsrcState->
super..foreachtarget...
(s=q;
(s==*lca)
Q_TRIGGER(s,Q_EXIT_SIG);
//exits
assert(0);
//malformedHSM
inLCA:
//nowweareintheLCAofsrcStateandtarget
assert(e<
&
entry[sizeof(entry)/
sizeof(*entry)]);
//entryfits
(s=*e--)
//retracetheentrypathinreverseorder
//enters
//updatecurrentstate
(0==Q_TRIGGER(target,Q_INIT_SIG))
assert(target==Q_TRIGGER(actState,Q_EMPTY_SIG));
target=actState;
Q_TRIGGER(target,Q_ENTRY_SIG);
//entertarget
3.
范例:
范例状态图
范例代码
QSTATEs0(QEVENT
*e);
QSTATEs1(QEVENT
QSTATEs2(QEVENT
QSTATEs11(QEVENT
QSTATEs21(QEVENT
QSTATEs211(QEVENT
QSTATEQ_Top(QEVENT
Initial(QEVENT
bool
bFoo;
QSignals{
A_SIG=Q_USER_SIG,
B_SIG,C_SIG,D_SIG,E_SIG,F_SIG,G_SIG,H_SIG
QEVENTtestQEvt[]=
{A_SIG,0,0},{B_SIG,0,0},{C_SIG,0,0},{D_SIG,0,0},
{E_SIG,0,0},{F_SIG,0,0},{G_SIG,0,0},{H_SIG,0,0}
int
main()
Hiberarchystatemachinetesting\n"
Initial(0);
//triggerinitialtransition
(;
;
)
c;
\nSignal<
-"
c=getc(stdin);
getc(stdin);
//discard'
\n'
(c<
'
a'
||'
h'
<
c){
return
0;
Q_Dispatch(&
testQEvt[c-'
]);
//dispatch
*e)
bFoo=
false;
Q_Init((QSTATE)s0);
*e){
(e!
=NULL)
switch
(e->
sig)
case
Q_ENTRY_SIG:
printf("
s0-ENTRY;
Q_EXIT_SIG:
s0-EXIT;
Q_INIT_SIG:
s0-INIT;
Q_INIT(s1);
E_SIG:
s0-E;
Q_TRAN(s211);
(QSTATE)Q_Top;
XX文库-让每个人平等地提升自我XX文库-让每个人平等地提升自我QSTATEs1(QEVENT
sig){
s1-ENTRY;
s1-EXIT;
s1-INIT;
Q_INIT(s11);
A_SIG:
s1-A;
Q_TRAN(s1);
B_SIG:
s1-B;
Q_TRAN(s11);
C_SIG:
s1-C;
Q_TRAN(s2);
D_SIG:
s1-D;
Q_TRAN(s0);
F_SIG:
s1-F;
Q_TRAN(s211);
(QSTATE)s0;
s11-ENTRY;
s11-EXIT;
G_SIG:
s11-G;
H_SIG:
//internaltransitionwithaguard
(bFoo)
{
//testtheguardcondition
s11-H;
break;
(QSTATE)s1;
QSTATEs2(QEVENT
s2-ENTRY;
s2-EXIT;
s2-INIT;
Q_INIT(s21);
s2-C;
s2-F;
s21-ENTRY;
s21-EXIT;
s21-INIT;
Q_INIT(s211);
prin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 层次 状态机 hsm 语言 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)