_GNU_,_attribute_和pragma扩展和指令的含义是什么?

时间:2014-08-30 06:38:16

标签: c

以下代码是什么意思

        #if _GNU_
        _attribute_((_naked_))
        #elif _ICCAVR32_
        #pragma shadow_registers = full
        #endif

这部分代码放在中断处理程序之前。任何人都可以解释这是什么意思。

1 个答案:

答案 0 :(得分:4)

通常,当您输入ISR时,编译器将保存所有寄存器,并在退出时恢复它们。 (例如,它可能会在ISR之前将它们推入堆栈,然后将它们弹出。)

如果ISR标记为裸,则不会生成此上下文保存代码。

在实际使用很少或没有寄存器的情况下节省了大量开销,但它通过将责任转移到程序员上来确保对上下文所做的任何修改都被撤消(通过手动保存和恢复)寄存器值)。

__attribute__((__naked__))是GCC引用的方式,#pragma shadow_registers = full在ICC编译器上实现了类似的结果。

the avr-gcc documentation中有一个相当不错的解释。


为了给你一个AVR环境中的例子,在芯片上运行看门狗定时器是很常见的。 看门狗定时器可以通过单个指令WDR重置,保证不会触及SREG

如果你重置了TIMER0_COMPA中断,那么我们有两个选择:

  • 裸中断只需要运行一条指令(WDR本身,忽略RETI等)
  • 正常的中断需要几十个(推送每个寄存器,重置看门狗,然后再次弹出每个寄存器)