天嵌 ARM开发社区

 找回密码
 注册
查看: 2156|回复: 3

请教一个外部中断的语句

[复制链接]
huajiji 发表于 2010-4-27 16:58:38 | 显示全部楼层 |阅读模式
本帖最后由 huajiji 于 2010-4-27 17:03 编辑

在光盘的test程序里面,keyscan.c文件里面有KeyScan_Test()函数,里面有个关于外部中断的语句我不是很懂:
pISR_EINT0 = pISR_EINT1 = pISR_EINT2 = pISR_EINT4_7 = (U32)Key_ISR;
Key_ISR是中断函数,返回值是空类型的,怎么可以强制转化为U32类型呢?还有pISR_EINT0 ,pISR_EINT1, pISR_EINT2 ,pISR_EINT4_7 ,是不同的中断向量,又怎么能让它们相等呢?有什么意义呢?
下面是Key_ISR()和KeyScan_Test()的源码:

static void __irq Key_ISR(void)
{
        U8 key;
        U32 r;

        EnterCritical(&r);
        if(rINTPND==BIT_EINT1)
        {
                //Uart_Printf("eint1\n");
                ClearPending(BIT_EINT1);
        }
        if(rINTPND==BIT_EINT4_7)
        {
                ClearPending(BIT_EINT4_7);
                if(rEINTPEND&(1<<4))
                {
                        //Uart_Printf("eint4\n");
                        rEINTPEND |= 1<< 4;
                }
        }
        if(rINTPND==BIT_EINT0)
        {
                //Uart_Printf("eint0\n");
                ClearPending(BIT_EINT0);
        }
        if(rINTPND==BIT_EINT2)
        {
                //Uart_Printf("eint2\n");
                ClearPending(BIT_EINT2);
        }

        key=Key_Scan();
        if( key == 0xff )
                Uart_Printf( "Interrupt occur... Key is released!\n") ;
        else
                Uart_Printf( "Interrupt occur... K%d is pressed!\n", key) ;

        ExitCritical(&r);
}


void KeyScan_Test(void)
{
        Uart_Printf("\nKey Scan Test, press ESC key to exit !\n");       

        rGPBUP = rGPBUP & ~0x03f0|0x03f0;                        //  LED [8:5] => PU En
        rGPBCON = rGPBCON & ~0x3d57fc|0x3d57fc;                //LED[8:5] => OUTPUT;
        rGPFCON = rGPFCON & (~((3<<4)|(3<<0)|(3<<8)|(3<<2))) | ((2<<4)|(2<<0)|(2<<8)|(2<<2)) ;                //GPF4,2,1,0 set EINT
       
        rEXTINT0 &= ~(7|(7<<4)|(7<<8)|(7<<16));       
        rEXTINT0 |= (0|(0<<4)|(0<<8)|(0<<16));                //set eint0,1,2,4 falling edge int


        rEINTPEND |= (1<<4);                                                        //clear eint 4
        rEINTMASK &= ~(1<<4);                                                //enable eint 4
        ClearPending(BIT_EINT0|BIT_EINT1|BIT_EINT2|BIT_EINT4_7);
pISR_EINT0 = pISR_EINT1 = pISR_EINT2 = pISR_EINT4_7 = (U32)Key_ISR;       
                EnableIrq(BIT_EINT0|BIT_EINT1|BIT_EINT2|BIT_EINT4_7);       

         while( Uart_GetKey() != ESC_KEY ) ;
         DisableIrq(BIT_EINT0|BIT_EINT1|BIT_EINT2|BIT_EINT4_7);       
}
zhaocj 发表于 2010-4-27 18:33:34 | 显示全部楼层
pISR_EINT0 = pISR_EINT1 = pISR_EINT2 = pISR_EINT4_7 = (U32)Key_ISR;
是函数的指针,就是让Key_ISR函数的首地址为pISR_EINT0 所指向的地址。在这里使用连续等号,我的理解是并不是这几个外部中断向量入口地址相等,而是让这几个中断所指向的地址都为后面Key_ISR函数的首地址。由于多个中断入口地址都指向Key_ISR函数,因此就需要在该函数内判断到底是哪个中断在发生。
我个人认为这种写法,可读性不是太好,不易于维护,不如每个中断对应一个函数这种方法好。
fjq 发表于 2010-9-18 14:41:43 | 显示全部楼层
学习了!!!!!
Rain_ning 发表于 2010-9-24 19:46:35 | 显示全部楼层
顶一下  我在这里也是很困惑呢 学习了~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2024-6-11 10:03 , Processed in 1.046875 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表