发新话题
打印

中断处理程序中的status的值的问题

中断处理程序中的status的值的问题

在中断处理程序irq.c中的
asmlinkage unsigned int do_IRQ(struct pt_regs regs)

{      

        /*  函数返回0则意味着这个irq正在由另一个CPU进行处理,

或这条中断线被禁用*/

      

        int irq = regs.orig_eax & 0xff;     /* 还原中断号 */

        int cpu = smp_processor_id();    /*获得CPU号*/

        irq_desc_t *desc = irq_desc + irq;  /*在irq_desc[]数组中获得irq 的描述符*/

        struct irqaction * action;

        unsigned int status;



        kstat.irqs[cpu][irq]++;

        spin_lock(&desc->lock);  /*针对多处理机加锁*/   

        desc->handler->ack(irq);  /*CPU对中断请求给予确认*/

      

        status = desc->status & ~(IRQ_REPLAY | IRQ_WAITING);
   在这里由于中断初始化的时候desc->status  = IRQ_DISABLED,
      那么现在的status  = (0000 0010)&~(0010 1000 );
   所以status 还是为 IRQ_DISABLED


        status |= IRQ_PENDING; /* we _want_ to handle it */
在这里status  = 0000 0110
         

               

        action = NULL;
     而这儿的判断status 永远为非 0 所以 if 将不会被执行 我的理解是这样的但是
我知道是有错的就是不知道错在哪儿,望各位高手指点一下

        if (!(status & (IRQ_DISABLED | IRQ_INPROGRESS))) {

                action = desc->action;

                status &= ~IRQ_PENDING; /* we commit to handling */

                status |= IRQ_INPROGRESS; /* we are handling it */

        }      

TOP

在线等候
谢谢      

TOP

哦恍然大捂
原来在中断申请函数int request_irq(unsigned int irq,
                void (*handler)(int, void *, struct pt_regs *),
                unsigned long irqflags,
                const char * devname,
                void *dev_id)
中调用int setup_irq(unsigned int irq, struct irqaction * new)的函数中改变了desc->status的值
        if (!shared) {
                desc->depth = 0;
                desc->status &= ~(IRQ_DISABLED | IRQ_AUTODETECT | IRQ_WAITING);
                desc->handler->startup(irq);
        }      

TOP

发新话题