インターフェイス2009年5月号付録基板 LPC2388 にモニタを移植( GCC )

2年半も前の付録基板が見つかったので、動かしてみました。URLタイトルにあるごとく、「始めました」といっても、実は12年も前に、ATMELのARM7の試作基板を作って、モニタの移植や基板チェックソフトを作ったことがあり、全く始めてではありませんが、ほとんど覚えていませんので、5月号と、その後の8月号を参考に、GCC で開発できるようになりました。というのは、5月号で紹介されていた、IAR の統合開発環境では、Cコンパイラで、アセンブラのソースを作成できなかったからです。GCCでは、コードのサイズ制限がなく、さらに、
$ arm-elf-gcc -S gcc_sample.c >gcc_sample.s ( enter )
で、アセンブラのソースを吐き出してくれるし、リンカーで作成された実行可能データを含む、ELFファイルなどを逆アセンブルしてファイルに残せたりします。
$ arm-elf-objdump -d gcc_sample_r >gcc_sample_r.txt ( enter )
簡易モニタを、GCCで開発できるようにしたもの。 はこちら。内部RAMのスピードの比較など。2011.12.5 追加
8ピンARM、LPC810 で高度計を作成( トランジスタ技術2014年2月号付録 )
mbed LPC1768 など、PIC32MXと速度比較(1MHz換算)

最初は、5月号の解説を元に、LEDちかちか

最初は、と言っても、 Flash Magic からダウンロードしたLPC2388のフラッシュメモリ書き換えソフトで、出来合いのプログラムを書くだけです。あとから気付いたのですが、付録基板は、3.3VのLDOの入出力に、3.3Vから5Vに向けて、ショットキーダイオードを付けないと、「5V側をショートして0Vになると、3.3V側のコンデンサに残った電圧で壊れる」という注意書き(5月号106ページ)があったので、3日ほど後で付けました。それまで壊れなかったのは幸いなのかも知れません。


GCCへの移植前の解説
準備中

簡易モニタを、GCCで開発できるようにしたもの。

ここらが、CQ出版サイトからダウンロードできるGCC開発環境ビルド済みARM用gcc一式 でコンパイルできる、簡易モニタのファイル一式です。

makefile を見てもらったらわかりますが、モトローラ形式と、インテル形式の両方を出力し、0番地から走るROM化したものと、0x40008000番地から走る、RAM用の実行ファイルを作ります。フラッシュメモリの書き換え回数がよくわからないので、できるだけRAMでテストしてから、ROMに書けるようにしています。この中の、gcc_sample_r.hex をフラッシュメモリに書くと、簡易モニタで起動できます。

このモニタでは、CPUの速度を簡易に測定できる、ベンチマーク(エラトステネスのふるい)を入れています。また、実行時間をμ秒単位で測定できます。モニタの操作で、メモリ間のコピーとか、比較ができますが、その際にかかった時間を、1μ秒のカウンタを使って、処理時間を確かめられます。
以下は、メモリの0x40000000番地から、0x40002000番地へ、バイト単位で0x2000バイトコピーするコマンドを出した後、Tコマンドで実行時間を表示する例です。

LPC2388-Bug>m40000000,40002000,2000
LPC2388-Bug>T
Timer HEX = 4E5, 1253μs
LPC2388-Bug>

この結果を見ると、72MHz の LPC2388 は、1μ秒で、6.5回ほどコピーできることが解ります。

LPC2388 には、64kbのRAMのほか、USB用ワークメモリ(0x7FD00000〜)と、イーサネット用ワークメモリ(0x7FE00000〜)が、それぞれ16kb実装されていて、CPUからは、RAMとして扱えます。

では、これらの内臓RAM間のプログラムによるデータ転送に、実行時間の違いがあるのか、モニタを使って計測してみます。各RAMの名称は、64kbのRAMを、MAIN(F)、USB用ワークメモリを、USB(F)、イーサネット用ワークメモリを、ETHER(F)とします。さらに、フラッシュメモリで動いているモニタと同じ機能のモニタを、64kbのRAMにロードして実行した場合の実行時間とも比較します。MAIN(R)など。
64kbのRAMでフラッシュメモリと同じモニタを走らせるには、次のようにします。
  1. LPC2388-Bug> プロンプトが出ている状態で、英小文字の L 'l' コマンドを与え、パソコンのターミナルソフトから、gcc_sample.mot を送信します。
  2. LPC2388-Bug>l ( enter )
    start loading address = 40008000
    END. bytes loaded = 00001B04

    LPC2388-Bug> と応答しますので、
  3. LPC2388-Bug>g40008000 ( enter ) で、0x40008000番地から実行させると、以下のように応答します。
  4. LPC2388-Bug>g40008000OK
    LPC2388 monitor 2011.12.2-2
    LPC2388-Bug>
  5. これで、RAMの0x40008000番地から同じ機能のモニタが走っています。
内臓RAMの転送スピードの違い
 操作 
 MAIN(F) 
 USB(F) 
 ETHER(F) 
 MAIN(R) 
 USB(R) 
 ETHER(R) 
バイト単位 8kバイトコピー μ秒
 1253 
 1480 
 1480 
 1138 
 1366 
 1366 
ロングワード単位 8kバイトコピー μ秒
 314 
 371 
 371 
 286 
 343 
 343 

この表から、内臓RAMで実行したほうが、若干早いことが解り、USBとイーサネット用ワークメモリと比較すると、メインの64kbのRAMの方が、若干早いことが解ります。
メモリ間のコピーはそれぞれ以下のコマンドです。
LPC2388-Bug>m40008000,4000a000,2000 (enter) バイト単位で MAINメモリ 間の8kbコピー
LPC2388-Bug>m7fd00000,7fd02000,2000 (enter) バイト単位で USBメモリ 間の8kbコピー
LPC2388-Bug>m7fe00000,7fe02000,2000 (enter) バイト単位で ETHERメモリ 間の8kbコピー
LPC2388-Bug>ml40008000,4000a000,800 (enter) ロングワード単位で MAINメモリ 間の8kbコピー
LPC2388-Bug>ml7fd00000,7fd02000,800 (enter) ロングワード単位で USBメモリ 間の8kbコピー
LPC2388-Bug>ml7fe00000,7fe02000,800 (enter) ロングワード単位で ETHERメモリ 間の8kbコピー



準備中


ホームに戻る


inserted by FC2 system