// Register: BAUDCTL
extern volatile unsigned char BAUDCTL @ 0x09B;
#ifndef _LIB_BUILD
asm("BAUDCTL equ 09Bh");
#endif
@記号は何ですか?アドレス 0x09B でキャッシュ不可の unsigned char を定義するということですか? では、なぜアセンブリで asm 関数が必要なのですか?
// Register: BAUDCTL
extern volatile unsigned char BAUDCTL @ 0x09B;
#ifndef _LIB_BUILD
asm("BAUDCTL equ 09Bh");
#endif
@記号は何ですか?アドレス 0x09B でキャッシュ不可の unsigned char を定義するということですか? では、なぜアセンブリで asm 関数が必要なのですか?
これはコンパイラの拡張機能であり、標準 C の一部ではありません。変数を address に配置します0x09b
。これは、組み込みプラットフォーム用のコンパイラの小さなサブセットでのみ使用され、ハードウェア レジスタの変数を持つことが一般的です。
これを行うためのもう 1 つの一般的な手法は、宣言でサポートされていない@
(つまり、より標準に準拠している) コンパイラでのポインターの使用です。それは次のようになります
volatile unsigned char *BAUDCTL = (unsigned char *) 0x09b;
これの欠点は、ボー制御レジスタがメモリ内の 2 つの場所を占有することです。1 つは実際のハードウェア レジスタ用で、もう 1 つはポインタ変数用です。もう 1 つの欠点は、ポインター逆参照演算子を使用してレジスターにアクセスする必要があることです。
これは標準の C ではなく、何らかの形の拡張であるため、その意味は実装によって異なります。ただし、あなたが正しい可能性が非常に高いと思います。基本的には、キャラクターが住所にいると述べています0x9b
。
これは通常、組み込みシステムでメモリ マップド I/O が行われる方法です。
ビットの必要性に関してはasm
、これも仮定です (十分に教育されていますが):コードextern
の BAUDCTL を適切に定義することができますが、後のブロックC
内でも使用したい場合は、アセンブラー定義が必要になる場合があります。ブロックasm
内から C の定義に到達する簡単な方法がない可能性があります。asm