• ベストアンサー

マイコンのメモリマップについて

マイコンに限った話ではないかとは思いますが、現在マイコンプログラムの勉強をしておりますが、マイコンのデータシートのメモリマップを見ると先頭番地からフラッシュメモリのマッピングがあり、その次に各種レジスタやRAMのマッピングがなされています。 (1)このメモリマップというものは論理アドレスと物理アドレスの対応表のようなものだと解釈しておりますが、この対応表自体はRAMの一部に格納されているのでしょうか? (2)例えばフラッシュメモリの物理アドレスが00~FFまであり、RAMの物理アドレスも00~FFだった場合で且つ フラッシュメモリの後ろにRAMのマップを作る場合、メモリマップの中の論理アドレスは00~2FFまでで物理アドレスはフラッシュメモリの部分は00~FF,RAMのブツリアドレスも00~FFになるという理解で良いですか? ひょっとするとかなり見当違いをしている質問かもしれません。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • K-1
  • ベストアンサー率21% (832/3844)
回答No.3

うーん、なんかピンとこないですね。 何か勘違いしてるかも。 1)一般的にメモリマップとは、どこからどこまでのアドレスにどんなハードウェアが接続されているかとか何に使われているか。の図です。 000000-00ffff:フラッシュメモリ 010000-010fff:レジスタ 011000-0fffff:メインメモリ という感じなはずです。 メインメモリで、ここからここはこれ、という図も「メモリマップ」です。 区別するなら「メインメモリのメモリマップ」です。 2)1)で書いたメモリマップ内00000-fffffで、レジスタの先頭は10000から始まります。 そのレジスタだけに注目した場合、相対的な位置は000-fffの範囲になります。 この相対的な位置のことを「論理アドレス」と言っているのでしょうか。 「論理アドレス」「物理アドレス」とは仮想記憶を使う場合に使用する用語です。 バンク切替などを行わない場合、この言葉は使いません。 固定のメモリマップの場合、単に「アドレス」というだけです。 あえていうなら「相対アドレス」ですが、かえってややこしくなるので普通は使いません。

jimihenn
質問者

お礼

どうもありがとうございます。 仮想記憶の物理アドレスはメモリマップ(メインメモリではないメモリマップ)とどういう関係にあるのでしょうか? >1)一般的にメモリマップとは、どこからどこまでの>アドレスにどんなハードウェアが接続されているかと>か何に使われているか。の図です。 >000000-00ffff:フラッシュメモリ >010000-010fff:レジスタ >011000-0fffff:メインメモリ >という感じなはずです。 例えば上記のメモリマップで000000にアクセスがあった場合フラッシュメモリにアクセスするまでにどのような道筋を通るのでしょうか? お時間あればお願いします。

その他の回答 (3)

  • K-1
  • ベストアンサー率21% (832/3844)
回答No.4
  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.2

普通、物理アドレス・論理アドレスというと、仮想記憶とかもっと上位の概念を指すことが多いような気がするけど。。 (1)普通は、ハードでアドレスデコーダーを作る場合が多いとは思います。デコーダーにI/O命令を送ると変更できたりする場合も多いと思います。 対応表自体をRAMにいれるという設計も可能でしょうが。 (2)これは、言わんとしていることは多分あってるんでしょうが、使われてる用語(メモリマップ・物理アドレス・論理アドレス等)に違和感がありますね。

jimihenn
質問者

お礼

どうもありがとうございます。 仮想記憶と勘違いをしていたみたいです。 >普通は、ハードでアドレスデコーダーを作る場合が多いとは思います。 ということは対応表のようなものがアドレスデコーダーに保存されているということになるんでしょうか? お時間ありましたらお願いします。

  • marimo_cx
  • ベストアンサー率25% (873/3452)
回答No.1

>ひょっとするとかなり見当違いをしている質問かもしれません。 (~ヘ~;)ウーン そんな気がします、だって、何を仰りたいのか、何の事を書いているのかさっぱり解りませんので。 物理アドレスとか論理アドレスとかってなんの事でしょう?ひょっとしてバンク切替えの事言ってるのかなぁ?とか。 それとも連続しているメモリチップをアドレスデコーダであっちゃこっちゃに振り撒く事言っているのかなぁとか想像はつきません。 ちなみにこの2例はいずれも物理的な仕組みです。

jimihenn
質問者

お礼

どうもありがとうございます。 やはりどこかで勘違いをしているみたいです。 もう少し調べてみます。

