milkyway的窝

最初想法的诞生地

 

wince中断问题

我现在遇到的问题是不知道如何编写硬件触发中断处理程序
环境为wince.net x86,代码如下希望您给予关注
//Öжϴ¦Àí²¿·Ö
HANDLE g_hevInterrupt;;
HANDLE g_htIST;
DWORD g_dwSysInt;
DWORD SetupInterrupt ( void );
DWORD WINAPI ThreadIST ( LPVOID lpvParam );
DWORD SetupInterrupt( void )
{
BOOL fRetVal;
DWORD dwIrq = 7(这是硬件设置的中断号)
DWORD dwThreadID;
// Create an event
//
g_hevInterrupt = CreateEvent(NULL, FALSE, FALSE, NULL);
if(!g_hevInterrupt) return 10;
// Have the OAL Translate the IRQ to a system irq
//
fRetVal = KernelIoControl( IOCTL_HAL_TRANSLATE_IRQ,
&dwIrq,
sizeof( dwIrq ),
&g_dwSysInt,
sizeof( g_dwSysInt ),
NULL );
if( !fRetVal )return 11;
// Create a thread that waits for signaling
//
g_htIST = CreateThread(NULL,// CE Has No Security
0, // No Stack Size
ThreadIST,// Interrupt Thread
NULL,// No Parameters
CREATE_SUSPENDED,// Create Suspended until we are done
&dwThreadID // Thread Id
);
if( !g_htIST )return 12;
// Set the thread priority to real time
//
int m_nISTPriority = 7;
if(!CeSetThreadPriority( g_htIST, m_nISTPriority))
return 13;
// Initialize the interrupt
//
if ( !InterruptInitialize(g_dwSysInt,g_hevInterrupt,NULL,0) )return 14;
ResumeThread( g_htIST );
return 0;
}

DWORD WINAPI ThreadIST( LPVOID lpvParam )
{
DWORD dwStatus;
// Always chec the running flag
//
BOOL g_fRun = TRUE;
while( g_fRun )
{
dwStatus = WaitForSingleObject(g_hevInterrupt, INFINITE);
// Make sure we have the object
//
if( dwStatus == WAIT_OBJECT_0 )
{
// Handle Interrupt Here
//
::MessageBox (NULL, _T("²âÊÔ!"), _T("¾¯¸æÌáʾ"), MB_ICONQUESTION);
// Finish the interrupt
//
InterruptDone( g_dwSysInt );
}
}
return 0;
}
不知道为什么不能触发

驱网网上商城-开发板,开发资料光盘
[楼 主] Posted:2004-12-31 13:21| 顶端
wxl_50685330





级别: 论坛版主
精华: 0
发帖: 2263
威望: 182 点
积分: 1793 分
贡献值: 0 点
注册时间:2002-11-19
进入个人主页 查看作者资料 发送短消息 发送邮件 推荐此帖 引用回复这个帖子



你的7(硬件号)号中断的isr里面要返回你申请的sysintr才行
高速无限下载文件,请申请vip会员

根据地的兄弟们,团结就是力量
[1 楼] Posted:2004-12-31 15:41| 顶端
dellgao





级别: 驱动牛犊
精华: 0
发帖: 9
威望: 1 点
积分: 11 分
贡献值: 0 点
注册时间:2004-12-31
进入个人主页 查看作者资料 发送短消息 发送邮件 推荐此帖 引用回复这个帖子



[quote]你的7(硬件号)号中断的isr里面要返回你申请的sysintr才行 [/quote]
我是刚刚入行 ,很感谢你的回帖,你的意思我不太懂?请明示

高速无限下载文件,请申请vip会员
[2 楼] Posted:2004-12-31 16:13| 顶端
wwei_wang





级别: 驱动大牛
精华: 0
发帖: 608
威望: 1 点
积分: 7 分
贡献值: 0 点
注册时间:2002-06-07
进入个人主页 查看作者资料 发送短消息 发送邮件 推荐此帖 引用回复这个帖子



dellgao兄弟,怎么没有看到你的中断处理程序isr?是你自己写的吗?只有在你的isr中返回你前面定义的g_dwSysInt值,你的WaitForSingleObject函数才会被释放。
高速无限下载文件,请申请vip会员

Come on, let us drive the world.
[3 楼] Posted:2004-12-31 16:38| 顶端
dellgao





