Я использую компилятор Microchip C18, и при возникновении прерывания я испытываю довольно длительную задержку, прежде чем код ISR начинает работать.
В качестве эксперимента, это в моей основной функции:
while(1)
{
LATAbits.LATA4 = 1;
LATAbits.LATA4 = 0;
}
В качестве обработчика прерываний я использую этот код, который я скопировал из некоторого примера (я не знаю, почему это так):
#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
}
Я получаю байты через SPI, и вскоре после получения байта основной цикл останавливается. Затем следует задержка в 16,5 мкс, прежде чем код ISR начнет работать. Это 165 инструкционных циклов!
увеличить изображение
Я знаю, что существует некоторое сохранение контекста, связанное с прерываниями, и что это еще хуже с прерываниями с низким приоритетом. Я отключил IPEN и использую только вектор с высоким приоритетом. Является ли 165 инструкций нормальной продолжительностью сохранения контекста?