WinCE驱动开发问题精华集锦

合集下载

Windows CE 6.0下的驱动

Windows CE 6.0下的驱动

Windows CE 6.0 6 0下的驱动 程序新特性何宗键 “微软——同济”移动与嵌入式中心 同济大学软件学院 济大学软件学院点击添加MSN机器人小新 为您收听下载MSDN中文网络广播课程加油助力!本次课程内容包括• 驱动程序开发简介 • CE 6.0的新内核架构对驱动程序的影响 • 内核模式驱动 VS 用户模式驱动 • 管理缓冲区 • 驱动程序的移植收听本次课程需具备的条件• 有过Windows CE 5.0开发经验 发经验 • 最好熟悉驱动程序开发 • 对CE 6内核有所了解Level 300驱动程序是什么?Application Driver Win CE OSDevice驱动程序是对物理或虚拟设备的抽象回顾驱动程序的基本知识z Native vs Stream ¾ 谁加载该驱动程序 (Who) z 单体 vs 分层 分层(MDD / PDD) ¾ 驱动的结构如何设计 (How) z Built In vs 动态加载 ¾ 驱动何时加载 (When) z Miniport、Wave、Touch ¾ 驱动的模型是什么样子 (What) z 内核驱动 vs 用户驱动 (新) 新 ¾ 在哪里加载驱动 (Where)回顾Windows CE 5的内存架构2 GB Kernel SpaceKernelLarge Memory AreaSlot 32 Slot 31 : : Slot 7 Slot 6 Slot 5 Slot 4 Slot 3 Slot 2Slot 1 – ROM DLLs Slot 0 – ExecutionSingle 2 GB VM for all Processes31 Slots for ProcessesExecution SlotWindows CE 6.0之后的内存模型2 GB Kernel SpaceKernel Filesystem y GWES Drivers2 GB p per ProcessProcess Code User VM32 K ProcessWindows CE 6中的两种驱动User r Memor ry Spac ceServicesD.EXE Windows CE Shell Application Service 1 Service n Udevice.EXE Udevice.EXE User Mode Driver 1 User Mode Driver nMarshalling Kernel Me K emory SpaceWin32 CE APIs – COREDLL / WINSOCK / COMMCTRL / COMMDLGKERNEL.DLLDEVMRG.DLL GWES.DLL DriversFILESYS.DLL FSDMGR.DLLNetworking DLLsOALK.COREDLL.DLL内核态驱动——新瓶装旧酒z 默认的驱动模式 z 在内核地址空间中运行 z 与内核模式的coredll, coredll  k.coredll.dll k coredll dll链接 ¾自动完成,无需更改构建规则 z 效率高 ¾快速访问内核API ¾直接同步访问用户的缓冲区 z 稳定压倒一切! 稳定压倒 切! ¾驱动Crash可能会导致内核崩溃——用户态驱动老革命遇到新问题Reflector服务用户模式驱动程序加载User Mode Driver Host ProcessUser Application User Mode Driver 8ActivateDeviceEx XXX_Init(…) 1udevice.exe User Mode Driver User ModeActivateDeviceEx CreateProcess(,,Volume Name)10HANDLE Returned 39Kernel Mode 47Device Context XXX_Init forwarded to UM Driver HostReflector Service Device Manager 2569HANDLE Parent Bus Driver110HANDLE Returned用户模式驱动注册表p[HKEY_LOCAL_MACHINE\Drivers\ProcGroup_0003]"ProcName"="udevice.exe""ProcVolPrefix"="$udevice"[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Ethman]"Prefix"="ETM""Dll"="ethman.dll""Index"=dword:1; WZCSVC must be started before ethman"Order"=dword:2A; Flags==12 is DEVFLAGS_LOADLIBRARY and DEVFLAGS_LOAD_AS_USERPROC; Flags12 is DEVFLAGS LOADLIBRARY and DEVFLAGS LOAD AS USERPROC"Flags"=dword:12"UserProcGroup"=dword:3 ;// default to group 3BIB文件的改变深入理解:请参考共享源代码缓冲区管理原因——内核驱动缓冲区管理原因——用户驱动缓冲区管理的内容:指针参数与嵌套指针处理调用者缓冲区–列集方法列集之——同步或异步访问CeOpenCallerBufferCeAllocAsynchronousBuffer处理调用者缓冲区–安全拷贝安全拷贝的方法z CeOpenCallerBufferz CeAllocDuplicateBuffer处理缓冲区的API z CeOpenCallerBufferz CeCloseCallerBuffer处理缓冲区的APIz CeAllocAsynchronousBufferz CeFreeAsynchronousBuffer处理缓冲区的APIz CeAllocDuplicateBufferz CeFreeDuplicateBuffer用户态驱动程序的限制用户态驱动程序的限制内核态驱动的限制CeCallUserProc内核模式驱动用户模式驱动同步异步同步异步参数不需使CeAllocDuplicateBuffer 不需要使用CeAllocDuplicateBuf 列表中的指针要用CeFreeDuplicateBuffer fer CeFreeDuplicateBuff er嵌不CeOpenCallerB ffer CeOpenCallerB CeOpenCallerB ffer 入到结构体需要使用CeOpenCallerBuffer CeAllocAsynchronousB uffer C h uffer CeCloseCallerB ff CeOpenCallerBuffer CeAllocAsynchrono usBuffer C h 中的指针CeFreeAsynchronousBu ffer CeCloseCallerBuffer uffer CeFreeAsynchronou sBuffer CeCloseCallerBuffer深入理解:请参考共享源代码CE Base Team Blog: Windows Base Team Blog: Marshal Helper API:驱动程序的移植DEMO使用CEAppCompat工具检查应用程序的兼容性。

基于WinCE的流接口驱动程序开发

基于WinCE的流接口驱动程序开发
3 1 建 立 要 创 建 的驱 动 所 在 的 目录 .
是从 宏观上进 行了研究 , 如文献[ — 】 例 4 5 。本 文主要 结合 Ca — y
ma n开 发 板 上 L CD 显 示 屏 的 背光 控 制 流 接 口 驱 动 程 序 实 例 详
细分 析 了 WiC n E下 流 接 口驱 动 程 序 的 开 发 实 现 流 程 。
t a a i pl L h t sm e CD diply S s a ba l t tea cki sr m dr er u o c yman gh i r ns n a v PXA27 i gie t an y i a pl te 0 s vn o alss m y h pr e s oc s of W i o sr a nd ws CE te m it f c dr e , nera e v i r Key wor : ido CE.te dsW n ws sr am nera ier yman it f ce dr v , Ca PX A27 0
目前 , i Wn CE提 供 了 四 种 设 备 模 型 ,其 中 两 种 是 专 门 用 于 WiC 的模 型 , 外 两 种 外 部 模 型 来 自其 他 的 操 作 系统 。 基 于 nE 另 WiC 的 两 种 模 型 是 本 机 的 设 备 驱 动 程 序 和 流 接 口的 驱 动 程 nE 序 。 两种 外 部 模 型 用 于 通 用 串行 总 线 ( S 和 网 络 驱 动 器 接 口 U B) 标 准 ( DI)驱 动 程 序 。 其 中流 接 口驱 动 程 序 是 为 连 接 到 基 于 N S WjCE平 台 的外 围 设 备 而 设 计 的 , 些 外 围 设 备 包 括 S 卡 、 n 这 D 摄 像 头 、 印 机 等 。目前 针 对 流接 口驱 动 程序 的设 计 和 开 发 很 多 都 打

组态王常见问题集锦

组态王常见问题集锦

北京亚控科技发展有限公司组态王最常用知识库集锦目录1.产品版本类(—)2.产品功能类(—)3.产品性能类(—)4.产品授权类(—)5.服务类(—)一、产品版本类亚控的组态王除了通用版之外,还发行了其他什么版本?答:亚控的组态王除了通用版之外,还发行了以下版本:英文版、日文版、韩文版、繁体版、嵌入版、纵多 OEM 版,以及即将发行的楼宇版。

通用版本中,高版本和低版本是如何兼容的?答:组态王 6x 系列版本是向下兼容的,即高版本的软件能够打开低版本的工程,但是高版本的工程不能使用低版本软件打开。

特殊情况:组态王及以前版本下开发的工程不支持升级到组态王。

组态王与有什么不同?答:组态王与的不同点有以下几点:1)组态王采用了全新的加密方式,组态王加密锁不向下兼容,不支持在组态王及以下版本的软件上使用;2)组态王提供了全新 web 功能,全新版的 Web 发布全面支持画面中包含控件的发布;3)组态王中,增加了向导式报表,方便用户制作常规的班报、日本、月报等报表;组态王目前还有电力版的软件吗?答:电力版软件发布到之后,不再发行此版本了,为维护方便,公司把电力版的各特殊功能合并到了通用版中。