関連するQ&A

  • OSはどのようにして、CPUにメモリ上の物理アドレスを伝えるのか?

    一般的なシステムにおいて、プログラムを実行するには、コンパイラが再配置可能なオブジェクトファイルにして、そのオブジェクトファイルをローダがメモリ上にローディングして、CPUによって実行が行われると認識しています。 では、実際にCPUにより実行される時に、どのようにしてCPUは、ローディングされている物理アドレスを知ることが出来るのですか?一番初めにOSがどのようにCPUに先頭番地を伝えているのかが見当がつきません。例えば、486では、セグメントレジスタの値とオフセットアドレスを加算したアドレスを基にメモリとやり取りしていますが、OSがこのセグメントレジスタに先頭アドレスをどのように格納しているのかを教えてください。お願いします。

  • メモリ管理機能

    OSのメモリ管理機能についておしえてください。 OSの機能にメモリ管理というのがありますが、これは 論理アドレスと物理アドレスのマッピングなど仮想記憶管理を行ったりしています、そのほか、アプリケーションの名前やデータサイズなども管理してるのでしょうか?(たとえば、Word.exeというプログラム名は論理アドレス何番から何番までに配置、xyz.mp3という名前のデータ名は論理アドレス何番から何番に配置といった感じで)

  • DTCのレジスタ情報設定方法についてご教示ください。

    DTCのレジスタ情報設定方法についてご教示ください。 はじめまして。 現在、SH7145マイコンを使って、DTC、SCIを使用したシリアル通信を 考えておりますが、以下の点で困っております。 転送情報を設定するために、 DTBRに転送情報の先頭アドレス上位16ビット、 DTCベクタアドレス(TXI_0 0x0000043A)に先頭アドレスの下位16ビット を設定しているのですが、0x0000043A番地にアドレスが設定されません。 HEWのデバッガを使用しており、0x0000043A番地を見るとFF FFのままです。 デバッガで0x0000043A番地に、直接下位16ビットの値を設定し、 0x0000043A番地を読みに行った場合には、設定した値を取得出来ました。 そこでプログラム中で正しくアドレスを設定する方法についてご教示ください。 また、DTCベクタアドレス(0x00000400番地から)はROMエリアになる事により、 HEWのビルドの設定等で対応することになるのでしょうか? 以上、よろしくお願いいたします。

  • メモリをアドレスを直接指定して値を取得するには

    マイコンのプログラムを書いております。 やりたい事はC言語でフラッシュメモリの物理アドレスを直接指定してそのアドレスの値を1バイト読むことです。例えば0xF000番地のアドレスから1バイト読む場合、以下のソースコードで問題ありますでしょうか?なおアドレスは2バイトで表現されます。 unsigned char *p_value; unsigned char value; p_value=&value; p_value=0xF000; この時点で変数valueには0xF000番地の値が正確に代入されてますでしょうか? よろしくお願いします。

  • 仮想ベクタテーブルについて

    私、このたび10年ぶりにマイコンプログラム制作をすることになったので、現在必死に勉強しておりますがどうしてもわからないことがあり質問いたしました。 現在は昔と違い、プログラムの書き換えが簡単にできるようにRAM上にフラッシュのプログラムをコピーして、RAM上でプログラムを起動するのが一般的なやり方のようですが、その際、仮想ベクタテーブルはなぜ必要なのでしょうか? ROMの先頭アドレスからマッピングされた通常のベクタテーブルに、RAMにコピーした関数のアドレスを登録しておけばよいように思うのですが? フラッシュの書き換え回数の問題があるからといっても、ベクタテーブルはアドレスを登録しておくだけだから、通常でしたら頻繁に書き換えなど怒らないかと思うのですが。。。? なぜ仮想ベクタテーブルというやり方をしなくてはいけないのかよくわかりません。 どなたかわかりやすくご教授下さい。 よろしくお願いします。

  • H8のダウンロードで、拡張しmapファイルでダウンロードすべきバイナリの番地はわかる?

    以前、H8マイコンでプログラムをしていたテスト機があるのですが、そのバイナリファイルは持っているのですが、どこの番地に書き込めば良いのかわからなくなってしまいました。確か0番地に書き込めば良かったと思ったのですが、うまく以後いているのか判断できません。開発は日立のHEW環境で行っています。メモリのどこに関数のポインタなどの情報が入っているmapファイルは持っているのですが、このファイルからbinファイルをどこに書き込めば良いかということはわかるのでしょうか?

  • フラッシュメモリのフォーマットについて

    FDなど磁気ディスクでは、物理フォーマットと論理フォーマットが存在し、FDについていえばwindows標準では、クイックフォーマット=論理フォーマット、通常フォーマット=論理+物理フォーマットを行っているとおもいます。 USBメモリなどのフラッシュメモリでのフォーマットも同じ理解でよいのでしょうか? 磁気ディスク以外でも物理フォーマットという考えは存在するのでしょうか?

  • H8マイコンのメモリセクションの変更を行いたい

    以前私はこのような質問をこのサイトでさせて頂きました。 HEWのビルドで出てきたビルドエラーについて#8678205 #okwave #q8678205 http://okwave.jp/qa/q8678205.html この質問の中で (エラー内容) ** L2321 (E) Section "S" overlaps section "R" Optimizing Linkage Editor Abort ERROR: Process failed with return code: 1 このエラー内容が、Rセクション(初期化領域)の容量がSセクション(スタック領域)にオーバーしているということがわかり、Rセクションの容量を減らすからSセクションの容量を減らして、Rセクションに割り当てる解決方というのを知りました。 実際に開発環境のHEWのtoolchainのセクション設定の項目で変更してビルドが完了し、mapファイルでも設定した通りのアドレスにセクションが設定できることを確認しました。 そのため、初期ではSセクションのスタックは0x200(512)Byteだったのですが、0x1E0(480)Byteと小さくしてしまったのですが、スタック領域を小さくするというのは少し不安を感じています。 他にRAM領域がないかを確認したところ、H8/2368マイコンの外部にCYPRESS社製のSRAM CY62148EV30LL-45ZSX1 TSOPII(32P3Y-H) 512kbyteのメモリをアドレス0x600000番地スタートで接続していることがわかりました。 512kbyteも容量があり、Rセクションはマップで見ても3.2kbyte程度なので、Rセクションだけこのメモリ領域に移したいと考えています。 ただ、 元々このメモリには次のようなメモリセクションが設定されています。 0x00600000 , BHEAPMEM 0x00670000 , BJURNEL このBHEAPMEMとBJURNELという文字をソースコード内で検索してみても全く使用されていない文字で検索できませんでした。 ソースコード内の0x600000番地についての記述では次のような (memmap.h) #define SRAM_BASE_ADDR 0x600000 /* size 512 K Byte (0x80000) */ #define SRAM_BASE 0x600000 /* size 512 K Byte (0x80000) */ (task.c) void * my_malloc(size_t size) { void * p; OS_ENTER_CRITICAL(); p = (void *)malloc(size); if(p == NULL || ((u32)p < (u32)SRAM_BASE_ADDR || (u32)p > ((u32)SRAM_BASE_ADDR + (u32)0x800000))) { printf("malloc error\n\r"); task_reset(); } OS_EXIT_CRITICAL(); return (void *)p; } 現在のメモリセクションマップはこのようになっています。 Address section 0x00000400 , PResetPRG,PintPRG 0x00000800 , P,C,C$DSEC,C$BSEC,D 0x00600000 , BHEAPMEM 0x00670000 , BJURNEL 0x00FF4000 , BPROGERASE 0x00FF4000 , B,R 0x00FFBE00 , S これを、次のように変えたいと思っています。 Address section 0x00000400 , PResetPRG,PintPRG 0x00000800 , P,C,C$DSEC,C$BSEC,D 0x00600000 , BHEAPMEM 0x0066F000 , R 0x00670000 , BJURNEL 0x00FF4000 , BPROGERASE 0x00FF4000 , B 0x00FFBE00 , S 実際にこのようなメモリセクションに変更することは可能なのか、また、実際に変更した場合にBHEAPMEM領域に問題が起きないかとか他に調べなければならないことなど、ご教示頂きますよう、どうぞよろしくお願い致します。

  • ビデオメモリとRAMのアドレスについて。

    ビデオメモリとRAMのアドレスについて。 32ビット版のOSの物理アドレスは4GB(0-FFFFFFFF)で、 ビデオメモリも当然、この間のアドレスを使用するものと理解していました、 つまり、あまり多くのビデオメモリを使用すると、利用可能な物理メモリ(RAM)の容量が減ってしまいますよと、 他の質問で、回答をしたところ、 ビデオメモリとRAMは別だから、勘違いですと、指摘されました。 私の使用しているOS(XP、Vista、Win7)の32ビット版は、 デバイスマネージャを開いて、表示を、リソースで確認すると、 ビデオメモリの分のアドレスは、0-FFFFFFFFの間に割り当てられています。 つまり、このビデオメモリのアドレスは、RAMが使用できない、 と思いますが、勘違いなのでしょうか。 もし、ビデオメモリ(2GB)+RAM(4GB)とすれば、 6GBの物理アドレスを、どのように管理するのか、 ご教授して、いただきたいと思います。 私は、64歳で、最近の新しい技術に、疎くなっているのでしょうが、 よろしくお願いします。

  • 命令

    lw r1,0(r4) 上記のような命令を実行したとします。レジスタ群r4には32ビット00000000000000000000000000100100が入っています。これは10進数にすると36なので0(r4)=0+36=36になります。 そしてメインメモリのアドレス36番地には10000001111111111111111111111111が入っていてこれをレジスタ群r1に移動します。 けれどもレジスタ群r1には00000000000000000000000000011000が最初から入っています。 ここで質問なんですがこの場合アドレス36番地の値と最初から入っていたレジスタ群r1の値は足さなければならないのですか? それともアドレス36番地の値をそのままレジスタ群r1につっこんでもいいのでしょうか?

専門家に質問してみよう