解释型单片机应用程序的研究*
2010-10-23陆宇霆臧珠萍欧阳文斌曾培峰
陆宇霆,臧珠萍,欧阳文斌,曾培峰
(东华大学a.计算机科学与技术学院;b.信息科学与技术学院,上海 201620)
解释型单片机应用程序的研究*
陆宇霆a,臧珠萍a,欧阳文斌b,曾培峰a
(东华大学a.计算机科学与技术学院;b.信息科学与技术学院,上海 201620)
采用配置文件定义系统处理和功能,提出一个组态简单、易于功能调整和系统升级的解释型单片机系统.按照业务逻辑编写的脚本文件以XML格式存储于SD(Secure Digital)卡中,脚本程序被单片机读入内存后,经解释器解释,调用系统软件中相应API(App lication Program Interface)函数,执行指定功能.建立在硬件层和系统软件层之上的单片机解释系统,对业务逻辑的编写、更改和实现更为方便.
脚本;解释型;应用程序;单片机;XML
传统的单片机应用软件主要为编译型,具有执行效率高、运行速度快的特点,但是编程人员需具备较强的编程知识和业务知识,程序的编写、编译、调试和下载是一个相对比较复杂的过程.
如果应用软件由脚本语言编写,通过解释器逐行读取、逐行解释执行,虽然相对于编译型软件运行速度较慢,但是脚本程序直观易懂、结构简单,与单片机系统的底层硬件无关,在不同的平台上只要有相应的解释器支持就可以实现相同功能,大大增强了应用软件的平台无关性和可移植性,因而在对运行速度要求不高的系统中有一定的应用价值.
近年来单片机技术发展迅速,运算速度和内存空间不断提升,这使得解释型应用软件在单片机应用中有了用武之地.新型的单片机测控装置具有可裁剪的微型脚本语言解释器,使其可以运行简单的脚本语言,提高了单片机的使用灵活性、可扩展性和自动化程度[1].文献[2]给出了基于嵌入式操作系统浏览器的JavaScrip t语言解释器的设计与实现方法,提出并实现了一种扩展的算符优先算法.在单片机中使用解释语言编写程序的结构,即将系统内对输入、输出部件的控制及其他所需动作,用相应的“指令代码”表示,主体程序对代码进行“解释”,并执行相应的动作[3].文献[4]采用xml描述业务逻辑,并实现基于xml脚本的业务解释器.
单片机控制系统中的软件按功能分为操作控制模块、文件读取与存储模块、通信模块、系统自检模块[5].在设计操作控制模块中的人机交互图形界面时,通常采用面向对象的程序设计方法,对显示的图形在功能上进行自顶向下、逐步细化的模块划分[6];具体实现时,采用液晶显示屏显示系统的工作状态,设置按钮并实现相关逻辑判断,提供检测、显示和按键控制的方法[7-8].文献[9]提供 SD卡(Secure Digital Memory Card)以及 C8051F020芯片中SPI接口(Serial Peripheral Interface)的结构和工作原理,扩展了单片机存储的方式.
目前单片机系统中模块丰富且技术成熟,系统结构多以编译型为主,采用解释型的很少.基于单片机技术的发展、解释型程序的优点以及XML技术的应用,本文提出一种解释型单片机系统的实现方法,讨论系统的结构、脚本文件的设计和提高系统速度的方法.
1 系统结构
系统由3个层次4个部分组成,如图1所示,分别为脚本文件、解释器、系统软件和相关硬件.用户根据所需业务逻辑通过PC机编写XML格式的脚本文件,脚本文件存储在基于 FA T文件系统的SD卡中,单片机以SPI模式读写SD卡中的脚本文件,脚本文件经过解释器解释,调用系统软件中相应的应用程序接口(Application Program Interface,API)函数,进行运算并驱动控制系统硬件.
图1 系统结构Fig.1 System architecture
系统软件提供实时监控程序、相关硬件的驱动程序以及通用的API函数.系统的硬件可以根据用户的需求进行设计,基本配置为单片机、液晶显示模块、SD卡读写模块和输入输出模块.
1.1 脚本文件
脚本文件编写包括确定系统需要的业务逻辑、人机交互界面相关的数据,以实现系统要求完成的功能.脚本文件分为表达、处理和数据3个部分.
表达部分:将系统处理的数据以一定的格式显示给用户,为用户提供良好的人机交互接口.
处理部分:各种信息和数据的处理逻辑,即系统的业务逻辑的描述.处理部分的调用基于消息响应机制,即对系统的相应消息进行处理.
数据部分:为处理部分和表达部分提供相关数据.根据数据的作用范围,分为全局数据与局部数据两部分.
脚本文件对这3个部分分别建立模板,并根据模板生成对象.所有的对象可以通过属性和内容进行描述,属性和内容的分配由文件的结构决定.
对象属性包括通用属性和专用属性.通用属性的名称(Name)属性是对象间相互区别的唯一主键;类型(Type)属性用于区分对象的种类.不同类型的对象,有其相应的专用属性描述,通过解释器对其进行相应的处理.
1.2 解释器
脚本解释器是单片机系统软件与脚本文件之间联系的桥梁.脚本解释器对脚本程序进行顺序读取及解释,根据解释的内容调用系统软件中相应的API函数,进行数据的处理以及对系统硬件的控制.
脚本解释器的工作流程如图2所示.系统基于事件驱动,首先读入脚本,完成初始化后,系统监控程序进入循环扫描状态,等待事件触发.一旦有事件发生,即对相应脚本进行检测,决定是否对当前事件进行消息响应.
图2 解释器工作流程Fig.2 Interpreter operating process
2 脚本文件实现
系统的大量信息都通过人机交互界面与用户交流,不同的显示信息具有不同的显示页面,因此,脚本文件由多个页面构成.鉴于单片机系统资源的限制,将SD卡中的脚本文件以页面为单位存储,每一个页面独立保存在一个文件中,其优点是调用某一个页面时只需读取对应的页面脚本文件,无需对所有的文件进行操作,从而提高了系统的处理速度.对系统的共享数据,则以全局变量的方式定义,并单独保存在一个文件中.
2.1 表达部分
表达部分的功能是将用户需要的、经过处理的数据,通过表达模板和页面生成器,把数据和表达形式相结合,发送给用户浏览.
表达部分包括页面、静态文本、动态文本、静态按钮和动态按钮类型对象,每一个对象都有两个通用属性:即名称属性和类型属性.名称属性用于区别其他页面,并实现在其他地方调用这个页面.类型属性表示对象的功能.除页面外,其他4种类型对象都有显示位置(Position)专用属性,该属性给出显示的内容相对于所属页面左上角的起始位置坐标 x和y.下面分别描述上述5种类型对象以及所用到的其他专用属性.
2.1.1 页面
页面(Disp)是用户与系统进行信息交换的一种手段.
页面范围(Rectangle)属性.该属性规定页面的尺寸,页面默认为长方形,页面的范围由页面左上角 x1,y1和页面右下角 x2,y2的4个坐标确定.
页面的内容由页面包含的对象构成,对象类型有静态文本、动态文本、静态按钮和动态按钮,用以显示系统的状态和接受用户的输入.
2.1.2 静态文本
静态文本(Lable)用于显示页面中固有的、不变化的文字.
显示内容(Value)属性.该属性描述页面上需要显示文字的内容,通常对应页面的标题、对话框的名称、按钮的名称等信息.
2.1.3 动态文本
动态文本(Edit)用于显示页面中随系统状态变化实时更新的文字.
显示资源(Source)属性.该属性描述页面上显示内容的来源,以数据对应的变量名来引用.这些动态文本主要反映系统实时的数据变化、输入输出状态的变化信息.
如果触发页面刷新(Refresh)事件,解释器会对当前页面的动态对象重新解释显示,即动态文本对象重新读取显示资源内容并在页面相应位置重绘.为了节省系统资源,此时的静态文本对象不采取重绘动作.页面刷新事件可以通过点击按钮进行触发,也可以在任务对象中创建定时刷新任务进行触发.
2.1.4 静态按钮
静态按钮(Static Button)是页面中可接受用户固定操作的文字或图形元素,在页面中操作和位置固定不变的按钮.
显示内容(Value)属性.该属性描述按钮上显示的内容.
按钮扩展(Expansion)属性.该属性可以对按钮进行横向或纵向的扩展,扩大按钮的响应范围,方便用户的操作.
当点击触摸液晶屏时,系统接收点击消息,消息包括被点击点的坐标,通过坐标与当前页面中按钮对象的坐标相比对,确认是否有按钮被点击.如果有按钮被点击,则触发相应的按钮点击(OnClick)事件,然后对按钮对象的内容部分进行解释执行,完成指定的功能.按钮对象的内容由所调用的函数对象组合构成,而函数对象来自系统软件提供的API函数与驱动控制函数.
2.1.5 动态按钮
动态按钮(Dynamic Button)是页面中可接受用户动态操作的文字或图形元素,在页面中操作和位置可变的按钮.
显示资源(Source)属性.该属性描述按钮上显示内容的来源.
按钮扩展(Expansion)属性.该属性的作用与静态按钮中的按钮扩展属性相同.
动态按钮给用户提供多种选择性操作和控制.在数据部分中,结构体变量将按钮的显示资源和按钮中函数所需的参数组合起来,数组变量将结构体变量组合起来.在页面中,按钮对象属性与数组变量中结构体变量对象属性相关联.改变数组变量的下标就可以选定相应的结构体变量,进而实现按钮的动态显示和动态操作.
2.2 处理部分
处理部分主要对各种信息和数据按一定的逻辑进行判断并进行处理.处理部分包括函数类型和任务类型对象.
函数对象的可选专用属性有参数(Parameter)属性和返回(Return)属性.参数属性可以是常量与变量,返回属性一般为变量.
系统软件层提供了功能丰富的API函数,这些函数采用编译方式实现.编写脚本程序时只需考虑如何使用API函数来实现业务逻辑.这样既方便修改业务逻辑,又提高了脚本的执行速度.
任务对象的可选专用属性有定时(Time)属性和频率(Frequency)属性.定时属性表示到定时属性值指定的时刻系统产生定时事件;频率属性表示每次到达频率属性值指定时间的倍数时刻产生频率事件.
任务对象的内容由所调用的函数对象组合构成.
2.3 数据部分
系统的状态以及系统处理的中间过程需以数据形式保存下来,本文在脚本和内存中各开辟一个专用区域存放数据.
数据部分包括基本类型、构造类型对象.基本类型有整型、字符型、浮点型等;构造类型有数组类型、结构体类型等.
基本类型对象的专用属性仅包括内容(Value)属性,即变量的具体内容.
构造类型对象具有多层结构,首层包括通用属性名称和类型,考虑到脚本结构,增加子一层结构,将所包含的对象作为内容,实现结构与概念的统一.数组类型对象由一系列相同类型对象组成;结构体类型对象是由不同类型对象组成的集合.
根据对象定义位置的不同,可分为全局变量和局部变量;按存储介质的不同,可分为脚本变量和内存变量.全局变量是各个页面对象都能访问的变量;局部变量是本页面对象能访问的变量.脚本变量是存储于脚本文件区的数据;内存变量是脚本文件为了提高访问速度在单片机内存中申请的内存变量.
脚本中的全局变量和局部变量不涉及内存的申请与释放,全局变量的作用域为所有页面,局部变量的作用域为其定义所在的页面.处理原则是先局部后全局,如果全局变量和局部变量同名则仅考虑局部变量.脚本文件的读写比较慢,如果对系统有速度上的要求,可以在系统中申请内存变量,以实现某些高速数据的交换和处理.
2.4 实际示例
根据前述脚本文件的实现方法,下面给出一个具体的应用实例.脚本文件分成两个区域:
(1)全局区域.全局区域中申请了内存变量以及任务对象,任务对象在系统初始化时调用系统时间函数,且与内存变量strHour和strMinute关联.
(2)页面区域,其下对象是局部的.页面区域中设计了一个大小为5×10字符、名为InitDisp的页面,页面中申请了结构体数组类型和字符类型的脚本变量.
示例的实现效果如图3所示.在第0行第6个字节(即 Position="6,0")显示静态文本“东华大学”;在第2行第0个字节显示动态按钮“页面1”,该动态按钮显示的内容来源于结构体数组变量Op t[byDrift].Value的内容,点击它会运行页面跳转函数,进入Op t[byDrift].Uri内容所指示的页面;在第2行第10个字节显示静态按钮“Change”,点击它则运行增加函数,使脚本字符变量byD rift增加1,进而改变动态按钮所显示的内容;在第4行第0个字节显示静态文本“当前时间:时 分”;在第4行第10个字节显示动态文本,显示内容来自全局变量strHour,为系统时间的小时;在第4行第14个字节显示动态文本,显示内容来自全局变量strMinute,为系统时间的分钟.
图3 示例显示画面Fig.3 Demonstration display frame
具体代码如下所示:
3 提高解释型单片机系统速度的方法
选定单片机后,提高解释型单片机系统的速度主要以提高存储读写速度和程序解释速度来实现,具体方法如下:
(1)脚本程序调用的API函数固化在单片机ROM中,脚本文件不定义函数.
(2)对定频率事件,例如采集外设数据、申请任务对象和内存变量.任务对象一旦被解释器解释后,就在系统中产生常驻的定时或者定频率任务,按照固定的时间或者固定的频率进行事件驱动,不需要被反复解释.内存变量区别于在脚本中的全局变量与局部变量,内存变量在单片机内部申请,对其进行操作无需进行多次脚本文件的操作(包括查找、定位和读写).
(3)一个脚本程序由多个页面构成,每一个页面构成一个文件,文件名取自页面的名称,FA T文件系统为文件名建立索引,页面的切换通过相应的页面文件索引切换完成.
(4)读取页面文件至单片机内存后对内存中脚本进行解释.单片机对内存的读写速度快于对SD卡的读写速度.
4 结语
本文研究了单片机系统中解释型应用程序的实现方法.从数据、处理、表达3个方面阐明了脚本文件的具体实现,并提出了如何提高解释型单片机系统的处理速度.本文提出的解释型程序执行方法,效率不如编译方式高,适用于对业务逻辑需频繁更改但是对实时性要求不高的系统.随着单片机处理性能的提高,解释型程序的执行速度也会相应提高,它的应用场合一定会不断扩大.
[1] 何岭松,赖红.用于单片机测控装置的微型脚本解释器[J].测试技术学报,2006,20(2):118-122.
[2] 张军林,阳富民,胡贯荣.JavaScript语言解释器的设计与实现[J].计算机工程与应用,2003,30:124-125.
[3] 孙力,鲍健.嵌入式单片机应用系统程序结构[J].量子电子学报,2000,17(3):279-281.
[4] 王开西,邹华,杨放春.基于 XML脚本的增值业务解释器的研究[J].北京邮电大学学报,2004,27(S2):74-78.
[5] 项功宏,陈奇.基于单片机的提花机控制系统的设计[J].机床与液压,2005(12):153-155.
[6] 王妍,张群.双容水槽微机控制系统显示软件设计[J].辽宁大学学报,2001,28(3):234-237.
[7] 邱士安.基于C8051F020单片机的控制系统应用[J].大庆石油学院学报,2006,30(5):72-74.
[8] 李艳,张琛星,李明辉.基于A T89C51单片机的锅炉液位控制系统[J].自动控制,2006,25(4):54-57.
[9] 李长有,武学东,孙步胜,等.基于C8051F020的SD卡主控制器设计[J].微计算机信息,2007,23(9-2):120-122.
[10] 张延园.JavaScript程序设计及应用[M].西安:西北工业大学出版社,1997.
Research of Interpreted Programming for MCU Application
LU Yu-tinga,ZANG Zhu-pinga,OU YANG Wen-binb,ZENG Pei-fenga
(a.College of Computer Science and Technology;b.College of Information Science and Technology,Donghua University,Shanghai 201620,China)
The processing and functions are defined by configuration files,an interpreted MCU(Micro controller Unit)system which is easily configured for function modifications or system version up is proposed.The business logic is defined by scrip t files in XML format and stored in SD(Secure Digital)card.The scrip t is moved into memory,and read by XML parser.The defined functions are executed by corresponding API(Application Program Interface)function calling.The MCU interpreted system based on the hardware and the system software is convenient for business logic definition,modification,and implementation.
script ; interpreted ; application ; microcontroller unit(MCU);xml
TP 314
A
2009-10-19
陆宇霆(1985—),男,上海人,硕士,研究方向为单片机系统.E-mail:luyutingemail@gmail.com
臧珠萍(联系人),女,讲师,E-mail:zpzang@dhu.edu.cn
1671-0444(2010)03-0258-05