嵌入式软件中状态机的抽象与实现

合集下载

嵌入式软件工程的基本原理与方法(八)

嵌入式软件工程的基本原理与方法(八)

嵌入式软件工程的基本原理与方法嵌入式软件工程是计算机科学与工程学科中的一个重要分支,它专注于开发和设计用于控制和运行嵌入式系统的软件。

嵌入式系统是指集成了一定功能的计算机系统,被嵌入到其他设备或系统中,通常作为控制和操作这些设备或系统的核心。

1. 嵌入式软件的特点嵌入式软件与传统计算机软件有许多不同之处。

首先,嵌入式软件通常运行在资源受限的环境中,如微控制器或嵌入式处理器。

这意味着使用的内存和存储空间有限,对于算法和数据结构的选择必须仔细考虑。

此外,嵌入式软件常常需要实时性能,即要求在特定时间限制内完成任务。

因此,对于软件的性能和响应时间的要求更高。

2. 嵌入式软件工程的基本原理嵌入式软件工程是一门系统工程学科,涉及到软件的开发、测试和维护等方面。

它强调以下几个基本原则:a. 需求分析与规格说明。

在嵌入式软件工程中,明确和准确地定义需求是至关重要的。

由于嵌入式软件往往是为特定设备或系统开发的,因此对于软件的功能和性能要有清晰的定义和规定。

这可以通过详尽的需求分析和规格说明来实现。

b. 架构设计与模块化。

嵌入式软件通常由多个模块组成,每个模块负责不同的功能。

通过将软件分解成模块,可以提高开发效率和代码的可维护性。

同时,合理的架构设计可以确保系统的可扩展性和可靠性。

c. 测试与验证。

在开发过程中,对嵌入式软件进行全面的测试是不可或缺的。

这涉及到单元测试、集成测试和系统测试等多个阶段。

通过测试,可以发现和修复潜在的问题,并确保软件的质量和可靠性。

d. 项目管理与版本控制。

嵌入式软件工程往往是一个复杂的过程,涉及到多个开发者和多个迭代阶段。

因此,良好的项目管理和版本控制是必不可少的。

通过合理的计划和管理,可以提高开发效率并确保软件项目按时交付。

3. 嵌入式软件工程的方法根据上述原则,嵌入式软件工程采用了一些常用的方法和技术。

以下是其中几种常见的方法:a. 面向对象设计与开发。

面向对象设计和开发将系统视为一组对象的集合,每个对象都有自己的属性和方法。

状态机编程思路及方法

状态机编程思路及方法

状态机编程思路及方法以状态机编程思路及方法为标题,写一篇文章。

一、引言状态机是一种常用的编程思路,它可以将程序的状态和状态之间的转换清晰地表达出来,使代码更加易于理解和维护。

本文将介绍状态机的基本概念、原理和实际应用,帮助读者更好地掌握状态机编程思路及方法。

二、状态机的基本概念1. 状态状态指的是程序运行过程中的一个特定阶段或情况,可以是系统状态、对象状态或任务状态等。

状态机将程序的运行过程抽象成一系列离散的状态,这些状态之间通过事件进行转换。

2. 事件事件是触发状态转换的信号或条件,可以是用户的输入、系统的通知或其他外部因素。

当一个事件发生时,状态机会根据当前的状态和事件,决定应该转换到哪个新的状态。

3. 转换转换表示状态之间的切换,它是从一个状态到另一个状态的过程。

转换可以是确定性的,也可以是非确定性的。

确定性转换是指根据当前状态和事件,只能转换到一个确定的新状态;非确定性转换是指根据当前状态和事件,可能转换到多个新状态中的任意一个。

三、状态机的原理状态机的原理是基于有限状态自动机(Finite State Automaton,简称FSA)。

FSA由一组状态、一组输入符号、一组输出符号和一组转移函数组成。

状态机在某个状态下,根据输入符号,通过转移函数确定下一个状态,并输出相应的输出符号。

通过这种方式,状态机能够根据不同的输入,自动地在不同的状态之间切换。

