博文

WinCE线程和内存管理之内存管理(2009-05-26 15:27:00)

摘要:内存管理

  同其它Windows操作系统一样,Windows CE.NET也支持32位虚拟内存机制、按需分配内存和内存映射文件等。但是与其它Windows操作系统又有明显的不同。 毕竟Windows CE是一种嵌入式实时性的操作系统,在内存管理方面必须要比其它Windows操作系统更节约物理内存和虚拟地址空间。在内存管理API方面,为了便于移植程序,Windows CE和其它Windows操作系统函数声明基本一致,这使一个在其它Windows下开发的程序员可以直接使用早就熟悉的API函数, 但是CE下内存管理的原理开发者还是应该熟悉的。

  1、ROM和RAM

  对于早期采用的存储设备一般采用ROM + RAM ,在ROM中存放的所有文件可以是压缩的也可以是不压缩的,这取决于OEM(原始设备制造商)。OEM在定制CE内核时可以设置一个标志告诉ROM镜像制作工具(romimage.exe)是否压缩文件。对于ROM中存放的模块(DLL、EXE文件)来说,如果是压缩的,模块在运行前先解压并全部存放到RAM中。如果是不压缩的,并且ROM介质支持线性访问(line-Accessed),就可以本地执行(executed in place,缩写为XIP)。利用本地执行方式运行应用程序、DLL的优点是:采用这种技术在加载EXE或DLL时,其中的代码段数据不加载到物理内存中,内核只是分配虚拟地址空间给代码段,当执行代码时内核会到实际存放在ROM存储设备上的文件中寻找代码并执行。采用这样的技术既可以节省可用内存又可以减少加载的时间。但是这种技术有一定的局限性,如果要让CPU到ROM中去寻找代码执行,那么ROM介质必须支持线性访问,这就要求ROM介质支持线性访问,而不是块访问。XIP这种加载方式的缺点就是执行速度相对较慢,CPU访问ROM的速度肯定远慢于访问RAM的速度。
 
  基于Windows CE的产品开始采用FLASH、IDE等永久存储设备时,内核镜像(.bin)和其它应用程序文件开始存放到永久存储设备中而不是ROM中,这不仅仅是因为硬盘或者FLASH的I/O速度比ROM快,更因为现在的内核包含的功能多并且文件数量增加,因而需要的存储空间很大,一般都在20MB左右。再加上其它开发商开发的应用程序文件,......

阅读全文(2441) | 评论:0

WinCE驱动程序的分类(2009-05-14 11:04:00)

摘要:最近有一些同学发邮件问我,驱动调试助手到底能动态加载哪些驱动,为什么在加载USB设备驱动时总是失败。要解释这个问题,首先得弄清楚WinCE中驱动的相关概念。本文将主要介绍WinCE下驱动程序的分类。        驱动程序是介于操作系统和设备之间的一 个代码层,它的主要作用是为操作系统提供一个接口,以操作不同的硬件,包括物理的和虚拟的设备。虽然驱动程序有很多种,但从编程的角度来看,无非是往一个 固定的框架中添加相应的代码。这里的框架指的是一个接口,面向操作系统。代码实现的宗旨是,在正确的时间往正确的寄存器中写正确的值。        驱动程序的分类,从不同的角度有不同的 分法。拿串口驱动来说,你可以说它是一个分层驱动,你也可以说它是一个流驱动,你还可以说它是开机时自动加载的驱动……这似乎有点乱。如果你也这么认为, 那建议往下看。如果这些你都了如指掌,那就不浪费时间了,当然,您愿意找茬,我会很感谢!        先说本地驱动(Native Drivers)和流驱动(Stream Drivers)。WinCE下的驱动都可以归类到这两个里面,二者必居其一。这是从驱动程序提供给操作系统的接口来区分的。流驱动为操作系统提供了流接口函数,如XXX_Init()、XXX_Open()、XXX_Read()、XXX_Write()、XXX_Close()等等。这一类的驱动由Device Manager来管理,它调用ActivateDeviceEx()函数来加载流驱动。ActivateDeviceEx()的参数是注册表中相应的键,用来设定加载流驱动的属性,如Index、Order、Prefix等等。流驱动的注册表配置信息一般存放在[HKEY_LOCAL_MACHINE\Drivers\BuiltIn]下。流驱动加载成功后,应用程序通过调用CreateFile()、ReadFile()、WirteFile()等来访问流驱动的设备。流驱动可以动态管理,驱动调试助手就是用来帮助调试这一类驱动的。 与流驱动相反,本地驱动提供给操作系统的不是标准的流接口,而是事先约定好的特定接口。不同的设备,接口也不一样......

