论坛的各位大神好,本人刚接触嵌入式不久,现在学习wince驱动开发,平台是x86的,正在学习使用中断。
我的代码如下,是仿照别人的代码写的:
static DWORD PwrButtonSysIntr = SYSINTR_UNDEFINED;
static DWORD PwrButtonIrq = 7;
DWORD PBT_IntrThread(PVOID pArg)
{
// RETAILMSG(1, (TEXT(">>> PBT_IntrThread()\r\n")));
HANDLE gPwrButtonIntrEvent;
gPwrButtonIntrEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &PwrButtonIrq, sizeof PwrButtonIrq, &PwrButtonSysIntr, sizeof PwrButtonSysIntr, NULL))
{
RETAILMSG(1, (TEXT("PBT: Error! Failed to request sysintr value for power button interrupt.\r\n")));
outportb(0x78,0x01);
return(0);
}
if (!(InterruptInitialize(PwrButtonSysIntr, gPwrButtonIntrEvent, 0, 0)))
{
RETAILMSG(1, (TEXT("::: SYSINTR_POWER Init Fail\r\n")));
}
for(;;)
{
WaitForSingleObject(gPwrButtonIntrEvent, INFINITE);
// RETAILMSG(1, (TEXT("::: Power Button Interrupt\r\n")));
///////////////把gpio的引脚电位拉低
outportb(0x99,0xff);
outportb(0x79,0x00);
InterruptDone(PwrButtonSysIntr);
//return 1;
}
}
DWORD GIO_Init(DWORD dwContext)
{
RETAILMSG(1,(TEXT("GPIO Initialize ...")));
HANDLE gPwrButtonIntrThread;
gPwrButtonIntrThread = CreateThread(0, 0,(LPTHREAD_START_ROUTINE)PBT_IntrThread, 0, 0, NULL);
RETAILMSG(1,(TEXT("OK !!!\n")));
return dwContext;
}
调试过,驱动的所有函数都是能正常使用的,但是就是不能响应中断。我是利用看门狗产生一个IRQ7。还有我想问,KernelIoControl这个函数是不是用来匹配IRQ和逻辑中断号的?那应该是在中断产生之前还是中断产生之后调用这个函数尼?这些代码我是仿照arm驱动的,是不是会有问题?求大神解答啊!!感激不尽啊。
------解决方案--------------------
KernelIoControl这个函数是不是用来匹配IRQ和逻辑中断号的?
——是的
是否重复进入中断要看你进入中断的条件,并且这个中断之后要停止应该要置位之类的动作,具体看你CPU的datasheet和你BSP其他例子。
我的博客以前应该有分析过wince 中断的过程,O(∩_∩)O~现在搞linux android了,所以就不帮你去找了。晚安。
------解决方案--------------------
你先用示波器看看硬件有没有中断然后再查代码,免得你的中断根本就没给出。
------解决方案--------------------
先用dos确认,这个系统简单,直接。 一般是排除问题的好工具。 换个IRQ试试,找其他设备不用的IRQ。
PS: 你用的什么型号的板子?