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