硬件中断,Windows CE是怎么发现这些中断的,需要注册?

luocan1986 2009-09-16 02:39:50
如题,板子上多加了一个设备。加了一根中断线,那么Windows CE 是怎么处理这些中断的了?驱动?BSP? 需要在哪里添加这些信息么?


我是菜鸟,我是大菜鸟!Thanks in advance!
...全文
144 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
luocan1986 2009-09-17
  • 打赏
  • 举报
回复
OS自己程序来发现中断的,然后再交给ISR来处理,详细流程估计得看内核代码
[Quote=引用 10 楼 ztg328 的回复:]
我现在不理解的是wince系统是怎么发现有中断的是就是从硬件发生中断到wince知道有中断这一步是在哪里实现的 是在 WaitForSingleObject(hEvent,INFINITE); 这句吗 他一直在检测硬件然后有中断了就处理 还是
[/Quote]
luocan1986 2009-09-17
  • 打赏
  • 举报
回复
顶起来 谁能给一个流程。。。
visualthinking 2009-09-17
  • 打赏
  • 举报
回复
我的理解是,如果添加了自己的中断,需要在ISR中添加 自己的逻辑中断号?然后再实现自己的IST,不知道对不对?
我是把一个键盘UserKey的中断改成了自定义的,当然前提是:UserKey的中断引脚引出来。
像填空一样:
OEMINTERRUPTENABLE\OEMINTERRUPTDISBALE\OEMINTERRUPTDONE,然后OEMINTERRUPTHANDLER
都是在switch--case里面添加,然后将intr.h里面加一个SYSINTR_XXX的声明,就ok
如果高级一些的做法,是GIISR,装载一个
KernelIoControl没有试过,不知是如果关联到EINTX的
ZTG328 2009-09-17
  • 打赏
  • 举报
回复
我现在不理解的是wince系统是怎么发现有中断的是就是从硬件发生中断到wince知道有中断这一步是在哪里实现的 是在 WaitForSingleObject(hEvent,INFINITE); 这句吗 他一直在检测硬件然后有中断了就处理 还是
luocan1986 2009-09-16
  • 打赏
  • 举报
回复
我的理解是,如果添加了自己的中断,需要在ISR中添加 自己的逻辑中断号?然后再实现自己的IST,不知道对不对?


[Quote=引用 8 楼 xuguod20042576 的回复:]
一般中断都是采用动态中断影射:例如
动态中断映射
好消息是,如果在设备驱动程序中使用 IO 控制码 IOCTL_HAL_REQUEST_SYSINTR
调用 KernelIoControl 来支持 IRQ/SYSINTR 映射,就不需要硬编码 SYSINTR 到
OAL 中。该调用最终在 OALIntrRequestSysIntr 函数中结束,这个函数为所给
IRQ 动态分配新的 SYSINTR,然后在内核的中断映射数组中注册这个 IRQ 和
SYSINTR 映射。查找 SYSINTR_MAXUMUM 以下的空闲 SYSINTR 值,比静态赋值
SYSINTR 更灵活,因为该机制不需要在添加新驱动程序到 BSP 时对 OAL 作任何
修改。
在使用 IOCTL_HAL_REQUEST_SYSINTR 调用 KernelIoControl 时,您在 IRQ 和
SYSINTR 之间建立了 1:1 的关系。如果 IRQ-SYSINTR 映射表已经有一个指定 IRQ
的条目,OALIntrRequestSysIntr 将不会创建鸠欤个条目。要从中断映射表中删除
一个条目, 比如在卸载驱动程序时, 则使槟 IO 控制码 IOCTL_HAL_REQUEST_SYSINTR
来调用 KernelIoControl。IOCTL_HAL_RELEASE_SYSINTR 取消从 SYSINTR 值到 IRQ
的关联。
下面的代码示例阐述了 IOCTL_HAL_REQUEST_SYSINTR 和 IOCTL_HAL_RELEASE_
SYSINTR 的使用。它接收一个自定义的值 (dwLogintr) 并把这个值传递给 OAL 来
转换成 SYSINTR 值,然后把这个 SYSINTR 与一个 IST 事件关联起来。
DWORD dwLogintr = IRQ_VALUE;
DWORD dwSysintr = 0;
HANDLE hEvent  = NULL;
BOOL bResult    = TRUE;
// Create event to associate with the interrupt
m_hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
if (m_hDetectionEvent == NULL)
{
    return ERROR_VALUE;
}
// Ask the kernel (OAL) to associate an SYSINTR value to an IRQ
bResult = KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR,
                          &dwLogintr, sizeof(dwLogintr),
                          &dwSysintr, sizeof(dwSysintr),
                          0);
if (bResult == FALSE)
{
    return ERROR_VALUE;
}
// Initialize interrupt and associate the SYSINTR value with the event.
bResult = InterruptInitialize(dwSysintr, hEvent,0,0);
if (bResult == FALSE)
{
    return ERROR_VALUE;
}
// Interrupt management loop
while(!m_bTerminateDetectionThread)
{
    // Wait for the event associated to the interrupt
    WaitForSingleObject(hEvent,INFINITE);
    // Add actual IST processing here
    // Acknowledge the interrupt
    InterruptDone(m_dwSysintr);
}
// Deinitialize interrupts will mask the interrupt
bResult = InterruptDisable(dwSysintr);
// Unregister SYSINTR
bResult = KernelIoControl(IOCTL_HAL_RELEASE_SYSINTR,
                          &dwSysintr, sizeof(dwSysintr),
                          NULL,0,
                          0);
