1
// Register: BAUDCTL
  extern volatile unsigned char           BAUDCTL             @ 0x09B;
  #ifndef _LIB_BUILD
 asm("BAUDCTL equ 09Bh");
  #endif

@記号は何ですか?アドレス 0x09B でキャッシュ不可の unsigned char を定義するということですか? では、なぜアセンブリで asm 関数が必要なのですか?

4

2 に答える 2

5

これはコンパイラの拡張機能であり、標準 C の一部ではありません。変数を address に配置します0x09b。これは、組み込みプラットフォーム用のコンパイラの小さなサブセットでのみ使用され、ハードウェア レジスタの変数を持つことが一般的です。


これを行うためのもう 1 つの一般的な手法は、宣言でサポートされていない@(つまり、より標準に準拠している) コンパイラでのポインターの使用です。それは次のようになります

volatile unsigned char *BAUDCTL = (unsigned char *) 0x09b;

これの欠点は、ボー制御レジスタがメモリ内の 2 つの場所を占有することです。1 つは実際のハードウェア レジスタ用で、もう 1 つはポインタ変数用です。もう 1 つの欠点は、ポインター逆参照演算子を使用してレジスターにアクセスする必要があることです。

于 2013-06-25T01:08:57.923 に答える
2

これは標準の C ではなく、何らかの形の拡張であるため、その意味は実装によって異なります。ただし、あなたが正しい可能性が非常に高いと思います。基本的には、キャラクターが住所にいると述べています0x9b

これは通常、組み込みシステムでメモリ マップド I/O が行われる方法です。

ビットの必要性に関してはasm、これも仮定です (十分に教育されていますが):コードexternの BAUDCTL を適切に定義することができますが、後のブロックC内でも使用したい場合は、アセンブラー定義が必要になる場合があります。ブロックasm内から C の定義に到達する簡単な方法がない可能性があります。asm

于 2013-06-25T01:10:47.150 に答える