10

私は組み込みシステムプログラミングに不慣れです。私は8051チップセットを使用するデバイスに取り組んでいます。サンプルプログラムで、変数を定義するときに、キーワードxdataを使用することがあることに気づきました。このような...

static unsigned char xdata PatternSize;

xdataキーワードが省略されている場合もあります。

私の理解では、xdataキーワードは、その変数が外部、フラッシュ、メモリに格納されることをコンパイラに指示します。

どのような場合に変数をxdataで外部に保存する必要がありますか?これらの変数へのアクセスには時間がかかりますよね?xdataを使用して保存された値は、デバイスのハードリセット後に残りませんか?

また、staticキーワードは、変数が定義されている関数を呼び出すたびに変数が存続することを意味することを理解しています。staticとxdataを一緒に使用する必要がありますか?

4

5 に答える 5

9

8051アーキテクチャには3つの個別のアドレス空間があり、コアRAMは8ビットアドレスを使用するため、最大256バイト、XDATAは読み取り/書き込み機能を備えた16ビットアドレス空間(64Kバイト)、プログラム空間は16ビットアドレス空間です。実行および読み取り専用データ機能を備えています。アドレス範囲が狭く、コアと密接に結合しているため、コアRAMのアドレス指定は、コードスペースとアクセスサイクルの点でより効率的です。

元の8051コアには小さなオンチップRAM(256バイトのアドレス空間がありましたが、一部のバリアントは実際のメモリの半分でした)があり、XDATAは(プログラムメモリではなく)オフチップデータメモリを参照していました。ただし、最新の8051アーキテクチャデバイスのほとんどは、オンチップXDATAとプログラムメモリを備えています。

したがって、パフォーマンスが重要な場合はコアメモリを使用し、より大きなメモリオブジェクトにはXDATAを使用する場合があります。ただし、ほとんどの場合、コンパイラがこの決定を行う必要があります(コンパイラのマニュアルを確認してください。メモリの割り当て方法が詳しく説明されています)。命令セットを使用すると、スタックをコアメモリに効率的に実装できますが、静的および動的に割り当てられたデータは、通常、XDATAでより適切に割り当てられます。コンパイラにXDATAキーワードがある場合、それはコンパイラの戦略を上書きし、コードの移植性を低下させるため、コンパイラの戦略が何らかの理由で失敗した場合にのみ使用する必要があります。

[編集]コアメモリには32バイトのビットアドレス指定可能な領域が含まれていることにも注意してください。ビットアドレス指定命令は、この領域への8ビットアドレスを使用して個々のビットに直接アクセスします。この領域は256バイトのバイトアドレス指定可能なコアメモリ内に存在するため、ビットアドレスとバイトアドレス指定の両方が可能です[/ edit]

于 2010-01-13T20:28:42.480 に答える
6

xdataは、データが外部RAMに格納されていることをコンパイラに通知するため、内部RAMではなく別の命令を使用してそのメモリを読み書きする必要があります。

外部データへのアクセスには時間がかかります。私は通常、割り込み変数を内部RAMに配置し、ほとんどの大きな配列を外部RAMに配置します。

ハードリセット後の外部RAMの状態(電源の入れ直しではない)について:ハードウェアの設定によって異なります。リセットラインは外部チップに接続されていますか?また、一部のチップには、CPUチップ内にXDATAが付属しています。もう一度お読みください。一部のチップには、8051CPUとIC内にある程度のXDATAがあります。

staticとxdataは重複しません。Staticは、変数を(スタック上またはメモリ位置で)割り当てる方法をコンパイラに指示します。Xdataは、その変数に到達する方法をコンパイラーに指示します。Staticは、その変数の名前空間をそのファイルだけに制限することもできます。関数だけにローカルなxdata静的変数と、関数にローカルであるが内部RAMを使用する静的変数を持つことができます。

于 2010-01-11T20:29:46.993 に答える
3

まだ言及されていない重要な点は、異なるメモリ領域にアクセスするために異なる命令が使用されるため、ハードウェアには「ポインタ」の統一された概念がないということです。DATA / IDATAスペースにあることがわかっているアドレスは、1バイトのポインターで一意に識別できます。同様に、PDATAスペースにあることがわかっているアドレス。CODEスペースにあることがわかっているアドレスは、2バイトのポインターで識別できます。同様に、XDATAスペースにあることがわかっているアドレス。しかし、多くの場合、memcpy渡されたポインタでどのメモリ空間を使用すべきかを事前に知りません。これに対応するために、8x51コンパイラは通常3バイトのポインタ型を使用します。これは任意のメモリ空間にあるものにアクセスするために使用できます(1バイトはポインタで使用する命令の種類を選択し、他のバイトは値を保持します)。次のようなポインタ宣言:

char *ptr;

任意のメモリスペースを指すことができる3バイトのポインタを定義します。宣言をに変更する

char xdata *data ptr;

DATAスペースに格納されているが、XDATAスペース内のもののみを指すことができる2バイトのポインターを定義します。同じく

char data * data ptr;

DATAスペースに格納される2バイトのポインターを定義しますが、これはDATAおよびIDATAスペース内のもののみを指すことができます。既知のデータスペースを指すポインターを使用するコードは、「汎用」の3バイトポインターを使用するコードよりもはるかに高速です(おそらく10倍)。

于 2013-06-05T22:02:51.710 に答える
1

8051には、(ほとんどの)コンパイラが宣言された変数のデフォルトとして使用する128バイト範囲のスクラッチパッド「疑似レジスタ」があります。ただし、明らかにこの領域は非常に小さいため、16ビットのメモリアドレス空間にも変数を配置できるようにする必要があります。これが、xdata(つまり「外部データ」)指定子の目的です。何をどこに置くかは、明らかに、データが何であるか、そしてそれをどのように使用するかによって異なります。

基本的に、これは間違った質問だと思います。Cコンパイラの8051固有の機能の使用方法を学ぶ前に、まずCPUアーキテクチャを理解する必要があります。

于 2010-01-11T19:43:48.243 に答える
1

xDataメモリ領域をいつどのように使用するかは、システムアーキテクチャによって異なります。一部のシステムはこのアドレスにRAMを搭載している場合がありますが、他のシステムはROMまたはフラッシュを搭載している場合があります。いずれの場合も、アクセスは内部RAM、ROM、またはフラッシュにアクセスするよりも遅くなります。

一般的に、大きなアイテム、一定のアイテム、および使用頻度の低いアイテムはxDataに入れる必要があります。アーキテクチャに依存するため、xDataに何を入れるかについての標準的なルールはありません。

于 2010-01-11T19:29:35.943 に答える