①シリアル経由でOSの実行形式ファイルをダウンロードし、RAM上にいったん保存する。
まずダウンロードを実現するために一般的に利用されているファイル転送のプロトコルを利用。
それがXMODEMプロトコル。
「モデムでのパソコン通信」の時代に、ファイル転送のために広く利用されたプロトコル。
プロトコル仕様が簡単なので実装の手間がかからず、また広く普及しているためにツール類も豊富とのこと。
XMODEMプロトコルは転送効率と信頼性は悪いらしいですが、失敗してもOSのサイズが小さいので再度転送すれば問題なしという位置づけで採用とのこと。
【プロトコル仕様】
本に記載されているプロトコル仕様に対して現状把握してみた内容をコメントしてみました。
[送信側]
①受信側から定期的に送信されるNAK(0x15)を受けたら、送信を開始する。
⇒受信用意できているよと知らせているのだろう
②データはブロック単位に分けて送信する。ブロックは固定長なので、ファイルの終端などでデータ量が足りない場合にはEOF(0x1a)で埋める。
⇒ブロック単位というのは何バイトだろう?ファイルの終端の後にEOFを詰める件了解。初期化をEOFで実施すればよさげ。
③1ブロック送信したらACK(0x06)かNAKが返ってくるのを待つ。ACKの場合には、引続き次のブロックを送信する。NAKの場合には、同じブロックを再送する。
⇒受信した信号がOKかを応答してきて、応じて処理を実施するのだろう
④データの終わりはEOT(0x04)を送信し、ACKが返ってきたら終了する。
⇒EOTとはEndOfTerminateの略かな?これに対してACKという応答がついてくる
⑤中断したい場合はCAN(0x18)を送信する。CANを受けたら中断する。
⇒CANとはCancelの略かな?これには同じCANで応答されるようだ
[受信側]
①受信準備ができたら、合図として定期的にNAKを送信する。シリアルから文字を受信したらデータ受信開始する。
⇒受信準備は何をもって準備完了なのか?定期的というのは何秒周期?シリアルで文字を受信したらNAKは出すのを辞めるのだろう
②SOH(0x01)を受けたら、連続するデータをブロックとして受信する。受信に成功したらACKを返す。失敗したら(チェックサムエラーなど)NAKを返す。
⇒ブロック長は送信側と共有できていないとダメだよなぁ、ACKとNAKの出しわけ注意
③EOTを受けたらACKを返して終了する。
⇒EOTを受ける条件はどんなんだろう
④中断したい場合はCANを送信する。CANを受けたら中断する。
⇒CANを受けたらCANを返すの他に、自発的にCANを返すもありなんだな
【ブロックフォーマット】
上記で疑問に思ったことの一部が下記の内容で解決されそうです。
________________________________________________
|a|b|c| d |e|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
a(1byte):データのサイズを表す。128バイトであればSOH、1024バイトであればSTXをセットする。
b(1byte):ブロック番号をセットする。1から開始して1ずつカウントアップし、255の次は0になる。
c(1byte):ブロック番号の1の補数(全ビットを反転させたもの)をセットする。チェック用
d(128byte):送信するデータを128バイトもしくは1024バイト単位でセットする。送信するデータが128バイトもしくは1024バイトに満たない場合はEOFでパディングする(空いた部分を埋める)。
e(1byte):8ビットのチェックサム、もしくは16ビットのCRC符号をビッグエンディアンでセットする。
ブロックのフォーマットは了解ですが制御信号のフォーマットはどんなんなのか?
まずダウンロードを実現するために一般的に利用されているファイル転送のプロトコルを利用。
それがXMODEMプロトコル。
「モデムでのパソコン通信」の時代に、ファイル転送のために広く利用されたプロトコル。
プロトコル仕様が簡単なので実装の手間がかからず、また広く普及しているためにツール類も豊富とのこと。
XMODEMプロトコルは転送効率と信頼性は悪いらしいですが、失敗してもOSのサイズが小さいので再度転送すれば問題なしという位置づけで採用とのこと。
【プロトコル仕様】
本に記載されているプロトコル仕様に対して現状把握してみた内容をコメントしてみました。
[送信側]
①受信側から定期的に送信されるNAK(0x15)を受けたら、送信を開始する。
⇒受信用意できているよと知らせているのだろう
②データはブロック単位に分けて送信する。ブロックは固定長なので、ファイルの終端などでデータ量が足りない場合にはEOF(0x1a)で埋める。
⇒ブロック単位というのは何バイトだろう?ファイルの終端の後にEOFを詰める件了解。初期化をEOFで実施すればよさげ。
③1ブロック送信したらACK(0x06)かNAKが返ってくるのを待つ。ACKの場合には、引続き次のブロックを送信する。NAKの場合には、同じブロックを再送する。
⇒受信した信号がOKかを応答してきて、応じて処理を実施するのだろう
④データの終わりはEOT(0x04)を送信し、ACKが返ってきたら終了する。
⇒EOTとはEndOfTerminateの略かな?これに対してACKという応答がついてくる
⑤中断したい場合はCAN(0x18)を送信する。CANを受けたら中断する。
⇒CANとはCancelの略かな?これには同じCANで応答されるようだ
[受信側]
①受信準備ができたら、合図として定期的にNAKを送信する。シリアルから文字を受信したらデータ受信開始する。
⇒受信準備は何をもって準備完了なのか?定期的というのは何秒周期?シリアルで文字を受信したらNAKは出すのを辞めるのだろう
②SOH(0x01)を受けたら、連続するデータをブロックとして受信する。受信に成功したらACKを返す。失敗したら(チェックサムエラーなど)NAKを返す。
⇒ブロック長は送信側と共有できていないとダメだよなぁ、ACKとNAKの出しわけ注意
③EOTを受けたらACKを返して終了する。
⇒EOTを受ける条件はどんなんだろう
④中断したい場合はCANを送信する。CANを受けたら中断する。
⇒CANを受けたらCANを返すの他に、自発的にCANを返すもありなんだな
【ブロックフォーマット】
上記で疑問に思ったことの一部が下記の内容で解決されそうです。
________________________________________________
|a|b|c| d |e|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
a(1byte):データのサイズを表す。128バイトであればSOH、1024バイトであればSTXをセットする。
b(1byte):ブロック番号をセットする。1から開始して1ずつカウントアップし、255の次は0になる。
c(1byte):ブロック番号の1の補数(全ビットを反転させたもの)をセットする。チェック用
d(128byte):送信するデータを128バイトもしくは1024バイト単位でセットする。送信するデータが128バイトもしくは1024バイトに満たない場合はEOFでパディングする(空いた部分を埋める)。
e(1byte):8ビットのチェックサム、もしくは16ビットのCRC符号をビッグエンディアンでセットする。
ブロックのフォーマットは了解ですが制御信号のフォーマットはどんなんなのか?