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?
Tags kernel-modules interrupt