PDA自作日記

 

まとめトップ

最近のコメント


   

メモリ管理 ━━━━

自作PDAで使用しているOAKS-32Rというマイコンボードでは、以下のメモリが使用可能です。

  • フラッシュメモリ:2MB
  • SDRAM: 8MB
  • CPU内蔵SRAM: 64KB
  • CPU内蔵コードキャッシュ: 8KB

起動シーケンスでは、最初にフラッシュメモリからモニタが起動し、ブートローダーに制御が移ります。ここで、以下の形でメモリチェックをおこないます。

  • SRAMのチェック(3回)
    • 全エリアにランダム値を書き込む
    • 同じ値が読みだせるかチェック
  • SDRAMのチェック(3回)
    • 全エリアにランダム値を書き込む
    • 同じ値が読みだせるかチェック

SDRAMのチェックのときは、CPUがSRAMに読み書きしている間に、CPU内蔵DMAがバックグラウンドでバースト転送をおこなうようにしています。これは、SDRAMが33MHzアクセスなのに対して、SRAMは66MHzでアクセスできるためです。SDRAMに対してバースト転送をおこなっている間にも、SRAMには1クロック空きでアクセスできるので、時間のかかるメモリチェックを効率よくおこなうことができます。

さて、M32Rは割り込みベクタがアドレス0付近にあるのですが、ここにはフラッシュメモリが割り当てられています。フラッシュメモリには、工場出荷時に標準ミドルウェアが書き込まれており、割り込みベクタもミドルウェア用に設定されています。今回は、以下のようなメモリマップを使用するため、標準のミドルウェアは使用しませんが、それでもできるだけ初期状態から変えないようにしたいと考えました。そこで、以下のようなトリックを使い、割り込みベクタを変更できるようにしています。

まず、テストの済んだSRAM上にフラッシュメモリからブートローダーをコピーし、そちらに制御を移します。これは、内部的にはCのスタートアップとして実現されています。そして、SDRAMCを制御して、SDRAMをアドレス0に割り当てます。(ドキュメントでは明示されていませんが)M32RではSDRAMコントローラはバスコントローラよりも優先されるため、これで割り込みベクタがSDRAM上にあり、書き換えできることになります。もちろんSDRAMアクセスによる割り込みの遅延の問題はありますが、割り込みベクタはジャンプ命令となっているため、少なくともコードキャッシュは有効です。

このあと、LCDにテストパターンを表示し、メモリカードからPDAのメインプログラムをSDRAMに読み込んで実行します。ここでは以下のようなメモリの割り当て方をしています。これは、M32102にはデータキャッシュがないことにより、スタックやデータをSDRAMに置くとアクセス時間で不利になると考えたためです。

  • コード: SDRAM
  • データ: SRAM
  • スタック: SRAM
  • 大きいデータ: SDRAM

大きいデータというのは、ディスクキャッシュやフォントデータなど、アクセス頻度が比較的低いものです。これらは、SDRAMを1MB単位で区切って、プログラム内で固定アドレスとして割り当てています。

コメントを書く


 
  Copyright © π 2009-2012
Powered by light work group
このページの内容は無保証です