2

我正在使用 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 接收字节,在收到一个字节后不久,主循环停止。然后在 ISR 代码开始运行之前有 16.5 µs 的延迟。那是165个指令周期!

中断时间 放大图片

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

4

2 回答 2

3

在某些情况下,中断开销可能与您的一样大!
看看这个

于 2011-06-20T22:59:50.323 回答
0

从 PIC 上的中断中获得良好性能的关键是最小化所需的上下文保存/恢复代码的范围。在许多情况下,这意味着用机器代码编写中断处理程序的时间关键部分。在至少有一些可以专门用于中断使用的未分区寄存器的部分上(我真的不喜欢 Microchip 决定吞噬大部分或全部公共存储区用于 FSR2 寻址,而不是分配例如 15 个字节用于 FSR2 寻址,每个 7 个字节用于FSR0 和 FSR1 寻址,以及每个 FSR 的一个“魔术操作”寄存器 [我很乐意讨论这些事情的想法])有时可以在没有任何上下文保存/恢复的情况下度过难关在一般情况下。例如,在我的一个 14 位 PIC 项目中,我需要每 1000 个时钟周期产生一次中断。因此,在禁用 RTCC 预标量的情况下,我的中断类似于:

中断入口:
  bcf INTCON,TMR0IF
  decfsz int_counter,f
   回复
  movwf saveW
  movf 状态,w
  clrf 状态;银行 0
  movwf 保存状态
  movlw 4
  movwf int_counter
  movlw 1024+3-1000 ' TMR0 未调整时间,加上 3 'slip',减去所需时间
  addwf TMR0,f
  bsf INTCON,GIE ; 在这一点之后,中断可以安全地嵌套!
  ...其他中断的东西
  movf saveStat,w
  movwf 状态
  交换保存W
  改版;也可以使用 RETURN,因为启用了中断  

请注意,在 3/4 的情况下,中断将在执行总共三个指令后返回,从下面执行的任何代码总共需要大约 6 个周期。

于 2012-02-09T16:03:09.943 回答