初级会员

- 积分
- 57
- 金钱
- 57
- 注册时间
- 2015-4-21
- 在线时间
- 0 小时
|

楼主 |
发表于 2015-6-12 21:14:05
|
显示全部楼层
回复【19楼】倒拔萝卜:
---------------------------------
先给你的专业分析点个赞!这个标题的确不对,应该改为FSM,我给的例子,只是为便于理解,是个原型,实际应用比如单片机上,只需把BestStateMachine(&var)这个放到定时器中断或者某个线程里面周期调用就可以了,至于事件驱动,比如用户按键事件在状态函数里面判断I/O状态就可以了啊,那个void*参数都可省了,如果你觉得这还不对,那好,我在这里用数组模拟个
int event_queue[]={1,2,2,0,0,4,4,4,0,0};//不同数字代表不同事件
typedef struct _SM_VAR //对状态机参数封装
{
int cnt;
int current_event;//加个变量做事件缓存
}SM_VAR;
int main(void)
{
SM_VAR var;
int i;
for (i = 0; i <= 8; i++){ //实际以下四行代码应当放到定时器中断,或某一线程,再不就while(1),状态机总得有个时钟吧
lock_acquire(eq_lock);//上锁,这个根据实际实现
var.current_event=event_queue;//读取事件
lock_release(eq_lock);//解锁
BestStateMachine(&var);//传入事件
}
return 0;
}
事件怎么用,在不同状态的Guard定义和Action就根据实际情况了,而且你也可以在Action中分发事件,这里就不赘述了。还有这个并不能实现HSM,这种复杂的东西我想必须有良好的数据结构做支撑,以后有时间我会研究。 |
|