因此,对于需要电力版的客户,要求给客户提供通用版即可。

打开的工程能否不升级版本直接打开?客户遇到过不升级无法打开的问题,与向下兼容的特性违背?答:版本打开版本的工程必须升级后才能打开。

这里的向下兼容是指高版本的软件可以打开低版本升级后的工程,而高版本的工程不能使用低版本软件打开。

嵌入版与通用版的区别有那些?答:1)不支持 OPC,驱动更少一些。

2)开发也是在普通的 PC 上开发,开发好之后在下载到嵌入式系统中跟实际设备连一下看。

3)开发环境的驱动和运行环境不一样。

开发环境是后缀是。

运行环境是,例如或。

4)用在 winCE,winXPE。

5)不支持 GPRS 通讯。

二、产品功能类组态王支持那些操作系统?答:最新版组态王支持的操作系统有:Windows 2000(sp4)、Windows XP(sp2)、Win7简体中文版、windows2003server、windows2008server、 Vista 系统。

WinCE电子纸阅读器实现的关键问题研究

WinCE电子纸阅读器实现的关键问题研究

映像 ; ③ 使用定制 O S的 S K 开 发 应 用程 序 。 D
按 上 述 步 骤 实 现 电子 纸 阅读 器 过程 中 , 发 电子 纸 显 开 示 驱 动 和 阅读 器应 用 程 序 开 发 是 实 现 阅读 器 的 两 个 关 键
问题 。
与 纸 质 阅读 相 比 , 子 纸 阅 读 器 具 有 无 辐 射 、 源 丰 富 、 电 资 存
程 序 四层 结 构 。 ]
设 计 WiC n E系 统 时 , 对 不 同 硬 件 平 台 需 要 按 照 如 针 下 步骤 进 行 系统 开发 : ① 开发 系 统 B P, 括 启 动 程 序 ( o t a e ) 设 备 S 包 B ol dr 、 o
图 1 WiCE系统 架 构 n
中 图分 类 号 :TP 1 . 4 3 1 5
文 献 标 识 码 :A
Key Pr bl m s Abo tW iCE —ba ed EI ton c Re der o e u n s ec r i a
Li n c e g Li in h g h n , uJa z i Qi
在 生 成 G E类 派 生 对 象 Wr p b p构 造 函 数 中完 成 P a2p 初 始 化 工 作 , 置 GP 设 E相 关 成 员 变 量 , 括 显 示 宽 度 、 包 显
2. 应 用 程 序 开 发 2
电子 阅读 器 的主 要 功 能 主 要 包 括 两 部 分 应 用 程 序 : 不
( olg fS fwae Na k i ie s y Tini 0 0 1, ia C l eo ot r , n a Unv ri , a j 3 0 7 Chn ) e t n
A s r c :On t e b sso i CE s s e a c ie t r ,t e ee to i a e ip a rv rd v l p n n h p l a i n p o r m e e b ta t h a i f n y t m r h t c u e h lc r n cp p rd s l yd i e e e o me ta d t e a p i t r g a d v l W c o

CE中断详解

CE中断详解
return(SYSINTR_MYINTR);
}
(2)多ISR模型:即ISR链(IISR)。CPU有多个硬件中断IRQ入口(如X86),它通过内核HookInterrupt函数将硬件中断号与ISR绑定起来,注册一个ISR,使多个硬件中断形成对应的ISR链,反之通过内核
UnhookInterrupt函数解除硬件中断与ISR的绑定,此时无OEMInterruptHandler函数。HookInterrupt函数的调用一般在OEMInit硬件初始化函数中进行,在多ISR模型中,当一硬件中断发生时,核心跳转到OAL层的主ISR,跳转的开销会非常小,原因是系统使用了少量的装配指令,主ISR可以直接处理中断,返回
#define SYSINTR_MYINTR (SYSINTR_FIRMWARE + 10)
在armint.c的OEMInterruptHandler()中
OEMInterruptHandler()
{
…………….
else if (IntPendVal == INTSRC_EINT2) // EINT2
1) 执行最小的中断处理,最小的中断处理指能够检验、答复产生中断的硬件,而把更多的处理工作留给IST(interrupt service thread)。
2) 当ISR完成时返回中断ID(逻辑中断,或者说是系统中断,就是SYSINTR_xx)(这个中断ID大部分是预定义的)。
ISR是在OAL层中实现的运行于内核态的程序。根据执行效率要高和嵌入式实时性的要求,ISR多用汇编或者C语言实现,主要任务就是根据硬件中断返回一个逻辑中断号。根据CPU是单个中断入口还是多个中断入口,ISR分为单ISR模型和多ISR模型:
SYSINTR_ID逻辑中断号。或者调用NKCallIntChain函数遍历已安装的ISR列表,已安装的ISR确定是否是注册了的硬件中断,如果是系统已注册的中断,查询中断源返回SYSINTR_ID,激活IST。如果是未注册的硬件中断,直接返回SYSINTR_NOP。

Apalis i.MX6 WinCE 开发入门说明书

Apalis i.MX6 WinCE 开发入门说明书

