编写Windows CE程序 (三)
Windows CE[font=宋体][size=10.5pt]应用程序可以用[/size][/font]Visual Studio[font=宋体][size=10.5pt]开发两种不同的应用程序。[/size][/font]Microsoft Mobile Information[font=宋体][size=10.5pt]工具套件([/size][/font]MMIT[font=宋体][size=10.5pt])允许开发人员建立[/size][/font]thin client[font=宋体][size=10.5pt]应用程序,它可以在其访问设备的基础上用来传送信息。而[/size][/font]Windows CE[font=宋体][size=10.5pt]内建浏览器以及使用[/size][/font]WAP[font=宋体][size=10.5pt]的移动电话都可以使用已经建立的这种应用程序。[/size][/font][font=宋体][size=10.5pt]大多数[/size][/font]Windows CE[font=宋体][size=10.5pt]设备不需要[/size][/font]full-time[font=宋体][size=10.5pt]的互联网连接,而且也没有本地的[/size][/font]Web[font=宋体][size=10.5pt]服务器,所以保留主[/size][/font]ASP.NET[font=宋体][size=10.5pt]应用程序以及[/size][/font]Web[font=宋体][size=10.5pt]服务没有多大意义。当然,这并没有限制设备的[/size][/font]Web[font=宋体][size=10.5pt]服务能力,只是限制了它们充当主机的能力。由于[/size][/font]EVC[font=宋体][size=10.5pt]和[/size][/font]EVB[font=宋体][size=10.5pt]工具套件没有提供表格控件,所以开发者不得不创建自己的控件,因此如果用[/size][/font].NET[font=宋体][size=10.5pt]编程无疑在这个方面简化了不少时间。[/size][/font]
CF[font=宋体][size=10.5pt]集成了[/size][/font]ADO.NET[font=宋体][size=10.5pt]和[/size][/font]SQL Server/CE[font=宋体][size=10.5pt]。只要开发者熟悉如何在完全版[/size][/font].NET[font=宋体][size=10.5pt]框架下用[/size][/font]VB.NET[font=宋体][size=10.5pt]或者[/size][/font]C[font=宋体][size=10.5pt]#开发数据库应用程序,那么就可以在[/size][/font]Windows CE[font=宋体][size=10.5pt]下用同样的技巧来开发应用程序。[/size][/font]
[b]IRQHandler[/b][b][font=宋体]中断处理[/font][/b][b][font=宋体]:[/font][/b][b][/b]
IRQHandler[font=宋体]就是中断处理句柄,[/font]IRQ[font=宋体]在外部中断源在需要向处理器请求服务时发生,比如:时钟、外围器件[/font]FIFO[font=宋体]上[/font]/[font=宋体]下溢出、按键等等。[/font]
[table=394][tr][td=1,1,394][align=left][align=left][font=宋体][size=11pt]NESTED_ENTRY IRQHandler [/size][/font][/align][/align][/td][/tr][tr][td=1,1,394][align=left][align=left][font=宋体][size=11pt]Sub
Lr, Lr, #4[/size][/font][/align][/align][/td][/tr][tr][td=1,1,394][align=left][align=left][font=宋体][size=11pt]//[/size][/font][font=宋体][size=11pt]保存将要用到的寄存器和Lr压入STACK_IRQ[/size][/font][/align][/align][/td][/tr][tr][td=1,1,394][align=left][align=left][font=宋体][size=11pt]Stmfd
sp!, {r0-r3, r12, Lr}[/size][/font][/align][/align][/td][/tr][tr][td=1,1,394][align=left][align=left][font=宋体][size=11pt]PROLOG_END [/size][/font][/align][/align][/td][/tr][tr][td=1,1,394][align=left][align=left][font=宋体][size=11pt]将要用到的寄存器压入STACK_IRQ,这样就完成了准备工作。 [/size][/font][/align][/align][/td][/tr][tr][td=1,1,394][align=left][align=left][font=宋体][size=11pt]//Test interlocked API status.[/size][/font][/align][/align][/td][/tr][tr][td=1,1,394][align=left][align=left][font=宋体][size=11pt]//INTERLOCKED_START EQU USER_KPAGE+0x380 [/size][/font][/align][/align][/td][/tr][tr][td=1,1,394][align=left][align=left][font=宋体][size=11pt]//INTERLOCKED_END EQU USER_KPAGE+0x400 [/size][/font][/align][/align][/td][/tr][tr][td=1,1,394][align=left][align=left][font=宋体][size=11pt]sub
r0, Lr, #INTERLOCKED_START [/size][/font][/align][/align][/td][/tr][tr][td=1,1,394][align=left][align=left][font=宋体][size=11pt]cmp
r0, #INTERLOCKED_END-INTERLOCKED_START [/size][/font][/align][/align][/td][/tr][tr][td=1,1,394][align=left][align=left][font=宋体][size=11pt]bllo
CheckInterlockedRestart [/size][/font][/align][/align][/td][/tr][/table][font=宋体][size=10.5pt]以上内容是关于互锁的检测。如果中断发生在互锁[/size][/font]API[font=宋体][size=10.5pt]的执行过程中,需要专门的处理。[/size][/font]
[font=宋体][size=10.5pt]这些[/size][/font]API[font=宋体][size=10.5pt]都是放在[/size][/font]INTERLOCKED_START[font=宋体][size=10.5pt]和[/size][/font]INTERLOCKED_END[font=宋体][size=10.5pt]之间的,通过[/size][/font]Lr[font=宋体][size=10.5pt]很容易就检查出是否是[/size][/font]INTERLOCKEDXXX[font=宋体][size=10.5pt]的过程。[/size][/font]
[table=473][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]……[/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]CALL
OEMInterruptHandler [/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]ldmfd
sp!, {r1} [/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]ldmfd
sp!, {lr} [/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]msr
cpsr_c, #IRQ_MODE:OR:0x80 [/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]ldmfd
sp!, {r1}[/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]msr
spsr, r1[/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]ldr
lr, =KData [/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]//[/size][/font][font=宋体][size=11pt]时间片已到,进行调度 [/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]cmp
r0, #SYSINTR_RESCHED[/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]beq
%F10
[/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]//[/size][/font][font=宋体][size=11pt]是否设备中断,中断号是否有效 [/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]//SYSINTR_MAX_DEVICES EQU 32
[/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]sub
r0, r0, #SYSINTR_DEVICES [/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]cmp
r0, #SYSINTR_MAX_DEVICES [/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]//[/size][/font][font=宋体][size=11pt]由此可以看出windowsCE的系统中断号最大支持32种从9-40. [/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]//[/size][/font][font=宋体][size=11pt]其中第16号(24)被定义为SYSINTR_FIRMWARE [/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]ldrhsb
r0, [lr, #bResched]
[/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]bhs
%F20
[/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]//device [/size][/font][font=宋体][size=11pt]中断 [/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]ldr
r2, [lr, #PendEvents]
[/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]mov
r1, #1 [/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]orr
r2, r2, r1, LSL r0
[/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]str
r2, [lr, #PendEvents] [/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]//[/size][/font][font=宋体][size=11pt]情况1:r0=SYSINTR_RESCHED=1 [/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]//[/size][/font][font=宋体][size=11pt]情况2: r0 =r0-SYSINTR_DEVICES>=SYSINTR_MAX_DEVICES[/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]10
ldrb
r0, [lr, #bResched]
[/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]orr
r0, r0, #1
[/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]//[/size][/font][font=宋体][size=11pt]更新[/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]strb
r0, [lr, #bResched]
[/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]……[/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]sub
lr, lr, #4 [/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]ldmfd
sp!, {r0-r3, r12} [/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]stmdb
lr, {r0-r3} [/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]ldmfd
sp!, {r0} [/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]//[/size][/font][font=宋体][size=11pt]保存恢复地址[/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]str
r0, [lr][/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]mov
r1, #ID_RESCHEDULE [/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]b
CommonHandler [/size][/font][/align][/align][/td][/tr][tr][td=1,1,473][align=left][align=left][font=宋体][size=11pt]ENTRY_END IRQHandler [/size][/font][/align][/align][/td][/tr][/table][font=宋体][size=10.5pt]单一[/size][/font]ISR[font=宋体][size=10.5pt]的[/size][/font]Device[font=宋体][size=10.5pt],主要通过[/size][/font]OEMInterruptHandler[font=宋体][size=10.5pt]处理,在[/size][/font]OEMInterruptHandler[font=宋体][size=10.5pt]没有定义的[/size][/font]IRQ[font=宋体][size=10.5pt],可以在[/size][/font]OAL[font=宋体][size=10.5pt]里面或者驱动的加载里面,通过[/size][/font]HookInterrupt[font=宋体][size=10.5pt]函数进行关联。[/size][/font]
[font=宋体][size=10.5pt]多个[/size][/font]ISR[font=宋体][size=10.5pt]的[/size][/font]Device[font=宋体][size=10.5pt],通常这是总线设备的需求,因为总线设备上面通常串有几个设备。这些总线上的设备,需要有一个[/size][/font]ISR[font=宋体][size=10.5pt]判断究竟是哪个设备发出的中断。这个[/size][/font]ISR[font=宋体][size=10.5pt],是一个[/size][/font]DLL[font=宋体][size=10.5pt]的程序,设备驱动必须在初始化的时候通过[/size][/font]LoadIntChainHandler[font=宋体][size=10.5pt](文件名,函数名,[/size][/font]irq[font=宋体][size=10.5pt])加载这个[/size][/font]DLL[font=宋体][size=10.5pt]程序。[/size][/font]
LoadIntChainHandler[font=宋体][size=10.5pt]的定义在[/size][/font]kdriver.c[font=宋体][size=10.5pt]的[/size][/font]NKLoadIntChainHandler[font=宋体][size=10.5pt]里面。对于大多数的总线设备,可以利用微软已经写好的[/size][/font]giisr.dll[font=宋体][size=10.5pt]来实现哦。[/size][/font]
[b][font=宋体]小结:[/font][/b][b][/b]
[font=宋体][size=10.5pt]开发[/size][/font]Windows CE[font=宋体][size=10.5pt]应用程序需要安装一个带有[/size][/font]Smart Device Extensions[font=宋体][size=10.5pt]的[/size][/font]Visual Studio .NET2002[font=宋体][size=10.5pt]或者[/size][/font].NET2002[font=宋体][size=10.5pt]的以上版本,这样你就拥有了一个熟悉、健壮、带有[/size][/font]End-to-End[font=宋体][size=10.5pt]调试特性的[/size][/font]Windows CE[font=宋体][size=10.5pt]应用程序开发环境。[/size][/font] Windows CE支持各种CPU和能够以多种方式被配置,每种方式带有一个不同的API,开发环境怎样才能知道目标平台呢? 需要使用Platform Builder么? 静待解答,谢谢! [quote]原帖由 [i]小漏[/i] 于 2008-6-2 15:56 发表 [url=http://bbs.linux-cn.com/redirect.php?goto=findpost&pid=47073&ptid=16523][img]http://bbs.linux-cn.com/images/common/back.gif[/img][/url]
Windows CE支持各种CPU和能够以多种方式被配置,每种方式带有一个不同的API,开发环境怎样才能知道目标平台呢? [/quote]
[size=10.5pt][font=Times New Roman]MS[/font][/size][font=宋体][size=10.5pt]已经开发了一组[/size][/font][size=10.5pt][font=Times New Roman]Windows CE[/font][/size][font=宋体][size=10.5pt]开发工具,某些兼容所有的平台,某些仅支持手持电脑和其他专门的系统。[/size][/font][color=black][font=Arial][/font][/color] [quote]原帖由 [i]小漏[/i] 于 2008-6-2 15:56 发表 [url=http://bbs.linux-cn.com/redirect.php?goto=findpost&pid=47073&ptid=16523][img]http://bbs.linux-cn.com/images/common/back.gif[/img][/url]
Windows CE支持各种CPU和能够以多种方式被配置,每种方式带有一个不同的API,开发环境怎样才能知道目标平台呢? [/quote]
[size=10.5pt][font=Times New Roman]MS[/font][/size][font=宋体][size=10.5pt]已经开发了一组[/size][/font][size=10.5pt][font=Times New Roman]Windows CE[/font][/size][font=宋体][size=10.5pt]开发工具,某些兼容所有的平台,某些仅支持手持电脑和其他专门的系统。[/size][/font][color=black][font=Arial][/font][/color]
.
[size=4]楼主说的非常不错![/size][img]http://bbs.ecshop.com/images/common/sigline.gif[/img][url=http://www.53kf.com/index0.php?page=603932][img]http://www.53kf.com/img/kflogo/v5_3.gif[/img][/url]
[url=http://www.53kf.com/index0.php?page=603932][size=4][color=red]点此免费申请 53KF网站在线客服,点击就能对话![/color][/size][/url]
[url=http://www.53kf.com/index0.php?page=603932][size=4][color=red]基本功能终身免费,为您创造更多价值![/color][/size][/url]
页:
[1]