WINCE 实验指导书

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

WINCE 系统实验指导书
WINCE 系统实验指导书 (1)
实验一、Windows CE系统平台的创立及模拟器的使用: (2)
一、实验目的 (2)
二、实验内容 (2)
三、预备知识 (2)
四、实验设备 (2)
五、实验原理 (3)
六、实验步骤 (4)
七、思考题 (11)
实验二、Windows CE BOOTLOADER 实验 (12)
一、实验目的 (12)
二、实验内容 (12)
三、预备知识 (12)
四、实验设备及工具 (12)
五、实验原理及步骤 (12)
六、思考题 (30)
实验三、Windows CE驱动开发 (31)
一、实验目的 (31)
二、实验内容 (31)
三、预备知识 (31)
四、实验设备及工具 (31)
五、实验原理及说明 (31)
六、实验步骤 (33)
七、思考题 (40)
实验四、Windows CE应用程序开发 (41)
一、实验目的 (41)
二、实验内容 (41)
三、预备知识 (41)
四、实验设备及工具 (41)
五、实验原理及说明 (41)
六、实验步骤 (44)
七、思考题 (58)
实验一、Windows CE系统平台的创立及模拟器的使用:
一、实验目的
1、了解WinCE 下的重要工具——模拟器
2、学习和模拟器相关的远程调试工具
3、学习WinCE 的调试手段
4、复习WinCE 开发工具Platform Builder
二、实验内容
建立WinCE 的PC 端模拟器,建立使用模拟器的配置,认识基于PB 端的WinCE 远程调试
工具。

具体步骤如下:
✧根据目标平台的特点和系统的需要,使用Platform Builder配置WINDOWS CE操作
系统的特性和功能。

✧编译、链接操作系统内核,生成内核镜像文件NK.bin。

✧将镜像文件下载,并在模拟器上运行生成的WINDOWS CE系统。

✧同时,构建一个调试版WINDOWS CE系统,并实际调试该系统。

三、预备知识
嵌入式系统调试手段和方法的根本概念,操作系统根本知识,Platform Builder 根本操作。

四、实验设备
硬件:PC 一台P3 以上〔内存不小于384MB,安装完工具硬盘剩余空间不得小于600M〕、ARM9 实验箱〔包含NETARM2410-S 实验板、JTAG 仿真器、各种串口线、并口线、网线、光盘
等〕一台。

软件:PC 操作系统Win2000 以上、ADS1.2 集成开发环境、Platform Builder 4.2 版本、Source Insight3.0。

五、实验原理
模拟器〔emulator〕是PB 的一局部。

专用于调试在PB 下创立的内核及应用程序。

模拟器能够在PC 下模拟Windows CE 的物理平台。

但实际上它只不过是一个运行在CPU Ring 3级别的用户程序。

所以它的运行速度要比正常的物理平台要慢。

模拟器仅支持x86 平台,它只能调试基于"Emulator:x86"的内核和所有用x86 指令集编译的程序。

模拟器有很大的限制,这些限制使它只能运行简单的应用程序。

但是有一点是好的,操作系统的大多数API 对于任何CPU 而言都是相同的。

考虑到不受CPU 类型影响的简单程序,还是可以在模拟器上调试的。

学习PB,用它来创立内核而又没有实际的物理平台来调试,那么模拟器非常适合。

但模拟器的限制也非常多,所以即使在模拟器下调试过所有能够调试的内核特征〔feature,或者称组件〕,你掌握的也不过是冰山一角。

Windows 的模拟器是嵌入式开发的非常重要的工具利器之一,通过模拟器可以在开发端进行平台的模拟仿真验证。

并且在PB 方面和EVC 方面都可以启动模拟器。

通过模拟器,可以模拟一个在线运行的WinCE 系统设备,使得针对硬件设备的调试可以放在PC 端模拟实现,这对于整个开发过程中的设计和验证有着至关重要的作用。

这一点和许多嵌入式操作系统有相似之处,例如VxWorks。

