如何使用avr-gcc将变量绑定到未使用的AVR I / O寄存器?

时间:2012-04-26 21:30:03

标签: avr avr-gcc

我想使用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寄存器执行此操作?

1 个答案:

答案 0 :(得分:2)

因为这仅适用于全局变量,所以只使用这样的东西,例如Uart波特率寄存器:

#define myGlobalVariable UBRR

另请注意,如果您正在进行大量的位测试,这种优化是值得的,因为大多数IO寄存器都有直接的位测试指令。哦,我忘了没有所有AVR都有LDS和STS指令,有些只通过Z寄存器访问SRAM,与简单的IN和OUT相比,这在代码大小和速度方面都有很大差异......