Apalis i.MX6 WinCE开发入门Revision History17-Aug-2015 Rev. 0.2 V1.1A 添加SD卡槽图片及错误修正2-Feb-2016 Rev. 1.1 V1.1A 增加WinCE Image V1.0b6 说明6-Jun-2016 Rev. 1.3 V1.1A 增加社区信息15-Aug-2017 Rev. 1.5 V1.1A 更新V1.2版本image内容,修正错误目录1.开发设备及材料准备 (6)1.1硬件准备 (6)1.1.1Apalis i.MX6 系列核心板模块 (6)1.1.2Apalis 系列载板 (6)1.1.3基本配件(按需自行配置,不包含在标准载板购买包装内) (6)1.2软件准备 (6)2.开发平台配置 (7)2.1硬件连接框图 (7)2.2电源连接 (7)2.2.1Apalis 开发板 (7)2.2.2Ixora 载板 (7)2.3显示输出连接 (7)2.3.1Apalis 开发板 (7)2.3.2Ixora 载板 (8)2.4调试串口COMA连接 (8)2.4.1Apalis 开发板 (8)2.4.2Ixora载板 (8)2.4.3串口连接参数为115200/8/1/none (8)2.4.4USB 串口驱动请从下面FIDI网站下载 (8)2.5调试USB口(在需要时连接) (8)2.5.1Apalis 开发板 (8)2.5.2Ixora载板 (8)2.6USB键盘/鼠标连接 (9)2.6.1Apalis 开发板 (9)2.6.2Ixora 载板 (9)2.7网络连接 (9)2.7.1Apalis 开发板 (9)2.7.2Ixora 载板 (9)2.8上电启动,开关机和重启开关 (9)2.8.1Apalis 开发板 (9)2.8.2Ixora 载板 (9)2.9上述所涉及的连接器和开关布局图 (10)2.9.1Apalis 开发板 (10)3.修改显示分辨率 (11)3.1修改Eboot分辨率 (11)3.2修改WinCE显示分辨率 (11)3.3清除WinCE注册表恢复到默认状态 (11)4.远程桌面连接 (12)4.1ActiveSync (USB)方式连接 (12)4.2网络方式连接 (12)5.开发主机SDK部署,针对VS2008开发环境 (13)5.1安装VS2008 (13)5.2安装WINCE 6.0 SDK (13)5.3安装WINCE 7.0 SDK (13)5.4测试SDK (13)6.VS2008应用调试之USB调试 (14)7.VS2008应用调试之网络调试 (15)7.1连接 (15)7.2主机端VS2008设置 (15)7.3目标板设置(英文版WinCE7) (16)7.4目标板设置(中文版WinCE7) (16)7.5测试连接情况 (17)8.E-boot和OS image更新升级 (18)8.1关于ToradexApalis i.MX6模块的image更新 (18)8.2使用Toradex Easy Installer进行模块系统更新 (18)8.3Eboot损坏情况下进入恢复模式重新刷写Eboot和OS image (18)8.4Eboot正常情况下,升级Eboot 或者OS image (20)8.4.1如模块当前WinCE系统正常,建议首选进入系统后使用Update Tool来升级相关组件 (20)8.4.2如当前Eboot版本为V1.2以下版本并升级为V1.2及以上版本 (20)8.4.3如当前Eboot版本已经为V1.2及以上版本 (21)9.软硬件开发资源及Toradex开发者中心 (22)9.2载板硬件开发资料下载 (22)9.3WinCE软件image,BSP,SDK等资源下载 (22)9.4开发上手指南以及Lib库的使用说明文档 (22)9.5Toradex社区 (22)10.Toradex公司简介及本地支持联系方式 (23)10.1Toradex公司简介 (23)10.2本地支持联系方式 (23)1. 开发设备及材料准备1.1 硬件准备1.1.1 Apalis i.MX6 系列核心板模块✓Apalis i.MX6 Quad 2GB IT | V1.1C✓Apalis i.MX6 Quad 1GB | V1.1B✓Apalis i.MX6 Dual 1GB IT | V1.1B✓Apalis i.MX6 Dual 512MB | V1.1B1.1.2 Apalis 系列载板✓Apalis Evaluation Board | V1.1A✓IxoraCarrier Board | V1.1A1.1.3 基本配件(按需自行配置,不包含在标准载板购买包装内)✓电源适配器✓外部显示连接线(如VGA、RGB、LVDS等)✓调试串口连接线✓调试USB口连接线1.2 软件准备✓Windows系统开发主机✓Virtual Studio 2008 开发套件✓串口工具如SecureCRT或者Xshell等2. 开发平台配置2.1 硬件连接框图2.2 电源连接2.2.1 Apalis 开发板✓X15,输入电源类型7-27V DC,螺丝接线连接,建议功率24W✓X17,输入电源类型12V +/-10%,5.5mm 圆形接头,建议功率24W;当外设如LVDS,PCIE等需要12V电源是必须通过此接头供电。

WinCE6.0下双模终端的USB转串口驱动开发

WinCE6.0下双模终端的USB转串口驱动开发
关键词 : n E . ; 模终端 ;S WiC 6 0 双 U B转 串 口
0 引 言
我国 3 G牌 照 的 发放 , 宣告 了 3 时代 的到 来 , G
基于 T —C MA和 C MA WC MA 的双 模 终 端 将 DS D D / D 取代 2 时代 的单 模 终 端 。诺 基亚 、 星 、 为 、 G 三 华 中 兴等 国 内外 通 信 厂 商 都 积 极 投 入 到 双 模 手 机 终 端 的开发 中来 , 目前 双模 手 机终 端 的研发 已经 成 为热 点 。当前市场 中主要 的智 能手 机操 作 系统 有 : o i N ka 主推 的 Sm in 开 放 内核 的嵌 入 式 Ln x 微 软 的 y ba , iu , WiC n E等 。由于 WiC 6 0嵌人 式 系统具 有实 时性 n E.
Wi E. U B设备驱动开发只提供了一些底层支持 n 60对 S C
的原因, 以通 信 模 块 厂 商 未 提 供 WiC 6 0下 的 所 nE .
U B驱 动 , 要 实 现 通 信 模 块 的基 本 功 能 , 开 发 S 而 除
纯 U B驱 动 外 , WiC 6 0下 , 需 要 修 改 Mo S 在 nE. 还 . d m源码 , e 存在 着开 发 周 期 长 、 作量 大 、 容 性 差 工 兼 等 问题 , 给开发 人 员带 来 了极 大 的不 便 。而通 过 串 口直接对 Mo e dm进 行操作 , 不仅 避 免 了上述 在开 发 中存 在 的问 题 , 时 由于操 作 Mo e 的 是 虚 拟 串 同 dm 口, 由它来 适 配 Moe 不 会 出 现 由物 理 串 口操 作 d m, Mo e 时制 约 M d m处理速 率 的问题 , 然保持 了 dm oe 仍 U B高 速的特 点 , 开 发人 员 只 需 开发 出对应 模 块 S 故 的 U B转 串 口驱 动 亦 可实 现 上 网 、 电话 等 功 能 ; S 打

智能无线抄表系统中CC1101的WinCE驱动开发

智能无线抄表系统中CC1101的WinCE驱动开发

智能无线抄表系统中CC1101的WinCE驱动开发智能无线抄表系统中CC1101的WinCE驱动开发0引言随着经济技术的不断发展,以及自动化程度的提高,越来越多的场合需要用到远程控制。

在承接的国家大学生创新性实验计划项目——基于无线跳传网络的智能抄表系统中,中继(SINK)模块,即采用S3C2410在WinCE下驱动射频芯片CC1101作手持终端控制器。

其中,在WinCE下驱动CC1101成为该项目的一个难点。

CC1101使用SPI通信,而SPI驱动属于WinCE串口驱动的一种,是流驱动。

本文将介绍WinCE5.0下,C1101的SPI 驱动程序设计。

1CC1101的SPI接口特性CC1101基于TI公司的0.18μm CMOS晶体SmartRF04技术,是一种低成本、真正单片的UHF收发器,为低功耗无线应用而设计。

