WinCE中断服务线程IST 详解_第1页
WinCE中断服务线程IST 详解_第2页
WinCE中断服务线程IST 详解_第3页
WinCE中断服务线程IST 详解_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、WinCE 中断服务线程IST 详解中断服务线程负责处理中断大部分的工作。Wince5.0下IST为用户态线程,而在wince6.0下,IST的加载空间会和加载驱动程序的载体相同,也就是说载体为内核态IST就为内核态。对于IST的大体描述是:IST的大部分时间都是在等待某一个事件,这个事件与相对应的逻辑中断号相关联。当有中断发生时,操作系统就会引发与该逻辑中断号相关联的事件,那么IST将会得到调度执行。编写处理中断驱动程序的两个步骤:一、进行中断初始化。二、编写中断服务线程。下面我们来具体介绍这两步的细节:一、进行中断初始化。1、创建事件2、获取IRQ的系统中断号3、创建挂起的中断服务线程IS

2、T 4、调用InterruptInitialize以创建IRQ与事件之间的关联。(创建未挂起的中断服务线程有可能导致InterruptInitialize函数调用失败,因为该事件已经处于等待状态)5、调用CeSetThreadPriority函数设置IST的优先级6、启动IST线程void InitialInterrupt(void)/Create an event创建事件g_hevInterrupt=CreateEvent(NULL,FALSE,FALSE,NULL);if(g_hevInterrupt=NULL)RETAILMSG(1,(TEXT(DEMO:Event creation f

3、ailed!rn);return;/Have the OAL Translate the IRQ to asystem irq获取IRQ的系统中断号fRetVal=KernelIoControl(IOCTL_HAL_TRANSLATE_IRQ,&dwIrq,sizeof(dwIrq),&g_dwSysInt,sizeof(g_dwSysInt),NULL);/Create athread that waits for signaling创建挂起的中断服务线程g_fRun=TRUE;g_htIST=CreateThread(NULL,/Security 0,/No Stack Size Thre

4、adIST,/Interrupt Thread NULL,/No Parameters CREATE_SUSPENDED,/Create Suspended&dwThreadID/Thread Id);/Set the thread priority arbitrarily 5设置线程优先级m_nISTPriority=5;if(!CeSetThreadPriority(g_htIST,m_nISTPriority)RETAILMSG(1,(TEXT(DEMO:Failed setting Thread Priority.rn);return;/Initialize the interrupt

5、创建IRQ与事件之间的关联if(!InterruptInitialize(g_dwSysInt,g_hevInterrupt,NULL,0)RETAILMSG(1,(TEXT(DEMO:InterruptInitialize failed!rn);return;/Get the thread started启动IST线程ResumeThread(g_htIST);需要注意的是,对InterruptInitialize的调用仅采用SYSINTR值和事件作为参数。内核不知道或者不关心将要等待该事件的线程。这样,就可以建立多种应用程序和驱动程序体系结构。应用程序的简单主循环可以初始化中断,然后立即等

6、待该事件。中断只能与一个事件关联,并且该事件不能用于对WaitForMultipleObjects的调用中。我们将观察一个简单的为中断提供服务的线程。这是大多数实现中的标准解决方案。二、编写中断服务线程1、等待中断事件2、确认得到来自操作系统的事件通知3、执行必要的中断处理4、在尽可能短的时间内完成中断的处理5、创建CELOGDATA,供内核调试工具Kernel Tracker查看6、调用InterruptDone通知内核中断完成(系统收到信号后会将该优先级中断恢复)7、再次等待中断事件DWORD WINAPI ThreadIST(LPVOID lpvParam)DWORD dwStatus;

7、BOOL fState=TRUE;/Always chec the running flag检查运行标志while(g_fRun)dwStatus=WaitForSingleObject(g_hevInterrupt,INFINITE);/Check to see if we are finished确认是否需要关闭IST if(!g_fRun)return 0;/Make sure we have the object确认是否成功获得事件if(dwStatus=WAIT_OBJECT_0)/Do all interrupt processing to complete the interac

8、tion做关于中断的相应处理,用户实现/with the board so we can receive another interrupt.if(!(READ_REGISTER_ULONG(g_pBoard Register)&INTR_MASK)RETAILMSG(1,(TEXT(DEMO:Interrupt.);g_dwInterruptCount+;/Finish the interrupt中断完成InterruptDone(g_dwSysInt);return 0;未理解下面一段话的真正含义!?该示例读取一个ULONG寄存器以确定中断状态。您只需用您的代码替换该代码段。非常关键的一点是,要使IST处理尽可能地简单。如果将来需要处理来自该

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论