引言
随着嵌入式系统cpu硬件从8位到32位的发展,嵌入式系统软件的开发环境也得到迅猛的发展,编程语言从10多年以前的汇编为主流发展到现在c、c++、java为主流。另外,面向对象设计技术、组件技术等在嵌入式系统软件设计中的应用也日益引起人们的重视。
在嵌入式系统软件开发领域,java是一门较新的异军突起的编程语言。其优点是语言本身简洁优美,完全按照面向对象思想设计,并且语言引入许多较为先进的特性,如多线程、自动内存管理和垃圾回收,非常适合于大规模复杂软件系统的开发。其不足点是与硬件结合不够紧密,同时代码运行速度较慢。此外,对于内存的使用,程序难于管理和控制。
由于采用java编程具有如上所述的众多优点,越来越多的嵌入式系统采用java技术来构造软件系统。本文在介绍基于日本某自动售货机产品的控制板的java运行平台基础上,详细讨论笔者为其平台开发的db引擎的组成和设计思路。
1 java运行环境平台
图1所示为java运行环境的总体框架示意图。本系统为克服java的解释执行机制所引起的执行速度慢的问题,在硬件上采用了sun公司开发的pico java芯片。它能够直接执行java的二进制代码,使java的执行速度提高一个数量级以上。在硬件层的上面是os层,本系统采用的是itron(日本东京大学坂村键教授设计的一种嵌入式操作系统,虽然在日本以外的市场影响不大,但在日本本地市场,占有率达90%以上)。由于itron规格制定得比较早,并且为兼顾低端嵌入式应用的场合,itron总体上功能比较简单,并未把诸如tcp/ip、文件系统等内容包含在其里面,因此与嵌入式linux等不一样的是,tcp/ip、文件系统是以独立的组件形式存在的。在os层的上面是jvm层。与其它一般java虚拟机不同的是,本系统的java执行代码不需要由jvm解释执行,而是由cpu硬件直接执行。在jvm的上层是自动售货机的基础平台类库和公共组件层。本文介绍的db引擎组件正是处于这一层。该层的上面是应用程序层,用于实现自动售货机的各种控制、管理机能。
2 嵌入式系统db引擎
2.1 db引擎组件的引入
众所周知,在台式机领域,db是一个十分关键的基础软件。以往嵌入式系统的软件可能更侧重于与硬件的交互与控制,但随着对嵌入式系统功能需求的日益复杂化,嵌入式系统软件中,信息、数据的保存与管理的比重也日益增加。在这样的背景下,嵌入式系统软件开发中,通过引入db组件,对实现软件整体框架结构的组件化与简单化,有着十分明显而重要的意义。
2.2 db引擎组件的总体框架
如图2所示,将整个db组件设计为3层结构,分别为jdbc接口层、sql解释层和动作执行层。这3层之间呈单向依赖关系。也就是说,sql解释层依赖于动作执行层,但动作执行层不依赖于其上面的两层,可以单独存在而直接被使用。如果用户以使用方便为主要目的,可采用完全配置方式,应用程序通过jdbc接口层存取数据。反之,如果用户对空间和效率要求较高,可仅配置动作执行层组件,应用程序直接调用动作执行层的api进行数据的检过和更新等操作。
(1)jdbc接口层
如前文所述是可选组件,旨在为应用程序提供一个标准的db调用接口。
(2)sql解释层
本db组件实现的sql解释层,只实现了标准sql的一个小子集,主要完成select、delete、insert、update、create table、drop table等功能。其中数据操作语句(select、delete、insert、update)的解释要点之一是where条件子句的解释执行,类似于数学表达式求值算法。本文采用简单直观的“算符优先法”。该算法使用两个工作栈,一个称作optr栈,用以寄存运算符;另一个称作opnd栈,用以寄存操作数或运算结果。算法的基本思想是:
①首先置操作数栈为空,表达式起始符“#”为运算栈的栈底元素;
②依此读入表达式中每个token。若是操作数,则进opnd栈adk是运算符,则和optr栈的栈顶运算符比较优先权后作相应操作,直至整个表达式求值完毕(即optr栈的栈顶元素和当前读入的token均为“#”。
本文实现的sql子集描述如下:
预定义
:=
:=
:=[,[,[…]]]
:=[,[…] ]]
:= =│==│!=││>│>=│<│dberror.timeout)break;
}
//发生超时退出循环情况,抛出例外
if(islocked){
throw new dberror(dberror.timeout_err,name);
}
//设定锁定标志
islocked=true;
}
//表打开操作
//参数ro只读打开标志
void open(boolean ro)throws dberror{
lock();
readonly=ro;
//表数据读入
load();
}
//表关闭操作(同时释放锁)
public synchronized void close() throws dberror{
if(islocked==false)return;
//关闭前,保存数据
if(isdirty)save();
if(isunload)unload();
//释放锁,通知其它等待线程
islocked=false;
notify();
}
图3 db引擎组件主要类的关系
2.5 db组件实现的结构设计
图3所示为db引擎组件的主要类之间的关系。其中,database为数据库类,用于描述和管理整个数据库对象table为数据表类,用于描述和管理表对象;tabledata用于描述和管理保存表数据的物理介质(文件);field为字段类,用于描述和管理字段类型信息;record为记录类,描述一条数据记录。为简化处理,本组件将database类设计为singleton模式,即本组件只能创建一个database实例。这对于嵌入式系统来说,大部分场合已经足够。与数据库的一般物理概念相对应,1个database实例包含n个table实例,1个table实例包含n个field实例。同时,1个table实例包含1个tabledata实例,1个tabledata实例包含n个record实例。
connection类用于管理用户访问数据库的会话(session)过程。对应一个用户的一次会话过程,生成一个connection实例。connection类对象保存着当前session打开的table列表,当用户提交执行某sql语句而需要锁定某个table时,系统首先检查该表是否已经在当前session已打开的table列表中。如果已经被打开,则不需要进行重复的锁定操作,直接反回对应的table对象实例。反之,如果尚未包含在打开的table列表中,表明当前session尚未打开和锁定该表,必须执行该表的打开和锁定操作(如果该表已被其它session打开,则必须等待到其它session翻放该表为止)。
本db组件还支持commit与rollback事务处理。能够在如此微小的db组件实现事务处理,主要得益于上述的session管理框架。在table类commit与rollback处理基础上,当一个session执行commit或rollback操作时,对包含在打开列表中的每个table实例,调用执行相应的commit或rollback处理即可。
3 结语与展望
本db组件已实际运行了大约两年时间。这期间除了对该组件进行一些功能追加以外,主体框架上基本保持不变,从而在一定程序上表明了该设计框架的可行性和合理性。该组件编译以后,class文件形成的jar包大小约为68kb,短小精度悍,便于使用。当然,该db组件目前仍然存在一些不足:首先,较为关键的一点是速度问题。一直以来,java的执行速度问题就是受批语的缺点所在,因此采用它实现自然也避免不了这人瓶颈。今后改进的思路之一是,将其中java处理效率不高的部分移出java,采用c实现;二者通过jni手段加以连接,以提高总体的运行速度。第二点需要改进的地方是表锁定的粒度问题。由于目前只能整个表进行锁定,并且不区分读锁定与写锁定,因此粒度较粗。虽然这样实现起来较为简单,但在多任务处理环境中可能增加不必要的时间等待。最后,jdbc接口的实现目前还不完全,需要加以完善。
5G毫米波段的拍卖于2019释放 其中28 GHz预计首先释放、紧接着是24GHz
工信部发电子信息制造业绩报,上半年继续保持平稳增长态势,投资势头良好
电机的旋转原理、结构、类型、故障排除全解
广和通LTE Cat1模组助力低碳通勤经济,电动微交通正成为上班族的“新团宠”
orcad怎么去浏览DRC检测过后的全部DRC错误
嵌入式Java运行平台数据库引擎的应用研究
未来性能增长需依赖架构上改变 因此需要用FPGA进行人工智能硬件加速
锡膏厂家普及锡条一些干货知识?
慧联无限完成数亿元C轮融资,通服资本领投,旷视科技、博将资本、华创资本跟投
最美不过华为荣耀8青春版 最快不过华为荣耀v9 两部手机今天发布!
RTL中多时钟域的异步复位同步释放
彩电业绩整体持续低迷,OLED电视正成为高端市场主流
SKYLAB:WiFi+蓝牙组合模块,了解一下
破解TD-LTE与LTE FDD融合组网的四大难题
英特尔和A股的韭菜们一样,选择割肉了
什么是谐波畸变?谐波通俗点怎么理解?
国内“半导体”3大标杆:“卡脖子”,“中国芯”崛起的希望?
2014智能汽车最值得关注的五大亮点
iphone13系统多大内存
特斯拉线圈的电压有多大_特斯拉线圈的用途