以下代码是什么意思
#if _GNU_
_attribute_((_naked_))
#elif _ICCAVR32_
#pragma shadow_registers = full
#endif
这部分代码放在中断处理程序之前。任何人都可以解释这是什么意思。
答案 0 :(得分:4)
通常,当您输入ISR时,编译器将保存所有寄存器,并在退出时恢复它们。 (例如,它可能会在ISR之前将它们推入堆栈,然后将它们弹出。)
如果ISR标记为裸,则不会生成此上下文保存代码。
在实际使用很少或没有寄存器的情况下节省了大量开销,但它通过将责任转移到程序员上来确保对上下文所做的任何修改都被撤消(通过手动保存和恢复)寄存器值)。
__attribute__((__naked__))
是GCC引用的方式,#pragma shadow_registers = full
在ICC编译器上实现了类似的结果。
在the avr-gcc documentation中有一个相当不错的解释。
为了给你一个AVR环境中的例子,在芯片上运行看门狗定时器是很常见的。
看门狗定时器可以通过单个指令WDR
重置,保证不会触及SREG
。
如果你重置了TIMER0_COMPA
中断,那么我们有两个选择:
WDR
本身,忽略RETI
等)