C _GNU_、_attribute_以及pragma扩展和指令的含义是什么

C _GNU_、_attribute_以及pragma扩展和指令的含义是什么,c,C,以下代码的含义是什么 #if _GNU_ _attribute_((_naked_)) #elif _ICCAVR32_ #pragma shadow_registers = full #endif 这部分代码放在中断处理程序之前。谁能解释一下这是什么意思。通常,当您输入ISR时,编译器将保存所有寄存器,并在退出时恢复它们。 (例如,它可能会在ISR之前将它们推到堆栈上,然后将它们弹出。) 如果ISR标记为裸,则不

以下代码的含义是什么

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

这部分代码放在中断处理程序之前。谁能解释一下这是什么意思。

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

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

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

\uuuuu attribute\uuuuu((\ uuuuu裸_uuuu))
是GCC如何引用的,并且
\pragma shadow\u registers=full
在ICC编译器上实现了类似的结果

关于这一点,有一个相当好的解释


举一个AVR环境中的例子,在芯片上运行看门狗定时器是很常见的。 看门狗定时器可以通过一条指令复位,
WDR
,该指令保证不会触碰
SREG

如果您在
定时器0\u COMPA
中断中重置此项,则我们有两个选项:

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

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

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

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

\uuuuu attribute\uuuuu((\ uuuuu裸_uuuu))
是GCC如何引用的,并且
\pragma shadow\u registers=full
在ICC编译器上实现了类似的结果

关于这一点,有一个相当好的解释


举一个AVR环境中的例子,在芯片上运行看门狗定时器是很常见的。 看门狗定时器可以通过一条指令复位,
WDR
,该指令保证不会触碰
SREG

如果您在
定时器0\u COMPA
中断中重置此项,则我们有两个选项:

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