引 言
面向对象开发方法无疑是当前最流行
![](/icons/4965de.gif)
软件开发方法
![](/icons/4965dou2.gif)
这归功于面向对象开发
![](/icons/4965de.gif)
众多优点:可靠性高
![](/icons/4965dou.gif)
所开发
![](/icons/4965de.gif)
![](/icons/4965chengxu.gif)
更健壮;由于面向对象编程
![](/icons/4965de.gif)
可重用性
![](/icons/4965dou.gif)
可以在应用
![](/icons/4965chengxu.gif)
中大量采用成熟
![](/icons/4965de.gif)
类库
![](/icons/4965dou.gif)
从而缩短了开发时间;继承和封装使得应用
![](/icons/4965chengxu.gif)
![](/icons/4965de.gif)
修改带来
![](/icons/4965de.gif)
影响更加局部化
![](/icons/4965dou.gif)
应用
![](/icons/4965chengxu.gif)
更易于维护、更新和升级
![](/icons/4965dou2.gif)
另外
![](/icons/4965dou.gif)
UML建模语言和Rosc等CASE工具为面向对象
![](/icons/4965de.gif)
流行也起了很太作用
![](/icons/4965dou.gif)
这些工具允许应用规范
![](/icons/4965de.gif)
面向对象分析和设计
![](/icons/4965de.gif)
方法与理论
![](/icons/4965dou.gif)
远离纠缠不清
![](/icons/4965de.gif)
源代码
![](/icons/4965dou.gif)
使得构建和设计变得更直观、更容易理解与修改
![](/icons/4965dou.gif)
从而大大提高开发效率
![](/icons/4965dou2.gif)
嵌入式系统
![](/icons/4965de.gif)
应用越来越广泛
![](/icons/4965dou.gif)
嵌入式计算机在数量上远远超过了各种通用计算机
![](/icons/4965dou2.gif)
嵌入式软件
![](/icons/4965de.gif)
开发与PC软件
![](/icons/4965de.gif)
开发相比存在
![](/icons/4965yi.gif)
些特别
![](/icons/4965de.gif)
地方;①嵌入式软件代码往往要求高质量、高可靠性;②嵌入式软件要求尽可能短
![](/icons/4965de.gif)
二进制代码长度和数据长度
![](/icons/4965dou.gif)
尽管半导体技术
![](/icons/4965de.gif)
发展使处理器速度不断提高、片上存储器容量不断增加
![](/icons/4965dou.gif)
但在大多数应用中
![](/icons/4965dou.gif)
存储空间仍然是宝贵
![](/icons/4965de.gif)
;③嵌入式系统往往存在实时性
![](/icons/4965de.gif)
要求
![](/icons/4965dou2.gif)
这些特别要求使得面向对象开发不太适合嵌入式系统
![](/icons/4965dou2.gif)
汇编语言是
![](/icons/4965yi.gif)
种非结构化
![](/icons/4965de.gif)
语言
![](/icons/4965dou.gif)
对于大型
![](/icons/4965de.gif)
结构化
![](/icons/4965chengxu.gif)
设计已经完全不能胜任了
![](/icons/4965dou.gif)
而C语言相比其他高级语言具有明显
![](/icons/4965de.gif)
性能优势
![](/icons/4965dou.gif)
这些原因使得C语言成为嵌入式系统开发
![](/icons/4965de.gif)
最佳选择
![](/icons/4965dou2.gif)
随着后PC时代
![](/icons/4965de.gif)
到来
![](/icons/4965dou.gif)
嵌入式应用迅速增长
![](/icons/4965dou.gif)
应用
![](/icons/4965de.gif)
复杂性也急剧增加
![](/icons/4965dou.gif)
C语言对应
![](/icons/4965de.gif)
传统结构化设计方法已不能满足嵌入式软件设计和开发
![](/icons/4965de.gif)
需要
![](/icons/4965dou2.gif)
能不能把面向对象开发与C语言
![](/icons/4965de.gif)
优点结合起来?对这个问题
![](/icons/4965dou.gif)
已经有人提出过
![](/icons/4965yi.gif)
些方法
![](/icons/4965dou.gif)
主要集中在用C语言来实现C
![](/icons/4965jiajia.gif)
![](/icons/4965de.gif)
语法
![](/icons/4965dou.gif)
如用结构来模拟类
![](/icons/4965dou.gif)
用
![](/icons/4965hanshu.gif)
指针来表示成员
![](/icons/4965hanshu.gif)
![](/icons/4965dou2.gif)
这些方法使得本来语法就已经很复杂
![](/icons/4965de.gif)
C语言更加麻烦
![](/icons/4965dou.gif)
同时没有了C语言快速、高效
![](/icons/4965de.gif)
优点
![](/icons/4965dou2.gif)
这里提出
![](/icons/4965yi.gif)
种新
![](/icons/4965de.gif)
方法:用面向对象方法进行分析和设计
![](/icons/4965dou.gif)
最后直接用C语言进行编码
![](/icons/4965dou2.gif)
1 应用实例
绕线机控制系统是
![](/icons/4965yi.gif)
个控制两个电机
![](/icons/4965de.gif)
单片机控制系统
![](/icons/4965dou.gif)
我们使用本文提出
![](/icons/4965de.gif)
新开发方法进行这个系统
![](/icons/4965de.gif)
开发
![](/icons/4965dou2.gif)
系统采用瑞萨公司H8/300H系列
![](/icons/4965de.gif)
16位单片机H8/3062
![](/icons/4965dou.gif)
整个系统硬件结构如图l所示
![](/icons/4965dou2.gif)
单片机通过I/O口与Flash芯片、控制面板、扬声器以及电机驱动电路相连
![](/icons/4965dou.gif)
并通过光电编码盘检测直流电机转动
![](/icons/4965de.gif)
圈数
![](/icons/4965dou2.gif)
![](http://www.crazycoder.cn/WebFiles/200812/dbfa7610-fd7b-413f-a9e3-1abe62295be6.jpg)
作为面向对象建模
![](/icons/4965de.gif)
工业标准
![](/icons/4965dou.gif)
UML几乎被所有面向对象
![](/icons/4965de.gif)
软件项目所使用
![](/icons/4965dou2.gif)
这个项目也使用UML来建模
![](/icons/4965dou.gif)
用到
![](/icons/4965de.gif)
CASE工具是Rose
![](/icons/4965dou2.gif)
UML提供了5类图进行不同阶段
![](/icons/4965de.gif)
建模:用例图、静态图、行为图、交互图、实现图
![](/icons/4965dou2.gif)
在开发过程中
![](/icons/4965dou.gif)
可根据不同阶段
![](/icons/4965de.gif)
具体要求
![](/icons/4965dou.gif)
选择不同
![](/icons/4965de.gif)
图形来描述系统
![](/icons/4965de.gif)
静态结构模型或者动态行为模型
![](/icons/4965dou2.gif)
![](/icons/4965yi.gif)
般过程是:①用UML
![](/icons/4965de.gif)
用例模型确定目标系统
![](/icons/4965de.gif)
主要功能和行为
![](/icons/4965dou.gif)
以便准确、完整地识别系统
![](/icons/4965de.gif)
需求;②通过对用例模型
![](/icons/4965de.gif)
分析
![](/icons/4965dou.gif)
从用例
![](/icons/4965de.gif)
描述中识别反映问题域本质
![](/icons/4965de.gif)
类和对象
![](/icons/4965dou.gif)
并利用UML
![](/icons/4965de.gif)
类图以及类之间
![](/icons/4965de.gif)
关系揭示系统
![](/icons/4965de.gif)
结构和组成;③利用UML动态模型中
![](/icons/4965de.gif)
顺序图、协作图、状态图和活动图描述系统结构元素
![](/icons/4965de.gif)
动态特性和行为
![](/icons/4965dou2.gif)
1.1 需求过程
系统主要运行过程:①开机时
![](/icons/4965dou.gif)
步进电机自动对原点;②修改参数设置时
![](/icons/4965dou.gif)
单片机把修改值存入Flash;③启动键按下时
![](/icons/4965dou.gif)
直流电机开始转动绕线
![](/icons/4965dou.gif)
单片机通过光电编码盘检测转动圈数
![](/icons/4965dou.gif)
并控制步进电机按照设置
![](/icons/4965de.gif)
参数排线
![](/icons/4965dou.gif)
绕线完成后自动停止;④暂停键按下时
![](/icons/4965dou.gif)
直流电机停止绕线
![](/icons/4965dou.gif)
步进电机排完已转
![](/icons/4965de.gif)
舀数后停止;⑤复归键按下时
![](/icons/4965dou.gif)
系统重启
![](/icons/4965dou2.gif)
系统
![](/icons/4965de.gif)
参与者只有用户1个
![](/icons/4965dou.gif)
通过对系统需求
![](/icons/4965de.gif)
分析
![](/icons/4965dou.gif)
可以识别3个主要用例:开机、机器设置和绕线控制
![](/icons/4965dou2.gif)
通过对用例
![](/icons/4965de.gif)
进
![](/icons/4965yi.gif)
步分解
![](/icons/4965dou.gif)
得出系统
![](/icons/4965de.gif)
用例图
![](/icons/4965dou.gif)
如图2所示
![](/icons/4965dou2.gif)
![](http://www.crazycoder.cn/WebFiles/200812/1606c9d9-a470-4029-a89a-7aad1d9d9eed.jpg)
1.2 设计过程
完成需求分析之后
![](/icons/4965dou.gif)
进入设计阶段
![](/icons/4965dou2.gif)
这个阶段中
![](/icons/4965dou.gif)
以需求分析结果为基础
![](/icons/4965dou.gif)
找出系统所需要
![](/icons/4965de.gif)
类和对象以及其相互关系
![](/icons/4965dou2.gif)
针对嵌入式系统
![](/icons/4965de.gif)
特点
![](/icons/4965dou.gif)
面向对象
![](/icons/4965de.gif)
![](/icons/4965yi.gif)
些高级特性不能使用
![](/icons/4965dou.gif)
动态创建对象、派生和多态这样
![](/icons/4965de.gif)
特性会大大降低系统速度并增大代码空间和数据空间
![](/icons/4965dou.gif)
对瑞萨H8/3062
![](/icons/4965dou.gif)
这款单片机只有128KB
![](/icons/4965de.gif)
ROM和4KB
![](/icons/4965de.gif)
RAM
![](/icons/4965dou.gif)
节省每
![](/icons/4965yi.gif)
个字节都显得非常重要
![](/icons/4965dou2.gif)
通过对用例和系统结构分析
![](/icons/4965dou.gif)
识别出来
![](/icons/4965de.gif)
类和关系如图3所示
![](/icons/4965dou2.gif)
![](http://www.crazycoder.cn/WebFiles/200812/aca7cfd3-6284-481c-9d42-54ec7ea9fa1b.jpg)
出于可移植性
![](/icons/4965de.gif)
考虑
![](/icons/4965dou.gif)
所有类被分成3个层次:
最顶层是功能逻辑类
![](/icons/4965de.gif)
抽象
![](/icons/4965dou.gif)
MachineStting为机器设置类;Keys为按键类
![](/icons/4965dou.gif)
Displayr为显示类
![](/icons/4965dou.gif)
MotorController为电机控制器类
![](/icons/4965dou2.gif)
这些逻辑上
![](/icons/4965de.gif)
类与硬件无关
![](/icons/4965dou.gif)
便于以后硬件修改
![](/icons/4965dou.gif)
同时使得开发绕线机
![](/icons/4965de.gif)
不同版本变得非常容易
![](/icons/4965dou.gif)
如从平绕机到开发环行机
![](/icons/4965dou.gif)
从二轴绕线机到开发三轴绕线机
![](/icons/4965dou2.gif)
中间层是外围硬件类
![](/icons/4965de.gif)
抽象
![](/icons/4965dou.gif)
Flash为Flash存储类
![](/icons/4965dou.gif)
用于存储设置
![](/icons/4965de.gif)
参数;Speaker为扬声器类;Panel为面板类;DCMoto/为直流电机类;StepMotor为步进电机类
![](/icons/4965dou2.gif)
最底层是单片机及其内部功能模块类
![](/icons/4965de.gif)
抽象
![](/icons/4965dou.gif)
H8/3062为单片机类
![](/icons/4965dou.gif)
用于封装输入/输出口;Timer_KeyShake为按键防抖定时器;Timer_DCMotor为直流电机PWM脉冲产生定时器;Timer_DCCapture为直流电机圈数捕获定时器;Timer_StepMotor为步进电机PWM脉冲产生定时器
![](/icons/4965dou2.gif)
分这
![](/icons/4965yi.gif)
层可以使得变换单片机类型非常容易
![](/icons/4965dou.gif)
瑞萨H8/300H系列单片机在国内应用非常罕见
![](/icons/4965dou.gif)
之所以选用这款是为了与国外产品
![](/icons/4965de.gif)
竞争
![](/icons/4965dou.gif)
这样可以更快、更好地打开国际销路
![](/icons/4965dou.gif)
但在选择这款单片机
![](/icons/4965de.gif)
同时已经做好了移植到ARM内核单片机
![](/icons/4965de.gif)
准备
![](/icons/4965dou2.gif)
为了理解系统
![](/icons/4965de.gif)
动态行为
![](/icons/4965dou.gif)
还应该用顺序图、协作图、状态图和活动图对系统动态行为进行描述
![](/icons/4965dou2.gif)
状态图对嵌入式系统
![](/icons/4965de.gif)
设计尤其重要
![](/icons/4965dou.gif)
这里用其对MotorController
![](/icons/4965de.gif)
状态转换进行描述
![](/icons/4965dou.gif)
如图4所示
![](/icons/4965dou2.gif)
![](http://www.crazycoder.cn/WebFiles/200812/97d59b47-f5cd-4bb9-895a-b5c236246f21.jpg)
可以用时序图等对用例进行进
![](/icons/4965yi.gif)
步
![](/icons/4965de.gif)
分析
![](/icons/4965dou.gif)
“启动”按键按下后处理
![](/icons/4965de.gif)
时序图如图5所示
![](/icons/4965dou2.gif)
![](http://www.crazycoder.cn/WebFiles/200812/d6171961-f111-4ef7-9742-0a43112b7629.jpg)
建模过程不是
![](/icons/4965yi.gif)
个直线过程
![](/icons/4965dou2.gif)
它往往是
![](/icons/4965yi.gif)
个演化、迭代
![](/icons/4965de.gif)
过程
![](/icons/4965dou.gif)
不断地分析、评价、修改、再分析
![](/icons/4965dou.gif)
才可能得到
![](/icons/4965yi.gif)
个高质量
![](/icons/4965de.gif)
模型
![](/icons/4965dou.gif)
为高质量
![](/icons/4965de.gif)
软件打下基础