主题:如何使用中断 共有34521人关注过本帖 |
---|
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 谢谢 |
|
单帖管理 | 引用 | 回复 |