UART接收中断但没有ISR?

时间:2014-12-14 10:21:39

标签: c microcontroller interrupt

我很好奇,如果中断已启用但我们没有为它编写ISR。 然后,如果该中断到来,代码流会发生什么(例如:UART接收中断)。

任何特定中断向量的中断向量表中的默认值是什么。

我的假设: 当中断到来时,代码将跳转到中断向量表,因为没有跳转到ISR的指令(因为我们没有写入ISR)。因此,程序计数器将停留在那里。

2 个答案:

答案 0 :(得分:2)

我认为可能有不同的实现,但至少x86实模式中断表只保存地址,而不是指令。因此,如果在设置有效地址和中断到达之前启用中断 - CPU将跳转到中断表中的任何地址。

如果info here正确 - ARM中断表保持指令而不是地址。我会假设ARM执行它在此表中找到的任何指令,但我没有经验确定。

答案 1 :(得分:0)

以下是18f4550's datasheet的摘要; 9.0中断,第101页:

  

高优先级   中断向量位于000008h且为低优先级   中断向量位于000018h。

这里有一些寄存器控制UART的中断:

IPR1bits.RCIP=1; //priority of UART interrupt :1==high
PIR1bits.RCIF=0;//erase interruption flag if set
PIE1bits.RCIE=1;//enable interrupt on UART reception

如果设置PIR1bits.RCIF=0;PIE1bits.RCIE=0;无法清除您的问题,则问题可能出在其他地方。

否则,添加中断代码。如果您使用微芯片的XC8编译器,它看起来像:

//on high priority interrupt, going here
void interrupt high_isr (void)
{
    if(PIR1bits.RCIF){ //receiving something, UART
        //reading...
        c=getcUSART ();
        //doing someting...
        ...
        PIR1bits.RCIF=0; //clearing interrupt flag, UART
    }
}

//on low priority interrupt, going here
void interrupt low_priority low_isr (void)
{

}

微芯片的编译器C18稍微有些棘手:

void YourHighPriorityISRCode();
void YourLowPriorityISRCode();

#pragma code high_vector=0x08
void interrupt_at_high_vector(void)
{
  _asm GOTO YourHighPriorityISRCode _endasm
}

#pragma code low_vector=0x18
void interrupt_at_low_vector(void)
{
  _asm GOTO YourLowPriorityISRCode _endasm
}

#pragma interrupt YourHighPriorityISRCode
  void YourHighPriorityISRCode()
  {
    ...
  }

#pragma interruptlow YourLowPriorityISRCode
  void YourLowPriorityISRCode()
  {
    ...
  }