O módulo do kernel não está recebendo interrupções corretamente

0

Eu tenho um gerador de pulsos que deve acionar meu dispositivo Linux para realizar uma ação, e esse pulso vai para um IRQ no meu processador.

Na árvore de dispositivos do Linux, a interrupção é representada sob esta entrada

align_trigger {
    compatible = "align_trigger";
    interrupt-parent = <0x1>;
    interrupts = <0x0 0x37 0x4>;
};

Então, no meu módulo do kernel eu uso isso

dtnode = of_find_compatible_node(NULL,NULL,"align_trigger");
if(!dtnode){
    printk(KERN_ALERT "Unable to locate devicetree entry\n");
}else{
    irq_index = of_irq_get(dtnode,0);
    if(irq_index>0){
        i = request_irq(irq_index,align_trigger_irq,0,"gxq_03",NULL);
        if(i){
            printk(KERN_ALERT "Unable to register IRQ\n");
        }else{
            printk(KERN_ALERT "Registed IRQ %d\n",irq_index);
        }                
    }
}

E, em seguida, o manipulador de IRQ que eu uso é isso

irqreturn_t align_trigger_irq(int irq,void *ptr, struct pt_regs *regs){
if(max_segment>0){
    if(current_segment>=max_segment){
        current_segment = 0;
    }else{
        current_segment++;
    }
    printk(KERN_ALERT "CURRENT SEGMENT: %d\n",current_segment);
}
return IRQ_HANDLED;
}

Então, no momento, ele não está fazendo muito, apenas relatando quando é acionado, para que eu possa confirmar. O gerador de pulsos está enviando interrupções a cada 100 nós, e eu configurei o segmento máximo para 100.

Eu verifiquei meu registro a cada 10 segundos por 1 minuto.

10 segundos - > QUADRO ATUAL: 1

20 segundos - > QUADRO ATUAL: 1

30 segundos - > QUADRO ATUAL: 2

40 segundos - > QUADRO ATUAL: 4

50 segundos - > QUADRO ATUAL: 5

60 segundos - > QUADRO ATUAL: 5

Então, eu certamente não estou recebendo o número de interrupções por segundo que eu deveria estar recebendo, e realmente não parece ser uma taxa consistente sendo vista pelo processador.

O número de IRQs relatados foi 165, então eu olhei para / proc / interrupts, já que isso tem sido mencionado em outros posts sobre interrupções. A entrada para 165 é esta:

        CPU0  CPU1 
165:    8     0    GIC-0    87    Level    gxq_03

A única coisa que eu posso verificar é que meu gerador de pulsos está emitindo pulsos na taxa certa, mas há um monte de coisas que poderiam estar dando errado entre isso e meu módulo do kernel registrando uma interrupção. Como posso continuar com a depuração do que está errado?

    
por Zephyr 15.02.2018 / 20:56

0 respostas