Cで@を使用した変数宣言


11

私はいくつかのCコードを読んでいて、プログラムでこの宣言に遭遇しました:

unsigned char serv_ctr @0x0002;

Mplab XC8 v1.35 Cコンパイラで「@ 0x0002」が何のためにあるのか、誰かがドキュメントを教えてくれたり、説明してもらえますか?


14
変数を特定のアドレスに配置するのはコンパイラの拡張機能だと思います。
ユージンSh。

2
この質問は#mplabタグにとって有益な場合があります。これはMplab固有であることが判明したためです。
シルベヌルグ

ただそれを得るために:これはこのサイトのトピックにありますか?これはSOに属すると思います。または、ここでマイクロコントローラーのプログラミングを依頼しても構いません。これにより、この質問がどこにあるべきかが少し不明確になります。
さよならSE

6
@KamiKaze ここで質問できるトピックはありますか?「ベアメタルまたはRTOSアプリケーション用のファームウェアの作成」をトピックとして、「PC用ソフトウェアのプログラミング」をオフトピックとしてリストします。これは組み込みシステムのプログラミングに関するものであるように見えるため、一目で話題になっているように見えます。それはかもしれないことありませんスタックオーバーフローに関するトピックであること自体が、ここでオフトピックそれを作ります。
CVn

尋ねるため@KamiKazeおかげで、私は同様の質問(私はこのSEの通常のユーザーではないよ)いた
GPPK

回答:


20

これは、変数を配置する絶対アドレスを指定することです。XC8コンパイラマニュアル 27ページ、セクション2.5.2絶対アドレス

変数と関数は、__at()コンストラクトを使用して絶対アドレスに配置できます
......
2.5.2.2相違点
8ビットコンパイラは、@記号を使用して絶対アドレスを指定しました


6

@は、特定のアドレスで変数を宣言できるC言語の一般的な非標準拡張です。メモリマップドハードウェアレジスタなどに使用できます。この場合、変数も宣言する必要があるvolatileため、例は正しくありません。

他のコンパイラは次のようなものを使用する__attribute__(section...#pragma ...、それは非標準的なCの全て

ツールチェーンがこれを行う唯一の合理的な理由(ある場合)は、不正なデバッガーでレジスタデバッグを有効にすることです。非標準の構文により、レジスターはリンカー出力およびデバッグ情報の一部になります。これにより、他の変数を監視できるように、クラッピーデバッガでレジスタを監視できます。

優れたデバッガーがあれば、特定のMCUをサポートおよび認識できます。そうすれば、Cコードに非標準のがらくたは必要ありませんが、代わりに純粋で移植可能な標準Cを書くことができます。

#define serv_ctr ( *(volatile uint8_t*)0x0002u )

1
コンパイラは後者の形式を受け入れる必要がありますが、実装では、適切と思われる方法でアドレスに番号をマッピングできます。さらに、私が見たほとんどのコンパイラは@、複数のメモリ空間またはその他の問題を持つ表記法ターゲットプラットフォームを使用するため、@表記法を使用して宣言されたほとんどの動作は、拡張なしで実行できるものとは異なる動作をします。
supercat

1

短い拡張子:

これは、xc8 2.0以降では機能しなくなりました。あなたは今書く必要がありました:

unsigned char serv_ctr __at(0x0002);

変数(serv_ctr)を絶対アドレス(0x0002)に配置します。

XC8 2.0では、@「C90」形式を使用するようにコンパイラー設定を設定すると、構文を使用して古いコードをコンパイルできます。設定は次のようになります。「XC8 Global Options」の下にあり、「C standard」と呼ばれます。


@ただし、Mplabだけでなく、他の多くの組み込みシステムコンパイラも構文をサポートしています。
ランディン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.