TOPへ
特殊電子回路について

English
Loading
トップ ページ >  チュートリアル > Nahimonによるプログラムのロード

Nahimonによるプログラムのロード

Nahimonとは

 Nahimonとは、特殊電子回路が現在開発しているRXマイコン用のモニタプログラムです。

 このプログラムの主な特徴はマイコンのジャンパなどを切り替えなくてもコンピュータのディスプレイの中で完結できるという点です。

 Nahimonは、以下の機能を備えています。

    • メモリ空間の任意のアドレスのダンプ
    • RAM領域の書き換え
    • SDカードの中身をdir等で表示、操作
    • RTCなどの操作

動作画面

MOTファイルをRXPROGやFDTで書き込み、USB仮想COMポートへTeratermやハイパーターミナルでアクセスするとこのように動きます。

使用方法

 ダウンロードのページより、RXduino-lib (bin)をダウンロードし、FDTやRXPROGを使用してボードに書き込んでください。

 書き込みが完了しデバイスを再起動したらピポというビープがなるので、音が鳴ったらシリアルポートやUSB仮想COMポートからの接続を待ち受けるので、環境にあった方から接続してください。シリアルに接続したら、loadというコマンドを打つと、Sレコードファイル(モトローラ形式HEXファイル)を待ち受ける状態になります。 

 RXのプログラムをビルドする際に、開始番地をRAM上にセットしておけば、RAMアプリが作れます。そうして作ったSレコードファイルをTeratermの窓などにドラッグアンドドロップをして流し込みます。通常は0番地から開始するプログラムとして作ります。 

 そして、rebootコマンドを送ると、CPUにリセットがかかって、先ほどロードしたRAMアプリが起動します。これなら、MD0のジャンパを変更してリセットボタンをおさなくてもパソコンの画面の中だけで操作できます。

内蔵コマンド

 Nahiimonには以下のコマンドが組み込まれています。文字化けを起こす場合、ターミナルの文字エンコードをShift-JISに変更してください。

      • help
      • dump
      • memwr
      • memfill
      • spi
      • load
      • dir
      • cd
      • type
      • jmp
      • run
      • reboot
      • time

help

コマンドのヘルプを表示します。2012/1/18日版ではまだヘルプを書いていないので少々お待ちください。

dump addr len

 addrで指定したメモリアドレスからlen分だけメモリをダンプして表示します。lenは16進数で指定します。

 メモリアドレス0バイト目から0x100(256バイト分)表示

