我很好奇,如果中断已启用但我们没有为它编写ISR。 然后,如果该中断到来,代码流会发生什么(例如:UART接收中断)。
任何特定中断向量的中断向量表中的默认值是什么。
我的假设: 当中断到来时,代码将跳转到中断向量表,因为没有跳转到ISR的指令(因为我们没有写入ISR)。因此,程序计数器将停留在那里。
答案 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()
{
...
}