(TFTP対応第1回)TFTPブート対応してみよう
2012/04/03
あなたは
人目のお客様です.
「(H8移植編その2第18回)TFTPでファイル転送」で
書いたようにTFTPでのファイル転送をOS側に実装したのだが,もともとブートローダー
のTFTPブート対応という話があってそのためにひとまずOSに実装した,という
ものだった.
なのでいよいよブートローダー側にKOZOSのTCP/IPスタックを移植して,
TFTPブートに挑戦してみよう.ただしブートローダーでは割り込みは利用したくない
(割り込みはOS側で管理するものなので,ブートローダー側でも利用するのは
ぼく的にはちょっとなんだかなあな気がするのだ).ということで既存の
マルチタスク構成・割り込みベースの動作のTCP/IPスタックを,
ポーリングベース・関数呼び出しベースの動作にうまく丸め込むような移植を
行いたい.
で,考えたやりかたは以下.
- kozos.c をマルチタスク動作でなく関数ベースでの動作にして,
登録した関数を次々に呼び出すような動作に改造.
- 各タスクのメイン関数は kozos.c から毎回呼び出されるようなポーリングの
動作に改造.
- 割り込みは利用せず,ハンドラ登録した関数がポーリングで毎回呼び出される
ような動作に改造.
このように関数呼び出しベース&ポーリングベースの動作にすれば,
タスク側はあまり改造せずにそのまま動作するはず.
ということで
「(H8移植編その2第18回)TFTPでファイル転送」
のソースコードをベースにして,TCP/IPスタックをOS側からブートローダーに
持ってきて実装した.
改造の内容は以下.
- (ブートローダーの修正)
- (Makefile) TCP/IPまわりのオブジェクトを追加.あとOSモジュールをインポートしないように修正(main.oのビルド方法を通常に戻す).
- (interrupt.h) INTR_ENABLE を無効化.(割り込みを有効化しない)
- (serial.[ch]) シリアル割り込みまわりのサービス関数をダミー実装.
- (ld.scr) メモリ調整し freearea を追加.
- (defines.h) typedef や enum の定義をOSから追加.
- (main.c) start_threads()をOS側から移植しそれを呼び出してタスク起動するように修正.
- lib.[ch] OS側から移植.(memmove(),strchr()が追加された)
- (OSからの流用)
- (syscall.[ch],memory.[ch]) そのまま移植.
- (consdrv.[ch],netdrv.[ch],ethernet.[ch],arp.[ch],ip.[ch],icmp.[ch],tcp.[ch],udp.[ch],httpd.c) シングルスレッドにメイン関数を改造して移植.(while()ループを外して kz_recv() 成功時のみ処理するようにし,変数はstatic化する)
- tftp.[ch] シングルスレッドにメイン関数を改造,さらにバッファにファーム展開用領域を指定して移植.
- rtl8019.[ch] 割り込みまわりのサービス関数をダミーにして移植.
- kozos.[ch] シングルスレッド化して移植.(kozos_single.c にリネーム)
- command.c シングルスレッド化しブートローダー側のコマンド解析処理を追加して移植.
まあ詳しくは,OSのkozos.cと今回作成したkozos_single.cの差分を見てみると
いいだろう.あと各タスクのメイン関数の改造の差分も参考になるだろう.
なるべく変更点を少なくするような方向性で改造している.
いつもどおりビルドして h8write とかでフラッシュROMに書き込み,
起動するとこれもいつもどおりプロンプトが出力される.
で,この時点で icmp タスクとか httpd タスクとかも起動している.
マイコンボードは 192.168.10.16 になっているので,PC側を192.168.10.1にして
192.168.10.16宛にアクセスするとpingに応答するしwebページにもアクセスできる.
さらにPCでtftpサーバを立ち上げてマイコンボードで「tftp」コマンドを実行すると,
kozosというファイルを取りに行く.なのでPC側でOSをビルドして置いておくと
tftpで取得する.さらに「run」コマンドを実行すると,tftp転送したモジュールを
実行する.
実際やってみると問題なくモジュール転送し実行できる.うーん感動.
まあ実際に動作させるまでにはいろいろデバッグしているのだが,
結果だけみるとあっさり移植できている.kozos_single.c による関数呼び出し&
ポーリングベースの動作への移行がわりとすんなりできてて嬉しい.
メールは kozos(アットマーク)kozos.jp まで