Microcontroller 微芯片C18上的正常中断延迟和上下文节省时间是多少?

Microcontroller 微芯片C18上的正常中断延迟和上下文节省时间是多少?,microcontroller,interrupt,pic,pic18,Microcontroller,Interrupt,Pic,Pic18,我正在使用微芯片C18编译器,在ISR代码开始运行之前,当发生中断时,我经历了相当长的延迟 作为一个实验,这是我的主要功能: while(1) { LATAbits.LATA4 = 1; LATAbits.LATA4 = 0; } 作为中断处理程序,我正在使用从某个示例中复制的代码(我不知道为什么这样做): 我通过SPI接收字节,收到一个字节后不久,主循环停止。然后,在ISR代码开始运行之前,会出现16.5µs的延迟。这是165个指令周期 我知道有一些与中断相关的上下文保存

我正在使用微芯片C18编译器,在ISR代码开始运行之前,当发生中断时,我经历了相当长的延迟

作为一个实验,这是我的主要功能:

while(1)
{
    LATAbits.LATA4 = 1;
    LATAbits.LATA4 = 0;
}
作为中断处理程序,我正在使用从某个示例中复制的代码(我不知道为什么这样做):

我通过SPI接收字节,收到一个字节后不久,主循环停止。然后,在ISR代码开始运行之前,会出现16.5µs的延迟。这是165个指令周期


我知道有一些与中断相关的上下文保存,而低优先级中断更糟糕。我已禁用IPEN,并且仅使用高优先级向量。165条指令是正常的上下文保存持续时间吗?

在某些情况下,中断开销可能和您的一样大

看看。

从PIC中断中获得良好性能的关键是将所需上下文保存/恢复代码的范围降至最低。在许多情况下,这意味着在机器代码中编写中断处理程序的时间关键部分。在至少有一些可用于中断使用的非银行寄存器的部件上(我真的不喜欢Microchip为FSR2寻址占用大部分或全部公共银行的决定,而不是为FSR2寻址分配15个字节,为FSR0和FSR1寻址分配7个字节,为每个FSR分配一个“魔术操作”寄存器)[我很想谈谈这方面的想法])在普通情况下,有时可以不进行任何上下文保存/恢复。例如,在我的一个14位PIC项目中,我需要每1000个时钟周期中断一次。因此,禁用RTCC prescalar后,我的中断类似于:

INTERRUPT_ENTRY: bcf INTCON,TMR0IF decfsz int_counter,f retfie movwf saveW movf STATUS,w clrf STATUS ; Bank 0 movwf saveStat movlw 4 movwf int_counter movlw 1024+3-1000 ' TMR0 unadjusted time, plus 3 'slip', minus desired time addwf TMR0,f bsf INTCON,GIE ; Interrupts can safely nest after this point! ... other interrupt stuff movf saveStat,w movwf STATUS swapf saveW retfie ; Could just as well use RETURN, since interrupts are enabled 中断输入: bcf INTCON,TMR0IF decfsz内部计数器,f 从中断返回 movwf saveW movf状态,w clrf状态;气缸组0 movwf saveStat movlw 4 movwf int_计数器 movlw 1024+3-1000'TMR0未调整时间,加上3'滑动',减去所需时间 addwf TMR0,f bsf INTCON,GIE;中断在此点之后可以安全嵌套! …其他打断的东西 movf saveStat,w movwf状态 swapf saveW retfie;也可以使用RETURN,因为中断是启用的
请注意,有3/4的时间,一个中断会在执行三条指令之后返回,这三条指令的执行总共需要6个周期。

+1我知道这一点,但我认为实际调用的函数需要很长时间。非常好的常见问题解答。问题是关于C18编译器。Th虽然可能会有帮助,但除非你把它放在上下文中,否则我无法理解你的答案。我甚至不知道把这个内联汇编代码放在哪里。 INTERRUPT_ENTRY: bcf INTCON,TMR0IF decfsz int_counter,f retfie movwf saveW movf STATUS,w clrf STATUS ; Bank 0 movwf saveStat movlw 4 movwf int_counter movlw 1024+3-1000 ' TMR0 unadjusted time, plus 3 'slip', minus desired time addwf TMR0,f bsf INTCON,GIE ; Interrupts can safely nest after this point! ... other interrupt stuff movf saveStat,w movwf STATUS swapf saveW retfie ; Could just as well use RETURN, since interrupts are enabled