2010年4月15日木曜日

はまった(T_T)イエロースコープ

H8シリーズのマイコンを仕事で利用したりします。
それまでは、机上デバッグでした。
ソースとにらめっこで頭の中でシミュレートし、バグを探すのです・・・。

先日、客先から要望があり、イエローソフトのイエロースコープなるものを使うことになりました。
初めての開発環境は、それなりにハマったりしてたくさんの時間を費やすのが普通です。

今回も初めてのイエロースコープでたっぷりハマったのでいくつか報告します!

○リンクできない!

昔ながらの開発環境では、コンパイラ・アセンブラ・リンカ・ライブラリアンがセットになっています。
しかしイエローソフトの開発環境では、リンカとライブラリアンが統合されている様な感じです・・・。

これハマりました。orz

私の頭の中では、リンカはすべてのオブジェクトをリンクしてくれると思っています。
しかしイエローソフトでは、ライブラリアンの機能も加わって、参照されたオブジェクトのみリンクされるのです。
一見便利そうな機能です。
無駄なオブジェクトは自動的に削除されるのでメモリの節約になります。

ところが、プログラムコードでは明示的に参照されなくても動的に参照されるオブジェクト部分・・・

これリンクされません。

動的に参照されるので、シンボルが無いのでリンカが勝手に削除してくれるのです。
おかげでプログラムが暴走しまくり・・・

これに気付くのに数日かかりましたよ。

イエローソフトのリンカは、明示的に参照していないオブジェクトはリンクしません。
注意してください。

○割り込みベクタ

H8/300hでは、割り込みベクタテーブルが64本用意されています。
計256バイト(100H)を000000Hから配置しています。

なのでプログラム開始は、通常100Hになるのですが・・・

64本すべてを利用していないチップのスタートアップルーチンでは、利用していない後ろの部分を削除してプログラム開始アドレスが100Hより前になったりします。

これもハマりました。

私が使ったチップは、64番割り込みまで実装されているチップです。
イエローソフトが用意したスタートアップルーチンは、60番までしか割り込みが定義されていません。
このため、61~64番までのベクタテーブルがプログラム領域と重複してしまい、ある割り込みが発生する度にプログラムがリセットされてしまいました。

分かれば簡単な落とし穴でした。
以後注意します。

上記問題が解決するまでは、イエロースコープ(デバッガ)が使えませんでしたが、もう使えます。
これから効率が上がる事でしょう。



このサイトは、広告収入により運営しております。