四、状态机的实际应用1. 编译器编译器是一个典型的实际应用场景,其中的词法分析和语法分析阶段使用状态机来处理输入的字符序列。

状态机可以根据不同的字符,切换到不同的状态,从而实现对输入的有效解析。

2. 游戏开发游戏中的角色状态管理、敌人行为控制等都可以使用状态机来实现。

例如,角色可以有站立、行走、奔跑等不同的状态;敌人可以有巡逻、追击、攻击等不同的状态。

通过状态机,游戏开发者可以方便地管理角色和敌人的行为逻辑。

3. 设备控制在嵌入式系统中,状态机常用于对设备的控制和调度。

嵌入式 状态机 方法

嵌入式 状态机 方法

嵌入式状态机方法嵌入式状态机是一种常用的软件设计方法,它可以帮助开发人员更好地管理复杂的系统状态。

在嵌入式系统中,状态机可以用来描述系统的行为和状态转换,从而实现系统的自动控制和优化。

嵌入式状态机的基本原理是将系统的状态和状态转换定义为一个有限状态机(FSM)。

FSM由一组状态、一组输入和一组输出组成。

状态表示系统的当前状态,输入表示系统接收到的外部事件,输出表示系统对外部事件的响应。

状态转换则表示系统在不同状态下对不同输入的响应,从而实现系统的自动控制。

嵌入式状态机的设计过程通常包括以下几个步骤:1. 定义系统状态和状态转换。

根据系统的需求和功能,定义系统的状态和状态转换。

状态可以是离散的,也可以是连续的。

状态转换可以是确定的,也可以是随机的。

2. 实现状态机框架。

根据定义的状态和状态转换,实现状态机框架。

状态机框架通常包括状态转换表、状态转换函数和状态机控制器等组件。

3. 编写状态转换函数。

根据状态转换表,编写状态转换函数。

状态转换函数根据当前状态和输入,计算出下一个状态和输出。

4. 集成状态机框架和应用程序。

将状态机框架集成到应用程序中,实现系统的自动控制和优化。

嵌入式状态机的优点在于它可以帮助开发人员更好地管理系统状态,从而提高系统的可靠性和稳定性。

同时,状态机可以帮助开发人员更好地理解系统的行为和状态转换,从而更好地进行系统设计和优化。

嵌入式状态机是一种非常有用的软件设计方法,它可以帮助开发人员更好地管理系统状态,从而实现系统的自动控制和优化。

在嵌入式系统中,状态机已经成为一种常用的设计方法,它可以帮助开发人员更好地理解系统的行为和状态转换,从而更好地进行系统设计和优化。

c语言嵌入式状态机案例

c语言嵌入式状态机案例

c语言嵌入式状态机案例一、什么是状态机状态机是一种表示系统行为的抽象模型,它用于描述和管理系统的状态,以及它如何响应内部和外部事件。

它是一种有穷有限的自动机,它通过定义一组状态和转换来描述系统的行为,并且可以在这些状态间进行切换。

状态机在很多领域中都得到了广泛的应用,如计算机科学、电子工程、控制工程、机器人技术、网络编程、智能控制系统等。

二、C语言嵌入式状态机C语言是编程语言中最常用的语言之一,它可以用于编写简单的程序,也可以用于编写复杂的应用程序和系统。

随着微控制器(MCU)的发展,C语言已经开始进入嵌入式领域,并且很多嵌入式系统的开发都是由C语言完成的。

C语言嵌入式状态机是一种十分流行的状态机,它是基于C语言编写的状态机,用于控制嵌入式系统的行为。

它可以帮助开发者更好地控制嵌入式系统,从而让嵌入式系统更加稳定、可靠。

三、C语言嵌入式状态机案例C语言嵌入式状态机案例主要用于控制嵌入式系统的行为,它可以帮助开发者更好地控制嵌入式系统。

下面我们就来看一个C语言嵌入式状态机的案例,来更好地理解C语言嵌入式状态机的工作原理。