图1-1 Windows CE 模拟器窗口
注意:关于模拟器的硬件限制:〔摘自Windows CE 帮助文档〕
✧仅能模拟DEC 2114x 网卡驱动来提供网络支持,其它网卡驱动不支持。

✧仅能模拟FLAT 显示驱动,其它显示驱动不支持。

✧不支持USB 设备
✧不支持PC 卡、硬盘、CF 卡。

✧不支持FAT、CDFS、DVD 文件格式。

六、实验步骤
1、使用PB 建立一个X86 体系下的模拟器
方法和上一个实验讲过的方法类似,以下简单概括一下过程。

〔1〕利用向导建立工程,第一步如下图:
图1-2工程建立第一步
点击“Next〞进入下一步,如下图:
图1-3工程建立第二步
在这里可以选择你需要的设备,也可以使用Custom configuration 自己定制。

点击“Next〞进入下一步,如下图:
图1-4工程建立第三步
图1-5工程建立第六步
图1-6工程建立第七步
〔2〕配置编译环境
首先需要设置Platform\setting…对话框
选择Retail 模式
图1-7设置Platform\setting…对话框
确保Enable KITL,Enable Kernel Debuger,Enable Full Kernel Mode 三项都被选中,
如下图。

图1-8设置Platform\setting 选项
图1-9语言选项
〔3〕编译
点击快捷按钮或者选择菜单Build\Build Platform 编译工程。

具体编译的时间和你
的机器配置有很大关系。

编译完毕,在系统信息里面会显示编译完毕信息“×errors,×warnings〞,并显示生
成的内核镜像文件,如下图。

图1-10内核镜像文件
(4)下载到模拟器
配置模拟器:编译成功后,单击"Target"-"Configure Remote Connection",如图2-35。

在弹出的对话框中找到"Download"下拉框,选择"Emulator-4.20",单击后面的"Configure",在弹出的对话框中设置分辨率为800 X 600 或640 X 480。

系统内存设置为64MB。

单击"OK" 后,在"Kernel"下拉框中选择"Emulator-4.20"。

单击"OK",如下图。

图1-11配置连接
图1-12 配置模拟器
启动模拟器:单击"Target"-"Download Initialize"。

在下面的对话框点“Yes〞。

图1-13启动模拟器
等待一会,模拟器就出来了。

可以看到标准外壳的界面,也就是桌面。

图1-14初始化下载
显示模拟器界面如下列图。

注意:模拟器在本地PC 的生成需要占用较大的内存和CPU 使用,所以应当保证足够的
可用内存,否那么模拟器的运行将非常的慢。

同时,由于PB 编译模拟器会产生大量文件,所
以必须保证Window 系统目录所在分区有足够的硬盘空间〔至少600M〕,否那么在编译
过程中会因磁盘空间不够而中止。

图1-15模拟器界面
七、思考题
结合你的实验操作想一下,使用模拟器对于嵌入式开发有什么好处?
实验二、Windows CE BOOTLOADER 实验
一、实验目的
1、掌握WinCE 的启动过程,
2、掌握WinCE for S3C2410 中Bootloader 的根本工作原理,
3、了解一般Bootloader 的开发方法。

二、实验内容
学习NETARM2410-S 上WinCE Bootloader 的工作原理,了解各级boot 的功能,认识Bootloader 在嵌入式操作系统中的一般开发方法。

具体步骤如下:
✧了解WinCE 的启动过程,掌握WinCE for S3C2410 中Bootloader 的根本工作原理
✧掌握两级Bootloader 的不同功能,完成两级Bootloader的烧写
✧编译、链接操作系统内核,生成内核镜像文件NK.bin,通过Eboot下载镜像文件,
最终在开发板上引导WINDOWS CE系统
三、预备知识
C 语言根本知识,操作系统体系结构根底知识,Bootloader 方面知识。

四、实验设备及工具
硬件:PC 一台P3 以上〔内存不小于384MB,安装完工具硬盘空间不得小于600M〕、ARM9 实验箱〔包含NETARM2410-S 实验板、JTAG 仿真器、各种串口线、并口线、网线、光盘等〕一台。