级别: 驱动牛犊
精华: 0
发帖: 9
威望: 1 点
积分: 11 分
贡献值: 0 点
注册时间:2004-12-31
进入个人主页 查看作者资料 发送短消息 发送邮件 推荐此帖 引用回复这个帖子



[quote]dellgao兄弟,怎么没有看到你的中断处理程序isr?是你自己写的吗?只有在你的isr中返回你前面定义的g_dwSysInt值,你的WaitForSingleObject函数才会被释放。 [/quote]
你说的中断服务程序,DWORD WINAPI ThreadIST ( LPVOID lpvParam );这个函数不是吗?你写过给一段源码好吗我参考一下,多谢了

驱网网上商城-开发板,开发资料光盘
[4 楼] Posted:2004-12-31 16:50| 顶端
liumengtao





级别: 驱动牛犊
精华: 0
发帖: 16
威望: 4 点
积分: 34 分
贡献值: 0 点
注册时间:2003-03-02
进入个人主页 查看作者资料 发送短消息 发送邮件 推荐此帖 引用回复这个帖子



ISR跟IST不是一回事,ISR负责获取硬件中断,再返回系统中断号给IST以触发WaitForSingleObject,ISR源码直接在帮助里找到,改改就行了。
驱网网上商城-开发板,开发资料光盘
[5 楼] Posted:2005-01-01 01:06| 顶端
午夜母猪魔





级别: 驱动牛犊
精华: 0
发帖: 16
威望: 2 点
积分: 19 分
贡献值: 0 点
注册时间:2004-11-18
进入个人主页 查看作者资料 发送短消息 发送邮件 推荐此帖 引用回复这个帖子



给你讲讲关于硬件中断转换为系统中断的流程你可能就清楚了:(因为我使用的是arm所以抗smdk2410为例。你可以根据你自己的平台来调整)
1。要使用中断必须先注册中断。具体位置在:
D:\WINCE420\PLATFORM\SMDK2410\INC\oalintr.h参照wince自带的中断注册即可。
2。将硬件中断变为系统中断
D:\WINCE420\PLATFORM\SMDK2410\KERNEL\HAL\ARM\armint.c 其中函数OEMInterruptHandler是实现硬件中断转换为系统中断的函数。可以参展别的中断产生的方法写你自己的中断。
3。中断与事件的绑定(以串口的为例,你要根据自己的需要写自己的东西。但是使用的函数是一样的):
com_init()
{ PHW_INDEP_INFO pSerialHead = NULL;
pSerialHead->hserialevent = CreateEvent (0.FALSE,FALSE,NULL);
InterruptInitialize (pSerialhead->pHWObj->dwIntID,//系统中断号 pSerialHead->hserialevent ,NULL,0);

)//此函数为中断与事件绑定

pSerialHead->pDispatchThread = CreateThread(NULL,0,IST,pSerialHead,0,NULL);//开一个处理线程
return(pSerialHead);
}
static DWORD WINAPI
IST ( PVOID pContext)
{
PHW_INDEP_INFO pSerialHead = (PHW_INDEP_INFO )pContext;
ULONG WaitReturn;
while (!Done())
{
WaitReturn = WaitForSingleObject
(pSerialHead->hserialevent ,INFINITE);
SerialEventHandler(pSerialHead);
InterruptDone(pSerialhead->pHWObj->dwIntID);
}
return(0)
}
在这里SerialEventHandler是自己要写的。
4。以上就是是中断处理的具体流程。你可以参考使用。如果有不对的地方请大家补充;

驱网网上商城-开发板,开发资料光盘
[6 楼] Posted:2005-01-02 10:00| 顶端
wwei_wang





级别: 驱动大牛
精华: 0
发帖: 608
威望: 1 点
积分: 7 分
贡献值: 0 点
注册时间:2002-06-07
进入个人主页 查看作者资料 发送短消息 发送邮件 推荐此帖 引用回复这个帖子