阅读全文(3201) | 评论:0

WinCE设计开发常见问题(WinCE开发特性及忠告)(2009-03-26 16:22:00)

摘要:最近一段时间,移动设备开发越来越多的成为了程序员社区的话题。移动设备主要包括智能手机和PDA,是嵌入式开发中很重要的一个方向。在智能手机领域被大多数手机厂商支持的J2ME无疑是领头羊,微软CE平台的SmartPhone也逐渐成为关注焦点。一直不温不火的PDA市场,也在行业应用领域有所收获,Pocket PC由于其开发与Windows平台的一致性而得到了开发人员的青睐。 在长期关注程序员论坛的过程中,我发现由于Windows CE开发的独特性,加之多个版本并存、缺乏中文参考资料,所以论坛上充斥着大量相同的入门问题。我希望在这里能够为刚转入Windows CE开发的程序员明晰一些概念,将现有的Windows CE版本与开发工具之间的关系给大家解释清楚。   Windows CE与平台开发   Windows CE是微软为嵌入式设备打造的操作系统,而嵌入式设备可谓多种多样,这就要求CE操作系统必须是可定制的,所以微软将Windows CE设计为模块化的操作系统。说简单点,我们可以把Windows CE想像成一盒积木,你可以用积木搭建出任何物体,但不一定要把所有的积木都用上。   Windows CE搭建出来的物体就是平台,是适应某种有固定标准的嵌入式设备的操作系统子集,最著名的平台就是Pocket PC了,是提供给没有键盘的掌上电脑使用的平台。由于平台和硬件的一致性,所以有时候我们也用平台的名称来称呼整个系统——硬件与操作系统的总和。   我们也可以自己开发平台,开发工具是微软提供的Platform Builder,Platform Builder的版本号是和Windows CE的版本号一致的。   更多程序员关心的是应用程序的开发,而应用程序开发是针对特定平台的,我们在开发之前必须安装目标平台的SDK,才能够开发出适应目标平台的开发工具。   Windows CE开发环境综述   初学者另外一个比较糊涂的概念是版本的问题,现在市面上能够见到Windows CE的两代产品,它们的内核分别基于Windows CE 3.0和Windows CE.NET(即4.0)。   微软将今年刚面世的Pocket PC 2003和Smart Phone 2003统称为Windows Mobile 2003,我们大多数时候还是习惯地沿用老称谓。   而市面上经常见到的P......

阅读全文(4405) | 评论:0

嵌入开发(WinCE)的一些经验(2009-03-19 11:15:00)

