wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
阅读:1710回复:9

关于IST和ISR问题(给分)(wxl_50685330请进)

楼主#
更多 发布于:2004-11-18 12:43
问题:
我想在驱动中处理两个中断,
1)是否需要在IsrDll中定义两个中断处理函数?例如‘ISRHandler’和‘ISRHandler1’。
  相应的xxisr.def中EXPORTS部分如下:
EXPORTS
        ISRHandler
        ISRHandler1
        CreateInstance
        DestroyInstance
        IOControl
2)如果我采用IST的话,是否需要创建两个线程(IST)?
3)是否需要分配两个共享内存共ISR和IST访问(如果采用共享内存的话)?


[编辑 -  11/18/04 by  wwei_wang]

[编辑 -  11/19/04 by  wwei_wang]
Come on, let us drive the world.
chang_nicolas
驱动小牛
驱动小牛
  • 注册日期2004-08-26
  • 最后登录2007-03-29
  • 粉丝0
  • 关注0
  • 积分370分
  • 威望39点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-11-19 14:59
说的都对呀!你是什么中断阿?
shanyonggao
驱动牛犊
驱动牛犊
  • 注册日期2003-01-02
  • 最后登录2008-07-14
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-11-21 13:04
1、如果用的是ARM的处理器的话,我想你可以把所有的中断处理ISR放到函数OEMInterruptHandler中,所以不需要两个中断处理函数。一般情况下不在ISR中写中断处理函数,通常只是返回逻辑中断号等一些简单的操作,这样是为了提高中断处理的性能,因为在ISR处理的时候会屏蔽掉所有的外部中断。
  当然如果不是ARM处理器的,你也可以写两个ISRHandler,然后在OEMInit中调用HookInterrupt把物理中断号同你的ISR处理程序关联起来。
2、不在ISR中写中断处理函数,那以就必须在IST中进行中断处理,这里对应不同的中断必须写不同的IST,所以需要创建两个线程IST。
另外你还可以查看相关的以下几个函数:
InterruptInitialize
OEMInterruptEnable
这将有助你理解整个中断处理的详细过程。
3、看你是否有这个需要了,如果需要的话就可以用全局变量进行数据共享。
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-11-22 09:12
shanyonggao 你好:
在驱动程序中,如果想把ISR和Irq关联起来,是不是调用函数LoadIntChainHandler()就可以了?
多谢指教!
Come on, let us drive the world.
chang_nicolas
驱动小牛
驱动小牛
  • 注册日期2004-08-26
  • 最后登录2007-03-29
  • 粉丝0
  • 关注0
  • 积分370分
  • 威望39点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-11-22 10:00
不是HookInterrupt吗?
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-11-22 15:25
:)兄弟解决了吗?

你说的方案取决于你的需求,处理的方式很多,配置可以很灵活,你既可以用一个ist来做多个中断的中断服务线程(当然,这需要特殊处理了),也可以同一个中断有多个中断服务线程,你要做的只是使用
BOOL InterruptInitialize(
  DWORD idInt,
  HANDLE hEvent,
  LPVOID pvData,
  DWORD cbData
);

把中断源和一个事件关联起来,中断到后事件会被置为有效,这中结构可以满足很多的需求,兄弟可以自己决定
根据地的兄弟们,团结就是力量
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-11-22 16:41
wxl_50685330大哥请关注我另外一个贴子,谢谢。
Come on, let us drive the world.
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-11-23 08:22
谢谢上面几位朋友的解答,不过小弟还有些迷惑:

1。为了把irq和ISR中断处理程序勾连起来,是不是在驱动的XXX_Init()函数中直接调用LoadIntChainHander()就可以了?还需要修改OAL层吗?如需修改,如何修改?
2。为了把sysirq和特定的事件关联起来,是不是在驱动的XXX_Init()函数中直接调用InerrruptInitialize()就可以了?还需要修改OAL层吗?如需修改,如何修改?
Come on, let us drive the world.
shanyonggao
驱动牛犊
驱动牛犊
  • 注册日期2003-01-02
  • 最后登录2008-07-14
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-11-23 19:12
为了把irq同逻辑中断号关联起来,你只需做以下几步:
1、定义一个新逻辑中断号,这个有一定的限制,前面8个中断号是微软保留的,不能使用,最大不能超过32,具体你可以查看PB的帮助文档。一般定义中oalintr.h文件中。
2、在OAL层的ISR处理对应irq代码中返回的刚才定义的逻辑中断号。
3、用InterruptInitialize使Event同该逻辑中断号相关联。
4、在InterruptEnable中使能该中断及相关的一些初始化工作。
我们的BSP里是用这方法关联的,但我看CSP的示例代码里面却是建立一个物理中断号与逻辑中断号的数组来关联的,不知道这之间有什么关系?


wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-11-24 15:24
谢谢shanyonggao及楼上几位朋友的鼎立相助。

Come on, let us drive the world.
游客

返回顶部