电路主要设定在315MHz,433MHz,868MHz和915MHz的ISM(工业,科学和医学)和SRD(短距离设备)频率波段,CC1101的主要操作参数和64位发送/接收FIFO可通过SPI接口控制,具有14个命令寄存器,47个普通配置寄存器和12个状态寄存器,通过4线SPI兼容接口(SI,SO,SCLK和CSn)配置。

其中,SPI接口是一种同步串行通信接口,CSn是芯片选择管脚,当该管脚为低电平时,SPI接口可以通信;SI和SO为数字传输管脚,SI用于数据输入,SO用于数据输出;SCLK为同步时钟,在时钟的上升沿数据被写入或读出。

CC1101中SPI接口的读/写操作方式。

CC1101的配置、命令发布和发射接收缓存的数据读取都通过SPI完成,SPI的操作都由主机控制,对CC1101来说,主机的控制操作即是发送的headerbyte。

下面介绍两种主要状态下的主机操作。

(1)读寄存器、读状态①写入头字节(R,0/1,address);②dummy write为从设备提供一个CLK,从SPI接收数据即读出address的数据。

WinCE 6.0设备驱动程序基本知识

WinCE 6.0设备驱动程序基本知识

设备驱动程序基础
b)
混合驱动程序
同样使用两层的MDD/PDD模型,这意味着会持续使用MDD, 也就是对于所有的PDD来说都使用相同的MDD,但是这个 MDD还提供了额外的独特功能(这个功能是给定设备类型的 MDD/PDD实现的一种逻辑扩展)。
使用混合驱动程序的优点: 使用混合驱动程序的优点:与分层架构相同。
接上页... 接上页...
这种架构通常在下列情况中使用: 当某个设备类型没有可用的分层模型时; 当设备硬件是不常见的定制硬件时; 当没有可以重用的分层驱动程序代码时; 当使用MDD/PDD模型,但不能达到需要的效率水平时。 当使用MDD/PDD模型,但不能达到需要的效率水平时。 优点: 可以避免在各个层之间切换,并且能最大化使用硬件,这些都 优点: 带来了高效率。
XXX_Seek
— 调用SetFilePointer函数时调用此函数 调用SetFilePointer函数时调用此函数
实现流接口驱动程序
XXX_IOControl
— 调用DeviceIoControl函数时调用此函数 调用DeviceIoControl函数时调用此函数 — 提供了支持自定义驱动程序操作的机制 — 大多数驱动程序都具有的多用途函数 — 通过I/O控制代码来识别具体的操作 通过I/O控制代码来识别具体的操作 — I/O控制代码是每个设备特定的 I/O控制代码是每个设备特定的
设备驱动程序基础
GWES(图形、窗口以及事件子系统) GWES(图形、窗口以及事件子系统):
支持窗口、对话框、控件、菜单、以及其他和用户界面相关的资源。控 制窗口管理器和窗口消息管理器,包括键盘消息、鼠标消息、触摸屏消 息等等。 GWES(gwes.dll)模块会加载由本系统独占使用的设备驱动程序,也就 是下列以任何方式与用户界面相关联的驱动程序:键盘、视频适配器、 触摸屏、打印机、鼠标。

基于WinCE的车载智能显示终端CAN流接口驱动开发

基于WinCE的车载智能显示终端CAN流接口驱动开发

0 引言
Байду номын сангаас
流接 口驱动程序是一般类型的设备驱动程序 , 它表现为用
户一级的动态链 接库 D L 用来 实现一组 固定 的函数 , 为流 L, 称
国内车载显示屏的研制 工作 从 2 0世纪 9 0年 代初 开始起
步 , 先 在 D 4和 S4等 机 车 上 陆 续 开 始 安 装 了 车 载 显 示 屏 。 首 F S
I t l g n s l y Te m i lBa e n W i n el e tDip a r na s d o nCE i
MU Yu — , A i e S NG J a n l W NG L — , O u n i d
( c ol f l tcl n ier gB in ioo gU ies y B in 00 4 C ia Sh o e r a E gn ei , e igJatn nvri ,e ig10 4 , hn ) oE c i n j t j
Ab ta t Ai d a t esau f o o t ei tl g n i ly tr n l n h e d o ef l p l ain, i p p rd v l s r c : me t h tt so c moi e l e t s a mi a a d t e n e ft ed a pi t l v n i d p e h i c o t s a e e e— h o e c mo ie itl g n ipa r n l i l o p d al o t ne l e tds ly t mi a w t mu t c mmu ia in i tr c sa d W i C mb d e p r t g s s m. o u e o v i e h i nc t e a e n n E e e d d o ea i y t o n f n e F c sd o h e p e y d vc rv rmo e n h e in o rv rp o rm n e n E, n o ie t h rc ia p l ain o n t ep r h r e ied i e d l dt e d s f ie r g a u d rWi C a d c mb n d wi t ep a t l p i t n i a g d h c a c o t e r i y w t h e eo me t ft ed s lytr n l sa p a t a x mp e i i t d c d t ed sg to fte C t a h al wa , i te d v lp n ip a e mia r ci l a l ,t n r u e e in me h d o AN sr m h o h a c e o h h e i tr c r e r g a a e n t e¥ C 4 0 a d t e CAN c n r l r MCP 5 0, n r c s e h ew r o n e a e d v rp o r m b s d o h 3 2 1 n h f i o t l oe 2 1 a d p o e s d te n t o k c mmu iain ts n c t e t o

WindowCE驱动程序

WindowCE驱动程序

Windows CE驱动程序模型 CE驱动程序模型
桌面Windows驱动程序模型 桌面Windows驱动程序模型
操作系统在启动后对硬件进行延迟加载,但依然 操作系统在启动后对硬件进行延迟加载, 把驱动程序加载到操作系统的内核空间中。 把驱动程序加载到操作系统的内核空间中。驱动程 序工作在系统的地址空间内, 序工作在系统的地址空间内,实现了驱动的动态加 载。 桌面Windows驱动程序最早采用 桌面Windows驱动程序最早采用VxD(已废弃), 驱动程序最早采用VxD(已废弃 已废弃) 2000开始采用 开始采用WDM( 从Windows 2000开始采用WDM(Windows Driver Model)模型,驱动程序调用DDK;Vista以 Model)模型,驱动程序调用DDK;Vista以 及以后的版本采用WDF( 及以后的版本采用WDF(Windows Driver Founation)是对WDM的建模与封装 Founation)是对WDM的建模与封装,但隐藏了更 的建模与封装, 多的细节,但降低了开发难度。 多的细节,但降低了开发难度。
Windows CE驱动程序的宿主 CE驱动程序的宿主
如果要运行DLL中的代码,那么必须先有一个EXE 如果要运行DLL中的代码,那么必须先有一个EXE 中的代码 进程,把该DLL加载道自己的地址空间内 加载道自己的地址空间内, 进程,把该DLL加载道自己的地址空间内,然后才可 执行DLL中的代码 中的代码。 执行DLL中的代码。 Windows CE的驱动程序也必须被其他EXE——宿 CE的驱动程序也必须被其他EXE——宿 的驱动程序也必须被其他 主加载
Windows CE驱动程序 CE驱动程序
Windows CE驱动程序 CE驱动程序
Windows CE驱动程序模型 CE驱动程序模型 Windows CE驱动程序的宿主程序 CE驱动程序的宿主程序 Windows CE驱动程序的类型 CE驱动程序的类型 Windows CE驱动程序的分类 CE驱动程序的分类 示例驱动程序的代码

