覚え書き程度の内容...
以下のツールのインストールを行った。
MacOS X 10.3.6, Xcode 1.5 (gcc 3.3) にて。
ごくフツーにインストールできる。
tar xvzf gputils-0.12.4.tar.gz
cd gputils-0.12.4
./configure --prefix=/usr/local/pic
make
sudo make install
これもごくフツーにインストールできた。 (以下の方法では z80, 8051 等にも対応するバージョンができる)
tar xvzf sdcc-2.4.0.tar.gz
cd sdcc
./configure --prefix=/usr/local/pic
make
sudo make install
インストール後に、"sdcc/support/scripts/inc2h.pl" というスクリプトを使って、インクルードファイルを作る。
(root になって)
cp support/scripts/inc2h.pl /usr/local/pic/share/sdcc/include
cd /usr/local/pic/share/sdcc/include
mkdir pic14
chmod +x inc2h.pl
./inc2h.pl 16f84 /usr/local/pic/share/gputils > pic14/pic16f84.h
./inc2h.pl 16f877 /usr/local/pic/share/gputils > pic14/pic16f877.h
(その他、必要なインクルードファイルを作る)
ちなみに sdcc が対応している PIC16系 MPU は、16f627, 16f628, 16f84, 16f873, 16f877, 16f819 である。
こいつの build にはいろいろヒネリが必要。
まずは必要なライブラリ等をそろえる。gtk+extra 以外は fink で揃えた(popt, gtk, glib, gtk+, gettext, readline, iconv ...)。 gtk+extra のコンパイルはフツーにできる。ちなみに build 後の gpsim の依存ライブラリを調べてみると、
otool -L /usr/local/pic/bin/gpsim
/usr/local/pic/bin/gpsim:
/usr/local/pic/lib/libgpsim.0.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/local/pic/lib/libgpsimcli.0.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/local/pic/lib/libgpsimgui.0.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/local/pic/lib/libgpsim_eXdbm.0.dylib (compatibility version 1.0.0, current version 1.0.0)
/sw/lib/libpopt.0.dylib (compatibility version 1.0.0, current version 1.0.0)
/sw/lib/libgtk-1.2.0.dylib (compatibility version 10.0.0, current version 10.1.0)
/sw/lib/libgdk-1.2.0.dylib (compatibility version 10.0.0, current version 10.1.0)
/sw/lib/libgmodule-1.2.0.dylib (compatibility version 1.0.0, current version 1.10.0)
/sw/lib/libglib-1.2.0.dylib (compatibility version 1.0.0, current version 1.10.0)
/sw/lib/libintl.1.dylib (compatibility version 2.0.0, current version 2.1.0)
/sw/lib/libiconv.2.dylib (compatibility version 5.0.0, current version 5.0.0)
/usr/X11R6/lib/libXext.6.dylib (compatibility version 6.4.0, current version 6.4.0)
/usr/X11R6/lib/libX11.6.dylib (compatibility version 6.2.0, current version 6.2.0)
/sw/lib/libreadline.4.dylib (compatibility version 4.2.0, current version 4.3.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 71.1.1)
NetBSD の pkgsrc から patch をもらってきた。patch なしでも build はできるが、挙動不審なものになってしまう。また、その他にも一カ所修正の必要なところがある。これら全部をまとめたものを gpsim-0.21.2-darwin.patch として置いておく。
tar xvzf gpsim-0.21.2.tar.gz
cd gpsim-0.21.2
patch -p0 < ../gpsim-0.21.2-darwin.patch
glibtoolize --copy --force
export CPPFLAGS='-I/sw/include' (shell は bash)
export CFLAGS='-O2 -I/sw/include'
export CXXFLAGS='-O2 -I/sw/include'
export LDFLAGS='-L/sw/lib'
./configure --prefix=/usr/local/pic
cp /usr/bin/glibtool ./libtool
make
sudo make install
付属の Makefile でそのまま build できるのだが ...
tar xvzf akipic-0.1.8.tar.gz
cd akipic-0.1.8
make
cp akipic /usr/local/pic/bin/
シリアルポートに、SUNTAC VS-60R (USB-Serial) を使っているのだが、ドライバが良くないのか、非常に不安定(たま〜に読み書きできるが、ほとんどの場合はエラーで終わるか、返ってこない)。どの辺でトラブっているのかと思って、akipic のソース内に printf debug 文を入れたら、何故かそれだけで急に安定した。タイミングの問題なのか、file descriptor まわりに何か原因があったのか、よくわからんがちゃんと動いているので良しとして、深くは追求しないとする。実際に加えた変更の内容は、→ akipic-0.1.8-patch こんな感じ。(この変更が有効かどうかは、環境によると思う。)
いくつかバグっぽいところも見つかっているが、ちゃんと使えている。 CCS-C ではコンパイラが勝手にやってくれたことも、sdcc では全部自分でやらなければならない。不便ともいえるが、コンパイラが勝手なことをしない=自分で全部でコントロールする、というのは、精神衛生上は良い。
主要なレジスタ、ビットはインクルードファイルに定義されており、以下のようなコーディングが可能。これはなかなか使い勝手が良い。
TRISB = 0x00; /** port B を出力に設定 **/
PORTB = 0x55; /** port B に 0x55 を出力 **/
if(RCIF) { ... } /** PIR1 レジスタの RCIF ビットを調べる **/
BIT_AT(PORTB,0) PIN_B0; /** 自分でビット定義すれば **/
PIN_B0 = 1; /** ビット単位で port B に出力もできる **/
Config Word の設定は、こんな感じで...
typedef unsigned int word;
word at 0x2007 __CONFIG = _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF;
関数への値の受け渡しと返り値の受け渡しは、1 byte なら W レジスタ経由になる。 それ以上なら汎用レジスタが使われる。
で、16f84 では、その汎用レジスタを確保する部分がうまくコンパイルされないようである。 何とか使いこなすなら、アセンブラコードにコンパイル後に手をいれるか、2 byte 以上の値の受け渡しは グローバル変数を使う、などして逃げる必要がある。
割り込み処理は、こんな感じで (1つの割り込み処理しか許可されない)
void Intr_func(void) interrupt 0 { . . . . . }
で、やはり 16f84 では、割り込み処理実行時にレジスタ退避のために汎用レジスタを確保する部分が うまくコンパイルされない。(本来、WSAVE, PSAVE, SSAVE という名前で汎用レジスタを確保する) これは今のところアセンブラコードで手を入れるしかないと思われる。
インラインアセンブラは _asm .... _endasm; で。
インラインアセンブラで、気がついたところでは ADDWF がうまく処理されない。
(例えば)
_asm ADDWF PORTB,F _endasm;
(これを -S オプションでコンパイルしてみると)
ADDWF PORTB,W
"ADDWF x,F" は、"ADDWF x,W" に勝手に書き替わるようだ ("ADDWF x,W" や "ADDWF x" としても "ADDWF x,W" になる) 。 バグか?