案例:控制一个可以控制灯的嵌入式系统要求:1.系统有两个状态:关灯和开灯;2.系统可以接收两种外部事件:按键按下和按键释放;3.当按键被按下时,灯会从关灯状态切换到开灯状态;4.当按键被释放时,灯会从开灯状态切换到关灯状态。

我们可以使用C语言编写一个状态机,用于控制上述的嵌入式系统。

首先,我们需要定义状态机的状态,即关灯和开灯两个状态:#define OFF 0#define ON 1然后,我们需要定义外部事件,即按键按下和按键释放:#define KEY_DOWN 0#define KEY_UP 1接下来,我们就可以编写状态机的代码了:int state = OFF; //当前状态void state_machine(int event){switch(state){case OFF:if(event==KEY_DOWN){state = ON;//把灯打开}break;case ON:if(event==KEY_UP){state = OFF;//把灯关闭}break;}}以上就是一个简单的C语言嵌入式状态机的案例,它可以帮助开发者更好地控制嵌入式系统的行为。

嵌入式系统的软件架构设计

嵌入式系统的软件架构设计

嵌入式系统的软件架构设计一、嵌入式系统软件架构设计的原则1.单一职责原则:模块化设计,每个模块负责独立的功能或任务,使得系统具有高内聚性和低耦合性,易于维护和拓展。

2.低功耗原则:嵌入式系统通常运行在资源受限的环境中,所以在设计过程中应考虑功耗的优化,如合理使用睡眠模式、降低组件工作频率等。

3.实时性原则:对于需要实时响应的系统,需要保证任务的实时性和可靠性。

可以使用实时操作系统,合理分配任务优先级,提供正确的调度机制。

4.可靠性原则:嵌入式系统通常运行在无人值守的环境中,对于需要长时间运行的系统,需要考虑到系统的稳定性和错误处理机制,如保证数据一致性、异常处理等。

二、常用的嵌入式系统软件架构模式1.分层结构:将系统划分为若干层,每一层负责特定的功能或任务。

上层可以调用下层的服务,实现系统的复用和模块化设计。

常见的分层结构有应用层、服务层、驱动层等。

2.客户端-服务器模式:将系统拆分为客户端和服务器,客户端负责用户界面和输入输出处理,服务器负责核心业务逻辑和数据处理。

这种模式适用于需要分布式处理和网络通信的系统。

3.事件驱动模式:通过订阅和发布机制,实现模块之间的高效通信和数据传递。

当一个模块触发一个事件时,相关的订阅者可以接收并处理这个事件。

这种模式适用于需要实现松耦合的模块间通信的系统。

4.状态机模式:系统根据不同的状态进行不同的处理,通过定义状态转换规则,可以实现系统的复杂逻辑控制。

这种模式适用于需要根据不同状态处理不同事件的系统,如自动控制系统。

三、嵌入式系统软件架构设计的指导1.准确定义需求:在设计阶段之前,清楚地定义系统的功能需求、性能需求、可靠性需求等,并根据需求确定软件架构的基本模型和模式。

2.模块化设计和接口定义:将系统划分为若干独立的模块,并定义模块之间的接口和通信机制。

模块化设计可以提高系统的复用性、拓展性和维护性。

3.确定关键任务:对于需要实时响应的系统,需要确定关键任务,并按照优先级进行调度。

状态机编程思路及方法

状态机编程思路及方法

状态机编程思路及方法状态机是一种常用的编程思路和方法,用于描述系统或对象在不同状态下的行为和转换。

它可以帮助开发人员更好地理解和设计复杂的系统,并在实际应用中提高代码的可读性和可维护性。

本文将介绍状态机的基本概念、应用场景以及实现方法,并通过示例代码来说明其具体应用。

一、状态机的基本概念状态机,又称有限状态机(Finite State Machine,FSM),是一种计算模型,用于描述系统或对象的状态和状态之间的转换。

它由一组状态、一组转换规则和一个初始状态组成。

1. 状态(State):状态是系统或对象的某种特定情况或属性,可以是一个离散的值或一个更复杂的数据结构。

在状态机中,状态用于描述系统或对象所处的不同状态,例如开机、关机、运行等。

2. 转换(Transition):转换是状态之间的切换过程。