wince 开发

wince 开发

wince 开发
Wince开发是指基于微软Windows CE操作系统的应用程序开发。

Windows CE(Compact Edition)是微软针对嵌入式设备及小型设备开发的一种操作系统。

Wince开发可
以用于开发各种嵌入式系统和移动设备上的应用程序,如
智能手机、PDA、GPS导航器、工业设备等。

Wince开发可以使用多种编程语言,包括C++、C#、Visual Basic等。

开发工具可以使用微软提供的Visual Studio开发环境,如Visual Studio 2008、Visual Studio 2010等。

在开发过程中,开发者可以利用Windows CE
的API和库来访问设备的硬件功能,如屏幕显示、触摸屏
输入、网络通信等。

Wince开发过程中,开发者需要对Windows CE操作系统、设备驱动程序、应用程序等有一定的了解。

同时,还需要
考虑设备的资源限制,如内存、处理能力等。

开发者还可
以使用模拟器来模拟嵌入式设备的功能,以便在开发过程
中进行调试和测试。

总的来说,Wince开发提供了一种方便快捷的方式来开发
嵌入式系统和移动设备上的应用程序。

通过使用Windows CE操作系统和相关的开发工具,开发者可以创建功能强大、稳定可靠的应用程序,满足用户的需求。

Windows嵌入式开发系列课程(4):Windows CE电源管理

Windows嵌入式开发系列课程(4):Windows CE电源管理

WinCE电源管理李小伟软件应用工程经理上海掌微电子技术有限公司本次课程内容包括z电源管理概要z电源管理驱动程序的实现z内核级电源管理收听本次课程需具备的条件z了解WINCE设备驱动程序开发的一般知识z初步了解WINCE 电源管理驱动Level 200内容¾电源管理概要z电源管理驱动程序的实现z内核级电源管理电源管理驱动的功能z建立一个对整个系统环境,电源状态和设备电源状态的全局了解.可以自定义适合你的电源管理驱动来全局地管理你的平台.z设备驱动的电源管理可以从整个系统电源状态管理中脱离, 自己管理自己的电源状态.z控制系统电源状态切换的过程.电源管理架构在WINCE 中电源管理驱动的位置ApplicationsDevice DriversOS ServicesGWES HAL OEM Adaption Layer withPM supportHardwarePower ManagerDevice.exe电源管理驱动框架z电源管理驱动提供了给应用程序和设备驱动程序的APIz PM.DLL 通过自定义接口和DEVICE.EXE联接z用IOCTL来调用驱动程序电源管理APIz应用程序接口类API¾应用程序可以调用此类API改变系统电源状态,或设定对设备电源状态的需求z设备驱动程序接口类API¾设备驱动程序调用此类API来管理设备电源状态z消息通知(Notification)接口类API¾应用程序调用此类接口API来接收到电源状态变化的消息通知.应用程序接口类APIz取得/设置系统电源状态¾GetSystemPowerState¾SetSystemPowerState¾POWER_STATE_XXX 标志¾可自定义的标志¾例子:¾WINCE500\PUBLIC\COMMON\OAK\DRIVERS\PM\TEST\SET¾WINCE500\PUBLIC\COMMON\OAK\DRIVERS\PM\TEST\GETz设置/取消对设备电源状态的要求¾SetPowerRequirement¾ReleasePowerRequirement¾例子:¾WINCE500\PUBLIC\COMMON\OAK\DRIVERS\PM\TEST\REQ¾媒体播放器运行时,对显示驱动和背光的需求.z取得/设置设备电源状态¾GetDevicePower¾SetDevicePower*¾例子:¾WINCE500\PUBLIC\COMMON\OAK\DRIVERS\PM\TEST\GETD¾WINCE500\PUBLIC\COMMON\OAK\DRIVERS\PM\TEST\SETD*调用此API会限制电源管理驱动程序更新设备电源状态. 参考帮助文档.设备驱动程序接口类APIz设备驱动程序调用电源管理驱动¾DevicePowerNotify¾RegisterPowerRelationship¾ReleasePowerRelationshipz电源管理驱动调用设备驱动程序¾DeviceIoControl¾IOCTL_POWER_CAPABILITIES¾IOCTL_POWER_SET¾IOCTL_POWER_QUERY¾IOCTL_POWER_GET¾IOCTL_REGISTER_POWER_RELATIONSHIP消息通知接口类APIz RequestPowerNotifications¾PBT_RESUME¾系统从挂起状态恢复时产生此消息.¾PBT_POWERSTATUSCHANGE¾系统在接上和断开外部电源时产生此消息.AC power¾PBT_TRANSITION¾当电源管理驱动改变系统电源状态时产生此消息.¾PBT_POWERINFOCHANGE¾电池状态改变时产生此消息.z StopPowerNotificationsz例子:¾WINCE500\PUBLIC\COMMON\OAK\DRIVERS\PM\TEST\MON ¾应用程序通过此API获知电源/电池状态,切换电池图标.电源管理驱动管理的设备驱动程序z设备类型: 注册表项IClass-GUID¾[HKEY_LOCAL_MACHINE\SYSTEM\CurrentContro lSet\Control\Power\Interfaces]¾Generic power-manageable devices¾Power-manageable block devices¾Power-manageable NDIS miniports¾Power-manageable display¾例子:¾WINCE500\PUBLIC\COMMON\OAK\DRIVERS\PM\TEST\DEVSAMPLE¾AdverstiseInterface¾显示驱动程序调用此函数注册为Power-manageabledisplay 类型的驱动.内容z电源管理概要¾电源管理驱动程序的实现z内核级电源管理WINCE里的电源管理驱动程序z最少功能电源管理驱动程序(PMSTUBS)¾SYSGEN_PMSTUBS¾不支持电源管理APIz完全功能电源管理驱动程序¾SYSGEN_PM¾支持电源管理API¾WINCE提供了2个实例¾WINCE500\PUBLIC\COMMON\OAK\DRIVERS\PM\PDD\PDA¾WINCE500\PUBLIC\COMMON\OAK\DRIVERS\PM\PDD\DEFAULT电源管理驱动分层架构z MDD¾包含各类设备驱动的句柄¾管理设备的电源状态¾提供电源管理API的实现z PDD¾制定/维护系统电源状态机管理¾改变硬件电源状态z实现电源管理APIz跟踪和设置设备电源状态z跟踪应用程序的消息通知请求.z处理活动监视计数器z处理设备加载/卸载的通知,并维护设备驱动程序的句柄z处理父设备与子设备之间的电源关系z管理设备电源状态需求z实现与设备驱动程序的调用接口¾gStreamInterface. RequestStreamDeviceÆDeviceIoControl ¾gDisplayInterface. RequestDisplayDeviceÆExtEscapez自定义系统电源状态机z检查系统电源管理的注册表内容的一致性.z实现电源管理驱动的消息处理,实现状态机管理.z设置系统电源状态和相应设备进入对应的电源状态.z自定义状态¾On , UserIdle,SystemIdle,DeepIdle,Suspend,OnBattery, InCradle等状态.¾对应的POWER_STATE_XXX 标志¾系统电源状态到设备电源状态的映射z注册表设置[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ Power\State\On]Default=dword:0; D0Flags=dword:10000; POWER_STATE_ONCOM1:=dword1; D1D4Off (Off)D3Sleep (Suspend)D2Stand By (SystemIdle)D1Low on (UserIdle) D0Full on (On)系统电源状态到设备电源状态的映射z映射到所有默认的设备[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Pow er\State\SystemIdle]"Default"=dword:2; D2"Flags"=dword:100000; POWER_STATE_IDLEz映射到某一特定类型的设备[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Pow er\State\SystemIdle\{EB91C7C9-8BF6-4a2d-9AB8-69724EED97D1}] "Default"=dword:4 ; D4¾"{EB91C7C9-8BF6-4a2d-9AB8-69724EED97D1}“= "Power-manageable display“系统电源管理状态机z GWES监视用户操作,通过事件(Event)来通知电源管理驱动程序z电源管理驱动程序通过事件(Event)和超时机制来实现状态机用户活动计时器z为每个状态创建相应的事件(Event)¾3个事件¾A timer reset event.¾An active status manual-reset event.¾A manual-reset event¾[HKEY_LOCAL_MACHINE\SYSTEM\CurrentContro lSet\Control\Power\ActivityTimers\UserActivity]¾Active->Inactive->timeout 然后切换到下一个电源状态电源状态变迁依靠超时机制z[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlS et\Control\Power\Timeouts]"ACUserIdle"=dword:1e"ACSystemIdle"=dword:3c"ACDeepIdle"=dword:5a"BattUserIdle"=dword:1e"BattSystemIdle"=dword:3c"BattDeepIdle"=dword:5a"BatteryPoll"=dword:1f4z按秒计数z0 表示功能禁止, 系统不会自动切换到此状态z这些设置可以在”控制面板”里的电源管理里改变.系统电源状态变迁UserActiveUserIdleUserInactiveSystemIdleSystemActiveOnSystemInactiveSuspendTimeoutSystemInactivityUserInactivityTimeoutTimeoutSystemIdleSuspendUserActivityUser Interactive(PM State)(System State)(Event)电源管理状态切换timeoutPlatformUpdateSystemPowerStatePmSetSystemPowerState_IPlatformSetSystemPowerStateGenerateNotifications PowerOffSystemUpdateAllDeviceStatePmSetSystemPowerStateSetSystemPowerStateIf NewState(Internal call)(内部调用)(外部调用)If External callPlatformMapPowerStateHint(MDD)(PDD)内容z电源管理概要z电源管理驱动的实现¾内核级电源管理内核级电源管理¾OEMIdle¾当系统里没有线程要运行时被调用¾OEMPowerOff¾当系统要进入睡眠或关闭状态时被调用¾睡眠——唤醒的流程OEMIdlez当线程调度器里,没有线程需要运行时,调用此函数. (Blocked waiting for input or event.)z负责将CPU置于低功耗状态,并且能快速恢复到正常运行状态.z不能将内存(DRAM)置于自刷新状态OEMPowerOffz进入睡眠时,此函数负责将系统置于一个功耗最低的状态:¾保存系统设置¾将内存(DRAM)置于自刷新状态¾CPU停止工作(掉电)¾禁止中断处理(用于唤醒系统的中断除外)z退出睡眠状态时,此函数负责恢复系统的设置z睡眠¾调用SetSystemPowerState进入睡眠状态¾电源管理驱动里设置设备的电源状态¾调用PowerOffSystem()进入内核处理¾调用各设备驱动的XXX_PowerDown()¾调用OEMPowerOff()¾进入睡眠Zzzzz….z唤醒¾触发唤醒中断, CPU被唤醒¾开始执行Bootloader代码,判断冷启动还是唤醒¾判断为从睡眠中唤醒,用保存在内存上的地址跳回OEMPowerOff()里的唤醒位置,恢复系统设置¾调用各设备驱动的XXX_PowerUp()¾回到电源管理驱动中,更新各设备驱动的电源状态¾电源管理驱动发出系统状态变迁的消息通知¾整个系统恢复到正常运行状态PowerOffSystem的流程z SC_PowerOffSystem()¾WINCE500\PRIVATE\WINCEOS\COREOS\NK\KERNEL\kwin32.c内容z电源管理概要z电源管理驱动程序的实现z内核级电源管理移动与嵌入式开发者大会(MEDC)汲取新知,加速未来——移动与嵌入式开发者大会(MEDC)您想洞悉最前沿的微软移动与嵌入式技术吗?您想聆听最权威的技术专家现场讲授吗?您想全方位体验移动新产品所带来的无穷魅力吗?2006微软移动与嵌入式开发者大会将带领您与科技同步、与市场同行。

