2014-08-30 21 views

回答

4

通常,當你輸入一個ISR時,編譯器會保存所有的寄存器,並在退出時恢復它們。 (例如,它可能會在ISR之前將它們推到堆棧上,然後將它們彈出)。

如果ISR被標記爲裸露,則不會生成此上下文保存代碼。

這樣可以在實際使用的寄存器很少或沒有實際使用的情況下節省大量開銷,但它通過將責任轉移到編程器上來確保對上下文進行的任何修改都被撤消(通過手動保存和恢復的寄存器值)。

__attribute__((__naked__))是GCC如何引用這個,並且#pragma shadow_registers = full在ICC編譯器上獲得了類似的結果。

在中有相當好的解釋。


爲了給你一個在AVR上下文中的例子,在芯片上運行看門狗定時器是相當普遍的。 看門狗定時器可以通過單指令WDR進行復位,該指令保證不會觸及​​3210。

如果重置此在,比方說,TIMER0_COMPA中斷,那麼我們有兩種選擇:

  • 赤裸裸的中斷需要只運行一個指令(WDR本身,忽略RETI等)
  • 正常中斷將需要幾十(推動每個寄存器,重置看門狗,然後再次彈出每個寄存器)