To dellgao: 不要着急,其实你离成功只差那么一小步了:)))
我仔细看了一下你给出的代码,还差那么一点点。就是没有把你的硬件中断(7号)和你的ISR相关联。你想想,对于你给出的代码,即使你的硬件已经产生了中断,系统也无法通知你的线程,因为系统怎么会知道你的IST和7号中断有关?所以你还需要做的就是把7号中断与一个ISR相关联,当产生7号中断时,系统会调用这个ISR。这个ISR由你自己来写,一般情况下,ISR只是完成简单的处理工作,主要工作还是由IST来完成。ISR的主要任务:
(1)判断这个中断(对于共享中断)是不是由你的硬件产生,如果
不是则直接返回SYSINTR_CHAIN;
(2)如果是由你的硬件产生,但不需要再由你的IST做进一步处理,那么返回SYSINTR_NOP就可以了;
(3)如果是由你的硬件产生,而且还需要由你的IST做进一步处理,那么要返回g_dwSysInt (这个值是你前面在SetupInterrupt( void )中得到的),返回g_dwSysInt之后,内核会激活与g_dwSysInt关联的事件,这样你的IST中的wait函数就会被释放了。


总结一下:
(1)你需要自己的写这个中断的处理函数即ISR,ISR的代码可以参照前面给出的主要任务来写,也可以参考pb里面的例子;
(2)在你的SetupInterrupt函数中调用LoadIntChainHandler函数把你的硬件中断(7号)同你写的ISR关联起来。

这样,就可以了,你试试吧,Good Luck.
:P :P :P

高速无限下载文件,请申请vip会员

Come on, let us drive the world.
[7 楼] Posted:2005-01-04 10:28| 顶端
dellgao





级别: 驱动牛犊
精华: 0
发帖: 9
威望: 1 点
积分: 11 分
贡献值: 0 点
注册时间:2004-12-31
进入个人主页 查看作者资料 发送短消息 发送邮件 推荐此帖 引用回复这个帖子



[quote]给你讲讲关于硬件中断转换为系统中断的流程你可能就清楚了:(因为我使用的是arm所以抗smdk2410为例。你可以根据你自己的平台来调整)
1。要使用中断必须先注册中断。具体位置在:
D:WINCE420PLATFORMSMDK2410INCoalintr.h参照wince自带的中断注册即可。
2。将硬件中断变为系统中断
D:WINCE420PLATFORMSMDK2410KERNELHALARMarmint.c 其中函数OEMInterruptHandler是实现硬件中断转换为系统中断的函数。可以参展别的中断产生的方法写你自己的中断。
3。中断与事件的绑定(以串口的为例,你要根据自己的需要写自己的东西。但是使用的函数是一样的):
com_init()
{ PHW_INDEP_INFO pSerialHead = NULL;
pSerialHead->hserialevent = CreateEvent (0.FALSE,FALSE,NULL);
InterruptInitialize (pSerialhead->pHWObj->dwIntID,//系统中断号 pSerialHead->hserialevent ,NULL,0);

)//此函数为中断与事件绑定

pSerialHead->pDispatchThread = CreateThread(NULL,0,IST,pSerialHead,0,NULL);//开一个处理线程
return(pSerialHead);
}
static DWORD WINAPI
IST ( PVOID pContext)
{
PHW_INDEP_INFO pSerialHead = (PHW_INDEP_INFO )pContext;
ULONG WaitReturn;
while (!Done())
{
WaitReturn = WaitForSingleObject
(pSerialHead->hserialevent ,INFINITE);
SerialEventHandler(pSerialHead);
InterruptDone(pSerialhead->pHWObj->dwIntID);
}
return(0)
}
在这里SerialEventHandler是自己要写的。
4。以上就是是中断处理的具体流程。你可以参考使用。如果有不对的地方请大家补充; [/quote]
"D:WINCE420PLATFORMSMDK2410INCoalintr.h参照wince自带的中断注册即可。
"我找了半天没有找到,请指教?谢谢我是新手

驱网网上商城-开发板,开发资料光盘
[8 楼] Posted:2005-01-04 10:47| 顶端
wwei_wang





级别: 驱动大牛
精华: 0
发帖: 608
威望: 1 点
积分: 7 分
贡献值: 0 点
注册时间:2002-06-07
进入个人主页 查看作者资料 发送短消息 发送邮件 推荐此帖 引用回复这个帖子



其实,arm和x86架构的平台,中断处理的实现方法的有一定的差别。在WINCE420\\PUBLIC\\COMMON\\OAK\\CSP\\I486\\INC的oalintr.h中定义了OEM所使用的用于irq和sysintr转换的函数,不过这些函数只能用于OAL层。在\\WINCE420\\PUBLIC\\COMMON\\OAK\\INC中的nkintr.h中有sysintr的定义,你可以看看。
其实,你可以按照我前面的方法试试,可以解决你的问题。你只需写一个isr并把这个isr和你的硬件中断相关联即可。

