【问题标题】:UART receive Interrupt enabled but with no ISR?UART 接收中断已启用但没有 ISR?
【发布时间】:2014-12-14 10:21:38
【问题描述】:

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

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

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

【问题讨论】:

  • 取决于随特定 MCU 提供的 BSP。它没有标准化的定义,但默认情况下,所有中断通常都连接到硬故障 ISR。为什么不直接查看 IV 代码并找出答案?
  • 您的问题的答案将取决于硬件。你有一个特定的控制器吗?
  • @PeterM:我认为更准确的说法是,它取决于随硬件提供的 SDK。
  • @barakmanos 8051 的 ISR 架构与 68000 的架构非常不同,没有 SDK 会改变这一点。

标签: c microcontroller interrupt


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这是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; 不能清除您的问题,则问题可能出在其他地方。

    否则,添加中断代码。如果你使用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)
    {
    
    }
    

    使用 microchip 的 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()
      {
        ...
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-11
      • 2018-10-04
      • 1970-01-01
      相关资源
      最近更新 更多