J'utilise le compilateur Microchip C18 et à l'apparition d'une interruption, j'éprouve un délai assez long avant que le code ISR commence à fonctionner.Qu'est-ce qu'une latence d'interruption normale et un temps d'économie de contexte sur Microchip C18?
A titre d'expérience, cela est dans ma fonction principale:
while(1)
{
LATAbits.LATA4 = 1;
LATAbits.LATA4 = 0;
}
Comme gestionnaire d'interruption j'utilise ce code je copiais de quelques exemples (je ne sais pas pourquoi il a fait de cette façon):
#pragma interrupt high_isr
void high_isr(void)
{
LATAbits.LATA4 = 1;
LATAbits.LATA4 = 1;
LATAbits.LATA4 = 0;
LATAbits.LATA4 = 1;
LATAbits.LATA4 = 1;
LATAbits.LATA4 = 0;
}
#pragma code high_vector=0x08
void interrupt_at_high_vector(void)
{
_asm GOTO high_isr _endasm
}
Je reçois des octets via SPI et peu après la réception d'un octet, la boucle principale s'arrête. Ensuite, un délai de 16,5 μs suit avant que le code ISR ne commence à fonctionner. C'est 165 cycles d'instruction!
Je sais qu'il ya un certain sauvegarde de contexte associé à des interruptions et qu'il est encore pire avec de faibles interruptions prioritaires. J'ai désactivé IPEN et j'utilise seulement le vecteur de haute priorité. Les instructions 165 ont-elles une durée normale d'économie de contexte?
+1 Je le savais mais je pensais que c'était la fonction qui s'appelait réellement ce qui prend beaucoup de temps. Excellente FAQ. – AndreKR