驱网网上商城-开发板,开发资料光盘

Come on, let us drive the world.
[9 楼] Posted:2005-01-04 11:24| 顶端
wwei_wang





级别: 驱动大牛
精华: 0
发帖: 608
威望: 1 点
积分: 7 分
贡献值: 0 点
注册时间:2002-06-07
进入个人主页 查看作者资料 发送短消息 发送邮件 推荐此帖 引用回复这个帖子



PB中提供了许多驱动的源代码,你的isr可以参考GIISR.dll来写,它的源代码位于WINCE420\\PUBLIC\\COMMON\\OAK\\DRIVERS\\GIISR。
高速无限下载文件,请申请vip会员

Come on, let us drive the world.
[10 楼] Posted:2005-01-04 12:09| 顶端
dellgao





级别: 驱动牛犊
精华: 0
发帖: 9
威望: 1 点
积分: 11 分
贡献值: 0 点
注册时间:2004-12-31
进入个人主页 查看作者资料 发送短消息 发送邮件 推荐此帖 引用回复这个帖子



[quote]PB中提供了许多驱动的源代码,你的isr可以参考GIISR.dll来写,它的源代码位于WINCE420\PUBLIC\COMMON\OAK\DRIVERS\GIISR。 [/quote]
这几天忙乎了一大阵子,还是迷茫,我是在EVC环境开发,不是在PB里面做,而且我是对计数器板开发,厂家没有提供驱动,
我的程序要实现的目的如下:
1、硬件环境是一个基于x86的PC104三寸嵌入式板卡
2、pc104的IO卡带有3个计数器
软件要实现的功能就是:
对计数器进行编程,每当计数器完毕时候就触发一个中断
以上就是所要罗嗦的,希望您能给个建议,谢谢!

高速无限下载文件,请申请vip会员
[11 楼] Posted:2005-01-07 15:59| 顶端
wwei_wang





级别: 驱动大牛
精华: 0
发帖: 608
威望: 1 点
积分: 7 分
贡献值: 0 点
注册时间:2002-06-07
进入个人主页 查看作者资料 发送短消息 发送邮件 推荐此帖 引用回复这个帖子



兄弟,如果我没说错的话,你的驱动是用来进行数据采集的?
其实,这个驱动的框架已经出来了(就是你最初写的那些),现在关键的问题是isr,你可以看看我前面给你建议,按照那个做肯定可以的。

驱网网上商城-开发板,开发资料光盘

Come on, let us drive the world.
[12 楼] Posted:2005-01-07 16:22| 顶端
dellgao





级别: 驱动牛犊
精华: 0
发帖: 9
威望: 1 点
积分: 11 分
贡献值: 0 点
注册时间:2004-12-31
进入个人主页 查看作者资料 发送短消息 发送邮件 推荐此帖 引用回复这个帖子



[quote]兄弟,如果我没说错的话,你的驱动是用来进行数据采集的?
其实,这个驱动的框架已经出来了(就是你最初写的那些),现在关键的问题是isr,你可以看看我前面给你建议,按照那个做肯定可以的。 [/quote]
我不是做采集的是分频用的,我看了你说的例程,有些迷糊

高速无限下载文件,请申请vip会员
[13 楼] Posted:2005-01-07 16:50| 顶端
wwei_wang





级别: 驱动大牛
精华: 0
发帖: 608
威望: 1 点
积分: 7 分
贡献值: 0 点
注册时间:2002-06-07
进入个人主页 查看作者资料 发送短消息 发送邮件 推荐此帖 引用回复这个帖子



不管是分频还是数据采集,你的驱动肯定是用来响应外部(定时)中断的。现在的问题是,在你的驱动中,由谁来响应你的外部中断呢?肯定不是ist,因为ist只是用来对中断进行进一步的处理,它是不能和硬件中断直接联系在一起的。直接相应硬件中断的是isr,你需要写这个中断服务例程,并把这个例程(isr)同你的硬件中断关联起来,这样当中断产生的时候,系统就会先调用你的isr,进而执行你的ist线程。如果你还是不太清楚,你就看看pb下面关于installable isr方面的文档吧。
驱网网上商城-开发板,开发资料光盘

