我有一些简单的 C++ 程序,如果使用 g++ 编译,它会生成以下汇编文本。唯一的说法是sbi
,这不会影响任何状态标志。我想知道为什么 G++ 会产生这些无用的推送/弹出r0
and r1
?
.global __vector_14
.type __vector_14, @function
__vector_14:
push r1 ;
push r0 ;
in r0,__SREG__ ; ,
push r0 ;
clr __zero_reg__ ;
/* prologue: Signal */
/* frame size = 0 */
/* stack size = 3 */
.L__stack_usage = 3
sbi 0x1e,0 ; ,
/* epilogue start */
pop r0 ;
out __SREG__,r0 ; ,
pop r0 ;
pop r1 ;
reti
.size __vector_14, .-__vector_14
有没有办法让 g++ 自动忽略这些寄存器保存。我不想将 ISR 声明为ISR_NAKED
一般来说。
编辑:
这是相应的 C++ 代码(-Os 或 -O3):
#include <avr/interrupt.h>
struct AppFlags final {
bool expired : 1;
} __attribute__((packed));
int main() {
}
ISR(TIMER0_COMPA_vect) {
auto f = reinterpret_cast<volatile AppFlags*>(0x3e);
f->expired = true;
}
原因是您使用的是过时的编译器。这提到的优化 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81268已在 v8 中添加(2018 年春季发布),请参阅GCC v8 发行说明 https://gcc.gnu.org/gcc-8/changes.html#avr:
编译器现在可以生成高效的中断服务例程 (ISR) 序言和尾声。这是通过使用新的AVR伪指令 https://sourceware.org/binutils/docs-2.29/as/AVR-Pseudo-Instructions.html__gcc_isr 由 GNU 汇编器支持和解析。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)