技术开发 频道

Windows嵌入式十大疑难解答

  【IT168 专稿】Windows Embedded是微软针对嵌入式领域推出的操作系统,包括:Windows Embedded CE、XP Embedded和.NET Micro Framework。其中Windows Embedded CE主要应用于手持设备、机顶盒、GPS和PMP等嵌入式设备中。基于Windows Embedded CE专门针对智能手机的操作系统平台。XP Embedded主要用于ATM、POS、电子信息亭等设备。以下疑难均由微软专家为我们解答,希望对大家有所帮助。  

  Wince篇

  1.Wince的RS232接口
  问题:最近做一个ARM9数据采集的项目,采用S3C2410内核,通过带数显的千分尺测量数据,然后通过RS232接口模块发送到ARM板的串口1,串口程序用EVC4.0编写,数显千分尺不间断主动发送数据,ARM上手动启动采集,用多线程读数据,但是一直读不到数据,想问一下,对这种情况是否要为千分尺写专门的驱动程序,千分尺输出遵循的是标准的RS232协议?用VC6.0写的串口程序在 PC与千分尺之间采集数据已经走通了,我也知道Wince不支持重叠I/O,所以采用了多线程,程序应该没有问题,我想是不是驱动出了问题?我采用的是厂家提供的BSP定制的Wince系统。

  答案:1.RS232只是基本的物理线路,发送的是串口的基本数据格式(启始BIT+数据BIT+停止BIT),你的千分尺应该有自己的协议格式吧?但只要是基于RS232的通讯方式,就不用单独为其写CE的驱动程序,只用按千分尺的通讯协议写解析驱动即可以
  2.你的VC60程序通讯正常,只能说明你的PC机的串口是正常的,从你的问题描述中,并没有看到你说明你证明了你的ARM设备的串口是正常的所以建议如下:
  (1)测试一下你的ARM设备的串口是正常的吗?
  (2)如果(1)不正常显然是你的CE系统或硬件问题,反之就是你的EVC程序问题,解决了第一步我们再进步考虑第2步

  2.Wince的动态映射的简单方法
  问题:Wince下用I/O口作为输入,外接一个按键,我只接收按键的命令。我用的EVC写的应用程序,请问要自己写驱动吗?怎么写?

  答案:按提问者的描述,你有2种方法完成应用程序功能,我在此提出最简单的动态映射方法:
  (1)使用MmmapIoSpace映射你的I/O端口为一个进程空间
  (2)使用之类的函数读取数据
   WRITE_PORT_UCHAR()
   WRITE_PORT_UCHAR()
   READ_PORT_UCHAR( )
  (3)不要忘记使用完后要动态的UnMmmapIoSpace释放端口


  3. Wince系统的软件输入面板(SIP)的使用
  问题:我通过实现IInputMethod接口, 实现了一个软件输入面板(SIP). 通过这个SIP输入字符的时候, 系统会弹出一个默认的候选窗口. 但这个候选窗口比较难看, 请问我可不可以用什么方法去定制这个侯选窗口? 在网上查阅一些资料, 突然对SIP和输入法的概念不明确了. 请问SIP和输入法之间的关系是什么呢?

  答案:软件输入面板(Software Input Panel,简称SIP)是每个装备了Wince系统的移动平台的一个基本功能。它提供给用户在PDA上进行数据输入的一种手段。
  我们可以通过以下两种方式来修改面板的外观:
  (1)通过直接修改Wince中的IM代码。由于Wince的80%的代码都是公开的,而IM的代码则是完全公开的。我们可以直接通过修改IM的代码来修改窗口界面。
  (2)通过自定义开发来完成。我们可以参照Wince中带的IM接口函数和定义格式来开发自己的IM控制界面,然后卸载原有的IM组件,通过DLLRegister来注册我们自己编写的IM组件,替换原有的就可以了。

  4.Wince的非模态对话框的简单实现
  问题:请问Wince下支持MFC的非模态对话框吗?我创建的非模态对话框咋Wince下,弹出来后,然后用鼠标拖动对话框移动,可是每移动一次,屏幕上就多出一个对话框(和原来的一模一样的),单击关闭也没有响应,不知道是为什么?还有就是在对话抗构造函数中我也用了m_FullScreen=false;但是有时候好像也不起作用,不知道为什么?希望能够得到您的帮助!谢谢!

  答案:非模态窗体是指窗体弹出后不影响主进程运行。
Wince下是支持非模态对话框对话框,根据提问者的描述,只能初步估计应该是刷新消息的问题,增加如下代码完成消息分发和强制窗口刷新:

while(GetMessage(&msg,NULL,0,0)){
  
if((hMlDlg== 0) || (!IsDialogMessage(hMlDlg,&Msg)))
  {
     TranslateMessage(
&Msg);
     DispatchMessage(
&Msg);
  }
}

  XPE篇

  5. XPE的线程操作
  问题:我们自己开发的应用,每个进程都要创建10个以上的线程,当线程数量超过一定值后,createthread就会返回错误。请教各位高手了,谢谢!

  答案:XPE本身是XP Professional的二进制组件化版本,在二进制文件、内存管理和进程管理上都和XP Professional完全一致。换句话来说,只要操作系统内存允许的情况下,对线程数量是没有限制的。
  1. 如果把你做好的应用程序在XP Professional上运行,看看是否还出现类似的问题,如果出现,则说明你的应用程序在线程控制方面存在问题,请检查你的代码;
  2. 如果你的应用程序在XP Professional上运行正常,而在XPE上运行不正常,那么可能是因为你的XPE缺少某些系统组件。

  6.XPE的跨平台开发
  问题:xpe多媒体支持强不强,我的程序是C#开发的,这个系统支持吗?

  答案:xpe和xp是同样的二进制文件,不过是组件化的,所以,只要你添加了合适的组件(比如.net framwork)那么2者之间的程序都是可以跨平台使用的。同时,XPE支持所有基于Win32\MFC\.Netframework开发出来的应用程序。

  7.XPE的系统开发时遇到的典型问题
  问题:由于实验需要,我做了一个XPE系统,加入了基本的USB,网络和控制面板里的大多数项目,并且为了能正常运行我需要在XPE上用到的软件,我还加上了如下的组件:
  Multimedia Application Compatibility
  Networking Application Compatibility
  Shell Application Compatibility
  Windows Management Instrumentation Technologies
  Windows Application Compatibility
  但是在做好的XPE系统上运行我的测试软件时(是一个处理摄像头图像,计算,并网络传输的软件,软件功能挺多,比较庞大),还是会出现未知错误而导致软件崩溃,并不是一开起来就出错,而是用到其中的某些功能时出错。这种情况在XP里是不会出现的。由于不知道这个软件会用到什么依赖的组件,所以我想现在只能尽可能加入多一些的组件来保证XPE运行这个软件时不再出错。可是我现在该加入些什么组件呢?请大侠们帮我提点建议!

  还有一个问题是,这个软件在XPE里运行时界面都乱掉了,界面上的按钮啦,文本框啦,都没有显示在正常的位置。我想这个问题可能是因为我做的XPE系统里字体太少,缺少软件需要的字体。那么,还有其他的可能原因吗?怎么解决呢?

  答案:由于XPE是组件化的操作系统,所以我们自己开发的应用程需经常会因为缺少某些系统文件或者动态库而导致运行错误。当然,把所有的组件都添加进去是肯定可以解决这个问题的,向你后来添加的那些组件一样,添加了,就可以征程运行了。但是违背了XPE的设计初衷,就是最小运行镜像和最快启动速度。所以我们不建议这么做。我可以教给你一个很简单的方法,就是在XP Professional上运行你的应用程序,同时打开TaskInfo这个工具,这个工具可以从网上下载到。通过这个工具我们可以看到你的应用程序需要调用那些系统文件支持,我们找到这些文件后,把它添加到XPE对应的目录下并注册就可以了。

  这样既简单,又保证了最小限度的增加系统尺寸。至于你的窗体布局混乱的问题,一个原因是因为你的应用程序调用了XPE系统中没有的字体支持,所以就会使用系统默认的字体来替换,从而导致界面混乱。这个问题的解决方案就是在你的应用程序开发阶段尽可能的使用宋体,或者明确都使用了那些字体,然后把这些字体添加到你的应用程序中就可以了。另一个原因,如果你使用的是C#开发的应用程序,那么在你的工程中把窗体的AutoScaleMode改为None就可以了。

  8.XPE的镜像复制操作
  问题:假设我需要在几台配置完全一样的电脑上安装XPE操作系统,现在已经build好一个XPE的镜像,用其中一台机器做好了FBA,并且也把驱动全部装好了。如果我把这台机器硬盘里的东西全部复制到其他几台机器的硬盘上,那么是不是其他机器就都能正常运行了?我的疑问是:听说配置完全一样的机器也会有一些不同,比如网卡的mac地址什么的。那么照我这种方法复制系统可以使这几台机器都正常运行吗?

  答案:如果通过拷贝的方式把经过FBA的XPE文件复制到其他机器上,启动肯定是会有问题,尤其在使用了EWF和FBWF的情况下,更会出现问题。而SID和你的网卡Mac地址也会是完全一致的。因为FBA的过程包含组件注册,安装PNP设备,移植注册表项,安装网络,保存替换系统Hives,重置操作系统等复杂的操作。我们如果需要大批量分发操作系统,可以有很多种方法使用:
  1. 使用System Clone Tool;这样可以能保证不同的镜像具有不同的主机名和SID
  2. 使用Ghost方法,这样不能保证不同的镜像具有不同的主机名和SID

  9.使用XPE实现U盘启动
  问题:用windows embedded studio制作了一个迷你型的xpe系统,请问我如何能从U盘启动整个系统呢?我在网络上找过相关的一些方法,但是都不能顺利的完成。

  答案:有三种方法可以使用:
  1. 如果你的开发机安装了XP SP2或者Vista操作系统,则可以使用DISKPART的工具来完成U盘的引导区建立;
  2. 如果你的开发机没有安装了XP SP2或者Vista操作系统,则可以使用XPE自带的UFDPREP工具来制作U盘引导区;
  3.我们还可以使用第三方的工具来制作U盘的引导区,例如USB Boo;
通过以上方法做好的U盘,我们只需要把生成的XPE镜像拷贝到U盘里,然后通过设置BIOS的方法让机器从U盘引导就可以进入FBA。

  10.使用XPE做应用开发 保护自己的知识产权
  问题:使用XPE做应用开发,如何保护自己的知识产权?

  答案:通过System Clone Tool可以保证你的每一台XPE具有唯一的SID。如果用户在你的机器上把你的应用程序拷贝出来,或者干脆把你的操作系统整体Ghost出来,这样从操作系统一级确实是没办法限制的,因为Ghost软件的运行根本就还没进入到操作系统里面。这个问题不是XPE的问题,因为所有的操作系统都做不了这样的事情。

0
相关文章