摘要:WindowsCE下Unicode和Ansi字符间互相转换的例子
纵所周知,WindowsCE下编程99%的问题都和Unicode有关.比如文件编辑,一般都保存为Ansi格式;无线通讯中控制Modem需要发送的AT指令,必须是Ansi格式;网络通讯中,PC端一般都是Ansi的,为了和PC上协议兼容,在WindowsCE中必须把要发送的一个指令从Unicode 转换成Ansi格式...等等.很多初学者对于这些问题总是感到很麻烦.其实WindowsCE中有标准的API实现了Unicode和Ansi字符间的互转.下面就是网络通讯中的程序片断.
m_psocket是指向一个从CCeSocket派生的类,如果没有连接的话其为NULL;
m_snd是要发送的CString,和一个EDIT相对应.
/发送函数片断
void CClient1Dlg::OnButtonSend()
{
  / TODO: Add your control notification handler code here
  if (!m_psocket) /无Socket连接,退出
  {
      MessageBox(TEXT("无连接!"),TEXT("信息"));
      return;
  }
  UpdateData(TRUE); /保存输入的字符串到m_snd
  unsigned char buf[129]; /发送缓冲区
  ZeroMemory(buf,sizeof(buf)); /缓冲区清零
  CString tmpstr(m_snd); /复制要发送的字符串
  int multibytelen=WideCharToMultiByte( /计算从Unicode转换到Ansi后需要的字节数
  CP_ACP, /根据ANSI code page转换
  WC_COMPOSITECHECK | WC_DEFAULTCHAR, /转换出错用缺省字符代替
  tmpstr.GetBuf......

阅读全文(2296) | 评论:0

Windows CE下驱动开发基础(2009-03-10 14:28:00)

摘要: 这是我从1月6日开始主持天极网论坛嵌入式开发版以来第一次发表文章,加上以前琐碎的文章共计30篇。研究的越多就越感觉自己懂的太少,其实在驱动开发方面我还是个菜鸟,我是想再次抛砖引玉,让做驱动有N年经验的人奉献一点出来,让大家减少一些研究驱动源码而又缺少注释所带来的痛苦。
  我想即使读者看过微软的关于驱动开发的培训教材和CE帮助文档中的驱动部分,头脑中仍然一片茫然。要想真正了解驱动程序必须结合一些驱动程序源码,在此我以串口驱动程序(COM16550)中初始化过程为线索简单讲一讲驱动开发的基础知识。
Windows CE下的串口驱动程序能够处理所有I/O行为类似串口的设备,包括基于16450、16550 UART(通用异步收发芯片)的设备和一些采用DMA的设备,常见的有9针串口、红外I/O口、Modem等。在%_WINCEROOT%\Public\Common\OAK\Drivers\Serial目录下,COM_MDD2子目录包含新的串口驱动MDD层函数代码。COM16550子目录包含串口驱动PDD层代码。SER16550子目录包含的一系列函数专用于控制与16550兼容的UART,这样PDD层的主要工作就是调用SER16550中的函数。还有一个ISR16550子目录包含的是串口驱动程序专用的可安装ISR(中断服务例程),而很多硬件设备驱动程序采用CE默认的可安装ISR giisr.dll。一般串口设备相应的注册表设置例子及意义如下: 键 意义 "SysIntr"=dword:13 串口1的中断ID为十进制13 "IoBase"=dword:02F8 串口1的IO空间首地址为十六进制2F8 "IoLen"=dword:8 串口1的IO空间长度为8个字节 "DeviceArrayIndex"=dword:0 串口1的索引,是1的由来 "Order"=dword:0 串口1驱动的加载顺序 "DeviceType"=dword:0 串口1的设备类型 "DevConfig"=hex: 10,00 .... 串口1在与Modem设备通讯时的配置,如波特率、奇偶校检等 "FriendlyName"="COM1:" 串口1在拨号程序中显示的名字 "Tsp"="Unimodem.......

阅读全文(2813) | 评论:0

WinCE下的串口驱动分析(2009-03-10 14:21:00)

摘要:串口驱动分析 Auth:nasiry date: 2005年4月12日
abort: windowsCE.net 420串口驱动分析 相关资料     虽然串口通讯已经是普遍的标准而且广为大家熟知,但驱动中涉及的部分内容也可能在平时的应用中并不是很常用到,在这里做一个简单的介绍待后面说明到具体代码的时候可以连贯一些。 串行通讯接口是目前十分流行的通讯接口之一。由于其电气界面的简单性使其在计算机领域的应用相当的广泛。在这里提到的串行通讯接口主要是指UART(通用串行)和IRDA两种。通常的串行连接电气连接上有3wire和9wire两种。3wire的接线方式下定义了发送、接收和地三根连接。其用途就如名称一样分别用于发送、接收。下面是通常3wire连接的结构框图

通常在串行接口控制器上会有两个FIFO用作接收和发送的缓冲,当接收到数据后会直接将接收到的数据置入该缓冲器,并同时由控制电路向本地总线发出通知,以便让本地总线将缓冲器内的数据读走,这样在响应(等待和读取)的过程中仍然能通过缓冲器来接收数据。而发送发送的过程刚刚相反,本地总线可一直向发送缓冲写入数据直到器填满为止,而无需对每个数据的发送进行等待。这就是基本的收发流程(这部分逻辑流程相信大家是最熟悉的)。这一点在3wire和9wire中都是相同的。但是我们考虑下面的情况,如果接收一方的响应由于某种原因的干扰(如处理器被其他中断服务占用)的时候可能就来不及相应之前ReceiveFIFO就可能被填满了,这样后续发送过来的数据就会丢失,这样在需要数据可靠传输的情况下串行通讯的弊端也就显示出来了。如需要数据的可靠传输就需要对数据流的收发进行控制。在9wire中将串行连接定义为如下形式。 针号 1 2 3 4 5 6 7 8 9 缩写 DCD RXD TXD DTR GND DSR RTS CTS DELL 功能说明 数据载波检测 接收数据 发送数据 数据终端就绪 信号地 数据设备就绪 请求发送 ......

阅读全文(2645) | 评论:0

WinCE系统下BootLoader的开发(2009-03-10 14:03:00)

摘要:引言 Windows CE.NET是微软公司向嵌入式领域推出的一款操作系统。它最大程度继承了桌面版Windows操作系统的丰富功能,同时又副入了许多新特性,以适应嵌入式领域的实际情况和要求。无论是商业应用需求,还是人们的多媒体消费需求,都能被采用CE操作系统的设备很轻松的满足。最新的.NET版本较之3.0版本,在实时性和稳定性上有大幅度提高,开始广泛地被平板电脑、数码相机、彩屏手机、PDA等多种高性能产品所采用。 但是,CE并不是一个通用的安装版操作系统,在形形色色的嵌入式硬件设备世界里, 一款CE系统通常只会针对某一种硬件平台生成。所以,作为原始设备生产商,必须根据自己的硬件平台和应用场合定制CE,最主要的工作就是编写适合于自己的板级支持包(BSP)。在BSP中,包含了一个重要的组成部分——BootLoader。创建一未功能完善的BootLoader,是开发WinCE系统的第一步,也是极为关键的一步。本文将结合开发实例,介绍如何开发适合于自己硬件的BootLoader。 1 定制CE操作系统的基本知识 定制CE操作系统是采用微软的工具软件:Platform Builder(PB)。该工具能够根据用户的需求,选择构建具有不同内核功能的CE系统。同时,它也是一个集成的编译环境,可以为所有CE支持的CPU目标代码编译C/C 程序。前面所说的BSP和BootLoader程序就是在该环境下编译,并整合到CE系统中去的。一旦成功地编译了一个CE系统,就会得到一个名为nk.bin的映像文件。只要将该文件下载到目标平台(device端),就能够运行CE了。 2 BootLoader BootLoader是一段单独的程序代码,它存放于目标平台的非易失存储介质中,如ROM或Flash。在开发CE的过程中,它主要用于启动硬件和下载nk.bin到目标板上,并有一定的监控作用。 图1描述了WinCE的BSP基本结构以及BootLoader所处的位置。 一般来说,对于BootLoader的功能要求并不是严格定义的,不同的场合区别很大。比如,在PC的硬件平台上,由于硬件启动根本就不是通过BootLoader(而是通过BIOS),所以BootLoader就不需要对CPU加电后的初始化做任何工作;而在笔者的开发平台(MIPS32)上,BootLoader是最先被执行的程序,所以就必......

阅读全文(3212) | 评论:1