1 引言
本报告介绍关于用Esterel语言开发嵌入式软件的一项实验。
2 Esterel语言简介
所有以计算机为基础的系统可分为三类:
l 转换系统:根据输入计算输出,然后结束,如绝大部分的数值计算软件、工资管理软件、编译系统。
l 交互系统:与外界环境进行不停的交互处理,如操作系统、数据库、互联网。
l 反应系统(reactive systems):不停地响应外界环境的激励,它与交互系统的不同之处是前者纯粹是由输入驱动的,其典型例子是过程控制系统、信号处理系统。
交互系统和反应系统需要并发程序设计。过去认为,一些典型的并发编程语言如CSP、OCCAM、Ada可满足交互系统和反应系统的需要。但是,实际上反应系统与交互系统是有区别的,因此最好有专门针对反应系统的程序设计语言。
上一世纪的80年代出现的同步语言(Synchronous Language)即是以反应系统为应用领域的一族程序设计语言。
Esterel语言是同步语言族中的一个成员。它适用于以控制处理为主的反应系统(其它一些同步语言适用于以数据处理为主的反应系统),如:
l 制造和运输中的实时过程控制
l 嵌入式系统
l 通信协议处理
l 外围设备的驱动程序
l 硬件粘合逻辑和控制器
l 人机接口
用Esterel语言编写的程序可以通过正确性证明的方法来验证。
3 Esterel语言应用实验
法国Esterel公司提供一个免费的Esterel语言编译和调试工具。笔者利用该工具做了一个实验。
实验对象是某控制板软件。该软件有65条需求,要完成以下功能:
a) 控制子系统的通/断以及2个开关的状态记录;
b) 采样检测外部16路离散开关信号;
c) 通过串行通讯口向主机报告各种参数及接收控制指令;
d) 自检测。
该软件用8031汇编语言编程。源代码行数是5000行(含少量注释行),目标码规模是13.5K字节。
笔者用Esterel语言和C语言改写了该软件,所实现的功能完全等价,但按Esterel语言的特点重新设计了控制流程。Esterel程序经编译后产生C程序,然后用C51编译工具生成目标码,其规模为27K字节。
用Esterel语言和C语言写的程序与用汇编语言写的程序相比,源代码的规模减少了50%,目标代码的规模增加了1倍,但仍在目标机容量范围之内。
根据软件工程的原理,用任何编程语言写一行源代码所化的工作量大体是相同的。因此源代码规模的减少对于开发、维护是有积极意义的。
该软件用Esterel仿真调试工具进行了调试,但编译连接生成的目标码没有在目标机上实际运行。
通过这项实验,主要有以下体会:
a) Esterel语言的并发性使设计人员可集中精力考虑高层的控制流问题,而不需要考虑并发的实现细节;
b) Esterel语言能检测控制流错误,而传统的编程语言无法检测这种最令开发者头疼的错误;
c) Esterel语言的仿真调试工具与传统编程语言的符号调试工具有很大差别,前者更容易使用;
d) Esterel语言的数据处理能力很弱,这是一个突出的局限性。
后记
该实验完成于2003年6月。