软件:PC 操作系统Win2000 以上、ADS1.2 集成开发环境、Platform Builder 4.2 版本、Source Insight3.0。

五、实验原理及步骤
1、Bootloader 概述
简单地说,Boot Loader 就是在操作系统内核运行之前运行的一段小程序。

通过这段小程序,可以完成初始化硬件设备、建立内存空间的映射图、和内核镜像建立通讯通道和调试通道等等工作,从而将系统的软硬件环境带到一个适宜的状态,以便为最终调用操作系统内核准备
好正确的环境。

通常来讲,Boot Loader 是严重依赖于硬件而实现的,特别是在嵌入式系统中〔有些局部还不可防止的使用汇编语言实现〕。

因此,在嵌入式的世界里几乎不可能建立一个通用的Boot Loader。

所以针对特定的处理器,必须专门来定制Bootloader,以实现不同的功能需求。

图2-1 bootloader 与其它结构的关系
绝大多数的Bootloader 实现的功能都无外乎两个:启动内核镜像和下载内核镜像。

而二者的区别在用户看来是不存在的,它们只针对开发人员。

因此,Bootloader 的作用是看起来很不起眼但实那么是很重要的。

✧启动加载〔Boot loading〕模式:即Bootloader 自动加载系统的过程,整个过程并没
有开发者和用户的介入。

在正常条件下,必须保证这种启动方式的有效,特别是在嵌入式产品发布的时侯,Boot Loader 必须直接工作在这种模式下以保证系统的正常运行。

✧下载〔Downloading〕模式:在这种模式下,目标机上的 Boot Loader 将通过串口连接
或网络连接等通信手段从主机〔Host〕下载文件,例如:下载内核映像和根文件系统映像等。

从主机下载的文件通常首先被 Boot Loader 保存到目标机的 RAM 中,然后再被BootLoader 写到目标机上的FLASH 类固态存储设备中。

有的系统还将启动各种通讯方法。

BootLoader 的这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用 Boot Loader 的这种工作模式。

工作于这种模式下的 Boot Loader 通常都会向它的终端用户提供一个简单的命令行接口,并可以执行简单的交互。

如下列图2-2 所示
图2-2 Boot Loader 结构图
2、烧写Bootloader
2410-S 上的CE 系统和其他RTOS 不同,它具有两级Bootloader 来引导内核镜像。

在Bootloader 阶段,比起其他系统Bootloader 来讲要复杂的多。

〔1〕Nboot
Nboot〔NandFlash Bootloader〕是2410-S 上WinCE 的第一级Bootloader,位于Nand Flash 的Block0。

主要负责初始化Flash,读取TOC,等等工作,最后将Eboot 内容拷贝到RAM 中,把CPU 执行权交给Eboot 接管。

Nboot 可以使用ADS 开发,也可以使用其他工具来开发。

使用SJF 来把Nboot 局部Bootloader 烧写在第0 个block 中。

使用方法如下:
✧修改BIOS 中计算机并口的选项,设置并口为“378〞模式。

✧安装Giveio 驱动,具体安装请参考Giveio 的说明。

✧之后在平台和PC 之间连接好JTAG 下载线。

在命令行运行SJF2410 /f:2410loader.bin 回车,可以看到如下列图界面
注:在这里三次选择顺序为000(012的0)
图2-3
选择K9S1208 prog,即输入“0〞,回车,如下图。

图2-4
选择K9S1208 Program,即输入“0〞,回车,如图2-5 所示。

图2-5
向block0 烧写,即输入“0〞,回车。

之后看到出现“Epppp……〞字样表示正在向对应的flash 中写入数据。

烧写完之后选择“2〞Exit 退出,如下图。

图2-6
图2-7
〔2〕TOC
TOC〔Table Of Content〕是整个Nand Flash 中存储内容的一个列表,这里面储存了有关启动和系统内核的一些相关存储信息,需要写在Nand Flash 的block1 中,由Nboot 里的函数读取。

之后Nboot 会按照读取的内容进行配置和跳转到不同的地址。

使用文本查看工具可以看到TOC 的主要组织形式。