Come on, let us drive the world.
[14 楼] Posted:2005-01-10 08:40| 顶端
lrx666





级别: 驱动太牛
精华: 0
发帖: 10286
威望: 1 点
积分: 9 分
贡献值: 0 点
注册时间:2001-08-17
进入个人主页 查看作者资料 发送短消息 发送邮件 推荐此帖 引用回复这个帖子



好,也学了点东西
高速无限下载文件,请申请vip会员
[15 楼] Posted:2005-09-22 14:37| 顶端
zhyi



级别: 驱动牛犊
精华: 0
发帖: 4
威望: 5 点
积分: 40 分
贡献值: 0 点
注册时间:2006-03-22
进入个人主页 查看作者资料 发送短消息 发送邮件 推荐此帖 引用回复这个帖子



在六楼的帖子中,
com_init()
{ PHW_INDEP_INFO pSerialHead = NULL;
pSerialHead->hserialevent = CreateEvent (0.FALSE,FALSE,NULL);
InterruptInitialize (pSerialhead->pHWObj->dwIntID,//系统中断号 pSerialHead->hserialevent ,NULL,0);

)//此函数为中断与事件绑定

pSerialHead->pDispatchThread = CreateThread(NULL,0,IST,pSerialHead,0,NULL);//开一个处理线程
return(pSerialHead);
}
static DWORD WINAPI
IST ( PVOID pContext)
{
PHW_INDEP_INFO pSerialHead = (PHW_INDEP_INFO )pContext;
ULONG WaitReturn;
while (!Done())
{
WaitReturn = WaitForSingleObject
(pSerialHead->hserialevent ,INFINITE);
SerialEventHandler(pSerialHead);
InterruptDone(pSerialhead->pHWObj->dwIntID);
}
return(0)
}
在这里SerialEventHandler是自己要写的。

我想请教一下,这个SerialEventHandle是否就是ISR,要自己写要求。我能否在这个ISR中实现两个中断,如果可以到IST中如何处理?另外,这上面是如何让ISR与中断相关联的,没看明白。

驱网网上商城-开发板,开发资料光盘
[16 楼] Posted:2006-04-20 23:18| 顶端
soarstar





级别: 驱动小牛
精华: 0
发帖: 102
威望: 117 点
积分: 0 分
贡献值: 0 点
注册时间:2005-03-14
进入个人主页 查看作者资料 发送短消息 发送邮件 推荐此帖 引用回复这个帖子



SerialEventHandle就是ISR啊
你说的“ISR中实现两个中断”是什么意思?
是不是指的是多源中断?
多源中断一般在IST中有个判断
返回的逻辑中断号都是不一样的
所以不会在同一个ISR中处理!

驱网网上商城-开发板,开发资料光盘
[17 楼] Posted:2006-04-21 10:25| 顶端
zhyi



级别: 驱动牛犊
精华: 0
发帖: 4
威望: 5 点
积分: 40 分
贡献值: 0 点
注册时间:2006-03-22
进入个人主页 查看作者资料 发送短消息 发送邮件 推荐此帖 引用回复这个帖子



QUOTE:
引用第17楼soarstar2006-04-21 10:25发表的“”:
SerialEventHandle就是ISR啊
你说的“ISR中实现两个中断”是什么意思?
是不是指的是多源中断?
多源中断一般在IST中有个判断
返回的逻辑中断号都是不一样的
.......


    我的意思是如果用一个驱动程序来实现两个中断线,怎么处理?
  两个中断线肯定对应两个不同的逻辑中断,上面的SerialEventHandle就是ISR,那么ISR能否返回两个不同的逻辑中断,然后不同的逻辑中断调用不同的IST,来完成不同的中断内容?
  或者可以用ISR返回一个逻辑中断,然后调用一个IST,那么在IST中如何区分?返回哪一个逻辑中断呢,毕竟两个中断线对应的逻辑中断不同,迷惑中。。。

posted on 2007-02-02 09:25 milkyway 阅读(2722) 评论(0)  编辑 收藏 引用 所属分类: wince(别人的文章技巧总结)


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

公告

随笔皆原创,文章乃转载. 欢迎留言!

常用链接

留言簿(37)

随笔分类(104)

随笔档案(101)

文章分类(51)

文章档案(53)

wince牛人

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