web-dev-qa-db-ja.com

マイクロコントローラで外部メモリを使用する方法

過去に、私は8ビットAVRとMSP430で多くの作業を行い、RAMとフラッシュの両方がチップに直接格納されていました。プログラムをコンパイルしてダウンロードすると、「ただ機能する」ので、変数が実際にどこにどのように格納されるかを心配する必要はありません。

現在、マイクロコントローラ(重要な場合はTI Stellaris LM3S9D92)に外部メモリを追加できるようにしたいプロジェクトを開始していますが、コードで外部RAMを使用する方法が完全にはわかりません。他の周辺機器とほとんど同じように外部バスを構成する方法はわかりますが、私を混乱させるのは、プロセッサが外部メモリといつ通信するか、いつ内部メモリと通信するかを追跡する方法です。

私の知る限り、外部RAMは内部SRAMと同じアドレス空間にマップされます(内部は0x20000000から始まり、外部は0x60000000から始まります)。これは、次のように記述した場合を意味します。 :

int* x= 0x20000000;
int* y= 0x60000000;

Xとyは、それぞれ内部と外部のRAM)の最初の4バイト(32ビットintを想定)を指しますか?もしそうなら、私が次のようなことをしたらどうなりますか?

int x[999999999999]; //some super big array that uses all the internal ram
int y[999999999999]; //this would have to be in external ram or it wouldn't fit

それぞれのタイプのメモリがどこにあるのかという境界について何かを伝える必要があると思いますか、それともすべて間違っていて、ハードウェアがそれを自動的に理解しますか?リンカースクリプトはこれを処理しますか?それらがメモリマッピングと関係があることは知っていますが、正確にはわかりません。 ARMクロスコンパイラの設定方法について読んだ後、winavr(avr-gcc)のようなものが舞台裏で私のためにこのようなことをたくさんやっていたので、私はそうしなかったと感じます。それに対処する必要があります。

少しとりとめのないことを申し訳ありませんが、誰かが私がこのようなもので正しい軌道に乗っているかどうか教えてくれれば本当にありがたいです。

更新

将来の読者のために、私はさらに数時間グーグルした後にこれを見つけました http://www.bravegnu.org/gnu-eprog/index.html 。ここでの回答と組み合わせると、私は大いに役立ちました。

20
nightrain

一般的に、それはまさにそれがどのように機能するかです。ハードウェアを適切にセットアップする必要があります。または、ハードウェアの固定アドレスにハードコードされているものがある可能性があります。

同じ質問をすることができます、ハードウェアは、アドレス0x21000010(私はちょうどそれを作りました)にバイトを書き込むとき、それがuart送信保持レジスタであり、その書き込みがuartからバイトを送信したいことを意味することをどのように知るのですか?そのようにロジックでハードコーディングされているため、答えです。または、ロジックにオフセットがある場合、UARTが移動できる場合があり、他の制御レジスタの内容に0x10を加えたものになります。その制御レジスタ(それ自体にハードコードされたアドレスがあります)を0x21000000から0x90000000に変更してから、0x90000010に書き込むと、別のバイトがUARTから出力されます。

私はその特定の部分を見る必要がありますが、それが外部メモリをサポートしている場合、理論的には、プロセッサのアドレス空間のどのアドレスがその外部メモリにマップされ、読み取りと書き込みが外部メモリを引き起こすかを知る必要がありますアクセス。

Intelベースのコンピューター(PC)は、1つの大きなフラットアドレススペースを好む傾向があり、Linuxボックス(ある場合)でlspciコマンドを使用するか、WindowsまたはMacの場合は他のコマンドを使用すると、ビデオカードが提供されていることがわかります。アドレス空間のチャンク。 CPU /オペレーティングシステムの保護を通過し、そのスペースのアドレスに書き込むと、PCIeコントローラーを介してプロセッサーからビデオカードに直接送信され、大混乱を引き起こしたり、単に色を変更したりします。ピクセル。あなたはすでにあなたのavrとmsp430sでこれに対処しました。アドレス空間内の一部のアドレスはフラッシュであり、一部はRAMであり、CPUコアのアドレスバスを調べてそのアクセスを送信する場所を決定するロジックがCPUコアの外部にあります。フラッシュバンクとラムバンクとロジックがすべてチップの境界内に自己完結している限り、これはロジックがアドレスに応答することを超えてそれほど遠くはなく、そこから外部メモリサイクルが作成されます。完了または結果が読み取りで返されると、内部メモリサイクルが完了し、次のことに進みます。

それは意味がありますか、それとも私はそれを悪化させていますか?

11
old_timer

予約されたWordレジスタを使用して、その変数を内部メモリ位置に配置することをコンパイラに提案できます。registerint iInside;注意して;コンパイラーは、使用可能なレジスター・ストレージのバイト数を認識しており、使用可能なスペースがすべてなくなっても問題ありません。

レジスター変数は、カウンターなど、非常に頻繁に使用されるものにのみ使用してください。

0
Ernest_CT