便携式微型打印机 开发常见问题及解答

便携式微型打印机 开发常见问题及解答

VMP01 PLUS便携式微型打印机开发常见问题及解答(V1.0)一、什么样的终端能驱动VMP01 PLUS便携式微型打印机打印VMP01PLUS分为两个型号:VMP01-PI、VMP01-PB。

其中VMP01-PI的数据通讯接口有:RS232串口、RAW-IR(原始红外)、IrCOMM(IrDA协会制定的红外虚拟串口);VMP01-PB的数据通讯接口有:RS232串口、Bluetooth(蓝牙虚拟串口)。

原则上只要手持数据终端(如数据采集器、PDA、手机、抄表机等)上有其中的一种就可以驱动VMP01微型打印机打印。

二、怎样通过手持数据终端驱动VMP01 PLUS微型打印机VMP01PLUS微型打印机不是一种通用的windows外部打印机设备,所以在windows 下并不能通过打印机驱动程序(peripheral device driver)实现在WORD、EXCEL、IE等等软件的打印功能。

而需要开发人员根据具体的客户需求编写驱动打印机的程序。

不论您使用的是VMP01 PLUS打印机的哪种端口(RS232、RAW-IR、IrCOMM、Bluetooth),对于手持数据终端(如数据采集器、PDA、手机、抄表机等)而言,VMP01便携式微型打印机都是一个外部串行数据接受设备,所以开发者开发微型打印机打印软件时,只需要打开对应的串行端口,然后向打印机发送打印命令和打印内容,在微型打印机接受到数据后,就会打印。

二、能否给出手持终端上驱动VMP01 PLUS微型打印机的程序流程基本的驱动打印机的程序流程是这样:打开串口Æ初始化打印机Æ向串口写入打印数据Æ关闭串口对于所有的手持终端,如果具有串行数据通讯接口,都会提供(或者开发者能够编写)如下几个函数(注:因对每个开发平台的函数名或参数不尽相同,这里给出的是一组虚拟函数,采用C语言语法):打开串口函数:Port: 串行端口号, Baudrate: 波特率CommOpen(Port,Baudrate);//向串口写入字符串:Port: 串行端口号, Block: 准备向 CommWrite(Port,Block,Length)//打印机发送的字符串, Length: 字符串长度关闭串口:Port: 串行端口号。

Windows CE嵌入式系统程序开发(基于ARM11)

Windows CE嵌入式系统程序开发(基于ARM11)

