李鼎 张秀芳 刘洲洲
摘 要:针对嵌入式系统数据库初始化过程复杂而影响整体系统进程的问题,将Nucleus数据库系统的索引表占用地址空间缩减,同时交换块不占地址空间,将其临时存放在数据库索引表的末尾节点,同时记录区占用剩余地址空间,重点处理索引表中的数据库记录ID,对其进行编码,使得可以区分数据库类型以及记录的类别且与文件系统以及注册表无关。系统测试结果表明该方法提高了数据库的存取速度且便于移植。
关键词:Nucleus; 嵌入式系统; 数据库; 架构
中图分类号: TP311.5
文献标志码: A
Abstract:In order to solve the problem that the initialization process of embedded system database is complex and then affects the whole system process, this paper reduces the address space occupied by the index table in the nucleus database system, at the same time, the exchange block does not occupy the address space, temporarily stores it at the end node of the database index table, at the same time, the record area occupies the remaining address space, and focuses on dealing with the database record ID in the index table, which makes it possible to distinguish between database types and record types and is independent of file system and registry. The test results show that this method improves the access speed of database and is easy to be transplanted.
Key words:Nucleus; Embedded system; Database; Architecture
0 引言
嵌入式系統诸如智能手机,智能手环,PAD等作为物联网设备已经广泛地应用在多种领域[1-4]。其中系统用户可以根据自身的软硬件环境的要求,选择合适的操作系统。其中数据库作为系统的关键模块,有至关重要的作用,由于记录索引表、交换区和数据记录区构成整个数据库系统,其中记录索引表占用一个地址空间且固定,而交换区不占地址空间,数据记录区占用其余的地址空间。在记录索引表中有每条数据库的地址、ID、类别、大小等信息。且每个记录ID唯一, ID号可以区分数据库以及记录的类别,本文提出一种ID号的编码规则,索引表以一个记录的形式保存到数据库里,并用记录类别加以区分,同时基于数据库设备,与文件系统以及注册表无关,可以有效提高嵌入式系统数据库存取速度且鲁棒性增强。
1 Nucleus嵌入式系统
Nucleus[5-7]是为实时嵌入式应用而设计的一个抢先式多任务操作系统。Nucleus系统的各层通讯协议都提供了由ANSIC写成的源码,有利于系统的可移植性并支持大部分处理器。而且Nucleus系统针对不同的处理器的源码大部分也是相同的且少部分跟CPU相关由汇编完成[2]。该操作系统完全开源,可以通过修改开源代码进行所需的配置,调试可以在中断和寄存器级进行。核心函数API和程序代码链接一起生产目标代码,可以直接烧制到目标板卡中,整个核心代码区内核规模非常小,方便调试。其中该系统[8-11]典型特点是对于堆栈的管理时将中断时线程堆栈和系统堆栈分开,可以使得当系统空闲时使用系统堆栈,中断嵌套处理比较简单,而且Nucleus内核比较简练,任务抢占的延迟可能会比较短,且内核和网络协议都是开源码的形式,不足之处在于对实时性不够、定时中断管理不可靠和对系统中断的处理容易产生堆栈格式错误。
2 系统架构
本文在整个数据库系统定义一个管理数据库命名为:sysdb,该数据库中的每一条记录标识着设备用户自己建立的数据库,其中内容包含了数据库名称、索引表数目、比较函数等关键信息,且数据库名不可重复,大小写信息不敏感。当设备用户创建、打开数据库时候就要访问到管理数据库sysdb。
2.1 记录索引表
本文设置索引表在开始地址空间,由32字节的头部:HEAD和一个索引表构成,HEAD可用来填写嵌入式系统的版本信息等。索引表的每项占12字节,共有5 458项,最后剩余4个字节保留。整个结构如下:
片IDHEAD索引表 冗余保留
4Bytes32Bytes12Bytes12Bytes……4Bytes
本文索引表用C语言描述为:
typedef struct tagIndex{
LONG id; //记录ID
WORD dir; //记录的目录号
WORD size; //记录大小
LONG addr; //记录的逻辑地址
}RECINDEX, *pRECINDEX;
其中目录号(WORD dir)表明该记录所在的目录,记录大小(WORD size)表明记录的实际大小,存储时自动向4字节对齐,规定记录大小不大于64 K。记录的逻辑地址(LONG addr)由低28 bit的偏移值和高4 bit标志位构成。 其中,偏移值是记录的逻辑地址,取之范围0~2 M。Flag是掉电保护标志,和Bank ID的含义类似,具体含义如下:
Flag = 0xF 表示该节点空闲(Free)。
Flag = 0xE 表示正在刚刚写完该记录,此时记录是完整的。
Flag = 0xC 表示该节点的记录在使用中,记录有效。
Flag = 0x8 表示该节点的记录是已经被删除了,但是排序表正在更新。
Flag = 0x0 表示该节点的记录是已经被删除了,排序表更新完毕。
Flag =其他 无效标志。
整个书库系统的所有记录个数的总和不能大于5 458,事实上,书库系统在记录总和接近5 400时,就开始限制加入记录了,留下的58个节点用作脏块整理的空间。
3.2 管理数据库sysdb
当数据库系统初始化时打开管理数据库sysdb。sysdb没有索引记录,记录类别只有一种,而且每条记录注册着一个用户创建的数据库。本文将sysdb的记录格式定义如下:
typedef struct tagdatabase{
char dbName[DB_MAX_NAME_LEN]; //数据库名称
DWORD pDataSortProc[DB_MAX_DATA_SORT _COUNT]; //数据记录排序函数表
DWORD pDirSortProc[DB_MAX_DIR_SORT _COUNT]; //目录记录排序函数表
}DBINFO;
其中:dbName是一个定长的字符串记录着数据库名称,大小写不敏感,强调一点就是数据库名称不能重复。因为用户打开数据库时要靠该名称唯一标识数据库。pDataSortProc 和pDirSortProc是兩个函数指针表,分别表示按照数据记录排序和按照目录记录排序,他的大小表明最多有可以建立那么多排序表,每个函数指针标示一个排序方法,所有函数指针初始化成为0xFFFFFFFF,一个数据库的排序表的个数可以在创建数据库时候指定,同时要指定一个函数指针,一旦指定了该函数指针,就永远不得修改,但是可以事后增加、删除排序方法,只要不超过限定的数目。排序表的下标用来作为记录ID编码的元素,sysdb的记录ID会作为该记录的数据库的ID,数据库ID同样是记录ID编码的元素,sysdb的数据库ID内定为0。规定sysdb的记录个数不能大于0x100。
3.3 ID编码规则
本文将记录ID由4个字节构成,从中可以解析出三种信息,分别是数据库ID、记录类别、记录流水号。结构如下:
0~7 bit,库ID8~15 bit,类别16~31 bit,记录流水号
其中:数据库ID是系统管理数据库sysdb的记录ID的记录流水号的低8位,高8位必然为0。数据库的记录有四种类别:数据记录(0x00)、目录(0x01)、数据排序记录(0x02)、目录排序记录(0x04),同时根据四种记录类别,记录流水号分别称作数据记录流水号、目录流水号、数据排序索引、目录排序索引。同一个数据库的数据记录流水号不能重复;同一个数据库的目录记录流水号不能重复;同一个数据库的数据排序记录索引不能重复;同一个数据库的目录排序记录索引不能重复。目录流水号和数据流水号是加入数据库的同类别记录的流水号递增的数值。排序索引是排序方法的ID号。流水号原则上是向上累加,并且从1开始,0表示无效,这与排序记录的修改有关,当加到0xFFFF时,再去查找并使用以前删除掉的记录的流水号,就是说已经删除掉的记录流水号可以再次利用,但是一个记录一旦创建,其记录ID号终生不变,并且要按照记录ID号中的流水号来建立排序表。
3 系统功能实现
由于每个数据库[12-15]记录有一个目录属性,表明该记录属于哪个目录,目录实际上是记录的归类信息。目录本身也当作记录存储在数据库中,目录作为记录他也有一个所属目录的属性,表明自己的父目录,由此可见整个是一个树状结构,数据记录是叶子节点,树根是sysdb。一个数据库的根目录没有记录和他对应,定义根目录的记录ID等于0。本文数据库流程图如图1所示。
4 系统测试
本文通过上位机和下位机测试两种方式:同时按下电源开关键(挂断键)和退出键(右功能键)用传输线将小机同PC连接起来:在PC端启动“数据库测试程序”,小机端:按开关键开机连接成功后,在PC端选择“系统自检”。首先进行串口测试如图2所示,同时分别测试串口0和串口1,并显示测试结果。在测试夹具上,将会将串口0和串口1短接,故各串口自发自收,自动判断测试结果如图2所示。
对于所有记录,系统将自动加入一个时间戳,来表示记录建立或修改的时间。增加、修改、删除一条数据记录,系统将自动修有的数据排序记录。同样,增加、修改、删除一条目录记录,系统将自动修改所有的目录排序记录。排序记录的时间戳是做后修改的时间,数据或目录记录得时间戳是记录建立的时间,在系统自检过程前完成所有数据库的创建和记录,如图3所示。
通过系统软件测试,表明通过设置系统索引表和系统ID编码使得数据库系统同时存取速度提高,且系统可靠性也得到了增强。
5 总结
Nucleus作为开放嵌入式系统,具有实时性和多任务性,系统资源的调度都在其有效管理控制下可以使嵌入式多任务的开发变得省时和省力,同时高效率,本文分析了基于Nucleus的嵌入式数据库系统索引表的机理和重新定义了ID编码,,对于嵌入式实时操作系统的开发具有重要的意义,下一步将对在系统掉电情况下的数据库保护进行研究。
参考文献
[1] Zhang R R, Xu Z Y, Ma Z G, et al. Global α - nucleus optical model based on a Dirac Brueckner Hartree Fock approach[J]. Nuclear Physics, Section A,2019,57(1):990-997.
[2] Nicholas Everett, Sarah Baracz, Jennifer Cornish. Oxytocin treatment in the prelimbic cortex reduces relapse to methamphetamine-seeking and is associated with reduced activity in the rostral nucleus accumbens core[J]. Pharmacology, Biochemistry and Behavior,2019,15(1):183-187.
[3] 汪洋,禹珉. 基于Nucleus操作系统实现TCP和UDP协议通信[J].软件工程,2018,21(9):29-33.
[4] 段亚林,谢永斌.基于Nucleus的通信终端中AT指令模块的设计与实现[J].计算机测量与控制,2015,23(11):3744-3746.
[5] 陈连坤.嵌入式系统的设计与开发[M].北京:清华大学出版社,2005.
[6] 台湾广达微电子设计有限公司.基带处理器手册[M].台湾:台湾广达微电子设计有限公司,2007.
[7] Douglas Boling. Microsoft Windows CE 程序设计[M]. 北京:北京大学出版社,1999.
[8] 蔡志明,卢传富,李立夏.精通Qt4编程[M].北京:电子工业出版社,2008.
[9] 汪兵,李存斌. EVC高级编程及其应用开发(Embedded Visual C++嵌入式编程)[M].北京:中国水利水电出版社,2005.
[10] 继刚. 面向智能手机的嵌入式实时操作系统[J].中兴通讯技术,2005,16(4):97-99.
[11] 彭涛.嵌入式操作系统移植技术研究[D].武汉:华中科技大学,2006.
[12] Zhao Zheng, Wang Lei, Liu Huan, et al. On similarity preserving feature selection[J]. IEEE Trans on Knowledge and Data Engineering, 2013, 25(3): 619-632.
[13] Marwedel P. Embedded system design[M].北京:科学出版社,2007.
[14] Gloria D Alessandro. Mircoprocessor design for embedded system [J].Journal of Systems Architecture, 2009, 45(6):1139-1149.
[15] 魏振华.嵌入式實时操作系统Nucleus中线程控制部件的实现[J]. 计算机应用与研究,2003 ,16(4):97-99.
(收稿日期: 2019.10.31)