<紙>さんLOG

「パソコンヲタクの雑記帳」
 PC/Linux系/物理・化学で遊んでいます。
思いついたことを綴っています。

PIC(13) GCBC

2008年07月03日 | PIC・マイコン
                                                日記@BlogRanking
 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クリック(投票を)お願いします ⇒ 日記@BlogRanking

最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。