(2017年初頭から、新版(v0.96版(2016-12-23版))に対応して変更中なので注意) * 無料で使えるBasic言語コンパイラ: GCBASIC ひょんなことから :D、 GCBASICというAVR/PIC用のBasicコンパイラを見つけました。 Great Cow Basic http://gcbasic.sourceforge.net/ フォーラム http://sourceforge.net/p/gcbasic/discussion/ * 対象マイコン: PIC: PIC10F 〜 PIC18F AVR: Tiny, mega * 開発環境 IDEのインストール このページの https://sourceforge.net/projects/gcbasic/files/GCBasic%20-%20Complete%20IDE%20including%20GCGB/ 「GCGB_Installer-xx.exe」というのをダウンロード/実行します。 執筆時点では「GCGB_Installer-96.exe」。 (http://gcbasic.sourceforge.net/download.html) インストール時にオプションで多数のプログラマアプリを選択できる。 デフォルトでOFFなのでひとまず全部にチェックを入れておきます。 で、 インストールするとデスクトップ上に (1) 「Great Cow BASIC」 (2) 「Great Cow Graphical BASIC」 と2つのアイコンができます。 このブログでは(1)「Great Cow BASIC」を対象とします。(Graphicalの方はここを参照) 以下「Great Cow BASIC」を「GCBASIC」と表記する。 GCBASIC(グラフィカルでない方(GCB@Syn))は、以下のプログラマ用のエディタをベースに作られているので、 結構本格的な開発環境となっています。 SynWrite Editor http://www.uvviewsoft.com/synwrite/ * メニューの日本語化方法 GCBASIC v0.9.6ベースです。 メニューは日本語化可能です。(言語切り替えが必要) (1) 「Options」-「Customize」-「Interface」-「Program Settings」の右ペインで 「Language」-「英語(米国)」の右にある「More」をクリック、 開いたページから「language.Jap.zip」を入手する。 (2) これを任意のフォルダに解凍し、出てきた「LANG」フォルダを GCBASICをインストールしたフォルダ(GCB@Syn)下の「SynWrite」フォルダの 中にコピーした後、GCBASIC IDEを再起動します。 (3) 再度 (1) の手順をたどって行くと「Language」のところで日本語選択可能に なるので選択し、OKを押すと日本語メニューに切り替わります。 (^^)/以降はこの「GCB@Syn」IDEをベースにした記述とします。 * ここまでの感想 もう ぶっとんじゃった!! xD 発見したばかりで詳細はこれからなんだけど、 個人的にはこれが無料で使えるなら合格です。 使えるわけだけど :D こんなのあるなら、もっと早く教えて欲しかった xD * 言語仕様 http://gcbasic.sourceforge.net/help/ (1) 構造化制御文を採用。do, while, case, if else, 等々 いわゆる「構造化Basic」 Goto文もある。 http://gcbasic.sourceforge.net/help/_flow_control.html (2) 行番号不要。(1)のおかげ (3) 変数名は2文字以上必要 (4) byte,word(16bit),long(32bit)型あり。string(サイズ指定可能)型あり http://gcbasic.sourceforge.net/help/_variables.html (5) 配列は1次元のbyte型のみ http://gcbasic.sourceforge.net/help/_arrays.html (6) ルックアップ・テーブルをサポート。(5)の制限を緩和する感じ http://gcbasic.sourceforge.net/help/_lookup_tables.html http://gcbasic.sourceforge.net/help/_readtable.html (7) 関数(function)、サブルーチン(sub)定義可能 引数の参照渡し、値渡しが可能。 後述。 サブルーチン http://gcbasic.sourceforge.net/help/_subroutines.html 関数 http://gcbasic.sourceforge.net/help/_functions.html (8) 各種周辺ライブラリあり ( UART, timer, pwm, i2c, spi ...) (9) LCD, GLCDライブラリあり。その他もあり。 GLCD http://gcbasic.sourceforge.net/help/_graphical_lcd.html LCD http://gcbasic.sourceforge.net/help/_liquid_crystal_display.html (10) C言語風の論理演算子も使える http://gcbasic.sourceforge.net/help/_conditions.html (11) 固定小数(3桁)の平方根、LOG関数あり。階乗関数あり。 http://gcbasic.sourceforge.net/help/_maths.html (12) 文字列操作関数あり。 asc, chr, hex, left, mid, str, trim, 等々 http://gcbasic.sourceforge.net/help/_string_manipulation.html (13) 割込みは非常に簡単に定義、使用できる。 http://gcbasic.sourceforge.net/help/_interrupts.html PICマイコンも見た目は割込みテーブル風に使える。 割込みフラグを気にする必要はない作りになっている。 (14) DDRレジスタやTRISレジスタの設定は不要。 コンパイラが自動で方向を判断する。 PORTB.5 = 1 とだけ書けば、コンパイラが内部でTRISやLATレジスタを適切に使うコードを 吐くのでちゃんと出力できる。スゴ。 PORTx.yへの「書込み」は、LATx.yに自動でリダイレクトされる。 この自動機能をOFFにすることもできるようだ。 http://gcbasic.sourceforge.net/help/__option_nolatch.html (15) #define文あり http://gcbasic.sourceforge.net/help/_constants.html #define LED1 PORTB.5 LED1 = on の様に書ける。 (16) プリプロセッサ機能(Script) http://gcbasic.sourceforge.net/help/_scripts.html C言語風に if,ifdef等を使って複雑な定数計算ができる (17) インライン化するためのmacro機能あり http://gcbasic.sourceforge.net/help/_macros.html (18) Peek,Poke命令 http://gcbasic.sourceforge.net/help/_peek.html (19) 一行内の複文可能 コロン:で区切って複文が可能。 http://gcbasic.sourceforge.net/help/_miscellaneous.html (20) 変数の使い方 http://gcbasic.sourceforge.net/help/_variables_operations.html 注意ポイント: (1) ローカル変数なし ちょっと残念だけど、我慢しよう。 :D ここだけ、原始的なBASICと同じ感じ。 subやfunction内で変数定義してもグローバル変数となる。 引数をローカル変数的に使うことで、ある程度緩和できると思う。 (2) 構造体なし (3) print命令の出力はLCDに表示する。 http://gcbasic.sourceforge.net/help/_liquid_crystal_display.html UART出力は「HSerPrint」を使う。 http://gcbasic.sourceforge.net/help/_rs232_hardware.html (4) 引数もグローバル変数 これは、コンパイラが吐いたアセンブラを見たんだけど、 「関数の引数」は全て「グローバル変数」にマップされます。(多分) 従って、SRAMが不足したときは「引数の名前の種類」を減らした方が 効率的と思われる。 そもそも、スタックを使うようなコードは吐かれない。 スタックフレームがない感じ。 Flash書込み系: インストール時にオプションにちゃんとチェックを入れると いろいろなものがインストールされて使えます。 (1) avrdude (2) avrdudess 以前は、 yuki-Labさんのavrdude-GUI v1.05 http://yuki-lab.jp/hw/avrdude-GUI/ でしたが、今はavrdudessに変更になっている様です。 (3) ワンクリックで「コンパイル+書込み」可能 (4) 好きなプログラマをメニューに登録、実行できる 自分は「guidude」を登録した。 (5) ソースフォルダに「flashAVR.bat」があればそれをコンパイル後に自動実行可能 ワンクリックで「コンパイル+書込み」できるので、 結局これを使ってます。便利。(^^)/ まず、GCB@Syn\G+Stools\flashAVR.bat を自分のソースフォルダにコピーします。
REM Call AVRdude for Arduino programmer: "AVRdude\avrdude.exe" -c arduino -P COM7 -b 115200 -p AT%2 -U flash:w:%1:i上を「flashAVR.bat」に追加、有効にした。元からある「USBasp」の行はREMしておく。 ボーレート115200は、Arduino DuemilanoveでOptiboot用の値。 その他: (1) Terminalソフト これどっかで見たことある。かなり高機能。入力支援: (1) コード補完可能(内蔵関数のみ) 関数の引数型も表示する。 (2) スニペット登録可能 * サンプルコードの場所 インストールしたフォルダの以下にメチャメチャたくさんある。 GCB@Syn\GreatCowBasic\Demos 一部はここにある。 http://gcbasic.sourceforge.net/help/_example_programs.html * GCBASICの構成 (1) GCBASICコンパイラが単独のオープン・ソース・プロジェクトの様だ (2) それに、IDEプロジェクトが付加されている感じ。 (3) 全てオープンソースでGPLライセンス。 (4) GCBASICコンパイラ自身は、無料のBASICコンパイラを使って書かれている。 (5) GCBASICはコマンドラインから使用可能。 * AVR(Arduino)でLEDチカチカしてみた。 AVRボードはここのArduino Duemilanove互換ボードを使った。 http://mpu.seesaa.net/article/2119740.html LEDをチカチカしながら、UARTに文字列を表示するデモです。
' マイコン: ATMega328p, 16MHz #chip mega328p,16 ' For Arduino Duemilanove #define LED1 portb.5 #define USART_BAUD_RATE 115200 ' グローバル変数 bar = 0 ' UART 表示サブルーチン Sub PrintTest( count, msg as string) HSerPrint msg + " " HSerPrint count HSerPrintCRLF End Sub ' メインルーチン main Do LED1 = on Wait 500 ms LED1 = off Wait 500 ms PrintTest(bar, "Hardware UART print test") bar++ Loop簡単! (^^)/ * コード効率 ここに他のコンパイラと比較した結果がある。 http://sourceforge.net/p/gcbasic/discussion/579125/thread/61284378/?limit=25#b328 業界最強と思われるSwordfish Basic とほぼ同じコード効率をたたき出している。 もう少し別のコードでも比較してみる。 * 言語仕様解説 CHIPINOというGCBASIC用に開発されたボードの使用説明書 PDFで220ページ 文法等の詳しい解説がある。 http://www.greatcowbasic.com/uploads/9/2/9/8/9298268/gcb_chipino_user_manual_v1.0_-_sample.pdf * 引数の値渡し、参照渡し 参照渡し: 以前はできなかった様だけど、今は大丈夫になっている様です。 普通に"変数を引数にする形"で関数(sub,function)を書けば、"参照渡し"になる。sub add5s( param1 as word , ansParam as word ) ansParam = param1 + 5 end sub上の場合、param1は参照渡しにする必要はないので、値渡しのほうが良い。(後述) (1) 引数は全てグローバル変数として定義される (2) dim answer as word add5s( 1, answer ) ' add5s呼び出し後のanswerは6。 値渡し: 変数の前に「in」を付ける。 参照渡しが必要ない変数は明示的にinを付けたほうがコード削減になる。sub add5s( in param1 as word , in param1 as word ) dim tmp as word tmp = param1 + param2 .... end sub参照渡しで受け取りのみの場合: 結果を引数で受け取るだけの場合、「out」を付けるとSRAMの節約になる。sub myAdd( in p1 as word , in p2 as word, out ans as word ) ans = p1 + p2 end sub* PORT等のビット設定にはbit型を使う (調査中): 再度ドキュメントを確認する必要あり 1と0の定数そのまま使える。 PORTB.5 = 1 ' ok PORTB.5 = 0 ' ok dim state as byte state = 1 PORTB.5 = state ' NG dim state as bit state = 1 PORTB.5 = state ' ok * サブルーチンのオーバライド(Override)可能 同じ関数名で引数の型や数が違うものを定義可能。 使用時に自動判別される。 これは便利。 http://gcbasic.sourceforge.net/help/_subroutines.html * 引数の初期値付きサブルーチン・コールSub ErrorBeep(Optional OutTone As Word = 440) Tone OutTone, 100 End Sub
* 間接サブルーチンコール(IndCall) http://gcbasic.sourceforge.net/help/_indcall.html 引数なしのサブルーチンを間接的に呼び出すことが可能、 C言語の関数ポインタ風。 * Loop系 http://gcbasic.sourceforge.net/help/_flow_control.html ループを途中で脱出するときは、 「exit for」「exit do」が使える。 Doループの場合、C言語の「continue」に相当するものはないようだ。 * コンパイルサイズ比較(2) (調査中): 参照渡し、値渡しを考慮して書き直す必要がある。 自分でやってみた。 コードの参照元 http://www.sfcompiler.co.uk/wiki/pmwiki.php?n=SwordfishUser.ManchesterCode http://www.sfcompiler.co.uk/wiki/pmwiki.php?n=SwordfishUser.Comparison 上のものと微妙に違うけど、まぁ同じ。 :D GCBASIC ver.0.9 (11/5/2014) BASCOM-AVR ver.2.0.7.5 MikroBasic v6.0.0 avr-gcc v4.8.0 の4つを比較した。 以下は、GCBASICのコード。' Manchester codec for Great Cow Basic ver.0.9.11 ' Made by audin 2014/06 ' Refered to ' http://www.sfcompiler.co.uk/wiki/pmwiki.php?n=SwordfishUser.Comparison ' http://www.sfcompiler.co.uk/wiki/pmwiki.php?n=SwordfishUser.ManchesterCode ' ' For ATMega328p #chip mega328p, 16 dim Index as byte dim bitResult as bit Sub Led_blink( State As Byte ) Do If State = 1 Then Portb.5 = 1 Wait 500 ms Portb.5 = 0 Wait 500 ms Else Portb.5 = 1 End If Loop End Sub ' encode ... function Encode( pValue as byte) as word Encode = 0 ' 戻り値は不定なので、初期化が必要 for Index = 0 to 7 if pValue.0 = 0 then Encode.14 = 1 else Encode.15 = 1 end if if Index < 7 then Encode = Encode / 4 end if pValue = pValue / 2 next end function ' decode... function Decode( pEncodedValue as word, pDecodedValue as byte) as byte bitResult= 1 for Index = 0 to 7 if ( pEncodedValue & 0x03 ) = 0x01 then pDecodedValue.7 = 0 else if ( pEncodedValue & 0x03 ) = 0x02 then pDecodedValue.7 = 1 else bitResult = 0 exit for end if end if pEncodedValue = pEncodedValue / 4 if Index < 7 then pDecodedValue = pDecodedValue / 2 end if next Decode = bitResult end function Dim Orgval As Byte Dim Wencval As Word Dim Res As Byte ' main routine Do For Orgval = 0 To 255 wEncval = Encode(orgval ) Res = Decode(wEncval , pDecodedValue ) If Orgval <> pDecodedValue Then Led_blink(1) End If Next Led_blink(0) Loop end他のBasicコンパイラ用のコードはここにまとめた。 https://bitbucket.org/dinau/storage/downloads/basic-compiler-avr-size-check-manchester.zip 結果: BASCOM-AVR: 888 Byte GCBASIC : 648 Byte mikroBasic: 498 Byte avr-gcc: 372 Byte となった。 但し、GCBASICは、Decode()関数内のビットチェックがうまく動かない風なので ANDチェックに置き換えてある。(調査中) 分った。 Help - Syntax - Conditionsにこうある。 http://gcbasic.sourceforge.net/help/_conditions.htmlPresently there is no way to combine bit tests with other conditions - NOT, AND, OR and XOR will not work.「ビットチェックを他の条件と結合できない」とある。orz 但し、 BASCOM-AVRも2変数演算までしかできないという制限があったりする。orz * 予約語一覧GCB@Syn\SynWrite\HL\GreatCowBasic.acp このファイルに一覧がある。 予約語を変数名や関数名に使ってはいけない。 間違えて予約語を変数名等に使ってしまうと、 意味不明な挙動に陥る可能性がある。 Helpに一覧がないので実は重要なファイルだったりする。v0.96で消滅した様だ。orz グラフィカル開発: Great Cow Graphical BASIC Great Cow Graphical BASIC というショートカットで起動する。 教育用に使われている例: 大学で使われていました。 PIC用の記述になっています。 http://naosite.lb.nagasaki-u.ac.jp/dspace/bitstream/10069/28573/1/PIC%E3%83%9E%E3%82%A4%E3%82%B3%E3%83%B3%E5%AE%9F%E7%BF%92%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88_3e.pdf 日本語なので結構参考になるかも。 * バグ関連 <紙>さんLoG http://jn1inl.blog77.fc2.com/blog-entry-868.html 上の方のブログによると、4〜6年くらい前にいろいろバグがあったとある。 それから、時は流れた。。。 ものの そもそもフォーラムをざっと見た限り、GCBASICは最初PIC用のコンパイラだったものが 後でAVRも加わったという感じだ。 さらにフォーラムを見ると、AVRのバグ報告が多いと思う。 で、 自分もAVRのバグにさっそく遭遇してしまいました。orz 従って、 最初に使うならPICマイコンにした方が良いかも、と思います。 ただ、AVRをバリバリ使ってたくさんバグ報告をした方が、 未来のためにはなると思う。:D
2014年06月01日
AVR/PIC: 無料のGCBASICコンパイラ (発見編)2014,2017
この記事へのトラックバック
AVRでif文のネストはこちらで試したところ問題なくコンパイルできました
Windows10,
IDE/コンパイラは古いタイプのバージョン GCB_Installer-99.exe.
APPCRASH問題は
1. Windows UpdateでWindowsを最新にする
2. ウイルス対策ソフトを停止する
3. 上記と同じ古いIDEを使う
で様子を見てはどうでしょう
win10ではAPPCRASHはでませんが、コンパイルは中断されます。
問題個所は、if文のネスティングです。if文の中にif文を書くとエラーがでます。例えば、
if xxxxx then
if xxxx then
xxxxx
else
xxxxx
end if
else
xxxx
end if