Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9182637
  • 博文数量: 1728
  • 博客积分: 12961
  • 博客等级: 上将
  • 技术积分: 19870
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-09 11:25
个人简介

偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.

文章分类

全部博文(1728)

文章存档

2024年(4)

2023年(26)

2022年(112)

2021年(217)

2020年(157)

2019年(192)

2018年(81)

2017年(78)

2016年(70)

2015年(52)

2014年(40)

2013年(51)

2012年(85)

2011年(45)

2010年(231)

2009年(287)

分类:

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文件来实现。

阅读(2749) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~