// Close the event object
CloseHandle(hEvent);
[/Quote]
xuguod20042576 2009-09-16
  • 打赏
  • 举报
回复
一般中断都是采用动态中断影射:例如
动态中断映射
好消息是,如果在设备驱动程序中使用 IO 控制码 IOCTL_HAL_REQUEST_SYSINTR
调用 KernelIoControl 来支持 IRQ/SYSINTR 映射,就不需要硬编码 SYSINTR 到
OAL 中。该调用最终在 OALIntrRequestSysIntr 函数中结束,这个函数为所给
IRQ 动态分配新的 SYSINTR,然后在内核的中断映射数组中注册这个 IRQ 和
SYSINTR 映射。查找 SYSINTR_MAXUMUM 以下的空闲 SYSINTR 值,比静态赋值
SYSINTR 更灵活,因为该机制不需要在添加新驱动程序到 BSP 时对 OAL 作任何
修改。
在使用 IOCTL_HAL_REQUEST_SYSINTR 调用 KernelIoControl 时,您在 IRQ 和
SYSINTR 之间建立了 1:1 的关系。如果 IRQ-SYSINTR 映射表已经有一个指定 IRQ
的条目,OALIntrRequestSysIntr 将不会创建鸠欤个条目。要从中断映射表中删除
一个条目, 比如在卸载驱动程序时, 则使槟 IO 控制码 IOCTL_HAL_REQUEST_SYSINTR
来调用 KernelIoControl。IOCTL_HAL_RELEASE_SYSINTR 取消从 SYSINTR 值到 IRQ
的关联。
下面的代码示例阐述了 IOCTL_HAL_REQUEST_SYSINTR 和 IOCTL_HAL_RELEASE_
SYSINTR 的使用。它接收一个自定义的值 (dwLogintr) 并把这个值传递给 OAL 来
转换成 SYSINTR 值,然后把这个 SYSINTR 与一个 IST 事件关联起来。
DWORD dwLogintr = IRQ_VALUE;
DWORD dwSysintr = 0;
HANDLE hEvent = NULL;
BOOL bResult = TRUE;
// Create event to associate with the interrupt
m_hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
if (m_hDetectionEvent == NULL)
{
return ERROR_VALUE;
}
// Ask the kernel (OAL) to associate an SYSINTR value to an IRQ
bResult = KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR,
&dwLogintr, sizeof(dwLogintr),
&dwSysintr, sizeof(dwSysintr),
0);
if (bResult == FALSE)
{
return ERROR_VALUE;
}
// Initialize interrupt and associate the SYSINTR value with the event.
bResult = InterruptInitialize(dwSysintr, hEvent,0,0);
if (bResult == FALSE)
{
return ERROR_VALUE;
}
// Interrupt management loop
while(!m_bTerminateDetectionThread)
{
// Wait for the event associated to the interrupt
WaitForSingleObject(hEvent,INFINITE);
// Add actual IST processing here
// Acknowledge the interrupt
InterruptDone(m_dwSysintr);
}
// Deinitialize interrupts will mask the interrupt
bResult = InterruptDisable(dwSysintr);
// Unregister SYSINTR
bResult = KernelIoControl(IOCTL_HAL_RELEASE_SYSINTR,
&dwSysintr, sizeof(dwSysintr),
NULL,0,
0);
// Close the event object
CloseHandle(hEvent);
luocan1986 2009-09-16
  • 打赏
  • 举报
回复
还想买本ARM的来看,硬件功底太差了,该还给老师的都还了!

[Quote=引用 6 楼 gooogleman 的回复:]
这个还可以,看这个对驱动工程师有帮助的,在www.china-pub.com的。
[/Quote]
gooogleman 2009-09-16
  • 打赏
  • 举报
回复
这个还可以,看这个对驱动工程师有帮助的,在www.china-pub.com的。
luocan1986 2009-09-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 gooogleman 的回复:]
楼主这个问题很长,我给你捕鱼方法看何宗健的那本书

看这里哦http://blog.csdn.net/gooogleman/archive/2008/11/11/3266887.aspx
[/Quote]


<<32位嵌入式系统硬件设计与调试>> 张崙的?
luocan1986 2009-09-16
  • 打赏
  • 举报
回复
推荐的英文书 那个连接要注册才能打开么?

[Quote=引用 2 楼 gooogleman 的回复:]
楼主这个问题很长,我给你捕鱼方法看何宗健的那本书

看这里哦http://blog.csdn.net/gooogleman/archive/2008/11/11/3266887.aspx
[/Quote]
luocan1986 2009-09-16
  • 打赏
  • 举报
回复
还是Google老大 速度啊。。找书去
gooogleman 2009-09-16
  • 打赏
  • 举报
回复
楼主这个问题很长,我给你捕鱼方法看何宗健的那本书

看这里哦http://blog.csdn.net/gooogleman/archive/2008/11/11/3266887.aspx
gooogleman 2009-09-16
  • 打赏
  • 举报
回复
楼主这个问题很长,我给你捕鱼方法看何宗健的那本书

看这里哦http://blog.csdn.net/gooogleman/archive/2008/11/11/3266887.aspx

19,498

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