PIC16F をステて、PIC18F 一本でと思いながらも、まだ未練がある。
そんなときに、フリーのGreat Cow BASICに手を出してしまった。
open-source で、PIC16F、PIC18F 両用である。
標準ライブラリはまあまあで、Forum にも若干ある。
だが、結論から言うと、欠点が多いBASIC 言語である。
1.バグが少なくない。
<紙>が見つけた、重大なものの2件を後で示す。
2.変数は、殆どバイト型のみ。(ワード型も使えるが)
宣言文で「As Byte」は省略可。
3.原始BASICのように、変数宣言しなくても使える。
逆に言えば、デバッグ効率が落ちる。
4.割込処理が弱い。つまり、USBデバイスは作れない。
良いところは、
1.オブジェクトサイズが十分に小さい。
2.tiny bootloader に対応したオブジェクトを生成できる。
(「#option bootloader」が追加されている。)
3.参照されるサブルーチンを後で記述できる。(前方参照可能)
mikroBASIC や Swordfish BASIC は後方参照のみ可能。
C言語では、プロトタイプが必要。
4.アセンブラを使うよりは、格段に生産性を高められる。
それで、chip をまた取り替えた。今度は、PIC16F873Aにグレードダウン。
と言っても、18F2550 を外して 16F873A を挿しただけですが。
で、これまでのうち9本を移植してみた。
バグに悩まされて、Swordfish の時とは逆に、1~2日に1本のペースだった。
バグを承知ならば、PIC16F 用には十分使えるかも。
(PIC18F は試していない。Swordfish BASIC がある。)
発見した重大なバグ2件は、「Forum」→「Compiler Problems」と辿って、
「BANKSEL is incorrect」
「IntOff is incorrect」
を見て下さい。(下手な英語ですが)
BANKSEL の件は、SDCCとは逆に最適化しようとしているようだが、
複雑(?)なif 文などの場合に生成が漏れてしまうようである。
if 文はなるべく単純化することで回避した。
IntOff/IntOn については、ついにコンパイラそのものを直してしまった。
FreeBASIC で書かれているので、FreeBASIC コンパイラをDLし、
Great Cow BASIC コンパイラソースを解読した。
これで、割込処理は安心して使えそうである。
最後に、オブジェクトが小さい一例を載せる。
<紙>の結果(概数)
------------------------------- ROM used -- 主な原因
16F877A + mikroBASIC(標準 LCD lib)1,700 Word "LCD lib"
16F877A + mikroBASIC(自作 LCD lib)1,200 Word
16F877A + SDCC (自作 LCD lib)1,800 Word "BANKSEL"
18F2550 + Swordfish (標準 LCD lib)(2,220Byte)
16F873A + Great Cow (標準 LCD lib)1,140 Word
これは、「Forum」→「Open Discussion」に載せている。
お手数をおかけします。2クリック(投票を)お願いします ⇒