ようやくトランジスタ技術誌8月号を仕入れたので早速付録78K0マイコンの動作テスト。本誌5章の説明通りにプログラムを打ち込んで動作させようとするとリンクエラーになるが、これについては著者の内藤さんのサイトに訂正が出ている[なひたふJTAG日記 - トラ技78Kマイコンのコンパイルエラー]。また、サンプルプログラムのアーカイブに含まれているものでは問題ない。で、これをちょいといじって蛍のようにぽわぽわと明滅するようにしてみた。
#pragma sfr #define TIME 400 void main() { PM6.1 = 0; // LED のポートを出力用にする while(1) { short i, j; for (i = 0; i < TIME; i++) { P6.1 ^= 0x01; // LED のポートを点滅 for (j = 0; j < i; j++) { ; } P6.1 ^= 0x01; for (; j < TIME; j++) { ; } } P6.1 ^= 0x01; } }
このコードをサンプルの設定のままビルドすると次のようなエラーが出る。
RA78K0 error E3405: Undefined symbol '_@RTARG0' in file 'sample1.rel' RA78K0 error E3405: Undefined symbol '@@iscmp' in file 'sample1.rel'
少しばかり悩んでしまったが、これは本誌記事 Appendix B にあるように意図せずにライブラリ iscmp が呼ばれているためのエラーだ。明示的なライブラリ関数がなくとも、コンパイラが演算処理を関数呼び出しに置き換えている。Appendix A の通りコンパイルオプション(標準のライブラリを使用する)とリンカディレクティブを編集する(MERGE @@LCODE := IXRAM の行を有効にする)ことで解決した。しかし「ライブラリについてはまだまだ未解明であり、確実な動作保障ができる方法ではない」と言うのは困る。この程度の数値比較をライブラリを呼ばずに済ます方法はないのだろうか。
[追記]
short で宣言している変数 i, j を unsigned char として TIME を 255 以内にすれば、標準ライブラリをリンクせずにビルドできた。C コンパイラ(CC78K0)のマニュアル、付録C ランタイムライブラリ一覧を見ると、整数のインクリメントや比較などの単純な演算でもライブラリ関数が使われる。8 bit 符号無し整数(unsigned char)に限定すればあまり使われないようだ。
FTDI の USB-UART コンバータとか、この手のデバイスドライバを複数入れるとシステムの具合が悪くなることがある。そうした場合には「新適当マイコン電子工作研究所 - USB プロジェクト - デバイス・ドライバを入れ替える」の tsuneo さんのコメントにある方法で、現在接続していないUSBデバイスのインスタンス(Hidden あるいはPhantom device)をデバイスマネージャー上で表示させて、それらを削除してから改めてインストールすると回復できたりする。
Posted by masato at 08:50 PMおそらく携帯電話等からは投稿できません。日本語文字列を含まないコメントやトラックバック、および当サイトへの言及を含まないトラックバックは御遠慮いただいております。また、90日以上経過した記事へのコメントはできません。