1
的含義是什麼下面的代碼是什麼_GNU_,_attribute_和編譯擴展和指令
#if _GNU_
_attribute_((_naked_))
#elif _ICCAVR32_
#pragma shadow_registers = full
#endif
這部分代碼的含義被放置在中斷處理程序之前。任何人都可以解釋這是什麼意思。
的含義是什麼下面的代碼是什麼_GNU_,_attribute_和編譯擴展和指令
#if _GNU_
_attribute_((_naked_))
#elif _ICCAVR32_
#pragma shadow_registers = full
#endif
這部分代碼的含義被放置在中斷處理程序之前。任何人都可以解釋這是什麼意思。
通常,當你輸入一個ISR時,編譯器會保存所有的寄存器,並在退出時恢復它們。 (例如,它可能會在ISR之前將它們推到堆棧上,然後將它們彈出)。
如果ISR被標記爲裸露,則不會生成此上下文保存代碼。
這樣可以在實際使用的寄存器很少或沒有實際使用的情況下節省大量開銷,但它通過將責任轉移到編程器上來確保對上下文進行的任何修改都被撤消(通過手動保存和恢復的寄存器值)。
__attribute__((__naked__))
是GCC如何引用這個,並且#pragma shadow_registers = full
在ICC編譯器上獲得了類似的結果。
在中有相當好的解釋。
爲了給你一個在AVR上下文中的例子,在芯片上運行看門狗定時器是相當普遍的。 看門狗定時器可以通過單指令WDR
進行復位,該指令保證不會觸及3210。
如果重置此在,比方說,TIMER0_COMPA
中斷,那麼我們有兩種選擇:
WDR
本身,忽略RETI
等)