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
- 一个正常的中断需要几十个(按下每个寄存器,重置看门狗,然后再次弹出每个寄存器)
\uuuuu attribute\uuuuu((\ uuuuu裸_uuuu))
是GCC如何引用的,并且\pragma shadow\u registers=full
在ICC编译器上实现了类似的结果
关于这一点,有一个相当好的解释
举一个AVR环境中的例子,在芯片上运行看门狗定时器是很常见的。 看门狗定时器可以通过一条指令复位,
WDR
,该指令保证不会触碰SREG
如果您在定时器0\u COMPA
中断中重置此项,则我们有两个选项:
- 裸中断只需运行一条指令(
本身,忽略WDR
等)RETI
- 一个正常的中断需要几十个(按下每个寄存器,重置看门狗,然后再次弹出每个寄存器)