如下图:
图2-8注:在这里三次选择顺序为001(012的0〕
图2-9
图2-10
〔3〕Eboot
Eboot〔Ethernet Bootloader〕是一种高级Bootloader,可以理解为一个伪的KernelImage,位于从Nand Flash 的Block2 开始局部空间。

它主要负责各个设备的初始化,内存地址映射,文件系统,网络系统驱动和加载内核镜像的相关准备工作,已经是比拟复杂的Bootloader 了。

使用Eboot 下载内核,Eboot 执行完毕之后可以通过控制台来下载真正的Kernel Image,并跳转到Kernel 来执行,这时系统就引导起来了。

在执行过程中,Eboot 会根据需要改变TOC 中的内容,这样就记录下来当时的状态,例如IP 地址,MAC 地址,启动信息等等。

值得注意的是,只有在调试阶段才有使用Eboot 的必要,当系统设计完毕之后,可以通过修改Nboot 来直接跳转执行Kernel Image,不再使用Eboot 来控制执行。

这时,启动速度会有很大提高。

Boot Loader 由两局部组成:OEM 启动代码〔OEM startup code〕和主代码〔maincode〕。

OEM 启动代码是最先执行的局部,它的功能是初始化内存存放器、设置CPU频率、初始化高速缓存等。

之后它跳转到主代码中执行。

一般OEM 启动代码都是用汇编编写。

主代码一般用C 语言编写,它负责其它所有任务,在执行的同时还能够将执行的相关信息显示在屏幕上。

一般添加公司LOGO 或者其它启动LOGO 都在此修改。

主代码主要由几个局部组成:镜像下载代码,通过并口或者网卡来实现从远程计算机下载nk.bin;串口调试代码,包含对串口的读写函数,用户调用这些函数就可以通过串口在远程计算机和本地计算机之间通信;写flash 代码,包含写镜像到flash 的函数;硬件监控代码。

一般的Boot Loader 的执行流程见下列图:
图2-11
上图中每个函数的功能如下:
StartUp() :CPU最先执行的函数。

也就是启动代码。

BootLoaderMain() :先后调用KernelRelocate、OEMDebugInit、OEMPlatformInit、OEMPreDownload等函数。

此函数源码文件路径为%_WINCEROOT%\public\common\oak\drivers\ethdbg\blcommon 。

OEMDebugInit() :初始化串口。

OEMPlatformInit() :执行特定平台的初始化工作,如时钟、一些驱动程序。

OEMPreDownload() :做下载前的准备工作。

一般用于反响给用户一些信息。

DownloadImage() :下载操作系统镜像到RAM或者Flash。

OEMLaunch() :负责启动镜像。

OEMReadData() :从远程计算机读取数据。

OEMMapMemAddr() :专用于写Flash时使用。

因为写flash的速度非常慢,所以此函数将Flash镜像临时缓冲到RAM中。

OEMShowProgress() :从函数名就能看出。

OEMIsFLashAddr() :判断一个地址是否是Flash的地址。

OEMFinishEraseFlash() :判断是否完成了擦除Flash内容工作。

OEMWriteFlash() :写镜像到Flash。

OEMStartEraseFlash() :开始擦除Flash。

OEMContinueEraseFlash() :继续擦除Flash工作。

可以看到,在Eboot 中,所有关于网络和系统的初始化工作都已经完成,并作好了下载
内核镜像的准备,DownloadImage()下载内核镜像,最后执行OEMLaunch()函数,跳转到内核开始地址运行。

此后内核就接管了CPU 的使用权和控制权,Bootloader 退出控制。

流程图如下列图:
图2-12
Eboot 也需要使用sjf2410 在命令行中烧写,在命令行里面敲入sjf2410 /f:eboot.nb0 选择K9S1208,再选择写入Block2.操作与烧写Nboot 完全类似
注:在这里三次选择的顺序为002(012的0〕
图2-13
图2-14
3、控制台使用
Bootloader 下载好之后,可以运行控制台执行一些操作。

控制台负责了有关启动内核的根本操作。

建立控制台如下列图所示:
建立超级终端对EBOOT 进行配置
图2-15
图2-16
图2-17 在这里需要对端口进行设置
图2-18
进入下画面后单击空格键就会进入EBOOT的配置截面〔即控制台〕
图2-19
Eboot配置界面
图2-20
功能解释:
✧ 1 为设备启动IP 及子网地址设定;
✧ 2 为boot 延时的时间设定;
✧ 3 选择是否设置动态IP 分配,这一级Boot 可以选择IP 分配方式;
✧ 4 为重置TOC 为缺省设置,各项参数将复原为默认值;
✧ 5 有两个选择,切换DOWNLOAD NEW 方式和LAUNCH EXIST 方式;
✧ 6 选择是否将RAM 内的image 写入到Nand Flash 中去,如果是Disable,那么系统掉电

✧不能被保存;
✧7 选择修改MAC 地址,推荐避开主机的MAC 地址;
✧8 选择是否开启Kernel Debug 功能;
✧9 为格式化整片NandFlash 为二进制文件系统,这需要大约几分钟的时间;
✧ B 选择是否支持二进制文件系统,如果选择了9,那么必须支持二进制文件系统;
✧ D 下载内核镜像;
✧R 读取TOC 中实际配置数据;
✧ F 为低级格式化NandFlash,选择这一项将擦除flash 上包括Bootloader 的所有内容;
✧L 运行NandFlash 上已有的内核镜像。

✧W 将当前配置好的数据写到TOC 中保存。

在这里主要对1、5、6、7、9等进行功能选择(其选项含义在下边有详解)
注:
1) IP及子网地址设定〔注:IP要求同一网段网地址与PC相同〕
5)第一次下载选择DOWNLOAD NEW方式成功后改为LAUNCH EXIST方式
6 )假设不选择ENABLED将不会被写入FLASH中掉电后将会丧失
7)修改MAC地址;不要与主机发生冲突(二者设置不同)
9) 最好在下载新内核镜像时候先格式化FLASH否那么可能会在下载新内核后出现一些错误
4. 对编译好的镜像内核进行下载:
(此镜像是通过Platform Builder 4.2来完成的;此工具软件可在微软网站下载)
〔1〕首先在Platform Builder 4.2上建立一个工程〔建立细节参考实验一〕
〔2〕然后把NK.bin放在你安装Platform Builder 4.2的盘符下如:C:\WINCE420\PUBLIC\arm2410\RelDir\SAMSUNG_SMDK2410_ARMV4IDebug 注:arm2410是建立的工程名字
〔3 〕在PB 中选择菜单中Target/ Configure Remote Connection…,弹出如下对话框:选择相应的平台之后将“Download:〞“Kernel〞都选择为“Ethernet〞。

