PICのC化 その3
PIC16F84で,もともとアセンブリ言語で書いてあったプログラムのSDCCへの移植は,公私の案件ともほぼ完了しました^^;
そのうちの,特に重要なものについては,今後のことも考えて,16F88に移植することにしました.
16F84(A)から,16F88への移植については,あちらこちらに書いてありますが,SDCCを使っての移植についてはあまり見つからないですね.
実際やってみると,高速で割り込みがかかるようなプログラムでなければ,拡張されたconfigの設定と,ANSELの初期化くらいで動きます.
しかし,微妙なタイミングで動くプログラムの場合は,上記の設定をしてSDCCでコンパイルし直しても動いてくれませんでした.
遭遇した問題は,今のところ2点で,SDCCではデフォルトの演算が16bitで行われてしまう,ユーザーのデータ領域にもバンク切り替えがあるという点です..
インラインでアセンブリ言語を書く場合,
_asm
MOVLW 32
MOVWF _ii
_endasm
は,
_asm
MOVLW 32
BANKSEL _ii
MOVWF _ii
_endasm
としておく必要があるようです.インラインでアセンブリ言語を書くこと自体,普通は必要ありません^^;
16bit演算については,これも時間に余裕がない処理では気をつけた方がいいです.
unsigned char jj;
...
if ( jj-1 ) goto どこそか;
は,16F84では,8bitの比較として,jjから1引いて,ゼロかどうか判断するという,期待どおりのアセンブリ言語生成でした.
ところが,16F88では, ( jj-1 )を16bitとして見なすようで,生成されたアセンブリ言語の長さはもとの2倍以上になります.まあ,確かにそれが正しいCコンパイラーの所作なのかもしれません.これを避けるために,
if ( jj!=1 ) goto どこそか;
と書き直しました.これは,jjが8bitの変数ですから,8bitでの比較をするのが正しいですし,アセンブリ言語の生成もその通りになっています(ただし,BANKSELの分,16F84(A)用よりは長くなります).
結局は,生成されたアセンブリ言語を眺めてトラブルシューティングということになります^^;
- Category(s)
- PIC