3

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

4

1 回答 1

2

由于这仅适用于全局变量,因此仅使用类似这样的东西怎么样,例如 Uart 波特率寄存器:

#define myGlobalVariable UBRR

另请注意,仅当您进行大量位测试时,此优化才值得,因为大多数 IO 寄存器都有直接位测试指令。哦,我忘记了不是所有的 AVR 都有 LDS 和 STS 指令以及一些仅通过 Z 寄存器访问 SRAM,与简单的 IN 和 OUT 相比,这在代码大小和速度上都有很大的不同......

于 2012-04-30T12:58:44.740 回答