gpt4 book ai didi

c - _GNU_、_attribute_ 和 pragma 扩展和指令的含义是什么

转载 作者:太空宇宙 更新时间:2023-11-04 01:29:23 25 4
gpt4 key购买 nike

下面的代码是什么意思

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

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

最佳答案

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

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

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

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

the avr-gcc documentation 中对此有相当好的解释.


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

如果您在 TIMER0_COMPA 中断中重置它,那么我们有两个选择:

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

关于c - _GNU_、_attribute_ 和 pragma 扩展和指令的含义是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25579733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com