它可以由外部事件触发,也可以由内部条件满足时自动触发。

转换可以是简单的一对一关系,也可以是复杂的多对多关系。

在状态机中,转换规则定义了从一个状态到另一个状态的条件和操作。

3. 初始状态(Initial State):初始状态是系统或对象的初始状态。

在状态机中,初始状态是状态机开始执行时所处的状态。

二、状态机的应用场景状态机广泛应用于各个领域的软件开发中,特别是在需要处理复杂逻辑和状态转换的场景下。

以下是一些常见的应用场景:1. 交通信号灯控制:交通信号灯的状态可以有红灯、黄灯和绿灯,它们之间的转换规则由交通规则和时间控制。

2. 游戏角色行为控制:游戏角色的行为可以有站立、行走、跳跃等,它们之间的转换规则由玩家输入和游戏逻辑控制。

3. 订单状态管理:订单的状态可以有待支付、已支付、待发货、已发货等,它们之间的转换规则由用户行为和系统逻辑控制。

4. 业务流程管理:业务流程的状态可以有开始、进行中、暂停、结束等,它们之间的转换规则由业务规则和用户操作控制。

三、状态机的实现方法状态机的实现方法有多种,可以使用面向对象编程、函数式编程或表驱动等方式来描述和实现状态和转换规则。

嵌入式操作系统_第3章 任务结构、状态、优先级、代码结构、任务控制块及链表、任务堆栈