然后启动实验板,按空格进入控制台,监视超级终端,选择“D〞选项下载新的内核,然后等待超级终端出现:“Using device name: 'SMDK241036864'+EbootSendBootmeAndWaitForTftp

或类似字样。

图2-21
图2-22
图2-23
选择configure等待选择的设备号
图2-24
图2-25
〔3〕内核编译的时间一般较长,如果不想等待太久,可以将光盘中已经编译完成的NK.bin 拷贝到系统的编译目
录%_winceroot%\PUBLIC\NETARM2410-S\RelDir\SAMSUNG_UT2410XARMV4Release 或类似的目录下〔如果已经存在那么覆盖之〕。

使用eboot 及Platform Builder 下载已经编译好的NK image
到目标设备上。

其中NK.bin 在\PUBLIC\NETARM2410-S\RelDir\
图2-26
4、在上面对话框中点〞configure…〞出现如下对话框:
图2-27
在其中选择出现的设备名,之后“OK〞。

然后确定。

这时会出现下载进度。

等待下载完毕。

下载完毕后目标板上的WinCE 系统会自动运行。

图2-28
图2-29
当WINCE操作系统成功启动后按实验平台的复位键重新启动WINCE操作系统并对EBOOT进行重新配置:
5)改为LAUNCH EXIST方式
6)改为DISABLE
w)对修改正的选项进行保存
六、思考题
1、Bootloader 在嵌入式操作系统中的作用和功能是什么?想一想,WinCE 中Bootloader 的形式和功能各是什么?
2、想一想,如何修改nboot 代码使nboot 直接引导内核镜像启动,不经过eboot 阶段。

