微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Wince外部中断控制LED详解动态申请

Wince外部中断控制LED详解动态申请

时间:11-20 来源:互联网 点击:

联外部中断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;

}
这个函数是在驱动被加载的时候调用的,所以要把初始化的任务放在这里。

与中断相关的部分就这么多,这是动态申请中断的方法,比较复杂。其实完全可以不用动态申请的方法,而且不推荐采用此方法。静态申请是一种很好的方法,比较简单。在后面的文章会进一步讲解。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top