オブジェクト"ファイル"が壊れる現象
先日、yukiさんから「roboBASICのオブジェクトファイルに不可解な現象が発生する」とメールを頂きまして、私はほとんど何もやってませんが、いろいろテストしてみた結果、オブジェクトファイルに関して判ったことを、大げさに報告します![]()
●不可解な現象
- 暇にまかせてネットから拾ったモーションデータや、ディアゴHPでの皆さんの投稿データを元に、マップ切替タイプのリモコンテンプレートを作成されてるそうです。
- プログラムを追加するたびに、チェックも兼ねて、roboBASICで、コンパイルしていたそうです。
- しかし、ある時、エラーも出ず、一見、正常にコンパイルされているんですが、オブジェクトファイルが変になってしまったそうです。
- ところが、RZ1Basicを使うと、正常にコンパイルされ、オブジェクトファイルは問題なく生成されたそうです。
●検証
yukiさんから添付して頂いた問題ありのコードと、問題なしのコードを、私もRZ1BasicとroboBASICを使ってコンパイルしてみました。
- roboBASICで問題なしのコードをコンパイル:
RZ1Basic=
roboBASIC=
- roboBASICで問題ありのコードをコンパイル:
RZ1Basic=
roboBASIC=
これを見る限り、RZ1BasicもroboBASICも、問題ありも、問題なしも、コンパイル結果は同じバイト数ですし、確かにエラーも出ず、roboBASICに問題があるようには感じませんでした。
なんで、最初は「な〜んだ、問題ないじゃん」と思いましたが、roboBASICによって作られたオブジェクトファイルをよくよく見てビックリ
、なんと、オブジェクトファイルが変になっているじゃあ〜りませんか![]()
ROBOBASICのプログラムは、MR-C3024の外付けEEPROMに転送されます。そのメモリーの容量は64KBです。なんで、私は64KBまでプログラムが扱えると思っていました。
2バイトの変数の扱いには、
- 符号なし2バイト整数:0から65535 (65536/1024=64KB)
- 符号あり2バイト整数:-32768から32767 (32768/1024=32KB)
があります。
オブジェクトファイルが問題なく作られているのは、32767以下で、それ以上の場合、オブジェクトファイルに問題が生じていることがわかりましたので、この時点で、roboBASICを使った場合、32KB以上のプログラムを作ることができないのかと思いました。
なかなか32KBを越えるプログラムも書けないですし、オブジェクトファイルまでチェックしていないので、32KB以上でオブジェクトファイルに問題が生じることなんて、簡単には気が付きませんよね。
●転送と起動
32KBを越えるプログラムは転送できる?起動できる?
RZ1Basicでは、32KBを越えてもオブジェクトファイルには問題がなかったため、最終的に
になるプログラムを、RZ1Basicで転送し、起動を調べてみた結果、32KBを越えるプログラムでも動かすことができることが確認されました。
roboBASICは32KB以上のプログラムを扱える?
roboBASICでは、32KBを越えるとオブジェクトファイルが壊れてしまいますが、RZ1Basicと同じ様に、最終的に合計43905バイトになるプログラムを転送してみました。
roboBASICで転送したデータを、外付けEEPROMの43900から16バイト分を読込んでみると、"2F 2B C4 7E AB"となっており、ちゃんと43905バイト転送されているようです(RZ1Basicのコマンドテスト機能を使用)。
下の図から、その転送されたコードが、正しいことが確認できます(RZ1Basicのオブジェクトコード表示機能)。
実際に、正常にロボットを起動させることも確認できました。
●まとめ
以上の結果から、
- roboBASICでは、オブジェクトコードが32KB以上になるプログラムにおいて、オブジェクトファイルが破損する。
- オブジェクトファイルが破損していても、転送されるオブジェクトコードには問題はなく、ロボットを正常に起動させることができる。
- オブジェクトコードには問題はないことから、オブジェクトコードをファイルとして保存する際に破損する。
ことがわかりました。
●資料
| 固定リンク | コメント (0) | トラックバック (0)
最近のコメント