资源描述:
《嵌入式系统中的状态机设计心得》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、嵌入式系统中的状态机设计心得 2010-08-0522:39:32
2、 分类:状态机
3、 标签:
4、字号大中小 订阅在使用iTRON类OS的嵌入式系统中,除了驱动程序以外,大多数模块也就是中间件和应用程序是以任务(TASK)的形式设计的。而iTRON类OS大多采用C语言实现,于是用状态机的方式实现功能模块成为了主要的设计方法。至于说面向对象,只要是稍微严谨一点的嵌入式系统,设计上要求程序完全覆盖所有的可能情况。程序不可能在紧急情况下抛出异常等待调试。同时由于对硬件和其它应用模块的往往具有严重的耦合性,代码的重用和扩展也不是那么随心所欲。当然还有基于语言的
5、执行速度之类的考虑。这种情况下C语言往往取代大多数现代语言成为了主角吧。iTRON类OS的任务间通讯一般通过两种方法,事件(EVENT)或者消息(MESSAGE)。事件处理快捷,但是无法附带任何参数且不能叠加。消息虽然传递稍慢,不过却可以通过内存池等方式附带一定数量的参数。而且多个同样的消息可以累积在消息栈中依次处理。如果形象得比喻一下:事件就是一串比特码,由特定为的0或1状态来判断事件是否发生,而任务以它自己的优先级别处理各种事件。消息就是一个缓冲区,OS以FIFO的方式把消息依从旧到新的顺序分发给任务进行对应处理。说到这里,我想强调一下本文讨论的重点
6、是通过状态机的方式处理消息的模型。至于事件的对应,可能今后会另外展开讨论。一个由OS管辖的嵌入式系统中的应用模块,在程序角度上是没有main函数,也不会被退出的(除非切断电源)。只要做过任何GUI程序,就不难理解这一点。程序被执行的瞬间,OS调用程序的初始化部分(Initialization),然后每隔一个固定的时间片程序的执行部分(Execute),当程序被关闭时休止部分(Exit)会被调用。而嵌入式系统与桌面GUI系统的不同之处在于:系统的电源被加载,OS完成初始化动作之后,往往会启动一个电源管理模块,而这个模块则会调用所有应用模块的初始化部分。另一
7、方面,OS或者电源管理模块在监测到电源即将被切断时,则调用所有应用模块的休止部分。在系统正常运行时,OS会依据各个任务的优先级依次调用它们的执行部分,并且向它们分发各自所属的消息。应用模块在收到消息后并不是立刻进行处理。设计良好的应用模块往往内部划分为多个状态,简单来说可以有种四到五种状态:睡眠状态,初始状态,空闲状态,繁忙状态和故障状态。当然了,根据不同的设计要求可以做相应的修改和扩充。应用模块内部根据不同的状态和可能接收到的所有消息编织出一张状态对应表。在表中填入适当的函数指针以响应不同状态下对各种消息的处理过程。这就是嵌入式系统中普遍的状态机模式。
8、举一个状态机实现的简单例子:我们将建立一个假象的小机器人,这个机器人能坐能走还能打架,打坏了还能自己修复。我打算用状态机的模式来实现这些功能的框架。/*机器人能接受的事件*/enum{EVENT_POWERON=0,EVENT_POWEROFF,EVENT_WALK,EVENT_FIGHT,EVENT_REST,EVENT_REPAIREVENT_SIZE};/*机器人的状态*/enum{STATUS_SLEEP,STATUS_INITIAL,STATUS_NORMAL,STATUS_FIGHTING,STATUS_BROKEN,STATUS_MAX};
9、/*状态机函数指针的原型*/typedefvoid(*MATRIX_FP)(constvoid*)/*状态机函数表格*/constMATRIX_FPs_Robot_Matrix[EVENT_SIZE][STATUS_SIZE]={/*EVENT_POWERON*/{Robot_PowerOn,Robot_NoProcess,Robot_NoProcess,Robot_NoProcess,Robot_NoProcess},/*EVENT_POWEROFF*/{Robot_NoProcess,Robot_PowerOff,Robot_PowerOff,Rob
10、ot_PowerOff,Robot_PowerOff},/*EVENT_WALK*/{Robot_NoProcess,Robot_NoProcess,Robot_Walk,Robot_Walk,Robot_NoProcess},/*EVENT_FIGHT*/{Robot_NoProcess,Robot_NoProcess,Robot_BattleMode,Robot_Fight,Robot_NoProcess},/*EVENT_REST*/{Robot_NoProcess,Robot_NoProcess,Robot_Rest,Robot_NormalMo
11、de,Robot_NoProcess},/*EVENT_REPAIR*/{Rob