偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.
全部博文(1747)
分类:
2009-04-07 09:01:02
以Windows CE.5.0系统、pxa270平台为例:
一.中断添加
1.要使用中断必须先注册中断
D:\WINCE500\PLATFORM\MAINSTONEIII\src\inc\bsp_cfg.h参照wince自带的中断注册即可。注册值不能大于SYSINTR_FIRMWARE+23。
2.将硬件中断变为系统中断
D:\WINCE500\PLATFORM\MAINSTONEIII\src\kernel\oal\intr.c 其中函数OALIntrStaticTranslate是实现硬件中断转换为系统中断的函数。可以参照别的中断产生的方法写你自己的中断。
3.中断设置与初始化
D:\WINCE500\PUBLIC\csp_pxa27x\oak\oal\common\intr\common\oem.c中的OEMInterruptEnable与OEMInterruptDisable函数,参照别的中断设置写自己的中断。
可以在OEMInitInterrupts添加对中断的初始化,也可以在后面的中断处理线程(IST)中添加。
二. 中断处理线程
1.创建线程CreateThread
2.创建事件CreateEvent
3.中断与事件绑定InterruptInitialize
4.while()
1)等待中断事件发生 WaitForSingleObject
2)确认有一个来自操作系统的事件
3)在尽可能短的时间内处理中断
4)调用 InterruptDone
---------------------------------------------------------------------------------------------
DWORD WINAPI ThreadIST( LPVOID lpvParam )
{
DWORD dwStatus;
// 检查运行标志
while( g_fRun )
{
dwStatus = WaitForSingleObject(g_hevInterrupt, INFINITE);
if( dwStatus == WAIT_OBJECT_0 )
{
// 在此处理中断
//
g_dwInterruptCount ++;
// 完成中断
//
InterruptDone( g_dwSysInt );
}
}
return 0;
}
---------------------------------------------------------------------------------------------
三. 驱动文件DLL
用Platform Builder 新建一个Dll工程,在程序中添加流接口的一些标准函数:
XXX.Init()
XXX_Deinit()
XXX_IOControl()
XXX_Open()
XXX_Close()
XXX_PowerDown()
XXX_PowerUp()
XXX_Read()
XXX_Seek()
XXX_Write()
在XXX.Init里完成初始化,包括IST的创建等,此函数由系统自动调用。其它函数根据实际需要添加内容。
然后添加一个.def文件用来配置dll所要导出的函数。
LIBRARY dllname
EXPORTS
XXX_Init
XXX_Deinit
XXX_IOControl
XXX_Open
XXX_Close
XXX_PowerDown
XXX_PowerUp
XXX_Read
XXX_Seek
XXX_Write
最后将它们编译成DLL文件。
四. 添加驱动到系统
将驱动dll拷贝D:\WINCE500\PBWorkspaces\PXA270\RelDir\MAINSTONEIII_ARMV4I_Release目录下。然后在D:\WINCE500\PLATFORM\MAINSTONEIII\files\Preject.bib中添加:
MODULES
; Name Path Memory Type
; -------------- --------------------------------------------- -----------
dllname.dll $(_FLATRELEASEDIR)\dllname.dll NK SH
其主要功能是在make image的时候把dllname.dll文件添加到系统内核中去。
接下来还要在projiect.reg中添加:
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\dllname]
"Prefix"="XXX"
"Dll"="dllname.dll"
使系统在启动时加载驱动。当然也可以直接建立一个bib文件和reg文件,只要将它们放到platform的release目录下就行了。
上述也可以通过编写cec文件来实现。