私はいくつかのCコードを読んでいて、プログラムでこの宣言に遭遇しました:
unsigned char serv_ctr @0x0002;
Mplab XC8 v1.35 Cコンパイラで「@ 0x0002」が何のためにあるのか、誰かがドキュメントを教えてくれたり、説明してもらえますか?
私はいくつかのCコードを読んでいて、プログラムでこの宣言に遭遇しました:
unsigned char serv_ctr @0x0002;
Mplab XC8 v1.35 Cコンパイラで「@ 0x0002」が何のためにあるのか、誰かがドキュメントを教えてくれたり、説明してもらえますか?
回答:
これは、変数を配置する絶対アドレスを指定することです。XC8コンパイラマニュアル 27ページ、セクション2.5.2絶対アドレス:
変数と関数は、
__at()
コンストラクトを使用して絶対アドレスに配置できます
......
2.5.2.2相違点
8ビットコンパイラは、@記号を使用して絶対アドレスを指定しました
@
は、特定のアドレスで変数を宣言できるC言語の一般的な非標準拡張です。メモリマップドハードウェアレジスタなどに使用できます。この場合、変数も宣言する必要があるvolatile
ため、例は正しくありません。
他のコンパイラは次のようなものを使用する__attribute__(section...
か#pragma ...
、それは非標準的なCの全て
ツールチェーンがこれを行う唯一の合理的な理由(ある場合)は、不正なデバッガーでレジスタデバッグを有効にすることです。非標準の構文により、レジスターはリンカー出力およびデバッグ情報の一部になります。これにより、他の変数を監視できるように、クラッピーデバッガでレジスタを監視できます。
優れたデバッガーがあれば、特定のMCUをサポートおよび認識できます。そうすれば、Cコードに非標準のがらくたは必要ありませんが、代わりに純粋で移植可能な標準Cを書くことができます。
#define serv_ctr ( *(volatile uint8_t*)0x0002u )
@
、複数のメモリ空間またはその他の問題を持つ表記法ターゲットプラットフォームを使用するため、@
表記法を使用して宣言されたほとんどの動作は、拡張なしで実行できるものとは異なる動作をします。
短い拡張子:
これは、xc8 2.0以降では機能しなくなりました。あなたは今書く必要がありました:
unsigned char serv_ctr __at(0x0002);
変数(serv_ctr
)を絶対アドレス(0x0002
)に配置します。
XC8 2.0では、@
「C90」形式を使用するようにコンパイラー設定を設定すると、構文を使用して古いコードをコンパイルできます。設定は次のようになります。「XC8 Global Options」の下にあり、「C standard」と呼ばれます。
@
ただし、Mplabだけでなく、他の多くの組み込みシステムコンパイラも構文をサポートしています。