嵌入式操作系统_第3章 任务结构、状态、优先级、代码结构、任务控制块及链表、任务堆栈
II就是一个能对这些小任务的运 行进行管理和调度的多任务操作 系统。
从应用程序设计的
角度来看, μC/OS-II的任务就 是一个用户编写的 C函数和与之相关 联的一些数据结构
内存
在内存中应该 存有任务的代 码和与该任务 配套的堆栈
任务代码 任务堆栈
而构成的一个实体。
进程的状态
运行态 就绪态 等待态(阻塞态)
程序通过访问它来了解CPU的利用率, 所以这个系统任务OSTaskStat( )叫做 统计任务
任务及的优优先先级权别 用O常明常使O个固O应把计别OSSSS户_数应数用_定_用优任是_CLLL可F用一的OO地O程先务:OGWSWW权 一 表 优 则 低以.程旦优E_μ,E序级,E0HSLCSS,个先表分 示根序被先T中O系T中别因T/_W__1O级级示为 。据中定级P通E统P还此PO,SRSRRS别别任应任义I过T数6_总I使用I2_O_4IOO…L用务,为给P,I务都最字个是用户自-ORO1W把程优则:表I共把了任动S个E的用高优0O_S表任序先意示赋0O最统务赋LT优一,先S,O_示务的级味最_值低计可给WP先个数级L1ER需别着低O,的任的优任以空SIW级数字别TO要的系优E2方务优先务使闲_-S,别字P1越,,数 统先T法级, 用任R自的先_…I越来大每在目中级P,别系的务O动R…-文。可别I来统优。2赋O,,件该供的+说则先如给1共会级果统
任当务控应制用块结程构序的主调要用成员函数OSTaskCreate( )
任务及控任制务块控(O制S_块TC链B)表 t…y创统进任务控这表…pOssIII数具链的表…etNNtNdrr…S建函行务控制个的TTTuue任_会有接任。fcc188Stts任 任 制 认务6UUT一数初从制块任头μ栈务理控tooUr当由按相为务即Kuss控__c个始空块各务部O务务块和ttt制C的*指有制cc进于用应一,相oSObbOOOs/块任化任,个控T_S**SSS控的的管行这户数个故当t针关优OT块OOC链TTTcbC务。务然成制BCCSCSS表系 些提量链这于BTT{BBBI制 身 任理、的先-SCCDPS时这控后员块ntItBBr统任供的表个是lkiayi块 份 务的PNPot任 属级I;,个制用进链t;;rte初务的任。链一re用x///;vt///就 证 是这函块任行入(任任任/;;务 性别//始控任务表些指///指务务务来指个数链务赋到)向相 , 不的 的化制等向务控叫空等的的向来任记函首表的值任后待当优前时块数制做白当 没 能务为当 表一一的前先一空数先获属,务堆录,还个为块空的时状级个任任于 有 被栈前 就些会为取性最控任限态别任务初没系并任身任栈务务标(务是 任 系控状 叫与调 被 一对 后 制顶始有控统把务 份志节控控制务的用创个任再块制拍一务统制态做任块化对创它块证指制块数块的链系建任务把链针个控承函应的建们链。)、任务的块表指堆指任管务针针

有限状态机在嵌入式软件中的应用

有限状态机在嵌入式软件中的应用

。i 『 状态和输入事件 的不同,选 择如何处理 该事 态 。每 一个 主 状 态 是 独 立 的 。状 态机 的状 态 是 以 件 以及 是否 需要转 换到 下一 个状 态 。 堆栈的方 式来存储 的。每一个状态返『 下列三个 Ⅱ I 有 限状 态机 (S 是 一个 元 组M:Q ∑, 值之 一 : F M) (, 6 , ,) q Z ,其 中 : 0 前状 态 ;
・ Z∈ Q是 终结状 念 的集 合 。 有 限状 态 机 一 般 有 两 种 表 示 方 式 :状 态 转 移
次 再 次进 入 到 该主状 态 时 , 至 于立 即退 出 而 要
收稿 日期 :2 0 .ol 0 51- 1 作者简介 :魏先民 (99一 ) 16 ,男, 山东临朐人 ,潍坊学院计算机 与通信工程 学院讲 师。
嵌入式软件中的复杂情况也大有裨益。在设 计阶
段 ,开发 人 员可 以利 用 状 态 机 模 型 来描 述 复 杂 的 系 统 ,能 大 大缩 短 嵌 入 武 系 统 项 目的 丌 发周 期 ,
并且 易于维护 。 2 传 统的有 限状 态机 .
有限状态机是一种具有离散输入输 出系统的 模型,它在任何 时刻 ,都处于一个特定 的状 态。
维普资讯
第6 卷第 4 期
2o O6年 7月
潍坊 学院 学报
J u lo i 2 Un v r i o ma f We f ie s
Vo . . 1 No 4 6
J1 0 6 u. 0 2
有 限状态机在嵌入式软件 中的应用

2 4.
维普资讯
做 初始 化的 T作 ; () l调 用 它 的主 状 念 或 者指 定 的主 状 态 , 2返 l u l 状 念机 能够 继续 进行 处 理 。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

收稿日期:2003-04-15;修订日期:2003-07-08 作者简介:熊振云(1979-),男,云南大理人,硕士研究生,主要研究方向:实时嵌入式系统; 阮俊波(1974-),男,湖北人,博士研究生,主要研究方向:实时嵌入式系统; 金惠华(1938-),男,博士生导师,主要研究方向:实时嵌入式系统、容错技术.文章编号:1001-9081(2003)10-0084-03嵌入式软件中状态机的抽象与实现熊振云,阮俊波,金惠华(北京航空航天大学计算机学院,北京100083)摘 要:文中提出了在嵌入式软件中把状态机作为一个独立模块从控制模块中抽象出来的思想,描述了抽象出来的状态机模块。

并介绍了如何将这种状态机抽象模块应用到实际项目中。

关键词:嵌入式软件;状态机;模块化中图分类号:TP311 文献标识码:AAbstract State Machine in Embed Softw areXI ONG Zhen 2yun ,RUAN Jun 2bo ,J I N Hui 2hua(Computer Science and Engineering School ,Beihang Univer sity ,Beijing 100083,China )Abstract :This article brings forward an idea that abstracting state machine from control m odule in embed s oftware and describes the abstract state machine m odule.It als o talks about how to use this kind of abstract state machine in a project.K ey w ords :embed s oftware ;state machine ;m odularization1 引言从传统的工业控制到人们日常生活中的电视、手机,到处都可以见到实时嵌入式系统的应用。

实时嵌入式系统与普通计算机系统的差别首先是资源较少,其次是系统不仅要保证计算产生正确结果,而且还要保证在规定时间内产生结果。

在开发嵌入式实时系统的软件时,经常需要用多个状态来描述系统的行为。

这些状态的状态变化和转移形成了状态机。

如果能抽象出一种通用的状态机模型,则可减轻嵌入式软件开发人员的工作负担,同时提高软件的可读性,增强软件的可维护性和可扩充性。

2 抽象状态机的意义在实时程序中,执行速度和各事件之间的配合是非常重要的,但软件中的结构化设计和数据隐藏等方法也同样十分重要。

如果在处理速度、硬件资源和开发工具允许的范围内充分将软件划分为各个独立的模块,将可以提高程序的可维护性,并为软件升级奠定良好的基础。

虽然在嵌入式实时软件中常用的开发语言———C 语言不直接支持模块,但可以把一个文件当作一个模块来处理。

在C 语言中,被说明为是静态函数和静态变量的内容,可以被同一文件内的其它例程调用,而不能由文件外的程序调用[1]。

在不支持静态声明的应用中,也可以人为的规定不作外部引用(或除少数特殊应用外不作外部引用)。

待组织成不同的模块文件后,可用头文件的形式说明函数和变量类型,以便模块间相互调用。

用这种方式构造的典型的模块文件的组织形式如下[1]:包含头文件说明函数和变量;说明全局变量;说明模块内的函数原型和变量;接口或输入函数的源代码;初始化函数的源代码。

在实际的工程应用中,比较容易就可以将诸如主程序模块、控制程序模块之类的功能抽象出来,却往往习惯将状态机的处理混入控制程序模块中。

如果这么做,将会在控制程序模块中引入大量的变量赋值和条件判断,增大软件开发的难度并给系统带来安全隐患,因为开发人员可能会弄不清楚变量的意义而不得不反复查阅设计文档,或者因混淆众多变量而错误的对某些变量进行赋值。

这种情况在系统开发后期尤为明显。

在工程实践中发现:可以将状态机作为一个单独的模块抽象出来。

这样做的好处是进一步增强了软件的可读性,而且状态机模块作为一个独立模块,可以在其它工程项目中实现代码级的软件重用,甚至可以影响到设计级的重用。

3 抽象状态机介绍3.1 设计思路图1不同项目中的状态机可谓是千变万化,我们总结发现:一般情况下,状态机如图1所示(Mealy 机模型[2]),表现为由现态在条件触发下进行事务处理,然后进入次态,等待下一个(次)触发条件。

为了方便的把状态机映射到一个数据结构上,可以将各个状态抽象为状态表示和状态对触发条件的反应,将这二者的组合称为状态节点。

这样,程序中的状态机就可以用一个状态节点的集合和现态加转移触发表示。

因为任何M oore 机模型都可以转换为Mealy 机模型,所以这种抽象是具有通用性的。

在状态机的抽取中,使用了C 语言加以实现并遵循上面第23卷第10期2003年10月计算机应用C om puter ApplicationsVol.23,No.10Oct.,2003提到的模块化文件的典型组织形式。

3.2 数据结构定义依照在设计思路里提到的表示方法,用下面的数据结构定义表示状态节点:typedef struct{uchar uS tate ;v oid (3lfInit )(v oid );v oid (3lfM ain )(v oid );//状态的处理函数}ST M -ST ATE ,3PST M -ST ATE;其中,uS tate 是状态表示,它与真实状态间是一一对应的;lfInit 是状态的初始化函数,它可为状态中用到的静态变量赋初值,并为应用扩展留下了空间;lfMain 是状态的处理函数,它完成状态的职能,并实现状态的转移(完成现态的改变)。

lfInit ,lfMain 两个函数是与具体应用相关的,所以它们的实现在调用状态机模块的控制程序模块中完成。

为描述一个状态机,还需要定义一个含有所有状态节点信息和状态机现态信息的数据结构———状态机描述,其定义如下:typedef struct {uchar nOldS tate ;//上一个状态uchar nCurS tate ;//当前状态uchar nIndex ;//现态索引,状态在状态节点向量表中的位置PST M -ST ATE pS tates ;}ST M -M AIN ,3PST M -M AIN ;其中,nCurS tate 是状态机的当前状态;pS tates 是指向状态节点向量表(状态节点数组)的指针,该表包含了所有该状态机的状态节点。

图23.3 接口函数说明模块是一个具有固定接口的黑盒子[1]。

抽象出的这个状态机模块也有其固定的接口:首先是整个状态机的初始化函数ST M -Init ,它主要完成状态机描述对象中属性的初始化及它和状态节点向量表的关联。

其次是状态机的派发函数ST M -Dispatch ,它在触使状态机发生转移的事件到来时被调用(通常是在中断处理函数或在消息循环中)。

该函数先对现态及现态处理函数的合法性进行检查,然后调用现态处理函数。

最后是状态转移函数ST M -T o ,它完成状态描述对象中上一个状态、现态、现态索引的更新;同时,它检测是否进入一个新状态,如果是则调用该状态的初始化函数。

该函数仅在各个状态的处理函数中及设置状态机初始状态时被调用。

3.4 抽象状态机使用模型开发者在使用抽象状态机时,遵循如图2所示的使用模型。

其中,初始化和状态派发处于开发程序的内核部分,用户只要在适当时候调用即可;状态转移加事务处理部分处于用户程序部分,需要用户自己实现。

4 应用举例在某公司的一套嵌入式实时软件中,上述的状态机模块得到了运用及证明。

下面通过该实例讨论抽象状态机在具体项目中的应用。

4.1 工程中的状态机描述如表1所示,工程中的状态机有八个状态,七个触发条件,表格中的数字表示状态在特定触发条件下转向的状态,空缺表示状态在该触发条件下不发生转移;状态机的初始状态为状态0。

表1状态触发条件条件1条件2条件3条件4条件5条件6条件70111235214314234105351010101111235114.2 工程中的状态机实现在设计中提到,抽象状态机的使用者需要将各个状态的职能写成函数,然后将这些函数的信息填到状态节点向量表里,最后,调用状态机初始化函数ST M -Init ,将状态节点向量表与状态机关联起来。

程序实现中,在控制模块里声明并实现了以下函数:v oid TEXT -S tate0Init (v oid );v oid TEXT -S tate0D o (v oid );v oid TEXT -S tate1Init (v oid );v oid TEXT -S tate1D o (v oid );∗∗v oid TEXT -S tate11Init (v oid );v oid TEXT -S tate11D o (v oid );v oid TEXT -Reserve (v oid );其中,TEXT -Reserve 函数为空函数,作为保留扩展用。

同样的,在控制模块中,还给出了状态节点向量表:ST M -ST ATE code S tmS tates[]={{0,TEXT -Reserve ,TEXT -S tate0D o},{1,TEXT -S tate1Init ,TEXT -S tate1D o},∗∗{11,TEXT -S tate11Init ,TEXT -S tate11D o},{0x ff ,TEXT -Reserve ,TEXT -Reserve}};其中,最后一个数组变量是为了标识数组结束而设置的空状态。

在控制模块的初始化函数中,先后调用了状态机模块提供的状态机初始化函数ST M -Init (&S tmS tateCtl ,S tmS tates )和状态转移函数ST M -T o (&S tmS tateCtl ,0):初始化函数中的S tmS tateCtl 是状态机描述类型ST M -M AI N 的变量,相当于面向对象思想中类的对象实例;S tmS tates 就是前面描述的状态节点向量表。

转移函数的作用是设置初始状态为状态0。

在控制模块的消息循环中,调用了状态机模块的消息派发函数:ST M -Dispatch (&S tmS tateCtl );这保证了每一个触发条件都能得到正确、及时的响应。

4.3 性能比较该工程的程序规模为5000行左右的C 语言源代码,其中58第10期熊振云等:嵌入式软件中状态机的抽象与实现涉及到状态机的部分约为1000行;程序最终运行在PHI LIPS 的89C58单片机上,时钟频率为24MH z。

相关文档
最新文档