打印

一指针函数调用疑问

[复制链接]
2814|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shanshui90|  楼主 | 2013-2-14 15:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void __irq  IRQ_Exception(void)
{       
        void    (*__Handler)(void);       
        int     irq_no;
        uint32  bak;               
       
        // 找出当前中断号
        bak = rINTPND;                                // 读取INTPND的值
        for(irq_no=0; irq_no<32; irq_no++)
        {       
            bak = bak>>1;
                if(bak == 0) break;
        }
       
        // 取得中断服务程序地址并执行
        __Handler = (void (*)(void)) VICVectAddr[irq_no];
        __Handler();
}

这个_Handler()函数的内容是什么?整个程序中再没有找到Handler的字眼了。 如果是空的,有何作用?

相关帖子

沙发
xinzha| | 2013-2-15 14:45 | 只看该作者
从代码本意来看,_Handler试图指向一个已经注册了的中断服务例程,它是一个局部变量,其他地方没有定义很正常。它的值来自于VICVectAddr这个函数指针数组,应该是中断初始化时按照需要所注册的相应中断标志位的服务例程。
首先这段代码是不严谨的,极端状况下会出问题。就是当进入中断服务之后,如果硬件问题导致中断标志位被清,就会产生irq_no等于32的情况,一个明显的越界错误没有处理。
其次这段代码没有错误保护,如果中断产生了,但是没有注册中断服务函数,结果将很悲惨。

使用特权

评论回复
板凳
shanshui90|  楼主 | 2013-2-15 19:18 | 只看该作者
嗯  受教了,谢谢!新年吉祥!

使用特权

评论回复
地板
Mr_driver| | 2013-2-20 10:43 | 只看该作者
哦哦

使用特权

评论回复
5
lxj19901115| | 2013-9-21 22:00 | 只看该作者
这代码有问题,貌似会死的很惨,,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

55

帖子

0

粉丝