〔提示:使用TOC 的不同内容,可以选择跳转到哪个,TOC 已经包含了系统的根本信息〕
实验三、Windows CE驱动开发
一、实验目的
1、学会使用WinCE 操作系统开发工具
2、熟悉开发环境
3、了解嵌入式系统驱动开发的根本思想和开发过程
二、实验内容
学习使用Platform Builder 4.2 集成开发环境,建立流驱动程序。

✧了解WinCE 根本系统体系架构
✧了解WINDOWS CE系统设备驱动根底知识和方法
✧学习使用Platform Builder 4.2 集成开发环境,建立流驱动程序
三、预备知识
C 语言根本知识,设备驱动根底知识和方法,WinCE 根本系统体系架构。

四、实验设备及工具
硬件:PC 一台P3 以上〔内存不小于384MB,安装完工具硬盘空间不得小于600M〕、ARM9 实验箱〔包含NETARM2410-S 实验板、JTAG 仿真器、各种串口线、并口线、网线、光盘等〕一台。

软件:PC 操作系统Win2000 以上、ADS1.2 集成开发环境、Platform Builder 4.2 版本、Source Insight3.0。

五、实验原理及说明
1、WinCE 驱动程序架构
目前WinCE 拥有两种驱动架构模型,一种是本机设备驱动,另一种是流接口设备驱动。

其中本机设备驱动已经被Microsoft 开发并由系统直接支持,由GWES〔图形窗口及事件子系统〕统一管理和加载;流驱动那么是由WinCE 设备管理器来管理的。

这种组织形式相对于UNIX 体系来说是比拟复杂的。

本机设备驱动适合于集成到CE 平台的设备。

例如电源驱动,它们已经成为了GWES 的一局部,
不表现为单个的DLL 使用。

这些驱动程序通常和系统有着较为紧密的联系,所以通常是和系统一起加载的。

流设备驱动由于具有较好的可移植性和可扩展性,被设备管理器独立出来管理统筹。

在本实验中,将以一个例如的流驱动演示程序来讲述简单驱动的工作。

下面的图3-1 中较为清楚的显示了单片形式存在的驱动和分层方式的驱动在WinCE 中的组织情况。

图3-1 驱动在WinCE 中的组织情况
2、流驱动程序
流驱动程序通过流驱动接口函数和设备管理器进行数据交互,并通过文件的形式来组
织,这一点和Unix 平台是很类似的。

它以动态链接库形式存在,具有同一组接口并调用同一个函数集的。

流驱动面向的是各种各样的外设,主要的任务是把外设的使用传递给应用程序来使用。

在WinCE 中设备文件通常是保存在固定的路径\Windows 目录下,通过注册表机制来完成特殊的命名惯例。

虽然流借口驱动程序具有普遍的特性,但是我们仍旧可以使用不同的方法来实现它们。

例如有些内部设备的驱动程序就是使用的流接口。

另外尽管流接口程序通常是由设备管理器程序加载和卸载的,但是有时候应用程序也执行加载和卸载的任务。

应用程序通过文件系统的API 来调用流接口函数,然后由流接口驱动程序调用本机驱动或者通过设备管理器与系统内核外围设备通讯交互,最后直接驱动相关硬件执行动作。

3、流接口驱动程序的一般标准入口
流接口驱动程序通常都具有如下的函数,具有一个统一的操作标准如表3-1 所示:
表3-1 流接口驱动程序的函数
函数名称描述
XXX_Close 驱动程序关闭时候调用
XXX_Open 翻开一个设备驱动时调用
XXX_Deinit 设备管理器或者应用程序卸载驱动时调用
XXX_Init 设备管理器初始化设备时调用
XXX_IOControl 上层软件进行IO 控制调用
XXX_PowerDown 系统挂起前调用
XXX_PowerUp 系统重新启动时调用
XXX_Read 翻开设备时候进行的读操作
XXX_Write 翻开设备时候进行的写操作
XXX_Seek 对设备指针进行操作时调用
XXX_Reinit 设备重复翻开时调用
其中XXX 代表驱动文件名,由驱动类型的3 个大写字母缩写而成,规那么由系统约定。

