【原创】Windows® Embedded CE 6.0 Fundamentals 读书笔记_Chapter 1
【原创】Windows® Embedded CE 6.0 Fundamentals 读书笔记_Chapter 2
【原创】Windows® Embedded CE 6.0 Fundamentals 读书笔记_Chapter 3
【原创】Windows® Embedded CE 6.0 Fundamentals 读书笔记_Chapter 4
【原创】Windows® Embedded CE 6.0 Fundamentals 读书笔记_Chapter 5
【原创】Windows® Embedded CE 6.0 Fundamentals 读书笔记_Chapter 6
【原创】Windows® Embedded CE 6.0 Fundamentals 读书笔记_Chapter 7
【原创】Windows® Embedded CE 6.0 Fundamentals 读书笔记_Chapter 8
【原创】Windows® Embedded CE 6.0 Fundamentals 读书笔记_Chapter 9
【原创】Windows® Embedded CE 6.0 Fundamentals 读书笔记_Chapter 10
文档下载地址
Windows® Embedded CE 6.0 Fundamentals +读书笔记
Chapter 8
这一章将会介绍一个完整的基于WINCE项目开发的过程模拟,也就是在整个项目开发中会遇到的一些事情。内容很多。我们按照文章
的顺序逐一介绍下去。
首先我们还是来看一些单词
//--------------------------
separated
intermediate
phase
approach
consists of
accurately
determine
precisely
substantially
peripheral
deploy
prolongs
interaction
suffciently
mandatory
Enterprise terminal
regularly
purpose
approach
profling
substantial
hierarchy
particular
represented
conclusion
recommendations
regarding
critical
permanently
detach
interact
appropriate
peripheral
The globally unique identifer (GUID)
appropriate
switchover
restriction
mandatory
rectangle
Encryption
auxiliary
metadata
accordance
appropriate
hive
corresponding
mechanism
properties
atomic
straightforward
//-------简单翻译-----------
分离
中间
相
接近
包括
准确
确定
正是
大大
周边
部署
延长
互动
充分
强制性
企业终端
定期
目的
接近
分析
大量
等级
特别是
代表
结论
建议
关于
关键
永久
分离
互动
适当
周边
全局唯一标识符(GUID)
适当
切换
限制
强制性
矩形
加密
辅助
元数据
按照
适当
蜂巢
相应的
机制
属性
原子
直截了当
Chapter 8 构建设备
本章开篇MS的工程师给出了一个基于WinCE操作系统的开发流程,这里我们简单的过一下,一个项目的开发,当然这里是指的规范的开发,首先要做的是对设备进行规划,设备计划包括:需求定义,选择或者规划硬件设计,基础操作系统的选择和设计,计划产品镜像的开发。规划完成后是对于硬件的开发,这里硬件开发是可选的,有些用户是直接购买OEM的硬件或者是外包硬件开发,这一个部分就可以作为选择项,硬件设计制作好了我们就要针对客户需求和硬件定制BSP包,当然这个部分也是可选的,因为很可能用户只是基于平台进行操作系统的二次开发或AP开发,BSP包完成后就可以进行操作系统开发,关于操作系统的开发包括前几章里所介绍的一些项目:定制运行镜像,开发应用程序,编译和测试中间版本镜像,创建软件开发包,为设备激活第三方开发包。完成以上开发后,我们就可以编译出最终版本的镜像,并对这个镜像进行测试,完成后完成产品镜像。接下来,MS的工程师对上面的过程进行了一个分析,这个分析部分非常重要,主要介绍了产生以上开发各个阶段和可选阶段的原因。这里我们可以这样理解。一个项目的开发需要很多人月资源,当然这里我们把一个项目分开,各负其责的进行开发,整体的人月成 本将会降低,当然有侧重点,这里我们举一个现实的例子,一个PND导航仪的开发,这里我们在Design house的角度上来看待整体项目的开发。
一个PND的开发,首先我们需要一个核型芯片做为主导,这时我们有了客户的需求,我们可以选则不同芯片原厂的CPU进行选则,不同的芯片原厂除了他们各自的CPU的属性不同,他们所做的事情是一样的,首先他们会设计好芯片,然后基于芯片做好一块基于芯片的开发板,这块开发板上会有这颗芯片的全功能,并且,芯片原厂将会定制一条适合的OS,wince的BSP,linux的核心等等,最为Design house,我们因为客户的需求,做一个PND,并且选用WINCE的操作系统,我们选定了一家芯片原厂后,与芯片原厂签署一系列的协议,原厂提供或者Design house或者客户自行采购一些ARM,再加上客户需求以及原厂给出的原始硬件设计方案以及BSP包,我们就可以开始第一轮的项目开发,首先在原厂的BSP包上定制好系统,完成系统定制的同时进行简单测试,释放出SDK给AP层开发 人员进行AP的开发,同时进行目标设备外围硬件驱动的开发,并配合AP层开发人员进行调试,完成所有功能后,释放出中间版本进行测试,测试完成后释放最终产品版本。最后提交给最终客户测试符合条件后小PP生产,小PP完成后批量生产。
文中图8-1给出了整体系统开发的流程图,大家可以参考。其中提及到了以往章节中提及的一些描述,例如第三章操作系统结构以及
第六章驱动结构,这两章可以帮助开发者配合客户的需求选择一个适合产品的系统结构以及驱动结构来开发产品。
接下来我们看第一节BSP的克隆。
这一个步骤一般情况下是芯片原厂来做的工作。当然Design house的开发上也可以基于芯片手册来定制自己的BSP,但文章也说了,有些开发需要消耗大量的人力物力和成本,所以这个地方的开发一般会由原厂来实施,而接下来的使用BSP或者对BSP的开发,也是基于已存在的BSP来进行定制和开发,以来减少开发的成本。这一节介绍了BSP克隆的过程。一般的过程先建立BSP,规定BSP的名称,描述,版本等,完成后定制该BSP包的编辑目录。保存完成BSP包的克隆。完成了BSP的克隆我们将为我们的BSP定制一些组件和项目,也就是第二节,克隆一个组件或者一个项目。这里在第四章有介绍,并讨论过这个问题,文章给出了一些建议,大家可以仔细阅读下187页的内容。 第三节第四节介绍了如何自动应用程序和自动加载设备,关于自动加载应用程序大家看一个例子就会清楚,例如,当系统启动完成后运行A.exe文件,我们需要做的是将该A.exe文件放置到一个固定的位置,当然这个位置是在开机时系统能过识别到的,例如系统 分区中,或者SD卡中(SD卡系统要能识别到)等,接下来我们需要对platfrom.reg进行一些修改
[HKEY_LOCAL_MACHINE/Init]
"Launch10"="shell.exe"
"Launch20"="device.dll"
"Depend20"="hex:0a,00"
"Launch30"="gwes.dll"
"Depend30"="hex:14,00"
"Launch50"="<path>//A.exe"
"Depend50"="hex:14,00, 1e,00"
<path>是你存放A.exe的路径。
自行加载设备的方法和自动加载软件类似,首先我们需要自己设计好驱动的程序并编译通过,完成后我们会得到该设备的dll动态库,第七章中有详细的介绍,这里就不多说了。这里举一个例子。例如我们这里有一个外围设别叫SAA7113的外围设备,我们写好了一个针对他们的驱动,生成了Dll,然后我们要在系统自动加载他。我们在platform.reg中加入以下的代码
;ADD BY MERCURY XU FOR saa7113 CHIP
;RESET FIRST.
[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/SAA7113/]
"Prefix"="SAA"
"Dll"="SAA7113.dll"
"Index"=dword:1
"Order"=dword:1
"FriendlyName"="SAA7113"
"Ioctl"=dword:0
这样在系统启动的时候,系统会自行加载这个驱动。
第五节 设备电源管理
这一节是比较重要,而且也是一节难点,因为电源管理无论在什么设备上都是需要的,而且电源作为设备工作的主要动力来源,如果在这一个部分设计的不好,整体系统的稳定性和寿命将会受到很大的影响。文章开头举了GSM/GPRS设备的例子,大家可以参考,这个主要是用在WM设备上的,接下来文章给我们了一个重要的知识,一个基础的电源管理系统使用的是分层的驱动结构,什么是分层的驱动那个结构大家可以去看看第六章的内容。参考代码的位置在/PUBLIC/COMMON/OAK/DRIVERS/PM/文件夹下,电源管理的PDD层是系统用来管理系统电源状态的,例如逻辑和理论上将电源从一个状态选择到另一个电源状态,设备可以根据他自身的需求复写目标设备的PDD层的电源管理目标设备。当然,在这里我们还是需要通过注册表作为一个标记,文章中列出了不同状态下注册表设定的值。一般情况下注册表的键值在HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Power。这里分别介绍了该注册表下几个主要的子键值,State,ActivityTimers,Timeouts。整个电源管理控制模式大家可以参考图8-17来了解。这里同时引出了IOCTL控制部分,文中给出了一些IOCTL的控制代码,具体请阅读表8-2。另外,这里说一点在实际开发中可能遇到的情况,一般情况下,系统是分为断电状态,带电休眠状态和工作状态,这三种状态都有电源管理的控制,特别是当机器休眠的时候,这个情况下电源管理是格外重要的,因为在休眠到唤醒的过程中,系统会去将相关的外围设备断电,并保存系统的一些当前信息,也就是Suspend的情况,这个时候,系统会去叫驱动的powerdown函数,如果这个驱动写有这个函数的话,大家可以写一个简单的驱动,定义好powerup和powerdown两个函数,这两个函数中间可以不用写过多的实现部分,只写一个打印信息的输出即可,当你将wince suspend的时候,也就是将系统挂起,你可以看打印信息中很明确的会跑到powerdown的函数中,在唤醒时,powerup也会执行,这里就给我们一个提示,如果某个外围设备在唤醒和休眠的预处理阶段需要做一些恢复或者特殊的保存动作是,这两个函数将会起到很重要的作用,这里给大家提出来一起讨论一下。
第六节 设备文件系统
这个部分主要是牵涉到系统的文件格式,在wince中,系统的根盘符是“/”,所有的系统基于这个目录下展开,存储管理在注册表的 HKEY_LOCAL_MACHINE/System/StorageManager/Proflies/<Media_Profle_Name>下。这里大家可以定义自己需要的分区的属性,这里
给出一个注册表的例子,帮助大家理解这一个部分:
[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles]
"AutoMount"=dword:1//自动加载
"AutoPart"=dword:0//自动分区
"AutoFormat"=dword:0//自动格式
"MountFlags"=dword:0//加载标记
"DefaultFileSystem"="FATFS"//默认文件系统
"PartitionDriver"="mspart.dll"//分区驱动
"Folder"="Mounted Volume"//目录名称
这里我们采用的是自动加载的方式,当然,文件管理还可以根据需求加载存储管理,另外在 HKEY_LOCAL_MACHINE/System/StorageManager/PartitionTable下,我们可以建立分区表,下面给出一个简单的例子
[HKEY_LOCAL_MACHINE/System/StorageManager/PartitionTable]
"21"="BINFS"
"11"="HIVEREG"
"12"="ROFATFS"
"41"="MYFATFS"
这里给出了几种分区格式,另外我们可以通过HKEY_LOCAL_MACHINE/System/StorageManager/<File_System_Name>来定义自己的文件系统名称,例如我们自己定义一个分区,可以参考一下的注册表写法
[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/FlashDrv]
"DefaultFileSystem"="BINFS"
"PartitionDriver"="mspart.dll"
"AutoMount"=dword:1
"AutoPart"=dword:1
"Folder"="YouName"
"Name"="Microsoft Flash Disk"
"BootPhase"=dword:0
"Flags"=dword:00000024
接下来文章介绍了一些文件系统服务,接着提出了两种文件系统,ROM-ONLY FILE SYSTEM和RAM and ROM文件系统。关于这个的选择需要根据具体情况来设定。
第七节 注册表
我们上面讲到了这么多的注册表,现在我们来具体看看注册表这个设备,Wince的注册表和普通的桌面系统的注册表是类似的,他存储了操作系统,应用程序和驱动的设定。文章中给出了对注册表控制的几个API函数,这里并且指出了注册表的两种类型,HIVE-BASED和RAM-BASED两种模式,这两种模式的选择一般常见的是选择HIVE型的方式,因为RAM的形式是面对与一个对象,当系统冷启动的时候注册表信息将会丢失,需要及时的根据当前状况保存,否测将会丢失注册表信息,所以我们选择模式的时候要根据设备的使用方法和使用环境来定选择什么样的模式。文章给出了HIVE模式下注册表配置的一个顺序,具体请参考206页一共10个要点。这里我们也给出一个小例子来帮助理解:
; HIVE BOOT SECTION
; @CESYSGEN IF FILESYS_FSREGHIVE
[HKEY_LOCAL_MACHINE/init/BootVars]
"SystemHive"="save//system.hv"
"ProfileDir"="save//"
"RegistryFlags"=dword:1
"Flags"=dword:F
; @CESYSGEN ENDIF
第八节 数据库
这一节主要讲述WINCE下的数据库,这里我们不多说,因为根据不同产品的需要,数据库这个组件是可选,但是作为万恶的应试的话还是要看看,说不定考到了。这里提出了两种数据库CEDB和EDB,说实话我都没用过,我只试验过在wince5.0下跑SQLITE3.0.而且跑通了,这里是微软自带的一套数据库,CEDB是早期版本就有的,EDB是6.0特有的一个版本,具体描述大家请仔细阅读这一节。
第九节 插件和消息传递系统
这个部分介绍了一个类似于PNP消息机制的系统,点对点通讯队列,文中举出了照相机为例子,大家可以参考图8-25.了解这个插件和点对点消息队列运行的一个基本原理。
第十节 外壳系统
这个部分就是介绍了系统启动后的界面,用户可以自行定义自己的界面,这里在最后一节还会继续描述,这里大家阅读下即可。
第十一节 加载文件到设备镜像
这个部分介绍了如何把我们需要的文件加载到我们定制的镜像当中,这里我们要使用到bib这个文件。一般都是platform.bib文件中添加,文中给出了一个例子,例如我们想把一个txt文件加载到我们的系统镜像中,我们需要做的是在platform.bib文件中的file sgement下加入相关的内容,例子如下:File.txt c:/MyFiles/File.txt NK SH,格式为<NameOfFileInTheImage> <FilePathOnDisk>/<FileNameOnDisk> <ROMregion> <FileProperties>,这个部分很机械,按照规定的来就可以了。这里要注意的是,我们自己写的流失驱动会产生一个dll,这里我们也需要把dll文件加入,否则我们无法在镜像中找到这个dll也就无法驱动我们写的流式设备,这也是在驱动调试中遇到的问题。
第十二节 创建文件快捷方式
当我们需要将自己写的一个应用程序加载到系统桌面上的时候,我们需要为这个文件做一个快捷方式,习惯的做法还是需要调用到bib文件,在其中为原始执行文件建立一个lnk,下面我们给出一个例子让大家更容易理解,例如,我们需要将XXX.exe文件在启动是就在桌面上,我们需要在bib文件中的file segment中说这样几句话:
xxx.lnk $(_FLATRELEASEDIR)/xxx.lnk NK
xxx.exe $(_FLATRELEASEDIR)/xxx.exe NK
而后我们要在系统加载时将其加载到系统中,我们需要在dat文件中说这样一句话,
Directory("/Windows/LOC_DESKTOP_DIR"):-File("xxx.lnk", "/Windows/xxx.lnk")
好了。到这里为止,我们整体系统就完整了设计,剩下的就是Build然后调试。
第八章学习完毕。
作者:Mercury Xu
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。