1

この命令でプロセッサの拡張ヘッダー構成を学習しようとしていますhttp://41j.com/blog/2011/09/beagleboard-gpio-input-driverless/

理解できない部分があります

volatile ulong *pinconf;
pinconf = (ulong*) mmap(NULL, 0x10000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0x48000000);
pinconf[0x2168/4] = 0x001C001C;

pinconfアレイがどのように機能するかを誰かが説明できますか?それはどのような価値を保存しますか?

編集:私が本当に何をpinconf[0x2168/4]意味するのか理解できなかったこと。それは16進配列であり、それはどのような値を参照していますか?

4

4 に答える 4

2

pinconf はメモリ マップされたファイル/デバイスです。リンクされたコードを見ると、fd は新しく開いた /dev/mem の記述子です。したがって、pinconf 配列に書き込むものは、実際には、配列で使用するオフセットにある /dev/mem に直接書き込むことになります。これが、このコードがGPIOハードウェアと「話している」方法だと思います。GPIO デバイスのメモリ マップがないと、書き込まれているアドレスで何が起こっているのかを知るのは困難です。

/ dev/memとは何かを確認してください。

そして、これが(一種の)行っているメモリマップI/Oについて読んでください。http://www.kernel.org/doc/htmldocs/uio-howto.html#userspace_driver

于 2012-11-15T13:18:18.880 に答える
2

私は元のブログ/コードの作成者です。ここに私が意味するものがあります:

あなたの要点に答えるために、pinconf[0x2168/4] はアドレス 0x48002168 を参照します。pinconf 配列は、アドレス 0x48000000 から始まります。ulong [1] として定義されており、ARM プロセッサでは 4 バイトです。アドレス pinconf+0x2168 にアクセスしたいことはわかっています。アドレス 0x2168 を pinconf のインデックスに変換するには、4 で割る必要があります。


最初からコードを見ていきます。

volatile ulong *pinconf;

pinconf は ulong (32 ビット int) ポインターとして定義されます。揮発性として定義されています。これは、コードの外部にある何かがその値を変更する可能性があることを意味します。その値を使用するたびにメモリから読み取る必要があることをコンパイラーに伝えます。これにより、コンパイラーは物事を台無しにする可能性のある巧妙な最適化を停止します。

pinconf = (ulong*) mmap(NULL, 0x10000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0x48000000);

これにより、pinconf がアドレス 0x48000000 を指すように設定されます。通常、次のようなことができます。

pinconf = (ulong*) 0x48000000;

pinconf がアドレスを指すようにしますが、これは機能しません。0x48000000 は保護されたアドレスで、カーネルからのみアクセスできます。mmap マジックは、ユーザー空間からアドレスにアクセスする方法を提供します。

pinconf[0x2168/4] = 0x001C001C;

これについては既に説明しましたが、これはアドレス 0x48000000+0x2168 に値を書き込んでいます。値 0x48002168 は OMAP3 データシートから取得され、GPIO システムでメモリ マップド IO を実行するために使用されます。4 で割り、アドレス 0x2168 を pinconf のインデックスに変換します。

[1] 正直に言うと、おそらく uint32_t を使用するべきでした。

于 2012-11-16T15:47:05.560 に答える
2

質問のタイトルに基づいて、配列にアクセスする際の16進表記について混乱していると思います。

16 進数は、数値を記述する別の方法にすぎません。無理をしないでください。私は書くことができます:

int a = 0xA;

また

int a = 10;

そして、それらは同じことを意味します。したがって、この場合:

pinconf[0x2168/4] = 0x001C001C;

ただ:

pinconf[8552/4] = 1835036;

後者は、pinconf が通常 4 (または 8) バイトを使用して 16 進数で書き込まれるアドレスを格納しているため、実際にはもっと混乱し00ます1C001C

于 2012-11-15T13:23:31.990 に答える
1

pinconf配列はulong(unsigned long)を格納します。

ulongvolatile ulong *pinconf;へのポインタを定義します。配列の最初の要素を指します。これは揮発性です。つまり、外部の「イベント」によって変更される可能性があり、キャッシュされません。これは、Cの任意の配列にリンクして機能します。

この場合、ファイル記述子fdを使用してファイル/デバイスにマップされます。

于 2012-11-15T13:16:03.727 に答える