主题:如何使用中断

  共有34500人关注过本帖    
zj
1楼


如何使用中断  发帖心情 Post By:2010-3-12 17:20:00   [只看该作者]

我用的是贵公司的EM9160v7.2。
中断被触发后,如果不使用EnableExternIRQ函数,还会再次响应中断吗?
还有文档中有下面这段:
当具体的中断处理函数ExIRQHandler执行完毕时,硬件中断请求输入ISA_IRQ1 或ISA_IRQ2 的电平已回到低电平状态,并确保在系统再次使能外部中断前一直保持为低,即函数EnableExternIRQ完成前一直保持为低,以防止中断嵌套。
那么我的情况是:触发中断后,我的ISA_IRQ1脚,会一直保持高,这样是不是会中断嵌套?
谢谢

  单帖管理 | 引用 | 回复 回到顶部
zxw
2楼


  发帖心情 Post By:2010-3-12 18:10:00   [只看该作者]

当中断发生后,需要调用EnableExternIRQ,才会再次响应中断。另外,中断是由上升沿触发的,所以你的电平保持是不会发生中断嵌套的现像。

  单帖管理 | 引用 | 回复 回到顶部
zj
3楼


  发帖心情 Post By:2010-3-16 17:00:00   [只看该作者]

请问下,在没有调用EnableExternIRQ时,中断次数会不会累加?
急急急!!!

  单帖管理 | 引用 | 回复 回到顶部
zxw
4楼


  发帖心情 Post By:2010-3-16 18:12:00   [只看该作者]

如不使用EnableExternIRQ,系统根本不会响应中断。其实,这些都是可以实验一下就能得出结果。从头文件中也能看到它的描述:

// 功能描述:使能EM9260外部中断,允许下一次的中断。
// 输入参数 hIRQ: 安装的外部中断句柄。
// 返回值 = TRUE: 操作成功。
//        = FASLE: 操作失败。
BOOL   EnableExternIRQ( HANDLE hIRQ );

  单帖管理 | 引用 | 回复 回到顶部
zj
5楼


  发帖心情 Post By:2010-3-16 18:25:00   [只看该作者]

我是用磁块触发中断的,但每次都会出现两次的中断。。。。
WaitForSingleObject( lpIRQ->hIRQEvent, INFINITE );
bIrqOccur = 1;
WaitForSingleObject( lpIRQ->hIRQWait, INFINITE );
EnableExternIRQ( lpIRQ->hIRQ );
上面是我的程序,发生中断时,我就只将BOOL bIrqOccur置1,
然后使用线程同步,阻塞在
WaitForSingleObject( lpIRQ->hIRQWait, INFINITE );
然后在主程序完成后,调用SetEvent(hIRQWait)
但这样就会出现两次中断。
这是为什么呢?怎么实现一次只能发生一次中断?
当执行完一次中断时,需要对hIRQEvent作什么吗?
麻烦帮忙下!
谢谢

  单帖管理 | 引用 | 回复 回到顶部
x10
6楼


  发帖心情 Post By:2010-3-16 21:44:00   [只看该作者]

有没有用我们的范例程序来响应你的外部中断。只有上升沿能够触发中断驱动程序的IST,不应当出现两次中断的情况。从你的代码也看不出来如何判断一次触发两次中断的。另外,一般应把对中断事件的处理与等待中断事件放在一起,否则系统延时很大,就没有什么必要要中断了。

  单帖管理 | 引用 | 回复 回到顶部
zj
7楼


  发帖心情 Post By:2010-3-16 22:04:00   [只看该作者]

范例程序?有的话麻烦发到oceanlab_zj@hotmail.com
我用中断,主要是为了激活主线程
主线程中:while(!bIrqOccur)
我在中断线程中加入了打印信息,发现有两次打印。

最后问下:对于
hIRQWait = CreateEvent(NULL,false,false,NULL);

我用WaitForSingleObject( lpIRQ->hIRQWait, INFINITE )阻塞,
用SetEvent函数标识句柄后,句柄会不会自动成为未标识的?
谢谢

  单帖管理 | 引用 | 回复 回到顶部
x10
8楼


  发帖心情 Post By:2010-3-17 13:04:00   [只看该作者]

程序在光盘的\software\通讯接口目录下。程序重发到你的邮箱,请查收。注意在WinCE中的任何线程,都不能有无阻塞的循环存在,否则将大量占用CPU时间,导致其他线程运行异常。通常每个线程可以通过WaitForSingleObject(..)或简单Sleep(..)方式让自己挂起。

  单帖管理 | 引用 | 回复 回到顶部
zj
9楼


  发帖心情 Post By:2010-3-17 13:12:00   [只看该作者]

非常感谢。

  单帖管理 | 引用 | 回复 回到顶部
zj
10楼


  发帖心情 Post By:2010-3-18 15:03:00   [只看该作者]

再问,这是我的中断线程程序
for(;;)
{
    WaitForSingleObject( lpIRQ->hIRQEvent, INFINITE );
    bIrqOccur = 1; // 启动主线程
    WaitForSingleObject( lpIRQ->hIRQWait, INFINITE );
    EnableExternIRQ( lpIRQ->hIRQ );
}
其中,hIRQWait = CreateEvent(NULL,false,false,NULL);
主线程的最后,标识句柄hIRQWait.
我用磁块触发,在不加入
WaitForSingleObject( lpIRQ->hIRQWait, INFINITE );
自己调试发现进入了两中断。
我想问,当加入
WaitForSingleObject( lpIRQ->hIRQWait, INFINITE );
为什么还会有两次中断。
谢谢


  单帖管理 | 引用 | 回复 回到顶部
x10
11楼


  发帖心情 Post By:2010-3-18 16:05:00   [只看该作者]

方便把你的测试代码发给我们看看吗,谢谢!

  单帖管理 | 引用 | 回复 回到顶部
zj
12楼


  发帖心情 Post By:2010-3-18 19:34:00   [只看该作者]

程序已发至support@emtronix.com
我的邮箱是278518766@qq.com
谢谢

  单帖管理 | 引用 | 回复 回到顶部

返回首页

如何使用中断

用户名:
            验证码: 验证码,看不清楚?请点击刷新验证码
内容: