メモリ・ダンプ・プログラム [ColdFire V2]
マイコンのプログラムを作成するんだったら、このツールははずせないでしょう。 メモリ・ダンプを作成するプログラムをSilentCで書きました。
いきなり、プログラム
まずは、プログラムの公開。
d(char *addr){ int i,j; addr&=0xFFFFFFF0; for(i=0;i<16;i++){ PrHex(addr);PrStr(" "); for(j=0;j<16;j++){PrHexByte(addr[j]);PrChar(' ');} PrChar(' '); for(j=0;j<16;j++){ PrChar(((addr[j]<32)||(addr[j]>=127))?'.':addr[j]); } PrStr("\r\n");SystemSleep(); addr+=16; } }
インタプリタで操作することを考えて、引数ひとつだけの関数としました。 引数で指定されたアドレスから256バイトの領域を表示します。 また、最初のアドレスは、16バイト境界から始まるようにしてあります。
使い方
この関数をmというファイルに保存して、使用します。
OK m::d(0x00014100) 00014100 0d 0a 3c 42 4f 44 59 3e 0d 0a 3c 43 45 4e 54 45 ..<BODY>..<CENTE 00014110 52 3e 0d 0a 3c 48 31 3e 3c 46 4f 4e 54 20 73 69 R>..<H1><FONT si 00014120 7a 65 3d 22 36 22 20 66 61 63 65 3d 22 41 72 69 ze="6" face="Ari 00014130 61 6c 20 42 6c 61 63 6b 22 3e 45 2d 6d 61 69 6c al Black">E-mail 00014140 20 73 65 6e 64 20 74 65 73 74 3c 2f 46 4f 4e 54 send test</FONT 00014150 3e 3c 2f 48 31 3e 0d 0a 3c 46 4f 52 4d 20 61 63 ></H1>..<FORM ac 00014160 74 69 6f 6e 3d 22 4d 61 69 6c 45 6e 64 2e 68 74 tion="MailEnd.ht 00014170 6d 22 3e 0d 0a 3c 49 4e 50 55 54 20 74 79 70 65 m">..<INPUT type 00014180 3d 22 74 65 78 74 22 20 73 69 7a 65 3d 22 33 30 ="text" size="30 00014190 22 20 6e 61 6d 65 3d 22 45 58 45 43 27 4d 61 69 " name="EXEC'Mai 000141a0 6e 3a 3a 6d 61 69 6e 27 22 20 76 61 6c 3d 22 22 n::main'" val="" 000141b0 3e 0d 0a 3c 49 4e 50 55 54 20 74 79 70 65 3d 22 >..<INPUT type=" 000141c0 73 75 62 6d 69 74 22 20 76 61 6c 75 65 3d 22 67 submit" value="g 000141d0 6f 22 3e 0d 0a 3c 2f 46 4f 52 4d 3e 0d 0a 3c 2f o">..</FORM>..</ 000141e0 43 45 4e 54 45 52 3e 0d 0a 3c 2f 42 4f 44 59 3e CENTER>..</BODY> 000141f0 0d 0a fc 00 01 29 53 65 74 45 6e 64 2e 68 74 6d .....)SetEnd.htm
ファイル領域と呼ばれている箇所のダンプです。
プログラムの問題点
これで、どこでもダンプできると思っていたのですが、無理なところもあるみたいです。
OK m::d(0) 00000000 addr not found in m
ポインタ変数に"0"を代入すると、うまく動いてくれません。 何か、特別な意味を持ってしまうようです。
OK m::d(0x40000000) 40000000 40 00 00 01 00 00 00 00 20 00 02 00 00 00 24 00 @....... .....$. 40000010 80 01 00 00 00 00 00 00 00 40 00 0c 30 e1 00 00 .........@..0... 40000020 03 00 00 08 00 00 00 00 00 00 00 00 00 00 00 00 ................ 40000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 40000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 40000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 40000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 40000070 00 00 00 00
I/Oレジスタ領域の先頭をダンプさせたら、途中で止まってしまいました。 0x40000070(IPSBAR+0x00_0070)のあたりは、Reservedとされている領域なので、未公開の何か危険なものが潜んでいたのだろうと想像します。 私の基板にはリセットスイッチを付けていないので、こうなるとパワー・オン・リセットで復帰させるしかありません。 ダンプの長さも指定できるようにした方がよかったかな。
参考文献
まだ、在庫あります。
Interface (インターフェース) 2008年 09月号 [雑誌]
- 作者:
- 出版社/メーカー: CQ出版
- 発売日: 2008/07/25
- メディア: 雑誌
ポインタコンテキストでの 0 は NULL を意味するためでしょうかね。
ポインタ変数に一旦 1 を代入してから -1 すればアクセスできました。
by masato (2008-08-23 14:32)