2 搭建Windows CE 开发环境 2.3 定制DMA-6410 XP 系统
2.3.1 使用项目向导 2.3.2 构建新的平台 2.3.3 编辑和修改 Windows Embedded CE项目 2.3.4 添加必要的功能 2.3.5 Build
3 Windows CE应用程序开发
3.1 第一个 WinCE程序
位程序
D
7 GPS与Google Earth定位系统
7.1 GPS相关知识
7.1.1 卫星星座 7.1.2 地面监控系统 7.1.3 信号接收机
7 GPS与Google Earth 定位系统
7.2 搭建环境
7.2.1 解析GPS定位信息 7.2.2 下载并安装Google Earth
7 GPS与Google Earth定位 系统 7.4 GPS与Google Earth定位程序
7.4.1 Google Earth_Start程序 的建立 7.4.2 地图定位功能 7.4.3 在地图上新增地标
8 鲜奶配送系统
8.1 系统总体 设计
A
8.2 搭建开发 环境
B
8.3 系统数据 库设计
C
8.4 系统初始 化
D
8.5 终端应用 程序设计
E
8 鲜奶配送系统
8.5 终端应用程序设计
6.3 键盘接口及 驱动程序
6.6 GPRS接口 及驱动程序
6 接口驱动程序开发
6.7 直流电动机接口及驱 动程序
6.9 蓝牙接口及驱动程序
6.8 步进电动机接口及驱 动程序
6 接口驱动程 序开发
6.1 驱动架构分析
6.1.1 驱动程序分类
6.1.2 流接口驱动程序架 构

WinCE流驱动程序设计概述

WinCE流驱动程序设计概述

Th sg fSte m n e f c ie iCE e De i n o r a l t r e Dr r orW n a v f
GU Z e g—h o, ANG Z —q a g N E W e —h a hn a W i in , I n u
( eat etfEet n sadE gne n N n n nv sy N n n 10 3 C i ) Dprm n l r i n n i r g, aj g U iri , aj g2 09 , h a o co c ei i e t i n
1 引 言
Wi E是 一 款 由微 软 公 司推 出 的 面 向嵌 人 式 n C 领域 的操 作 系统 , 广 泛应 用 于手 机 、 D 平 板 电 被 P A、
S 11 A 10的新一代嵌 入式应用 处理 器, 属于 8 _ r m系 列, 它拥有 T u b h m 压缩指令、4 6 位长乘法指令、 增强 型 D P指 令 等 先 进 特 性 , 集 成 了众 多 的外 部 接 S 并
驱动。其中流驱动由于接 口简单、 支持硬件设备最
多, 因而最 为 常用 。下 面 将结 合 D P A 5 B X 25开发 板
D IE SB i n 。例如音频设备 ( vD v 的加 RV R \u I” h Wae e ) 载信息 : f K Y— O A —M C IEi resi,hni E L C L A HN D vr u I H i B i
Wae e \ vD v ]
”Prfx = ”W AV ” e i”
中流驱动的一个简单实例 , 详细说 明其设计方法 。
2 流 驱 动 开 发 的 基 本 知 识
2 1 开发 WiC . n E驱动 的基本 工具

第6章.第3节 WindowsCE操作系统开发

第6章.第3节 WindowsCE操作系统开发

先 看一个 平台的创建流程
Platform Setting
使你可以浏览和修改关于整个平台的每个属性的选项 菜单: Platform -> Settings…
Build Options (1)

Enable CE Target Control Support

选择该选项可以在启动时使能目标控制功能(target control support). 选择这一项同时也打开了内核无关传输层(Kernel Independent Transport Layer — KITL). 选择该选项可以在Config.bib文件中预留内存空间,允许在启动过 程中操作系统可以读取boot loader存储的数据. 选择该选项可以开启事件跟踪子系统(event-tracking subsystem). 选择该选项可使线程运行在内核模式,选择该模式会使系统较脆弱, 但是性能会有所提高. 选择该选项可以使编译好的镜像下载后被烧写的到Flash中

允许调试器建立宿主机和目标机间的链接和传送调试信息 要建立宿主机和目标机间的通讯就必须选择该选项,取消该项也 会同时取消被选定的“Enable CE Target Control Support ”选 项 选择该选项可以将Windows CE的有关内核的信息以日志的形式 装入平台镜像中 这是一个有条件编译的标志,设置它表示OS会提供详细的调试信 息来帮助调试. 选择该选项将事件放入release目录,同时开启事件跟踪
PB能做什么?(2)




Windows CE测试套件(Test Kit)提供了整套驱动 测试工具 内核调试器可以调试定制的OS镜像,同时提供给 用户镜像运行状况的信息 应用调试器可以调试在特定OS上运行的应用程序 远程工具可以调试基于Windows CE的目标机上 运行任务,并获取相关信息 模拟器通过模拟硬件可以加快和简化开发过程, 使用户可以在宿主机上完成平台和应用程序的初 步开发 SDK导出向导可以为用户导出一个特定的软件支 持包(software development kit — SDK).
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Windows CE 编程的十点忠告最近两周我们花了大部分时间将已有的应用程序移植到Microsoft Windows CE中。

一般说来,这个计划不是太难。

我们起步于Microsoft Win32代码,当然Windows CE是基于Win32应用程序接口(API)的。

有利的是,我们的应用程序(即Raima 数据管理器)有方便的使用接口,并包含一个大约由150个子函数组成的库,这些函数都是由C语言写成,可以用来创建、管理和访问数据库。

按建立应用程序的方式来说,我们原以为将它移植到Windows CE中是一项相对简单的C语言编程练习。

然而,我们不久便遇到好些困难。

从粗心大意的错误开始,比如在基于Windows NT 的Windows CE仿真器上使用Microsoft Windows NT库,接着又违背Windows CE的编程戒律,如"千万不要给Unicode(国际标准组织10646标准)字符分配奇数内存地址"。

大约有百分之九十的问题或多或少地与Unicode有关。

尽管Unicode编程不难,但是,当给单字节字符编写代码时,很容易出错(我有过许多次错误)。

下面这些忠告是根据我们在Windows CE上编写Raima 数据管理器的经验总结出来的,但我相信,在做任何其它Windows CE程序之前,它们都值得借鉴。

毕竟大多数Windows 开发者,当他们创建第一个Windows CE应用程序时,真正运用的是已掌握的Win32知识。

1. 不要在仿真器上使用Windows NT库这里所讨论的第一个错误实在太愚蠢了,但我还是陷了进去,也许你也会。

当用Microsoft VC++(5.0版)创建一个Windows CE程序时,你会发现,包含路径(include)、库路径(library)、及可执行程序路径被自动调整以匹配反应目标环境的选择。

因此,比如说为Windows CE模拟器建立应用程序时,你会发现,include路径没有指向Win32的包含文件(在VC目录下),而是指向Windows CE包含文件(在WCE目录下)。

千万别去修改。

由于Windows CE在Windows NT下运行,所以仿真器上运行的程序能够调用任一Windows NT动态链接库(DLL)中的函数,即使这个DLL不是模拟器的成员也一样。

显然,这不是很好氖拢 蛭 嗤 暮 残碓谑殖諴C(H/PC)或Windows CE设备上不可用,而你的软件最终要能在这些设备上运行。

第一次将非Unicode应用程序装入Windows CE仿真器时,你会发现,许多正在使用的函数它都不支持,例如美国国家标准协会(ANSI)定义的字符函数strcpy()。

这也许引诱你去链接Windows NT 运行时间库,以便能解决所有问题。

如果你是刚开始用Windows CE编程,可能你能用的包含文件和库文件是明显的。

答案就是,你不要采用那些在写普通Win32或非Windows CE程序时使用的包含文件和库文件。

2. 不要混淆TCHARs和bytes如果你正在Windows CE上写非Unicode应用程序,你或许要将所有的字符串从单个字符(chars)转换为宽字符(widechars)(例如,C变量类型whcar_t)。