详细规那么请参考帮助文档和MSDN 的说明。

了解了这些函数的功用,就可以开始着手建立起来一个最简单的流驱动程序。

它的功能
是向缓冲区中读写字符。

六、实验步骤
1、建立模拟器工程
运行Platform Builder,建立一个基于X86 体系的模拟器。

下面的驱动程序建立都可以
在仿真器中模拟实现。

注意需要在Applications & Services Development 选项中选择Active Temple Library (ATL), C libraries &Runtimes, Message Queuing(MSMQ), Microsoft Foundation Classes (MFC), Standard SDK for Windows 这几个选项,这样可以确保将来调试的驱动和调用的应用程序具有足够的库和效劳可以享用。

详细的建立过程和方法可以仿照实验二里面的步骤来做,这里不再赘述。

2、创立驱动程序工程
在PB 中新建一个工程,单击菜单中的File 选择建立New Project or File Name…弹出
如下列图3-2 的对话框。

图3-2 新建工程
在这里选择Project 标签选择WCE Dynamic-Link Library 即WinCE DLL 并在右侧输入
工程名和存放位置〔会默认〕。

点击“OK〞确认。

图3-3 生成DLL 的类型
在对话框中选择生成DLL 的类型,可以选择An empty project 来创立一个空的dll,也
可以选择A simple Windows CE DLL project, 创立一个简单的WinCE 动态链接库工程,这
个工程只带有简单的DLL 入口函数。

A DLL that exports some symbols 用来生成简单的输
出函数。

点“Finish〞完成创立。

如图3-3。

创立完PB 的主界面上会切换到该工程,如图3-4 所示。

图3-4 工程根目录
再次点击File,选择“New Project or File Name…〞,在向导对话框中选择Files 标
签,如下列图3-5 所示。

如图3-5 选择File
选择建立C++ Source File,同时添加文件名,存储路径并将文件添加到DLL 工程中。

参加“windows.h〞,“tchar.h〞头文件和动态链接库的入口函数〔标准函数〕DllEntry
Point( ),建立好一个简单的动态链接库的架子,添加相应的处理。

详见各种说明文档。

3、编写驱动程序的代码
DWORD STR_Init(DWORD dwContext)
{
DWORD dwReturn = 0;
RETAILMSG (1,TEXT(“MYSTRINGS:STR_Init\t\n〞)); memset (achBuffer,0,BUFSIZE * sizeof (WCHAR));
dwReturn = 1;
return dwReturn;
}
BOOL STR_Deinit(DWORD hDeviceContext)
{
BOOL bReturn = TRUE;
RETAILMSG(1,(TEXT(MYSTRINGS:STR_Deinit\t\n〞))); return bReturn;
}
DWORD STR_Open (DWORD hDeviceContext,
DWORD AccessCode,
DWORD ShareMode)
{
DWORD dwReturn = 0;
RETAILMSG (1,TEXT(“MYSTRINGS:STR_Open\t\n〞)); dwReturn = 1;
return dwReturn;
}
BOOL STR_Close(DWORD hOpenContext)
{
BOOL bReturn = TRUE;
RETAILMSG(1,(TEXT(MYSTRINGS:STR_Close\t\n〞))); return dwReturn;
}
BOOL STR_IOControl(DWORD hOpenContext,
DWORD dwCode,
PBYTE pBufIn,
DWORD dwLenIn,
PBYTE pBufOut,
DWORD dwLenOut,
PDWORD pdwActualOut)
{
BOOL bReturn = TRUE;
RETAILMSG(1,(TEXT(MYSTRINGS:STR_IOControl\t\n〞))); return bReturn;
}
void STR_PowerDown (DWORD hDeviceContext)
{
RETAILMSG(1,(TEXT(MYSTRINGS:STR_PowerDown\t\n〞))); }
void STR_PowerUp(DWORD hDeviceContext)
{
RETAILMSG(1,(TEXT(MYSTRINGS:STR_PowerUp\t\n〞)));
}
DWORD STR_Read(DWORD hOpenContext,
LPVOID pBuffer,
DWORD Count)
{
DWORD darter = 0;
RETAILMSG (1,TEXT(“MYSTRINGS:STR_Read\t\n〞));
DWORD cbBuffer = wcslen ( achBuffer);
dwReturn = min(cbBuffer, Count);
wcsncpy((LPWSTR)pBuffer, achBuffer, dwReturn);
return dwReturn;
}
DWORD STR_Seek(DWORD hOpenContext,
Long Amount,
DWORD Type)
{
DWORD dwReturn =0;
RETAILMSG(1,(TEXT(MYSTRINGS:STR_Seek\t\n〞)));
Return dwReturn;
}
DWORD STR_Write(DWORD hOpenContext,
LPCVOID pSourcdBytes,
DWORD NumberOfBytes)
{
DWORD dwReturn =0;
RETAILMSG(1,(TEXT(MYSTRINGS:STR_Write\t\n〞)));
dwReturn = min(BUFSIZE, NumberOfBytes);
wcsncpy (achBuffer, (LPWSTR) pSourceBytes, dwReturn);
Return dwReturn;
}
确定编写完毕保存。