USB0  $ dump 0 100
00000000 20 c0 ec e7 35 85 72 59 80 06 19 a0 d3 b0 8d 40  ...5.rY.......@
00000010 58 46 d7 7b 16 21 20 d2 74 7b f1 53 fb bb 49 1a XF.{.! .t{.S..I.
00000020 52 20 d2 8e 7d 42 d0 dc ea e6 00 20 5d a3 ce 14 R ..}B..... ]...
00000030 00 07 c7 bf 09 8a f1 fb a5 2c 61 14 ff ad 09 04 .........,a.....
00000040 48 08 8d 7f 23 01 93 7f 81 77 d0 1c f9 af 0b a1 H...#....w......
00000050 9a a0 9e 85 38 41 b5 ff f3 7a 14 44 5e d9 6e 12 ....8A...z.D^.n.
00000060 30 80 f7 fe 61 85 d0 d1 78 37 08 02 2d ff 8d 72 0...a...x7..-..r
00000070 84 19 5a be 44 10 41 4e 45 7c a2 cc 1e 0f 03 90 ..Z.D.ANE|......
00000080 b3 09 6f 6f 82 d3 d9 34 61 db 00 2e da e7 5c 89 ..oo...4a.....\.
00000090 94 b0 c9 ff 51 30 8f 7c 3f cd 16 c8 bb 36 4b 21 ....Q0.|?....6K!
000000a0 20 ac d2 f1 14 c0 b4 57 bd ff 27 4b 4f 65 23 91  ......W..'KOe#.
000000b0 ca 48 9b e7 88 ca 80 9d ba eb 05 30 af f7 2f 35 .H.........0../5
000000c0 90 96 e1 ef 10 10 69 f5 ff 9e 20 14 ff ed 1c 48 ......i... ....H
000000d0 82 9e fd f5 11 0d e1 a3 e7 9f c5 04 db f5 77 40 ..............w@
000000e0 c2 00 72 ec 87 9a d2 af bf ec 40 50 2e aa 3f 3c ..r.......@P..?<
000000f0 0c 88 bf e3 61 08 70 5b 7f e3 22 c8 5f 1d 0f 20 ....a.p[.."._..    

memwr { b|w|l } addr val

メモリアドレスのaddr目にvalで指定した値を書き込みます。b、w、lはそれぞれバイト型、ワード型、ロング型を指しています。

メモリアドレス0バイト目に対してバイト型でffと書き込んだ後にダンプして確認する

USB0  $ memfill 0 10 ff
アドレス00000000から0000000fまでを値ffで埋めました

USB0 [2012/01/18 06:24:09] $ dump 0 10
00000000 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................

spi id | dump addr

指定されたSPI IDの内容をダンプします。

jmp addr

指定されたアドレスaddrにジャンプします。addrは16進数です。

load

プログラムの入力待ち状態に入ります。loadを打った後にTeratermのウィンドウにファイルをドロップすると「ファイル転送を行いますか?」と聞かれるのではいを押して転送を開始してください。有効なプログラムファイルの形式はモトローラのSレコード形式です。

 

dir

現在MMCカード(マイクロSDカード)の中にあるファイルの一覧を表示します。

USB0  $ dir
ファイルの一覧を表示します

0個のファイルが見つかりました。
 

cd dirpath

現在のカレントディレクトリをdirpathに変更します。引数がない場合はルートパス(一番上)に移動します。

run

流し込んだファイルを実行します。

reboot

デバイスを再起動します。詳しくは技術情報の項をお読みください。

time

RTCにセットされている時刻を表示します。

USB0  $time
RTCが設定されていないので適当な時刻を設定します。
USB0 [2012/01/18 05:34:00]  $

技術的情報

 通常、この方法だとここで問題が3つほどあります。

RAMプログラムとワーキングエリアの重複

 RXモニタはROM上で動くアプリとしてつくり、ワーキングエリアは 0x10000〜0x17fffまでを使うようにします。ロードするRAMアプリは 64kBのサイズ制限を設けることで、エリアがぶつからないようにしています。ユーザプログラムエリアは64KBでもかなりのものが作れます。

リブートの方法

 リブートにはウォッチドッグタイマを使っています。ウォッチドッグタイマがオーバーフローすると、内蔵ペリフェラルも含めてリセットされます。た だし、「ウォッチドッグタイマが溢れた」ということを示すフラグ(WDT.RSTCSR.WOVF)はリセットされません。メモリの安全な場所にRAMア プリの開始番地とキーワードを書いておいて、スタートアップルーチンが「RAMアプリ起動のためのリブートだな」と判断したら、RAMアプリの実行開始番 地へジャンプするようにします。

リセットの際のUSB仮想COMポートの扱い

 USB仮想COMポートは悩ましい問題です。USBがリセットされてしまう(つまり、抜き差しと同じ状態)ので、新しいプログラムでRXが起動する前にTeraTermを閉じて、新しいプログラムが起動したらTeraTermを再度開かなければなりません。

 そこで、もし仮想COMポート経由で操作されている場合には、リセットまでに5秒間の猶予が行われるようにしました。

 

これで、USB仮想COMポートだけでも十分に遊べるようになるはずです。

今後の予定

現在はまだSDRAMは使っていません。今後はSDカードからのプログラムのロードなどができるようにしたいと思います。