本文将探讨如何使用UML状态机向导来开发和模拟跨平台嵌入式系统。嵌入式系统是专用计算机,通常内置于设备中,使用微控制器,这些微控制器在单个设备上集成了计算机的多种功能。嵌入式系统需要与特定硬件紧密协作,并且必须在预定的时间内响应外部交互,通常是实时的。
许多嵌入式系统应用程序自然而然地适合以状态机的形式组织。一个必须按顺序执行一系列动作或根据不同的状态处理输入的程序,通常最好实现为状态机。因此,大多数嵌入式系统支持基于状态机的设计,其中可以在单个状态下接收多个事件。下一个状态由接收到的事件的内容决定。状态机提供了一种非常灵活的机制来处理异步事件交互,但这种灵活性也带来了自身的复杂性。
Visual C++是一个强大的软件开发工具,但它主要针对开发Windows特定的应用程序。UML状态机向导作为Visual C++的插件,为嵌入式系统的开发和在Visual C++开发环境中的模拟提供了统一建模语言(UML)状态机编程机制。模拟和调试后,开发者可以将程序迁移到目标工作环境,几乎不需要额外的投资或努力。
状态机可以通过多种方式展示,从简单的表格到图形动画插图。状态机向导以两种方式展示和组织状态机:状态树和状态图。状态机向导定义了一组特定的宏作为状态机映射数据。这些宏映射到状态枚举、事件处理函数声明、状态的事件处理表、状态树定义和应用程序变量定义。在以下源文件中,状态机向导生成了以下宏来定义PowerUpDown应用程序:
// PowerUpDown.c
SME_BEGIN_STATE_DEF(PowerUpDown, PowerUpDown)
/*
{{SME_STATE_DEF(PowerUpDown, PowerUpDown)*/
SME_STATE_ENTRY_FUNC(PowerUpDownEntry)
SME_STATE_EXIT_FUNC(PowerUpDownExit)
SME_ON_EVENT(EVENT_KEY_LEFTSOFT, OnPowerUpDownEVENT_KEY_LEFTSOFT, SME_INTERNAL_TRAN)
SME_ON_EVENT(EVENT_KEY_RIGHTSOFT, OnPowerUpDownEVENT_KEY_RIGHTSOFT, SME_INTERNAL_TRAN)
/*
}}SME_STATE_DEF*/
SME_END_STATE_DEF
// 更多状态定义...
状态树向导定义了PowerUpDown应用程序的状态树,如图1所示。应用程序项目包括DialogCtrl、MenuCtrl和PowerUpDown应用程序。PowerUpDown应用程序由(PowerUp (Idle, MenuSurf, Function), PowerDown)状态组成。
状态图为提供了应用程序逻辑结构和流程的“鸟瞰图”。它以图形方式构建状态层次结构,将子状态嵌套在其父状态内。状态图的另一个主要优势是它显示了每个状态的转换,以从一个状态到另一个状态的箭头形式显示。
在开发嵌入式系统应用程序时,有两个线程:一个线程是应用程序开发,另一个线程是模拟器开发。在每个开发线程中,可以将其划分为以下三个阶段: