2013-04-11 10 views
25

このPICマイクロコントローラのヘッダーファイルはpic1250.hという名前で見つかりましたが、使用されている構文のハングアップを得ることができません。@ sign in C変数宣言

ファイルのソースは次のとおりです。私は全体の修飾子・データ型@宣言-何かを理解することができないんだ

/* 
* Header file for the Microchip 
* PIC 12c508 chip 
* PIC 12c509 chip 
* Baseline Microcontrollers 
*/ 

static volatile unsigned char RTCC @ 0x01; 
static volatile unsigned char TMR0 @ 0x01; 
static volatile unsigned char PCL @ 0x02; 
static volatile unsigned char STATUS @ 0x03; 
static   unsigned char FSR @ 0x04; 
static volatile unsigned char OSCCAL @ 0x05; 
static volatile unsigned char GPIO @ 0x06; 

static   unsigned char control OPTION @ 0x00; 
static volatile unsigned char control TRIS @ 0x06; 

/* STATUS bits */ 
static bit GPWUF @ (unsigned)&STATUS*8+7; 
static bit PA0 @ (unsigned)&STATUS*8+5; 
static bit TO @ (unsigned)&STATUS*8+4; 
static bit PD @ (unsigned)&STATUS*8+3; 
static bit ZERO @ (unsigned)&STATUS*8+2; 
static bit DC @ (unsigned)&STATUS*8+1; 
static bit CARRY @ (unsigned)&STATUS*8+0; 

/* OPTION bits */ 
#define  GPWU (1<<7) 
#define  GPPU (1<<6) 
#define  T0CS (1<<5) 
#define  T0SE (1<<4) 
#define  PSA (1<<3) 
#define  PS2 (1<<2) 
#define  PS1 (1<<1) 
#define  PS0 (1<<0) 

/* OSCCAL bits */ 
static bit CAL7 @ (unsigned)&OSCCAL*8+7; 
static bit CAL6 @ (unsigned)&OSCCAL*8+6; 
static bit CAL5 @ (unsigned)&OSCCAL*8+5; 
static bit CAL4 @ (unsigned)&OSCCAL*8+4; 

/* GPIO bits */ 
static bit GP5 @ (unsigned)&GPIO*8+5; 
static bit GP4 @ (unsigned)&GPIO*8+4; 
static bit GP3 @ (unsigned)&GPIO*8+3; 
static bit GP2 @ (unsigned)&GPIO*8+2; 
static bit GP1 @ (unsigned)&GPIO*8+1; 
static bit GP0 @ (unsigned)&GPIO*8+0; 

#define CONFIG_ADDR 0xFFF 
#define FOSC0  0x01 
#define FOSC1  0x02 
#define WDTE  0x04 
#define CP  0x08 
#define MCLRE  0x0F 

。誰かが私を助けてくれますか?私はこれでちょうど初心者です。

+0

どのコンパイラを使用していますか? – FatalError

+13

標準ではありません。 '@'は実行文字セットの一部ではありません(Cが作成された時点ではまだASCIIに追加されていませんでした)。 –

+1

これはメモリアドレスにエイリアスを割り当てるのと同じようなものです。 –

答えて

37

これはコンパイラ拡張です。 PIC MPLAB XC8コンパイラーのドキュメント(強調鉱山)から

ほとんどの変数は 構築物@アドレスと、その宣言に従うことによって、絶対アドレスに配置することができ

5.5.4絶対変数ここで、addressは、 変数が配置されるメモリ内の場所です。このような変数は、絶対変数として知られています。データメモリに

5.5.4.1 ABSOLUTE変数は

絶対変数は、主 特殊機能レジスタとC識別子のアドレスを等しくするために意図されているが、絶対 アドレス内で通常の変数を配置するために使用することができますデータメモリ。例えば

:0x06で@

揮発性unsigned char型のPortvar。

は、データメモリに06hに位置するPortvarという変数を宣言します。コンパイラ はこのオブジェクトの記憶域を予約し(アドレスが汎用RAMに入る場合)、 はその変数の識別子をそのアドレスと同じにします。

MPLAB XC8は、同じ@構造を持つ特定のメモリ位置にオブジェクトを配置する唯一のコンパイラではありません。

もう1つのよく知られたコンパイラは、Freescale CodeWarriorです(少なくともHCS08の場合)。

もう1つはIAR Cコンパイラです(少なくともMSP430とAVRの場合)。

+0

+この素敵な答えをもたらす努力のため –

+0

ドキュメントの参照とあなたの答えのおかげで –

22

これは、特定のメモリ位置に変数を配置するためのPICコンパイラの拡張です。私が知っている他のコンパイラはその拡張機能を持っていません

+0

変数を特定のメモリに配置すると便利です。それは低レベル言語のようではありませんか? –

+11

ハードウェア、特にマイクロコントローラや埋め込み物などで直接作業する場合、特定のアドレスに物を置くことは*非常に便利です。システムは特定のアドレスを読み書きすることができます(この場合、これらのステータスビットはおそらくハードウェア入力に由来します)。 – ssube

+1

@GrijeshChauhanどのようにCPUが編成されているかを詳しく見てください。それらの中には、あらかじめ定義されたメモリ位置に特別なレジスタがあります。はい、メモリアドレス空間に登録します。質問にあなたが見ているのはそれを反映しています。 –

9

PICコンパイラでサポートされているC言語拡張で、変数を特定のRAMアドレスに割り当てることができます。

exemples:

  • あなたは、多くの場合、非常に少ないメモリを持っており、同じバイトに複数の変数をパックする必要が組み込みシステムでは:

    char a @ 0x25; /* place A at address 0x25 */ 
    bit b @ 0x25.3; /* place B at the third bit of address 0x25 */ 
    

    このための3つの用途があります。標準のbit field も有効ですが、この構文により簡単になります。

  • もう1つの理由は、PICレジスタがRAMにマップされているため、他のメモリの場所と同じようにPICレジスタにアクセスできます。この構文を使用すると、関心のあるビットのシノニムを定義し、通常の変数のように使用することができます。
  • サイズに関係なく、特定の場所に変数を設定します。これは時には便利です。

埋め込みプログラミングはすべて、ハードウェアの完全な制御に関することです。

+0

+&歓迎、もう一つの素敵な答え..私のための参照リンクを追加することができます –

+0

実際まあ、ヘッダがビットフィールドを使わなかったのは私がほとんど気づいていなかったその構文ではないかと思っていました。 –

+1

@AviGabhawala:この場合、変数はメモリマップされたレジスタとオーバーラップするため(メモリの先頭にあります)したがって、特定の場所を設定する能力が不可欠です。ビットフィールドでは、それを行うことはできません。 –

6

非標準の@演算子は余分な機能であることに注意してください。あなたは正確に標準Cと同じ動作を達成することができます

#define RTCC (*(volatile uint8_t*)0x0001u) 

この場合の変数は、ハードウェア・レジスタであるため、あなたは割り当てを心配する必要はありませんが、彼らはすでに、ハードウェアに存在しています。カスタムアドレスに変数を割り当てる場合は、@演算子はコードではなく変数の特定の割り当てのみを解決するため、これを修正するためのリンカファイルが必要です。

多くの組み込みコンパイラが@のようないくつかの非標準演算子を思いつく主な理由は、デバッガを設計するときにボックス外で考えることができないためです。彼らはデバッガに供給されるオブジェクトファイルに何らかの変数が存在することを期待していますが、#defineを使用するとそのような "デバッグ情報オブジェクト"は割り当てられません。

代わりにデバッガがソースコードを参照するか、MCU認識機能を組み込んだ方がよい場合は、このような非標準コードは必要ありません。デバッガだけに焦点を当てた企業の高品質ツールには、常にレジスタマップを表示するためのビルトインサポートが付属しています。