PIC16系のUSARTとMPLAB/PICCのこと(1)
その後、調べわかったことをざっと列挙しておく。
■ PICC Liteは悪くなかった
コンパイラのバグかと思って、PIC C Liteの生成されているコードをずいぶん読んだが、当初思っていたほどひどいコード生成ではないとわかった。
PIC16シリーズはコンパイラ泣かせのアーキテクチャなのに、ずいぶん頑張っていると思う。PICCは、(私は使ったことはないが)mikroCやCCS Cよりずいぶんマシなコードを生成しているらしい。
PICC Liteの生成するコードが間違っているのかと思ってbank切り替えまわりを重点的に調べたが、私が使った限りは間違ったコードは一つも生成されていなかった。
■ PICC STD/PRO
PICCはLiteではなくSTD/PRO(有償)のほうだと、コードを半分ぐらいに縮めることが出来ると書かれていた。
早速45日評価版(STD)をインストールしてテストした。
can't generate code
というエラーが出た。
if(RCIE & RCIF)
がエラーになった。RCIE && RCIFと書かないといけないようだ。
あと
func(i*7 + j, k );
もこのエラーになった。複雑な式もエラーになるようだ。
t = i*7;
func(t + j , k );
とすればコンパイルが通った。
結果、1505byteが1366byteになった。1割ほど縮んだ。5割は縮んでいないが、最適化なしに比べれば5割という計算なんだろう。生成されるコードはなかなか上質のコードだと思う。
PICC PROのお値段は$1495らしい。PIC10/12/16で量産品の商品開発をしているなら買う価値が十分あるのかも知れない。
ただ、私がテストしたとき(9.60PL2/STD)では、bank切り替えまわりでbugっていた。(明日の日記で詳しく書く)
■ MPLABのシミュレータがおかしくなる
・ifdefの多用
PICC Lite×MPLABでifdefを多用しているとMPLABのデバッガがおかしくなって正しい実行行を指せなくなった。(デバッガとして使い物にならない!)
・USARTに疑似入力
MPLABのシミュレータでUSARTに疑似入力を与えるためのテキストファイルの書式は以下の形式のものでなければならなかった。この形式であれば正しく動作した。(マニュアル読もう…)
USARTに疑似入力を与える方法
http://www.picfun.com/mplab/V730/mplab316.html
■ MPLAB上のシミュレータは高機能
MPLABのシミュレータでは、File Registerのhex表示の他に、Program Memoryのhex表示、プログラム中の変数の値の表示、File Register名での値の表示などが出来るので非常に強力なデバッグが実現できる。
チップ自体のエミュレーションもほぼ完璧で、クロックの設定、pinの入力や、USARTのファイルからの入力/ファイルへの出力、ブレークポイントの設定などが出来る。
ここまであればFile Registerの値が変化したときにブレーク出来て欲しいが、それは出来ないようだ。
また、シミュレータで実行しているときに(シミュレータ上の)Program Memoryを直接値を変更したり、Program Memoryに逆アセしたものを表示させたり、Program Memory上で命令を書き換えたり(簡易アセンブラ機能)出来る。
ソースに逆アセしたものを同時表示するにはメニューからView→Disassembleを選択。この選択肢は、メニューのDebugのところに表示されていて欲しい気がしないでもない。