几乎所有Windows CE支持的Win32和运行时间库函数都要求宽字符变量。

Windows 95不支持Unicode,然而,为了使程序代码具有可移植性,你要尽可能采用tchar.h中定义的TCHAR类型,不要直接使用wchar_t。

TCHAR是定义为wchar_t还是char,取决于预处理器的符号UNICODE是否定义。

同样,所有有关字符串处理函数的宏,如_tcsncpy宏,它是定义为Unicode函数wcsncpy还是定义为ANSI函数strncpy,取决于UNICODE是否定义。

在现存的Windows应用程序中,有些代码也许暗示字符长为单字节。

这在给字符串分配内存时经常用到,例如:int myfunc(char *p){char *pszFileName;pszFileName = malloc(MAXFILELEN);if(pszFileName)strncpy(pszFileName, p, MAXFILELEN);/*etc*/在这段代码中,分配的内存块应该写作(MAXFILELEN * sizeof(char)),但是大多数程序员喜欢将它简化为MAXFILELEN,因为对于所有的平台来说sizeof(char)的值等于1。

然而,当你用TCHARS代替多个字符时,很容易忘记这种固有的概念,于是将代码编写成下面的形式:int myfunc(TCHAR *p){TCHAR *pszFileName;PszFileName = (TCHAR*)malloc(MAXFILELEN);If (pszFileName)tcsncpy(pszFileName, p, MAXFILELEN);/*etc*/这是不行的。

它马上会导致出错。

这里的错误在于malloc函数中指定变量大小为bytes,然而_tcsncpy函数中使用的第三个变量却指定为TCHARs而不是bytes。

当UNICODE被定义时,一个TCHAR等于两个字节数(bytes)。

上述代码段应该改写为:int myfunc(TCHAR *p){TCHAR *pszFileName;PszFileName = (TCHAR*)malloc(MAXFILELEN * sizeof(TCHAR));if(pszFileName)tcsncpy(pszFileName, p, MAXFILELEN);/*etc*/3. 不要将Unicode 字符串放入奇数内存地址在Intel系列处理器上,你可以在一奇数内存地址储存任何变量或数组,不会导致任何致命的错误影响。

但在H/PC上,这一点不一定能行? 你必须对大于一个字节的数据类型小心谨慎,包括定义为无符号短型(unsigned short)的wchar_t。

当你设法访问它们的时候,将它们置于奇地址会导致溢出。

编辑器经常在这些问题上提醒你。

你无法管理堆栈变量地址,并且编辑器会检查确定这些地址与变量类型是否相匹配。

同样,运行时间库必须保证从堆中分配的内存总是满足一个word边界,所以你一般不必担心那两点。

但是,如果应用程序含有用memcpy()函数拷贝内存区域的代码,或者使用了某种类型的指针算术以确定内存地址,问题也许就出现了。

考虑下面的例子:int send_name (TCHAR * pszName){char *p, *q;int nLen=(_tcslen(pszName) + 1) * sizeof(TCHAR);p=maloc(HEADER_SIZE + nLen);if(p){q = p + HEADER_SIZE;_tcscpy((TCHAR*)q, pszName);}/* etc */这段代码是从堆中分配内存并复制一个字符串,在字符串的开头留一个HEADER_SIZE 的大小。

假设UNICODE定义了,那么该字符串就是一个widechar字符串。

如果HEADER_SIZE是一个偶数,这段代码就会正常工作,但如果HEADER_SIZE为奇数,这段代码就会出错,因为q指向的地址也将为奇数。

注意,当你在Intel系列处理器中的Windows CE仿真器上测试这段代码时,这个问题是不会发生的。

在这个例子中,只要确保HEADER_SIZE为偶数,你就可以避免问题的发生。

然而,在某些情况下你也许不能这么做。

例如,如果程序是从一台式PC输入数据,你也许不得不采用事先定义过的二进制格式,尽管它对H/PC不适合。

在这种情况下,你必须采用函数,这些函数用字符指针控制字符串而不是TCHAR指针。

如果你知道字符串的长度,就可以用memcpy()复制字符串。

因此,采用逐个字节分析Unicode字符串的函数也许足以确定字符串在widechars中的长度。

4. 在ANSI和Unicode字符串之间进行翻译如果你的Windows CE应用程序接口于台式PC,也许你必须操作PC机中的ANSI字符串数据(例如,char字符串)。

即使你在程序中只用到Unicode字符串,这都是事实。

你不能在Windows CE上处理一个ANSI字符串,因为没有操纵它们的库函数。

最好的解决办法是将ANSI字符串转换成Unicode字符串用到H/PC上,然后再将Unicode字符串转换回ANSI字符串用到PC上。

为了完成这些转换,可采用MultiByteToWideChar()和WideCharToMultiByte () Win32 API 函数。

5. 对于Windows CE 1.0的字符串转换,劈开(hack)在Windows CE 1.0 版本中,这些Win32API函数还没有完成。

所以如果你想既要支持CE 1.0又能支持CE 2.0,就必须采用其它函数。

将ANSI字符串转换成Unicode字符串可以用wsprintf(),其中第一个参数采用一widechar字符串,并且认识"%S"(大写),意思是一个字符串。

由于没有wsscanf() 和wsprintfA(),你必须想别的办法将Unicode字符串转换回ANSI字符串。

由于Windows CE 1.0不在国家语言支持(NLS)中,你也许得求助于hack,如下所示:/*Definition / prototypes of conversion functionsMulti-Byte (ANSI) to WideChar (Unicode)atow() converts from ANSI to widecharwtoa() converts from widechar to ANSI*/#if ( _WIN32_WCE >= 101)#define atow(strA, strW, lenW) \MultiByteToWidechar (CP_ACP, 0, strA, -1, strW, lenW)#define wtoa(strW, strA, lenA) \WideCharToMutiByte (CP_ACP, 0, strW, -1, strA, lenA, NULL, NULL)#else /* _WIN32_WCE >= 101)*//*MultiByteToWideChar () and WideCharToMultiByte() not supported on Windows CE 1.0*/int atow(char *strA, wchar_t *strW, int lenW);int wtoa(wchar_t *strW, char *strA, int lenA);endif /* _WIN32_WCE >= 101*/#if (_WIN32_WCE <101)int atow(char *strA, wchar_t *strW, int lenW){int len;char *pA;wchar_t *pW;/*Start with len=1, not len=0, as string length returnedmust include null terminator, as in MultiByteToWideChar()*/for(pA=strA, pW=strW, len=1; lenW; pA++, pW++, lenW--, len++) {*pW = (lenW = =1) ? 0 : (wchar_t)( *pA);if( ! (*pW))break;}return len;}int wtoa(wxhar_t *strW, char *strA, int lenA){int len;char *pA;wchar_t *pW;/*Start with len=1,not len=0, as string length returned Must include null terminator, as in WideCharToMultiByte()*/for(pA=strA, pW=strW, len=1; lenA; pa++, pW++, lenA--, len++) {pA = (len==1)? 0 : (char)(pW);if(!(*pA))break;}return len;}#endif /*_WIN32_WCE<101*/这种适合于Windows CE 1.0的实现办法比使用wsprintf()函数要容易,因为使用wsprintf()函数更难以限制目标指针所指向的字符串的长度。

相关文档
最新文档