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 に答える