索阅 100例 首 页| 资 讯| 下 载| 论 坛| 博 客| Webinar| 高 校| 专 刊| 会展| EETV| 百科| 问答| 电路图| 工程师手册| Datasheet

Windows CE

WindowsCE是微软公司嵌入式、移动计算平台的基础,它是一个开放的、可升级的32位嵌入式操作系统,是基于掌上型电脑类的电子设备操作系统,它是精简的Windows 95,Windows CE的图形用户界面相当出色。

其中CE中的C代表袖珍(Compact)、消费(Consumer)、通信能力(Connectivit)和伴侣(Companion);E代表电子产品(Electronics)。与Windows 95/98、Windows NT不同的是,Windows CE是所有源代码全部由微软自行开发的嵌入式新型操作系统,其操作界面虽来源于Windows 95/98,但Windows CE是基于WIN32 API重新开发、新型的信息设备的平台。Windows CE具有模块化、结构化和基于Win32应用程序接口和与处理器无关等特点。Windows CE不仅继承了传统的Windows图形界面,并且在Windows CE平台上可以使用Windows 95/98上的编程工具(如Visual Basic、Visual C++等)、使用同样的函数、使用同样的界面风格,使绝大多数的应用软件只需简单的修改和移植就可以在Windows CE平台上继续使用。Windows CE并非是专为单一装置设计的,所以微软为旗下采用Windows CE作业系统的产品大致分为三条产品线,Pocket PC(掌上电脑)、Handheld PC(手持设备)及Auto PC。


 目前最新的Windows CE为Windows CE 6.0,这个版本在内核部分有很大的进步:
  所有系统元件都由EXE改为DLL,并移到 kernel space.
  全新设计的虚拟内存架构
  全新的设备驱动程序架构,同时支持 User Mode 与 Kernel Mode 两种驱动程序。突破只能运行 32 个工作元(process)的限制,可以运行 32768 个工作元。每一工作元的的虚拟内存限制由32 M 增加到全系统总虚拟内存。Platform Builder IDE 集成到 Microsoft Visual Studio 2005。新的安全架构,确保只有被信任的软件可以在系统中运行。UDF 2.5 文件系统。支持 802.11i (WPA2)及 802.11e (QoS) 等无线规格,及多重 radio support.
  支持 x86, ARM, SH4, MIPS 等各种处理器。提供新的 Cellcore components 使系统在移动电话网络中更容易创建数据链接及激活通话。[1][2]在开发环境上,微软也提供兼容于.NET Framework的开发元件:.NET Compact Framework,让正在学习.NET或已拥有.NET程序开发技术的开发人员能迅速而顺利的在搭载Windows CE .NET系统的设备上开发应用程序。
  用于掌上电脑Pocket PC以及智能手机Smart Phone上的Windows CE系统称为Windows Mobile,目前成熟的最新版本为Windows Mobile 6.5。
  1) WinCE与Linux有何区别?(商业模式,学习和开发难度,对硬件的支持,稳定性,对工程师未来发展的帮助,对研发中心未来发展的帮助)
  嵌入式Linux OS与Windows CE相比的优点:
  第一:Linux是开放源代码,遍布全球的众多Linux爱好者都是Linux开发者的强大技术支持者;Windows CE目前6.0内核全部开放,GUI不开放。第二:Linux的内核小、效率高;Windows CE相比,占用过多的RAM。第三Linux是开放源代码的OS,在价格上极具竞争力,适合中国国情。Windows CE需要版权费用。第四Linux不仅支持x86芯片,还是一个跨平台的系统。更换CPU时就不会遇到更换平台的困扰。第五,Linux内核的结构在网络方面是非常完整的,它提供了对包括十兆位、百兆位及千兆位的以太网络,还有无线网络、Token ring(令牌环)和光纤甚至卫星的支持,目前WINCE的网络功能也比较强大。
  嵌入式Linux OS与Windows CE相比的弱点:
  第一:LINUX开发难度较高,需要很高的技术实力,WINCE开发相对较容易,开发周期短,内核完善,主要是应用层开发。第二:LINUX核心调试工具不全,调试不太方便,尚没有很好的用户图形界面,WINCE的GUI丰富,开发工具强大;第三,系统维护难度大。Linux占用较大的内存,如果去掉部分无用的功能来减小使用的内存,但是如果不仔细,将引起新的问题。
  2) WinCE 5.0与6.0有何区别?
  100%毫无保留地开放Windows Embedded CE 6.0内核,微软还将Visual Studio 2005专业版作为Windows Embedded CE 6.0的一部分一并推出。Visual Studio 2005专业版将包括一个被称为Platform Builder的功能强大的插件,它是一个专门为嵌入式平台提供的“集成开发环境”。这个集成开发环境使得整个开发链融为一体,并提供了一个从设备到应用都易于使用的工具,极大地加速了设备开发的上市。Windows Embedded CE 6.0重新设计的内核具有32,000个处理器的并发处理能力,每个处理有2GB虚拟内存寻址空间,同时还能保持系统的实时响应,加入了新的单元核心数据和语音组件,6.0包含的组件更便于开发者创建通过Windows Vista内置功能无线连接到远程桌面共享体验的投影仪,充分利用了多媒体技术,以开发网络媒体设备、数字视频录像机和IP机顶盒等。
  3) 请说出10个使用WinCE的产品(其中有5个产品是大家都知道的)。
  手机,指纹识别系统,汽车电子检测设备,智能家电,医疗仪器(例如:监护仪,心电检测仪等等),工业控制仪器(例如:人机界面显示的高精准电机控制,工业采集控制通信等),定位导行设备(例如:车载GPS导航仪),
  4) 请说出10个使用Linux的产品(其中有5个产品是大家都知道的)
  摩托罗拉A系列(明),E系列(E6,E680等),爱国者MP5(如P881)
  5) WinCE 与 Vxworks有何区别?(商业模式,学习和开发难度,对硬件的支持,稳定性,对工程师未来发展的帮助,对研发中心未来发展的帮助)
  WinCE商业模式:
  Windows Embedded CE 6.0使用了基于数量的特许许可证模式,设备制造商可以在设备开始供货时再购买运行许可证。微软将提供知识产权保护(根据许可协议条款)和为期10年的产品支持生命周期,确保产品的完整性,并保证厂商得到必要的支持和保护以获得成功。
  Windows CE 休眠唤醒全面解析
  Windows CE 作为一个广泛应用于移动便携设备上的操作系统,提供了完善的电源管理的功能。其中,休眠唤醒便是一个重要的功能。那么,休眠唤醒是什么原理呢,这首先要从硬件说起。这里呢,我就拿用自己得最熟练的三星平台的2440 CPU为例来和大家探讨一下。
  首先看2440 Datasheet 里关于休眠部分的描述
  SLEEP ModeThe block disconnects the internal power. So, there occurs no power consumption due to CPU and the internal logic except the wake-up logic in this mode. Activating the SLEEP mode requires two independent power sources. One ofthe two power sources supplies the power for the wake-up logic. The other one supplies other internal logics ,including CPU, and should be controlled for power on/off. In the SLEEP mode, the second power supply source forthe CPU and internal logics will be turned off. The wakeup from SLEEP mode can be issued by the EINT[15:0] or by RTC alarm interrupt.
  上面这段话大意就是,当CPU进入休眠模式后,整个CPU系统会进入低功耗模式,只有当外部中断0-15中任意一个中断被触发,或者实时时钟中断被触发时,系统才会被唤醒。我们结合2440 wince5.0 BSP中的相关部分来详细分析。
  (这里说句题外话,现在市面流传着2种类型的wince5.0的BSP,一种是基于三星官方发布的PQOAL结构的,另一种,是从4.2的BSP升级上来的,也就是把原来4.2下的 BSP经过修改,使得能够在PB5.0下编译通过。下面我要分析的就是后者,也就是从 wince4.2下升级过来的5.0 BSP.他的结构和4.2下面的基本相同。
  按我的观点,这两种BSP 无所谓好坏,只要能实现产品功能的,就是好的BSP.不过从长远来看,微软主推的是PQOAL结构的BSP,以后官方发布的5.0和6.0的BSP,基本都是采用的这种结构。)
  使得系统进入休眠的方法有很多,比如在WINCE的桌面上,点左下角的图标,然后选择 “挂起”。或者是在应用程序或驱动中调用SetSystemPowerState函数,都可以让系统进入休眠状态。实际上,这两种方法殊途同归,最终都是要去调一个 OEM层的函数 : OEMPowerOff
  .
  这个函数的具体实现在
  WINCE500"PLATFORM"SMDK2410"KERNEL"HAL"power.c中
  ,如下
  VOID OEMPowerOff(void)
  {
  volatile IOPreg *s2410IOP = (IOPreg *)IOP_BASE;
  volatile INTreg *s2410INT = (INTreg *)INT_BASE;
  volatile LCDreg *s2410LCD = (LCDreg *)LCD_BASE;
  /* Save Current Important CPU Regs... */
  CPUSaveRegs(CPUBackupRegs);
  /* LCD Controller Disable */
  CPULCDOff();
  /* Stop all GPIO */
  ConfigStopGPIO();
  /* Set misc register for power off */
  ConfigMiscReg();
  /* Actual Power-Off Mode Entry */
  CPUPowerOff();
  /* Recover Process, Load CPU Regs */
  CPULoadRegs(CPUBackupRegs);
  /* Clear GSTATUS2 register : Write 1 to clear */
  s2410IOP->rGSTATUS2 = s2410IOP->rGSTATUS2;
  /* Interrupt Clear */
  s2410IOP->rEINTPEND = s2410IOP->rEINTPEND;
  s2410LCD->rLCDSRCPND = s2410LCD->rLCDSRCPND;
  s2410LCD->rLCDINTPND = s2410LCD->rLCDINTPND;
  s2410INT->rSUBSRCPND = s2410INT->rSUBSRCPND;
  s2410INT->rSRCPND = s2410INT->rSRCPND;
  s2410INT->rINTPND = s2410INT->rINTPND;
  OEMInitDebugSerial();
  CPUClearCS8900();
  RETAILMSG(1,(TEXT("-- Exit OEMPOWER."r"n")));
  RETAILMSG(1,(TEXT("s2410INT->rINTMOD = 0x%x "r"n"), s2410INT->rINTMOD));
  RETAILMSG(1,(TEXT("s2410INT->rINTMSK = 0x%x "r"n"), s2410INT->rINTMSK));
  }
  我们可以看到,这里面依次做了以下工作:
  调用 CPULCDOff函数,关闭背光。
  调用 ConfigStopGPIO,设置各IO休眠后的状态
  调用 ConfigMiscReg,设置 CPU上的 Misc寄存器。
  接下来,调用 CPUPowerOff。。。。。。。
  注意看程序里的注释:Actual Power-Off Mode Entry
  也就是说,在这个函数的内部,才会真正使得CPU进入休眠模式,那么我们接下来看看这个函数都干了什么工作吧。搜索,怎么搜不到函数的实现?????
  其实,这个函数的具体实现是用汇编语句来写的,所以在搜索的时候,文件的类型得选择 *.*,而不是 .c,.cpp,*.h等,
  我们终于在 WINCE500"PLATFORM"SMDK2410"KERNEL"HAL"ARM"fw.s中找到了这个函数的实现,当然,都是汇编写得 :(
  (未完待续)
  Windows CE 休眠唤醒全面解析(基于2440平台)(2)
  LEAF_ENTRY CPUPowerOff
  ; 1. Save register state and return address on the stack.
  ;
  stmdb sp!, {r4-r12}
  stmdb sp!, {lr}
  ; 2. Save MMU & CPU Registers to RAM.
  ;。。。。。。。。。。。。。。。。。。。。。。。。。。。。
  。。。。。。。。。。。。。。。。。。。。。。。。。。。。
  。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
  这里我就不把代码贴出来了,大家自己去BSP包里看。
  这写部分代码的功能就是保存当前系统的状态,把CPU上一些寄存器里的数据保存到RAM里去,然后禁止RAM自刷新的功能。而且当CPU进入Sleep状态时,RAM是不会掉电的,这样RAM里得数据就不会丢失,当CPU被唤醒后再用RAM里的数据来恢复系统。
  注意这一句
  ; 6. Set external wake-up interrupts (EINT0-2: power-button and keyboard).
  。。。。。。。。。。。。。
  。。。。。。。。。。。。
  也就是说在这行话下面,你就得加入设置唤醒中断源的程序了
  如果你在这里成功设置了某个IO 作为中断功能的话,那么系统在休眠后就可以通过人为触发这个中断来实现唤醒CPU(注意,是唤醒CPU,而不是唤醒Wince 系统).这里教大家个小窍门,我们完全可以不在这个语句下面来写汇编语句来实现设置外部唤醒中断的功能(谁让咱是汇编菜鸟呢)。而是在之前的 ConfigStopGPIO里,写C的程序来完成同样的功能。当然,你得保证你设置的那个IO的状态在进入休眠前没有被改变 :)
  接下来,程序走到这里
  。。。。。。。。。。。。。。。。。。。。。
  。。。。。。。。。。。。。。。。。。。。。
  。。。。。。。。。。。。。。。。。。。。。
  ldr r4, =vCLKCON
  ldr r5, =0x7fff8 ; Power Off Mode
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ; Sometimes it is not working in cache mode. So I modify to jump to ROM area.
  ldr r6, =0x92000000 ; make address to 0x9200 0020
  add r6, r6, #0x20 ;
  mov pc, r6 ; jump to Power off code in ROM
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  b SelfRefreshAndPowerOff
  ALIGN 32 ; for I-Cache Line(32Byte, 8 Word)
  SelfRefreshAndPowerOff ; run with Instruction Cache's code
  str r1, [r0] ; Enable SDRAM self-refresh
  str r3, [r2] ; MISCCR Setting
  str r5, [r4] ; Power Off !!
  b .
  LTORG
  这段代码的意义,就是把 0x7fff8 这个32位数送到CLKCON寄存器里,这样就使得CPU进入了休眠的模式
  不过在实际编译运行过程中,我发现,如果是在4.2的bsp中,这样的代码是没问题的,系统能够正常进入休眠,但是在升级到5.0后,在进入休眠之前,系统会发生异常错误,还没执行进入休眠的语句,程序就跑飞了。经过一段排查,发现把
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ; Sometimes it is not working in cache mode. So I modify to jump to ROM area.
  ldr r6, =0x92000000 ; make address to 0x9200 0020
  add r6, r6, #0x20 ;
  mov pc, r6 ; jump to Power off code in ROM
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  这段代码注释掉,就解决了上面的问题(具体原理是什么还在摸索中)
  至此,无论是4.2的BSP还是5.0的BSP,都可以进入休眠状态了。拿仪器测了测,恩,果然这时候系统中消耗的电流大幅度降低。那么接下来,就是另一个艰巨的任务了:系统唤醒。
  正如之前我们提到的,必须在系统进入休眠前,正确设置外部唤醒中断,才能够唤醒CPU.一般来说,正确设置唤醒中断源,有三个要点。
  1 把对应的GPIO设置为中断功能
  2 明确外部中断触发条件,比如我们把这个唤醒用的中断源所对应的IO接到一个按键上,希望通过按下按键来实现唤醒。那么就得明确,当按下这个按键时,IO口上的电平会发生什么样的变化。
  3 设置EXTINTn寄存器,按照按键按下时IO电平的变化条件来设置。比如当按下按键时,IO口上的电平会发生从高到低的变化,那么我们就设置对应的EXTINTn,使得中断触发条件为Falling edge trigeerde,即下降沿触发。
  这三点都注意了,那么你会发现,当系统休眠后,按下这个按键,CPU就会被唤醒,消耗电流一下子就变大了。。。但是,这仅仅是唤醒了CPU,还没有使得WINCE系统恢复起来,那么要恢复WINCE 系统,要怎么做呢??



如果您认为本词条还有待完善,需要补充新内容或修改错误内容,请编辑词条     查看历史版本
开放分类
操作系统    

贡献者
sky2009