如果不想编写,也可以直接拷贝光盘中的MyDriver.cpp 文件到工
作目录下。

4、准备配置文件
✧Def 文件。

复制光盘中的String.Def 文件到工作目录下。

✧Reg 文件。

复制光盘中的StringReg.reg 文件到工作目录下。

✧Cec 文件。

复制光盘中的MyDriver.cec 文件到工作目录下。

✧Makefile 文件和Sources 文件。

复制makefile 和sources 文件到工作目录下。

这些文件是 DLL 工程编译必须具备的配置文件,它们说明了关于驱动如何链接,编译路径,和系统注册等等重要的工作,在编写新的DLL 时一般都需要进行改动甚至重写。

这里直
接拷贝光盘中的文件来实现。

有兴趣的也可以使用文本查看软件〔如Ultra Edit32,WinHEX 等〕来翻开这些文件,看看文件内部是如何配置的。

拷贝完毕后,在PB 下导入CEC 文件。

将MyDriver.cec 拷贝到PB 当前工程目录下〔模拟器目录下〕,翻开File 菜单,选择Manage Catalog Features 弹出一个属性对话框,如图3-6。

图3-6 属性对话框
在右侧按钮中点击Import,选中MyDriver.cec 导入当前工程目录,然后单击“OK〞确
认完成。

导入方法和导入平台BSP 的方法是相同的。

可以发现驱动被添加到工程组件窗口中,在组件上点击右键,选择Add to Platform,
完成系统的驱动添加。

5、编译内核
和实验一的编译方法一样,点击来实现编译。

特别注意现在是在使用模拟器,所以
在编译选项中应该选中“EMULATOR:X86 WIN32〞。

编译之前,在Build Option 选项标签中确保“Enable CE Target Control System〞,“Enable Kernel Debugger〞,“Enable KITL〞被选定,这些选项允许内核向PB 传送调试信息。

单击“OK〞确定。

如图3-7 所示:
图3-7 编译
6、加载驱动
内核编译完毕后开始在模拟器下加载。

单击Target 下面选择Configue Remote Connection,弹出对话框如图3-8 所示。

图3-8 加载驱动
选择Emulator – 4.20,再点确定,在Target 菜单中选择Download/Initialize,就
可以看到模拟器开始运行启动,一个模拟的WinCE 系统在窗口中显示出来,绝大多数的操作都可以使用了。

此时在PB 的Debug 窗口中可以看到系统的启动调试信息。

其中可以很清楚的看到驱动
模块被加载的状态,驱动运行成功。

相关文档
最新文档