C UART接收中断已启用,但没有ISR?

C UART接收中断已启用,但没有ISR?,c,microcontroller,interrupt,C,Microcontroller,Interrupt,我很好奇,如果一个中断被启用,但我们还没有为它编写ISR。 然后,如果中断出现,代码流会发生什么变化(例如:UART接收中断) 中断向量表中任何特定中断向量的默认值是多少 我的假设: 当中断到来时,代码将跳转到中断向量表,因为没有跳转指令到ISR(因为我们没有编写ISR)。因此,程序计数器将卡在那里。这里是一个;9.0中断,第101页: 高度优先 中断向量为000008小时且优先级较低 中断向量为000018h 以下是一些控制UART中断的寄存器: IPR1bits.RCIP=1; //prio

我很好奇,如果一个中断被启用,但我们还没有为它编写ISR。 然后,如果中断出现,代码流会发生什么变化(例如:UART接收中断)

中断向量表中任何特定中断向量的默认值是多少

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

这里是一个;9.0中断,第101页:

高度优先 中断向量为000008小时且优先级较低 中断向量为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无法清除您的问题,问题可能在其他地方

否则,添加一个中断代码。如果使用microchip的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()
  {
    ...
  }

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


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

取决于随特定MCU提供的BSP。没有标准化的定义,但默认情况下,所有中断通常都连接到硬故障ISR。你为什么不研究一下IV代码并找出答案呢?这个问题的答案取决于硬件。您是否考虑了一个特定的控制器?@PeterM:我想更准确地说,它取决于硬件附带的SDK。@barakmanos 8051的ISR体系结构与68000的ISR体系结构非常不同,没有SDK会改变这一点。