发表于:2008/5/28 16:01:00
#0楼
Windows CE应用程序可以用Visual Studio开发两种不同的应用程序。Microsoft Mobile Information工具套件(MMIT)允许开发人员建立thin client应用程序,它可以在其访问设备的基础上用来传送信息。而Windows CE内建浏览器以及使用WAP的移动电话都可以使用已经建立的这种应用程序。
大多数Windows CE设备不需要full-time的互联网连接,而且也没有本地的Web服务器,所以保留主ASP.NET应用程序以及Web服务没有多大意义。当然,这并没有限制设备的Web服务能力,只是限制了它们充当主机的能力。由于EVC和EVB工具套件没有提供表格控件,所以开发者不得不创建自己的控件,因此如果用.NET编程无疑在这个方面简化了不少时间。
CF集成了ADO.NET和SQL Server/CE。只要开发者熟悉如何在完全版.NET框架下用VB.NET或者C#开发数据库应用程序,那么就可以在Windows CE下用同样的技巧来开发应用程序。
IRQHandler中断处理:
IRQHandler就是中断处理句柄,IRQ在外部中断源在需要向处理器请求服务时发生,比如:时钟、外围器件FIFO上/下溢出、按键等等。
NESTED_ENTRY IRQHandler
Sub Lr, Lr, #4
//保存将要用到的寄存器和Lr压入STACK_IRQ
Stmfd sp!, {r0-r3, r12, Lr}
PROLOG_END
将要用到的寄存器压入STACK_IRQ,这样就完成了准备工作。
//Test interlocked API status.
//INTERLOCKED_START EQU USER_KPAGE+0x380
//INTERLOCKED_END EQU USER_KPAGE+0x400
sub r0, Lr, #INTERLOCKED_START
cmp r0, #INTERLOCKED_END-INTERLOCKED_START
bllo CheckInterlockedRestart
以上内容是关于互锁的检测。如果中断发生在互锁API的执行过程中,需要专门的处理。
这些API都是放在INTERLOCKED_START和INTERLOCKED_END之间的,通过Lr很容易就检查出是否是INTERLOCKEDXXX的过程。
……
CALL OEMInterruptHandler
ldmfd sp!, {r1}
ldmfd sp!, {lr}
msr cpsr_c, #IRQ_MODE:OR:0x80
ldmfd sp!, {r1}
msr spsr, r1
ldr lr, =KData
//时间片已到,进行调度
cmp r0, #SYSINTR_RESCHED
beq %F10
//是否设备中断,中断号是否有效
//SYSINTR_MAX_DEVICES EQU 32
sub r0, r0, #SYSINTR_DEVICES
cmp r0, #SYSINTR_MAX_DEVICES
//由此可以看出windowsCE的系统中断号最大支持32种从9-40.
//其中第16号(24)被定义为SYSINTR_FIRMWARE
ldrhsb r0, [lr, #bResched]
bhs %F20
//device 中断
ldr r2, [lr, #PendEvents]
mov r1, #1
orr r2, r2, r1, LSL r0
str r2, [lr, #PendEvents]
//情况1:r0=SYSINTR_RESCHED=1
//情况2: r0 =r0-SYSINTR_DEVICES>=SYSINTR_MAX_DEVICES
10 ldrb r0, [lr, #bResched]
orr r0, r0, #1
//更新
strb r0, [lr, #bResched]
……
sub lr, lr, #4
ldmfd sp!, {r0-r3, r12}
stmdb lr, {r0-r3}
ldmfd sp!, {r0}
//保存恢复地址
str r0, [lr]
mov r1, #ID_RESCHEDULE
b CommonHandler
ENTRY_END IRQHandler
单一ISR的Device,主要通过OEMInterruptHandler处理,在OEMInterruptHandler没有定义的IRQ,可以在OAL里面或者驱动的加载里面,通过HookInterrupt函数进行关联。
多个ISR的Device,通常这是总线设备的需求,因为总线设备上面通常串有几个设备。这些总线上的设备,需要有一个ISR判断究竟是哪个设备发出的中断。这个ISR,是一个DLL的程序,设备驱动必须在初始化的时候通过LoadIntChainHandler(文件名,函数名,irq)加载这个DLL程序。
LoadIntChainHandler的定义在kdriver.c的NKLoadIntChainHandler里面。对于大多数的总线设备,可以利用微软已经写好的giisr.dll来实现哦。
小结:
开发Windows CE应用程序需要安装一个带有Smart Device Extensions的Visual Studio .NET2002或者.NET2002的以上版本,这样你就拥有了一个熟悉、健壮、带有End-to-End调试特性的Windows CE应用程序开发环境。
大多数Windows CE设备不需要full-time的互联网连接,而且也没有本地的Web服务器,所以保留主ASP.NET应用程序以及Web服务没有多大意义。当然,这并没有限制设备的Web服务能力,只是限制了它们充当主机的能力。由于EVC和EVB工具套件没有提供表格控件,所以开发者不得不创建自己的控件,因此如果用.NET编程无疑在这个方面简化了不少时间。
CF集成了ADO.NET和SQL Server/CE。只要开发者熟悉如何在完全版.NET框架下用VB.NET或者C#开发数据库应用程序,那么就可以在Windows CE下用同样的技巧来开发应用程序。
IRQHandler中断处理:
IRQHandler就是中断处理句柄,IRQ在外部中断源在需要向处理器请求服务时发生,比如:时钟、外围器件FIFO上/下溢出、按键等等。
NESTED_ENTRY IRQHandler
Sub Lr, Lr, #4
//保存将要用到的寄存器和Lr压入STACK_IRQ
Stmfd sp!, {r0-r3, r12, Lr}
PROLOG_END
将要用到的寄存器压入STACK_IRQ,这样就完成了准备工作。
//Test interlocked API status.
//INTERLOCKED_START EQU USER_KPAGE+0x380
//INTERLOCKED_END EQU USER_KPAGE+0x400
sub r0, Lr, #INTERLOCKED_START
cmp r0, #INTERLOCKED_END-INTERLOCKED_START
bllo CheckInterlockedRestart
以上内容是关于互锁的检测。如果中断发生在互锁API的执行过程中,需要专门的处理。
这些API都是放在INTERLOCKED_START和INTERLOCKED_END之间的,通过Lr很容易就检查出是否是INTERLOCKEDXXX的过程。
……
CALL OEMInterruptHandler
ldmfd sp!, {r1}
ldmfd sp!, {lr}
msr cpsr_c, #IRQ_MODE:OR:0x80
ldmfd sp!, {r1}
msr spsr, r1
ldr lr, =KData
//时间片已到,进行调度
cmp r0, #SYSINTR_RESCHED
beq %F10
//是否设备中断,中断号是否有效
//SYSINTR_MAX_DEVICES EQU 32
sub r0, r0, #SYSINTR_DEVICES
cmp r0, #SYSINTR_MAX_DEVICES
//由此可以看出windowsCE的系统中断号最大支持32种从9-40.
//其中第16号(24)被定义为SYSINTR_FIRMWARE
ldrhsb r0, [lr, #bResched]
bhs %F20
//device 中断
ldr r2, [lr, #PendEvents]
mov r1, #1
orr r2, r2, r1, LSL r0
str r2, [lr, #PendEvents]
//情况1:r0=SYSINTR_RESCHED=1
//情况2: r0 =r0-SYSINTR_DEVICES>=SYSINTR_MAX_DEVICES
10 ldrb r0, [lr, #bResched]
orr r0, r0, #1
//更新
strb r0, [lr, #bResched]
……
sub lr, lr, #4
ldmfd sp!, {r0-r3, r12}
stmdb lr, {r0-r3}
ldmfd sp!, {r0}
//保存恢复地址
str r0, [lr]
mov r1, #ID_RESCHEDULE
b CommonHandler
ENTRY_END IRQHandler
单一ISR的Device,主要通过OEMInterruptHandler处理,在OEMInterruptHandler没有定义的IRQ,可以在OAL里面或者驱动的加载里面,通过HookInterrupt函数进行关联。
多个ISR的Device,通常这是总线设备的需求,因为总线设备上面通常串有几个设备。这些总线上的设备,需要有一个ISR判断究竟是哪个设备发出的中断。这个ISR,是一个DLL的程序,设备驱动必须在初始化的时候通过LoadIntChainHandler(文件名,函数名,irq)加载这个DLL程序。
LoadIntChainHandler的定义在kdriver.c的NKLoadIntChainHandler里面。对于大多数的总线设备,可以利用微软已经写好的giisr.dll来实现哦。
小结:
开发Windows CE应用程序需要安装一个带有Smart Device Extensions的Visual Studio .NET2002或者.NET2002的以上版本,这样你就拥有了一个熟悉、健壮、带有End-to-End调试特性的Windows CE应用程序开发环境。