Wince外部中断控制LED详解动态申请
联外部中断8和IST线程。在IST中会通过dwStatus = WaitForSingleObject(g_hevInterrupt, INFINITE)来等待中断的发生。然后利用KernelIoControl( IOCTL_HAL_TRANSLATE_IRQ,
&dwIrq, sizeof( dwIrq ), &g_dwSysInt, sizeof( g_dwSysInt ), NULL ); 将物理中断IRQ转换为逻辑中断。这是给内核用的。接着就要创建中断服务线程了:g_htIST = CreateThread(NULL,// CE Has No Security
0, // No Stack Size
ThreadIST,// Interrupt Thread
NULL,// No Parameters
CREATE_SUSPENDED,// Create Suspended until we are done
&dwThreadID // Thread Id
);
这些都做好以后就可以初始化中断了.
// Initialize the interrupt
// 初始化中断,将逻辑中断号与事件关联,即中断产生时触发该事件
//在中断服务线程IST中会等该事件的发生,即WaitForSingleObject(g_hevInterrupt, INFINITE);
//从而中断发生就导致IST运行,处理中断任务
InterruptInitialize(g_dwSysInt, g_hevInterrupt, NULL, 0) 该函数就将物理中断对应的逻辑中断号和事件关联起来了。
到这里整个初始化就做好了,这其中的函数调用顺序不是唯一的,但只要理清各个函数的调用顺序就行了。
DWORD TST_Init( LPCTSTR pContext)
{
printfmsg((TEXT("come into the init!!!\r\n")));
// GPIO Virtual alloc
s2440IO = (volatile IOPreg *) VirtualAlloc(0,sizeof(IOPreg),MEM_RESERVE, PAGE_NOACCESS);
if(s2440IO == NULL) {
printfmsg((TEXT("For s2440IO: VirtualAlloc faiLED!\r\n")));
}
else {
if(!VirtualCopy((PVOID)s2440IO,(PVOID)(IOP_BASE),sizeof(IOPreg),PAGE_READWRITE | PAGE_NOCACHE )) {
printfmsg((TEXT("For s2440IO: Virtualcopy faiLED!\r\n")));
}
}
s2440INTR = (volatile INTreg *) VirtualAlloc(0,sizeof(INTreg ),MEM_RESERVE, PAGE_NOACCESS);
if(s2440INTR == NULL) {
printfmsg((TEXT("For s2440INTR: VirtualAlloc faiLED!\r\n!\r\n")));
}
else {
if(!VirtualCopy((PVOID)s2440INTR,(PVOID)(INT_BASE),sizeof(INTreg),PAGE_READWRITE | PAGE_NOCACHE )) {
printfmsg((TEXT("For s2440INTR: Virtualcopy faiLED!\r\n!\r\n")));
}
InitInterrupt();
return 0x1234;
}
这个函数是在驱动被加载的时候调用的,所以要把初始化的任务放在这里。
与中断相关的部分就这么多,这是动态申请中断的方法,比较复杂。其实完全可以不用动态申请的方法,而且不推荐采用此方法。静态申请是一种很好的方法,比较简单。在后面的文章会进一步讲解。
Wince外部中断控制LED动态申 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)