Step4 ファイル転送ができない

448 views
Skip to first unread message

naka

unread,
Jul 28, 2010, 10:40:50 AM7/28/10
to KOZOS友の会, mxjx...@yahoo.co.jp
はじめまして。

「12ステップで作る組み込みOS自作入門」を購入して、読んでいる者です。現在、Step 4のXMODEMプロトコルによるファイル転送でつまづい
ています。

[環境]
OS: CentOS 4.8
PC: dynabook satellite J11(シリアルポートあり)
端末エミュレータ:minicom

[現象]
loadコマンドを入力後、XMODEMでファイル転送を開始すると、タイムアウトする。


調べたところ、xmodem.c の xmodem_read_block 関数内の次の条件文を外すと、転送が完了することがわかりました。
(Step4)

if (block_num != block_number)
return -1;

これで安心して、Step 5に進んだのですが、上記の条件分を外すと、dumpコマンドの結果とreadelfの結果が一致しないことがわかりまし
た。そこで、リンカスクリプトで設定したbuffer領域に、block_numとblock_numberを出力してみることにしました。
xmode_read_block関数内で、次のようにしました。

block_num = serial_recv_byte(SERIAL_DEFAULT_DEVICE);
- if (block_num != block_number)
- return -1;

+ *(buf++) = 1; // 目印のため
+ *(buf++) = 1; // 目印のため
+ *(buf++) = 1; // 目印のため
+ *(buf++) = block_number;
+ *(buf++) = block_num;

for (i = 0; i < XMODEM_BLOCK_SIZE; i++) {
c = serial_recv_byte(SERIAL_DEFAULT_DEVICE);
- *(buf++) = c;
check_sum += c;
}

- return i;
+ return XMODEM_BLOCK_SIZE;


その出力結果が、次です。block_numの値が1のまま変わりません。

01 01 01 01 01 6e 9f 5a 7b d0 d8 9c fc 97 f7 dd <---
92 a3 31 38 87 5b 67 7f 04 d7 b8 83 fc b6 43 5f
8b cb 2e b6 4f 5b 09 f7 a1 92 9a 0a cb b7 af 77
81 fe 3a 2d 36 9f 06 f3 65 4b a0 18 7a c1 25 68
20 20 fe 28 3f 7a c1 3e 40 8a 53 90 7b b7 8c eb
8a 6f 22 01 3f db 6f 6c 0a 10 bd e2 fe fd ed 9b
e6 54 87 64 0b be 67 79 30 43 94 51 de 1f 1d fe
02 3d 84 10 bf 62 99 67 c9 14 b2 ed 36 ba dc 05
01 01 01 02 01 ee 73 fd ba d4 75 cc f6 d5 fe e7 <---
0e 29 09 10 bf e3 7c e3 84 78 81 09 d5 fe fc 5f
ff b1 42 15 c9 5f dd af 1d 43 47 b6 6f 79 19 eb
34 02 82 97 6b ff 55 00 3e 0d e2 66 93 72 c6 f6
10 39 d9 a9 cb e1 5f fa 94 9c a4 40 87 fe f3 e6
28 87 00 1a c3 d7 9f f0 1a 38 01 2c ef 77 f7 e3
11 1a 48 7a 1d 3f c4 7f f4 c8 2d c0 5e 75 3f dd
a9 8e 62 e4 53 3d 5d 76 0b 48 0c 81 7d cf da dc
01 01 01 03 01 f7 6f bf a0 11 0c 00 cf 9e eb ea <---
24 87 40 64 6d c9 7f e5 22 14 8e ca 9d 8d fc f9


この先を見てみると、block_numberが5になったとき block_numが2になり、その後1ずつ増えていくことが
わかりました。どうやら、block_numberとblock_numが一度も同じ値にならないためにXMODEMでのファイル転送でタイムアウトし
てしまうようです。

さて、このような場合、どのように対処していけばよろしいでしょうか?

よろしくお願いいたします。


※(H8移植編第4回 ブートローダーでプログラムをロードしてみる)のソースコードを落として、helloをロードしよう試みたところ、Retry
Exceeded count になりました。

やまちゅう

unread,
Jul 28, 2010, 11:26:48 PM7/28/10
to KOZOS友の会
nakaさん、こんにちは、やまちゅうです。

詳しく書かれている内容を確認していないので、間違っていたらすみません。

XMODEMでのファイルの転送がタイムアウトする件ですが、実はこれ、わたしも体験しました。
で、この件は本の中に書かれているように”素早く転送を始める状態に持っていく”が、
わたしの場合の解決方法でした。 厳密に時間を計った訳ではないので数字は多少前後するかも
しれませんが、ブートロードプログラム上で"load"コマンドを叩いてから、ファイルの
転送が始まるまでに10秒以上かかるようだとタイムアウトするようです。

やまちゅう

mxjx...@yahoo.co.jp

unread,
Jul 29, 2010, 10:59:14 AM7/29/10
to kozos_t...@googlegroups.com, mxjx...@yahoo.co.jp
やまちゅうさん、ご意見ありがとうございました。

自己解決しましたので、報告します。

原因は、XMODEMでファイルを転送するときのファイル名の指定方法でした。具体的によくなかったのは次の二つです。

(1) minicomを実行するときのカレントディレクトリが転送したい
ファイルが置いてあるディレクトリでなかったこと。
(2) 転送するファイル名を./kozosや/root/.../kozosというように指
    定していたこと。

本日、step6の「Hello World」の実行まで到達しました。

お騒がせしまして、すみませんでした。

naka



 

kozos

unread,
Jul 30, 2010, 6:05:39 AM7/30/10
to KOZOS友の会
解決したようでよかったです。やまちゅうさん、ご回答ありがとうございました。

XMODEMでのタイムアウトの件なのですが、内容はやまちゅうさんのご指摘のとおりなのですが、これの原因ってご存知のかたはおられるでしょうか。一
見すると、NAKがたまってしまっているように思えるのですが。

なんだか腑に落ちない動作なのですが、詳細不明です…。

naka

unread,
Jul 30, 2010, 8:15:14 AM7/30/10
to KOZOS友の会
kozos さん

私も腑に落ちないと思い、理由を調べました。
そこで、初歩的なミスをみつけました。

実は、minicom の設定で 「Filenames and paths」→「Upload directory」の設定値が、/ になっていませ
んでした。
以前うまくいかず、設定を変更し、そのままになっていたようです。

本に書かかれていることが正しいです。ご迷惑をおかけしました。

naka

やまちゅう

unread,
Jul 31, 2010, 2:18:47 AM7/31/10
to KOZOS友の会
ラインモニターをPCと開発基板の間に挟んで、流れるデータをモニターできれば解決できるのかも
しれませんね。 もしくは、USBの usbsnooy のような、シリアル版 snoopy があれば、232cのデータを
そのまま確認できるんですけれどね。

XMODEM のタイムアウトは転送のたびにいろいろ気をつかわなくて面倒なので、そうそうにS-recに
移行したいと思っています。 motファイルの転送ならば jerminal も使えて便利です。
(cu / kermit / minicom より使いやすいと思います。ソースも公開されていますし、少なくとも
Linuxならばすんなりコンパイルできます。)

やまちゅう

On 7月30日, 午後7:05, kozos <hsa...@saturn.dti.ne.jp> wrote:
Reply all
Reply to author
Forward
0 new messages