这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 中断驱动函数为何会死掉?

共4条 1/1 1 跳转至

中断驱动函数为何会死掉?

菜鸟
2004-08-05 00:25:45     打赏

我写了一个响应外边中断的驱动程序

但是在进入中断驱动函数时,系统常常会死掉。

如果只是在中断处理函数执行printk这种简单操作,中断可以正确执行。
但如果我在中断驱动函数中放入一些复杂一点的操作代码或者调用其它函数。

系统常常在执行到open函数时,内核就自动进中断(这时并没有中断源),而且死在里面了。

open函数只是执行open device和一些初始化,它怎么自己进去中断了,而且死在里面了.

我的系统是s3c4510B。

希望各位大虾帮忙啊! [align=right][color=#000066][此贴子已经被作者于2004-8-4 16:50:36编辑过][/color][/align]




关键词: 中断     驱动     函数     为何     死掉    

菜鸟
2004-08-05 17:18:00     打赏
2楼
void HDLC_read_service(int irq,void *dev_id,struct pt_regs *regs) //中断服务函数
{
printk("\n(----K----)INTERRUPT EXECUTED!(----K----)\n");
int i,k;
BYTE rLen;
BYTE rBuf[512]; BYTE Channel; UWORD16 HdlcQueueData;
UWORD16 * HdlcQueue; if( HdlcReg[HDLC_IR] & 0x01 )
{
for(i=0;i<HdlcQueueSize;i++)
{
SetRamPage(InitBlockPage);
HdlcQueue=(UWORD16 *)(St5465_Mem_BaseAddr+HdlcQueue_BaseAddr);
HdlcQueueData=HdlcQueue[i];
HdlcQueue[i]=0x00;
if( HdlcQueueData & 0x8000 ) //HDLC INT NOT APPLIED YET
{
if( HdlcQueueData & 0x2000 ) // Tx
{

}
else // Rx
{
Channel = ( (HdlcQueueData & 0x1F00) >> 8 );

rLen = GetHdlcFrame(Channel,rBuf);
if(rLen > 0 && rLen < 63)
{
printk("\n(----K----)Receive From Hdlc Port %2d : ",Channel);
for(k=0;k<rLen;k++)
printk("%02x ",rBuf[k]); }

}
} }
} } static int open_Arm7(struct inode * inode, struct file * files)
{ MOD_INC_USE_COUNT;


printk("(----K----)open_Test Excuted!\n");
///////////////////////////////////////////////
InitBoard();
//////////////////////////////////////////////
Setup5465();
printk("(----K----)Init Hdlc Chip Bus Mode Ok!");
//////////////////////////////////////////////
return 0;
} /*
* close access to the HDLCController
*/ static int release_Arm7(struct inode * inode, struct file * files)
{
int i;
for(i=0;i<32;i+=4)
printk("(----K----)ARM 0x3ff400%x = %x\n",i,(*(volatile unsigned int *)(0x3ff4000+i))); MOD_DEC_USE_COUNT;
printk("\n(----K----)close_Test Excuted!\n");
return 0;
} struct file_operations arm7_fops = {
read: read_Arm7,
write: write_Arm7,
open: open_Arm7,
release: release_Arm7,
};
int hdlc_init(void) //始化函数
{ int result;
result = register_chrdev(254, "hdlc", &arm7_fops);
if (result < 0)
{
printk("(----K----)Test: can't register the test driver\n");
return(-1);
} if (Arm7_major == 0)
Arm7_major = result;
printk("(----K----)Major Number=%d\n",result); //在系统上注册中断 result=request_irq(HDLC_READ_IRQ,HDLC_read_service,SA_INTERRUPT,"HDLC_read",NULL);
INT_ENABLE(HDLC_READ_IRQ);

if (result == -1)
{
printk("(----K----)Can't get assigned irq %d\n",HDLC_READ_IRQ);
return -1;
} return(0);
}
多余的代码省略

菜鸟
2004-08-05 17:19:00     打赏
3楼
什么叫“中断服务函数中,禁止调用系统调用”啊?

菜鸟
2004-09-28 23:18:00     打赏
4楼

可能是堆栈溢出,最好不要用这样的大数组,BYTE rBuf[512]; 可以把代码有简单开始,一点一点往上添加验证。


共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]