【原创】WinCE中断驱动开发实战

参考文档:

WinCE 6.0中断驱动程序分析 BY:HJB

WIinCE中断流式实现驱动和APP 51wince

接下来我们先做一个简单的开发分析。

1.当前功能需求为:

   1.1 外部GPIO响应低电平后进入中断状态;

   1.2 进入中断后响应一些系列功能,当前第一步实现简单的打印信息显示即可,或AP层弹出Messgebox之类提示中断响应成功;

2.概要设计思路:

   2.1 此中断结合与某流式驱动中开发;

   2.2 响应流程为ISQ --> Interrupt ID(逻辑中断号)  --> Event对象;

   2.3 中断处理流程ISR->IST->功能

   2.4 涉及可能需要修改和创建的函数:XXX_Init(),GPIOIntrThread(),XXX_DeInit();

3.详细设计思路:

   3.1 准备初始化所需中断GPIO口的中断属性,包括定义中断对象变量,中断事件,中断GPIO口初始化;

   3.2 修改完善XXX_Init中功能;

         3.2.1 定义消息队列 MSGQUEUEOPTIONS msgQueueOptions = {0} ;
         3.2.2 中断对象变量 XXXCTL *pXXXCtl = NULL;
         3.2.3 GPIO口对象变量WINCE_XXX_GPIO_DEFINE pin;   
         3.2.4 申请中断变量空间 pXXXCtl  =  (XXXCTL *)LocalAlloc(LPTR, sizeof(XXXCTL)); 
         3.2.5 设置中断优先级别 pXXXCtl->dwPriority256 = PCL_DEFAULT_THREAD_PRIORITY;
         3.2.6 创建消息队列 CreateMsgQueue ;
         3.2.7 创建事件 CreateEvent ;
         3.2.8 创建线程调用线程中断处理函数 CreateThread;
         3.2.9 初始化配置GPIO口特性(可以提前操作,但参考pwrbutton部分程序发现有些时候习惯定义在创建消息线程处理函数之后,暂时还没想清楚为什么);

   3.3 设计GPIOIntrThread中断线程处理函数

        3.3.1 定义事件对象,功能对象;
        3.3.2 设置线程优先级CeSetThreadPriority;
        3.3.3 进入消息等待循环while(1);
        3.3.4 等待信号量WaitForSingleObject;
        3.3.5 返回信号量返回值,如返回事件WAIT_OBJECT_0跳转执行对应功能,如WAIT_TIMEOUT则结束,在此处我们设置超时时间为INFINITE,保证持续监测;
        3.3.6 完成返回;

   3.4 修改XXX_DeInit()函数内容

        销毁在创建过程中所产生的所有Handle,释放申请空间LocalFree,清空对象;

4.其他功能实现:

    4.1 其他功能的实现是基于中断响应后,第一部分设计开发我们先尝试将GPIO的中断响应实现,通过打印信息或者AP层MessageBox方式显示出来,具体功能可以按照实际需求进行原始功能移植或再开发;

    4.2

5. 实现原理

    通过流式驱动的Init函数作为入口,我们可以将其通过WinCE系统加载驱动的方式将我们设计的功能流式驱动在开机时就自动运行,通过配置注册表和BIB文件即可使其自动运行,在运行init时,会激活WaitForSingleObject进入while死循环中等待信号量,同时我们设定WaitForSingleObject的超时时间为INFINITE,可以保证其持续的去检测是否有中断产生。

6.其他参考

   2410 powerbuttom 程序代码

原文地址:https://www.cnblogs.com/mercuryxu/p/1632740.html