一种基于Smartphone类的注册表实现方案
扫描二维码
随时随地手机看文章
摘要:目前SmartphcIne类型的手机注册表都是用数据库实现的,现在要改用COMS来实现,具体做法是采用大小为64 KB的2块FLASH来模拟CMOS,在此基础上实现注册表的管理,直接从FLASH驱动层做起。注册表的记录改变了传统的Windows做法,采用一种简化的方法,不分目录级,由一个主键加一个键值构成,其主键是一个null结束的字符串,可以包含目录信息,这对后继手机软件的应用开发建立了良好的开发基础。
关键词:注册表;Smartphone:CMOS;FLASH
0 引言
随着多媒体移动终端(PDA,智能手机)的快速发展,使其已经不再只是用于语音通信的手持设备,而成为集成了MP3,MP4以及上网移动办公等附加功能的嵌入式通信平台。Smartphon是Accelerator Technology公司开发的一种嵌入式RTOS产品,其操作系统为Nucleus,只需一次性购买Licenses就可以获得操作系统的源码。Accelerator Technology公司在底层对无线通信以及语音文本信息通信模块做了大量优化。
Nucleus是一款优秀的嵌入式实时操作系统(RTOS),具有抢占式和时间片轮转任务调度方式,主要用在时间苛刻的嵌入式应用当中。大约95%的Nucleus用ANSIC写成,作为一个库加载到应用代码当中,目前手机行业有很多使用Nucleus。Smartphone平台的基本架构分为:
无线堆栈层:负责最终的数据发送与接收处理,它对接收和发送的硬件细节进行控制,突出无线通信这个核心内容,是Smartphone操作平台最低的一层。
核心API层:可利用它们来进行与无线通信和语音服务相关的开发,主要参照MSDN来使用。
逻辑层:系统为简化开发,将一些API包装成各个功能块以便调用类似控件,这层提供各控件接口。
应用层:是系统中面向用户提供服务的各应用程序。
1 接口设计与实现方案
当前大部分智能手机的注册表原来是用数据库实现的,现在要改为用COMS来实现,具体做法是,采用大小为64 KB的2块FLASH来模拟CMOS,在此基础上实现注册表的管理,直接从FLASH驱动层做起。注册表的记录改变了传统Windows的做法,采用一种简化的方法,不分目录级,由一个主键加一个键值构成。主键是一个null结束的字符串,可以包含目录信息,也可以写成“\APP\WINDOW\POSITION\X”,考虑到查找的方便性,主键字串必须用大写,并且要以“\”开始。键值有3种类别,分别是DWORD,Binary和string。其中,DWORD占4 B;String是null结束的字符串;Binary是由一个4 B的Size加上内容构成。考虑到FLASH的读写特性以及可移植性,整个记录信息向4 B对齐,并用0填充冗余各位。
1.1 数据结构
注册表的大小为64 KB,另外的64 KB是为了擦写时备份用的。整个64 KB空间分成2大块,即索引块和数据块,其中索引块大小为4 KB,数据块为60 KB。索引块由32 B的HEAD和一个偏移表构成,HEAD由1个4 B的片选字加1个28 B的保留位构成,保留位建议填写成“HTW CMOS VER1.0”,片选字用作擦除时掉电的保护。偏移表的每项占4 B,共有1 016项,每个偏移项均由低28 b的偏移值和高4 b标志位构成,标志位用作增加和修改时掉电的保护。数据块由一个接一个变长的记录构成,每个记录内容向4 B对齐,并用0填充冗余各位。记录由4 B控制字段+4 BCHECKSUM+主键+键值构成。其中,控制字段=28 b SIZE+4 b FLAG。SIZE是低28位,即物理的前28位。它表示整个记录的大小,包括自身及CHECKSUM、主键、键值等。FLAG是高4位,即物理的后4位,它表示键值的属性,同时用来作为掉电保护的判断标志。
1.2 关于掉电保护信息
掉电保护要做好,有2个必要条件,一是系统启动后在初始化时,有能力知道上次关机是正常关机还是异常掉电关机;二是系统在任何时候突然掉电,有能力追溯到掉电前的资料信息。注册表系统用于掉电保护的信息有3处,分别是片选字、偏移表项的标志位、记录控制字段的FLAG。片选字共有2块64 KB的FLASH,每块最前面的4 B是片选信息,正常情况下,正在使用的那一块(记A)片选信息写着00 00 00 C0,另外一块(记B)写着FF FF FF FF,并且B是一个擦除过的很干净的空块。A其余可能的取值是00 00 00 80,B其余可能的取值是00 00 00 F0和00 0000 E0,这一点与FMM中的用法基本相同。当A写满时需要整理,会运行一个整理流程,也会用到这些取值。每个偏移表项由低28 b的偏移值和高4 b标志位构成,其中标志位正常取值时,0xC0表示有效,0x8表示已删除;其余可能的取值是0xF表示空闲或者正在写,0xE表示刚刚修改完。对注册表的增加、修改、删除都会用到这些取值。记录控制字的FLAG每个记录控制字由低28 b的SIZE和高4 b的FLAG构成。FLAG的取值前面有描述,正常情况下0xE表示键值为DW0RD,0xC表示键值为Binary,0x8表示键值为String,其他的取值都表示正在写入控制字段时突然掉电,此时SIZE不可靠,整个数据块应该丢弃这4个字节。下一个偏移表项的取值应该仪仅越过这4个字节。对注册表的增加、修改、删除等操作,会用到这个FLAG,它与偏移表项的标志位一起使用,共同完成这几种操作的掉电保护。
1.3 部分API函数示例
注册表系统向应用提供的API接口有4个,另外还有一个初始化和一个块擦除流程,即RegCreateKey()刨建;RegDeleteKey()删除;RegQueryValueEx()查询;RegSetValue()设置;Reg_Initialize()初始化;Reg_EraseChip()擦除。
2 开发环境
本软件模组在PC机上开发,经过编译工具embedded Visual C++后,在CPU为ARM920T的硬件平台下运行。
编程语言:C语言
操作系统:Nucleus
Nucleus内核版本:2.4.20
交叉编译工具:VC++&ADS
编译环境:Visual C++
硬件平台:SC32442X或ARM920T
3 结语
由于Smartphone的用处已经越来越广泛,故提出一种为Smartphone建立较为通用高效的手机注册表实现方案,这对后继手机软件的应用开发,建立了良好的开发基础,性能优越且易于移植,已经成功应用于Linux和Windows CE等嵌入式操作系统。目前该方案已用于诸多无线移动多媒体终端项目,且效果理想。