我想使用avr-gcc将全局变量绑定到未使用的I / O寄存器(例如PORTB),以减小代码大小。我在AVR的应用笔记AVR035(第14页)中学到了这个技巧。
在应用笔记中,他们使用IAR编译器并将变量绑定到I / O寄存器,如下所示:
__no_init volatile uint8_t counter@0x35;
使用avr-gcc,我可以使用以下行将变量绑定到标准寄存器(在本例中为r3):
register uint8_t counter asm("r3");
但这对I / O寄存器不起作用。有没有办法为I / O寄存器执行此操作?
答案 0 :(得分:2)
因为这仅适用于全局变量,所以只使用这样的东西,例如Uart波特率寄存器:
#define myGlobalVariable UBRR
另请注意,如果您正在进行大量的位测试,这种优化是值得的,因为大多数IO寄存器都有直接的位测试指令。哦,我忘了没有所有AVR都有LDS和STS指令,有些只通过Z寄存器访问SRAM,与简单的IN和OUT相比,这在代码大小和速度方面都有很大差异......