Windows CE操作系统BSP开发笔记
- 格式:docx
- 大小:1.81 MB
- 文档页数:17
Windows CE 嵌入式系统Windows CE是Microsoft公司的嵌入式操作系统产品。
它是一个紧凑、高效和可扩展的操作系统,具有多线程、多任务、确定性的实时和完全抢先式优先级的操作系统环境,适合于只有有限硬件资源的硬件系统。
操作系统的定制采用模块化设计方式,便于用户的使用。
支持Win32 API和MFC,具有Windows程序设计经验的用户可迅速掌握其编程方法。
第一章绪论BSPBSP是介于主板硬件和操作系统之间的一层,也可以说是操作系统的一部分,主要目的是为了支持操作系统,使之能够正常地在主板上运行.“嵌入性”、“专用性”和“计算机系统”是嵌入式系统的三个基本要素。
一般情况下,嵌入式操作系统可分为两类:一类是面向控制和通信等领域的实时操作系统,如WinRiver公司的VxWorks、ISI公司的pSOS、QNX公司的QNX和ATI的Nucleus等.另一类是面向消费电子产品的非实时操作系统,Windows CE是一个实时操作系统.实时支持功能在以下几个方面提升了Windows CE的性能.(1)支持嵌套中断(2)允许更高优先级别的中断首先得到响应,而不是等待低级别的中断服务线程(IST)(3)更好的线程响应能力(4)对高级别中断服务线程的响应时间上限的要求更加严格,在线程响应能力方面的改进,可帮助开发人员掌握线程转换的具体时间,并通过增强的监控能力和对硬件的控制能力帮助开发人员创建更好的嵌入式应用程序.(5)更多的优先级别,256个优先级别可使开发人员在控制嵌入式系统的时序安排方面有更大的灵活性.(6)更强的控制能力,对系统内的线程数量的控制能力可使开发人员更好地掌握调度程序的工作情况.5 丰富的多媒体和多语言支持第二章Windows CE的体系结构和功能2.1 Windows CE的层次结构2.2 进程、线程与调度2.3 内存管理2.4 存储管理与文件系统2.5 用户界面与图形系2.1.1 微内核结构Windows CE属于比较典型的微内核操作系统在内核中仅仅实现进程、线程、调度及内存管理等最基本的模块,而把图形系统、文件系统及设备驱动程序等等都作为单独的用户进程来实现.这样做显著地提高了系统的稳定性和灵活性.操作系统的结构可分为单体内核结构和微内核结构.传统的UNIX 是单体内核操作系统的代表.单体内核操作系统将图形、设备驱动及文件系统等功能全部在操作系统内核中实现,运行在内核状态和同一地址空间.其优点是减少了进程间通信和状态切换的系统开销,获得较高的运行效率;缺点是内核庞大,占用资源较多且不易剪裁,一旦每个驱动程序出错,就会导致整个系统的崩溃,系统的稳定性、安全性不好.与此相反,微内核系统在内核中只实现那些必须由内核实现的基本功能,而将图形系统、文件系统、设备驱动及通信等功能在内核之外,以系统服务的形式提供各种功能.这种结构的优点是有一个精炼的内核,便于剪裁与移植,而且由于系统服务程序运行在用户地址空间,因而个别驱动程序的错误不至于导致整个系统的崩溃;其不足之处是在运行中用户状态和内核状态频繁地切换,从而导致系统效率不如单体内核.微内核结构用一个水平分层的结构代替了传统的纵向分层的结构。
板级⽀持包(BSP)[转载]板级⽀持包(BSP)[转载]2008-09-03 20:45BSP是板级⽀持包(Board Support Package)的缩写,是通常⽤在嵌⼊⾏业中的⼀个术语,⽤来代表在⼀个特殊硬件平台上快速构建⼀个嵌⼊操作系统所需的原始资料或者⼆进制软件包。
BSP的作⽤是⽀持操作系统,使之能够更好的运⾏于硬件平台。
BSP是相对于操作系统⽽⾔的,不同的操作系统对应于不同定义形式的BSP,包括Windows CE、Linux、Vxworks 等。
SoC/CPU⼚商应向其芯⽚的⽤户提供⼀个基本的BSP包,以⽀持主板⼚商或整机制造⼚商在此基础上定制和开发各种商⽤终端产品。
在嵌⼊式系统学习过程中设计到了Bootloader,下⾯讲述了Bootloader的基本作⽤,在后续的⽂章中我将对如何编写⾃⼰的Bootloader进⾏介绍。
1. Bootloader的基本概念:简单地说,bootloader就是在操作系统内核运⾏前运⾏地⼀段⼩程序。
通过这段⼩程序,可以对硬件设备,如CPU、SDRAM、Flash、串⼝等进⾏初始化,也可以下载⽂件到系统板、对Flash进⾏擦除和编程,真正起到引导和加载内核镜像的作⽤,但是随着嵌⼊式系统的发展,bootloader已经逐渐在基本功能的基础上,进⾏了扩展,bootloader可以更多地增加对具体系统的板级⽀持,即增加⼀些硬件模块功能上的使⽤⽀持,以⽅便开发⼈员进⾏开发和调试。
从这个层⾯上看,功能扩展后bootloader可以虚拟地看成是⼀个微⼩的系统级的代码包。
bootloader是依赖于硬件⽽实现的,特别是在嵌⼊式系统中。
不同的体系结构需求的bootloader是不同的;除了体系结构,bootloader还依赖于具体的嵌⼊式板级设备的配置。
也就是说,对于两块不同的嵌⼊式板⽽⾔,即使它们基于相同的CPU构建,运⾏在其中⼀块电路板上的bootloader,未必能够运⾏在另⼀块电路开发板上。
本文说明:从WINCE6.0的安装到使用,花费时间最大的是在下载需要安装的软件和修复各种运行时的BUG错误一.WINCE6.0开发环境建立:主要对WINCE6.0的开发环境需要的软件,硬盘空间,安装步骤等进行了说明二.安装WINCE6.0过程和使用WINCE6.0时遇到的问题及解决办法一.WinCE6.0开发环境建立(1)需要安装的软件及安装包大小(下面提到的软件安装包都已在公司文件服务器平台组public目录下的win CE6.0文件夹中进行备份)1、Visual Studio 2005 2.6G2、Visual Studio 2005 Service Pack 1 430M3、MSDN(可选)4、Windows Embedded CE6.0 3.67G5、Windows Embedded CE 6.0 Platform Builder Service Pack 1 56.3M6、WINCE6.0R2 1.9G7、WINCE6.0R3 1.14G8、Microsoft Device Emulator 2.09、Virtual Machine Network Driver for Microsoft Device Emulator10、WINCE6.0 Updates Packages(2011)大于1.4G本文基于Windows XP SP3操作系统环境,以上10项除第3项外,其他的都必须安装,并且必须安装顺序安装。
软件下载及遇到问题:a.VS2005客户端需要在第三方网站下载,目前微软官方网站上提供的安装包的安装程序是不能启动的,通过微软官网下载只会浪费时间。
b.VS2005 SP1补丁包也可通过第三方网站下载。
c.WINCE6.0客户端+SP1+R2+R3安装包,微软提供了相应的下载器下载这几个部分的安装包,但使用这些下载器的下载速度可能会让你不耐烦,建议找一个第三方网站直接下载这些客户端的离线安装包,我找到的唯一一个地址为:/id/2793687d.用于运行WINCE6.0的OS镜像的模拟器Emulator2.0可以在微软官网下载,但其VirtualMachine Network Driver for Microsoft Device Emulator微软官网已经关闭此安装程序的下载,需要寻找第三方网站进行下载。
Windows CE 6.0入门详解(环境搭建内核配置和应用开发起步)武汉众嵌科技有限公司修订历史记录一、安装开发环境 (3)A)按下列顺序安装所需软件 (3)B)安装说明 (3)C)装中可能出现的问题及解决方法 (4)二、WINDOWS CE 内核定制 (5)A)基W INDOWS CE产品开发流程大致分为以下几个阶段 (5)1.硬件设计 (5)2.选定BSP (5)3.获得驱动程序 (5)4.剪裁系统内核 (5)5.导出SDK (6)B)详细制作流程 (6)1.新建立一个OS Design工程 (6)2.建立工程 (7)3.配置工程 (8)C)配置内核 (10)1.选择应用程序(Applications-End User) (10)2.Applications and Services Development (10)3.选择系统核心服务(Core OS Services) (11)munication Services and Networking (12)5.设备管理(Device Management) (12)6.and Data Store (13)7.选择字体(Fonts): (13)8.国际化支持(International) (13)9.Internet Client Services (14)10.Graphics and Multimedia Technologies (14)11.Shell and User Interface (15)D)生成系统镜像 (15)E)生成SDK (16)F)安装A CTIVE S YNC 并配置 (16)G)配置模拟器并生成程序 (16)H)配置模拟器 (17)I)应用开发 (19)一、安装开发环境a) 按下列顺序安装所需软件1.Visual studio 20052.Visual studio 2005 server pack 13.Visual studio 2005 service pack 1 update for Windows vista/74.Windows Embedded CE 6.0 (Windows Embedded CE6.0.iso)5.Windows Embedded CE6.0 service pack 16.Windows Embedded CE 6.0 R27.Windows Embedded CE 6.0 R38.Windows Embedded CE cumulate product update rolluppackage through(12/31/2010)9.VS_emulator.exe(模拟器)b) 安装说明我的系统是Windows 7 旗舰版所以存在一个权限问题我以这样的方式安装所有的程序:c) 装中可能出现的问题及解决方法报错信息:1. ToolsMsmCA(Error): Setup package issue or CoreConDataStore corrupted: DeviceSDKInstComp Add/Remove failed.HR=0x8007005。
自制Windows CE 6.0安装详细图片教程强调:本教程是由郭斌和张学良共同完成,图片教程仅是根据自己安装过程制作而成,有错误或者不足之处应以实际情况为准。
有好的意见和建议请发邮件联系我们,联系邮箱是:pmbc88@.1、更新操作系统,升级为SP3首先检查您的操作系统,如果你的操作系统是Miscrosoft Windows XP SP2版本,那么在安装Windows CE之前必须要更新您的系统。
方法是右键点击我的电脑选择属性,在常规中查看操作系统版本,在自动更新中点击从Windows Update 网站安装更新。
进入Windows 系统更新界面,点击立即下载和安装,安装更新程序完成之后要重新启动电脑,重启完电脑之后开始安装Windows XP Service pack 3。
安装完Windows XP Service pack 3之后,重启电脑,右键单击我的电脑属性,这时候发现Windows系统版本已经成为Miscrosoft Windows XP SP3版本,然后继续点击自动更新,按照上面提到的方法来完成SP3相关的后续更新。
由于更新程序数目很多,速度很慢,为了防止电脑进入待机状态,需要对关闭监视器和屏幕保护程序进行设置,具体设置如下图所示。
2、安装前的一系列准备进入微软中国官方网站(/zh/cn/),可以点击所有产品对微软的产品有所了解,而我们即将要安装的Windows CE 6.0 就属于微软的Windows Embedded产品。
点击Windows Embedded即可进入Windows Embedded界面,在这个界面点击关于就可以了解一下什么是Windows Embedded,点击为什么选择Windows Embedded?就可以对Windows Embedded 系列的产品有所了解,这时候就可以发现Windows Embedded CE。
了解完这些之后,下面就可以在Windows Embedded界面点击下载进入Windows Embedded下载中心。
基于WinCE的BootLoader研究摘要:随着计算机技术的快速发展,嵌入式微控制器技术和嵌入式系统已成为当前的一大热点,而BootLoader则是嵌入式系统中重要的一部分。
对WinCE下的BootLoader做了详细的研究。
关键词:WinCE;BootLoaderBootLoader是在操作系统内核运行之前运行的一段小程序,它存放于目标平台的非易失存储介质中,如ROM或Flash。
它可以初始化硬件设备,建立内存空间的映射图,从而将系统的软硬件环境带到 1 个合适的状态,然后加载操作系统映像到内存,跳转到操作系统代码去执行。
在开发CE的过程中,它主要用于启动硬件和下载nk.bin到目标板上,并有一定的监控作用。
下图描述了WinCE的BSP基本结构以及BootLoader所处的位置。
一般来说,对于BootLoader的功能要求并不是严格定义的,不同的场合区别很大。
比如,在PC的硬件平台上,由于硬件启动根本就不是通过BootLoader(而是通过BIOS),所以BootLoader就不需要对CPU加电后的初始化做任何工作.通常,BootLoader必须包含下载CE映像文件的功能。
图1WinCE BSP的基本结构总体上BootLoader需要完成以下工作:(1)初始化CPU速度。
(2)初始化内存,包括启用内存库,初始化内存配置寄存器等。
(3)初始化中断控制器,在系统启动时,关闭中断,关闭看门狗(Watchdog)。
(4)初始化串行端口(如果在目标上有的话)。
(5)启用指令/数据高速缓存。
(6)设置堆栈指针。
(7)设置参数区域并构造参数结构和标记。
(8)执行POST(加电自检)来标识存在的设备并报告有何问题。
(9)为电源管理提供挂起/恢复支持。
(10)传输操作系统内核镜像文件到目标机。
也可以将操作系统内核镜像文件事先在FLASH中,这样就不需要BootLoader和主机传输操作系统内核镜像文件,这通常是在做成品的情况下使用。
【原创】Windows CE操作系统BSP开发——————BootLoader开发OAL开发2011-11-290 概述BSP:介于主板硬件和操作系统之间的一层软件系统把操作系统与硬件交互的接口抽象抽取出来,再作为单独的一层函数,操作系统需要访问底层硬件的时候(例如初始化硬件、关中断等),不再直接访问硬件,而是调用抽象出来的这一层函数完成操作。
有了BSP层的抽象之后,操作系统内核的代码就可以做到只与CPU体系结构相关,而与具体的硬件无关了。
对于不同的CPU体系结构,操作系统仍然需要提供编译好的二进制代码或在该CPU下可编译的源代码。
因此,在内核中如果要使用汇编语句,对不同的CPU都要编写一份,所以操作系统代码大多数都是用C/C++实现的。
BSP与特定的嵌入式操作系统相关。
BSP对应的是某块具体的开发板/产品板,而不是某款CPU,也不是某类CPU 体系架构。
因此,BSP 与开发板一一对应。
概念:芯片支持包,CSPOAL 层:负责Windows CE 内核与硬件通讯。
当引导程序引导操作系统结束后,由OAL层负责硬件平台初始化、中断服务例程、实时钟、计时器、内核调试、开关中断和内核性能监测等工作。
OAL的代码在物理上是内核的一部分,最终经过编译链接,OAL会成为内核的一部分。
引导程序(Boot Loader):在硬件开发板上执行的一段代码,它的主要功能是初始化硬件、加载操作系统映像到内存,然后跳转到操作系统代码去执行。
配置文件:一些包含配置信息的文本文件。
这些配置信息通常与操作系统映像或源代码有关。
例如告诉编译系统如何编译某些源代码,或告诉编译系统如何配置最终的操作系统映像文件。
.BIB、.DB、.REG 和.DAT四类平台初始化文件:用来告诉MakeImage工具如何生成操作系统映像;Sources和DIRS文件:告诉构建系统如何构建代码;CEC文件:这样BSP可以与Platform Builder集成。
设备驱动程序:Q:当最终的产品中不包含boot loader时,操作系统是如何启动的?A:开机就执行OAL代码,然后启动操作系统。
发布BSP的目的是把BSP打包成安装文件,以方便第三方软件开发商使用。
一般而言,可以把BSP打包成.MSI安装文件。
1 BootLoader开发Boot Loader通常位于目标设备上的非易失存储设备中(例如Flash、ROM),并且在系统加电或重置的时候自动执行。
可以通过JTAG或串口烧写工具把Boot Loader烧写到目标设备上。
绝大多数Boot Loader都会从开发机下载映像到目标机然后执行。
与使用JTAG烧写映像到目标机相比,这样做在开发过程中可以方便的更新目标机上的映像,缩短“修改/构建/下载/调试”的开发周期,以节省开发时间。
而之所以选用以太网,主要考虑是它的速度比较快。
图Boot Loader的执行顺序总体而言,Windows CE的Boot Loader有三大功能:◆初始化目标硬件设备:包括初始化内存、中断控制器、时钟和MMU等◆控制启动过程:提供一个简单的菜单与用户交互◆下载并执行操作系统Boot Loader组成BLCommon库:实现通用的Boot Loader框架,其功能包括:把Boot Loader搬到RAM里以获得更快的访问速度、解析以及解包.BIN文件的格式、检验校验和以及跟踪加载进度。
BLCommon库还会调用OEM代码来处理硬件初始化等操作。
在Boot Loader的代码中,开发者可以直接链接blcommon.lib 来使用BLCommon库中的功能。
OEM代码:以OEM开头的一些函数,需要开发人员实现。
EBoot库:实现DHCP、TFTP和UDP网络服务。
在Boot Loader的代码中,开发者可以直接链接eboot.lib来使用EBoot库中的功能。
Windows CE使用TFTP协议进行下载,EBoot库的目的是简化和封装复杂的网络操作。
Boot Loader中有两类设备经常被用到:以太网卡——下载操作系统映像;Flash——用来存储Boot Loader和下载的操作系统映像。
因此Boot Loader针对这两类硬件设备也抽象出了统一的接口,也可以被称作驱动程序,分别是EthDbg 驱动和FMD 驱动。
注:TFTP是一个简单的文件传输协议,EBoot使用它来下载操作系统映像;TFTP是基于UDP协议的。
DHCP 是从服务器动态获得IP地址的协议;如果网段内有DHCP 服务器,EBoot可以用DHCP 动态获得IP地址。
Boot Loader的工作流程和原理Boot Loader的实现必须和可选实现的OEM函数必须实现的与串口调试相关的函数配置和编译Boot Loader1,编译源代码Boot Loader的源代码由C语言代码和汇编语言代码组成。
编译这些代码都可以在Windows CE的构建系统下完成。
因此对于要构建的代码,首先需要编写SOURCES和DIRS文件。
2,配置Boot Loader配置文件须包含目标设备上的内存分配信息,其次要包含ROM的一些信息如起始位置、宽度等,最后还要包含需要打包的文件列表。
Boot.lib文件用来配置Boot Loader。
3,打包打包Boot Loader的工具与打包OS的工具是一样的,都是RomImage.exe。
此工具只接受一个BIB文件为参数。
SOURCES文件的最后一行定义了BootImage附加操作,构建系统在所有编译链接完成后自动调用此操作。
BootImage操作定义在EBoot目录的Makefile.inc文件中:使用RomImage.exe工具打包EBoot代码,将生成的文件(可能的格式有NB0、BIN和SRE)复制到Release目录。
4,最终,根据不同目标设备的烧写方式不同,选择一个适用于自己目标设备的映像,烧写进内置的Flash中,就可以在目标设备上运行Boot Loader了。
SOURCES文件实例:SMDK2410 BSP,Eboot,SOURCES2 OAL开发OAL(OEM Abstraction Layer)是位于Windows CE操作系统内核和目标硬件设备之间的硬件抽象代码。
从物理上来说,OAL的代码是操作系统内核的一部分。
通常OAL代码会被编译成一个库,然后这个库与其它的内核库进行链接,共同形成操作系统内核的可执行文件。
如果在最终的产品中没有Boot Loader,显然在OAL中就要实现硬件初始化。
WINCE的内核代码与CPU相关而与硬件设备无关,所有与具体外设相关的代码都在OAL中。
值得注意的是在OAL中,有很多代码是可以Boot Loader和OAL通用的。
这其中包括一些硬件初始化代码和端口访问代码。
Windows CE内核的构成:NK库:通常指的是NK.lib或NKProf.lib文件,这两个库文件是由微软提供的,包含了Windows CE操作系统内核的大部分功能。
例如:进程线程管理、调度管理、内存管理等。
因此NK 库是内核的核心所在。
其中NK.lib 是含有内核基本功能的库,而NKProf.lib 中含有性能监控代码。
根据CPU体系结构不同,NK库一共有四种,分别对应X86、ARM、MIPS和SH四类CPU。
这也是内核代码与CPU体系结构相关的体现。
KITL是Kernel Independent Transport Layer的缩写,其基本的思想是提供操作系统内核在开发机和目标设备之间建立连接和通信的途径。
正如KITL的名字所描述的一样,KITL的特点是与具体的数据传输介质无关。
数据可以通过以太网、串口、USB 或者并口等多种方式进行传输,但是对于操作系统内核而言,它看到的是统一的接口。
连接建立之后,操作系统内核的很多服务都可以架构在KITL之上。
例如内核调试,控制台等等。
实现KITL的库文件是KITL.Lib。
C函数库也是由微软提供的。
这部分代码是在内核中使用的C语言函数,名字是FullLibc.Lib。
一般的CRT代码都会架构在操作系统之上,并且用到操作系统的一些功能,但是这个库是与操作系统无关的,不会用到操作系统提供的服务,因此可以安全的用在操作系统内核中。
也正因如此,它实现的仅仅是C函数库的一个子集。
Production-Quality OAL是由微软提供的一些可重用的代码库。
这些代码库包含对特定CPU 或CPU内置的外设控制器的操作代码。
在实现BSP的时候,如果要实现对CPU操作或对CPU 内置控制器的操作,应该尽量使用PQOAL中的库而不要自己实现。
在BSP的代码中,基本上以OAL开头的函数都是PQOAL 库中的函数。
在ARM的函数调用过程中,寄存器R0、R1、R2和R3被用来传送函数的参数,而不像X86中把函数的参数放在栈上。
KernelStart()函数,即主控函数的功能:PRIVATE\WINCEOS\COREOS\NK\KERNEL\ARM\Armtrap.s 1,初始化页表、打开MMU和Cache页表就是虚拟地址和物理地址的映射表。
MMU利用查找页表把虚拟地址映射到物理地址。
页表中除了记录有虚拟地址的映射信息外,还包含此段内存的访问权限。
用户设置一个虚实映射的数组,Windows CE的代码会自动根据这个数组的内容去设置相应的页表。
这个数组就是OAL_ADDRESS_TABLE 。
它是一个有用户填充的数组,数组中的内容定义了物理地址到带缓存的虚拟地址(0x8000 0000到0x9FFF FFFF)之间的映射关系。
KernelStart()的代码会根据这个数组的内容,来配置页表。
KernelStart()会根据这个表建立两份虚实映射。
以SMDK2410为例,数组的定义在\PLATFORM\SMDK2410\SRC\INC\oemaddrtab_cfg.inc中。
g_oalAddressTableDCD 0x80000000, 0x32000000, 32 ; 32 MB DRAM BANK 6DCD 0x82000000, 0x08000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 1DCD 0x84000000, 0x10000000, 32 ; nGCS2: PCMCIA/PCCARDDCD 0x86000000, 0x18000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 3DCD 0x88000000, 0x20000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 4DCD 0x8A000000, 0x28000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 5DCD 0x8C000000, 0x30000000, 32 ; 32 MB DRAM BANK 6DCD 0x90800000, 0x48000000, 1 ; Memory control registerDCD 0x90900000, 0x49000000, 1 ; USB Host registerDCD 0x90A00000, 0x4A000000, 1 ; Interrupt Control registerDCD 0x90B00000, 0x4B000000, 1 ; DMA control register……………………DCD 0x91800000, 0x58000000, 1 ; A/D convert registerDCD 0x91900000, 0x59000000, 1 ; SPI registerDCD 0x91A00000, 0x5A000000, 1 ; SD Interface registerDCD 0x92000000, 0x00000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 0DCD 0x00000000, 0x00000000, 0 ; end of tableEND2,设置异常向量跳转表3,当MMU和Cache打开之后,还需要初始化每个模式下的栈,才能开始执行C语言代码。