2014年06月01日

AVR/PIC: 無料のGCBASICコンパイラ (発見編)2014,2017

AVR/PIC: 無料のGCBASICコンパイラ (発見編), 2014, 2017
(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を押すと日本語メニューに切り替わります。

(^^)/

 syn-ide.png
以降はこの「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ソフト これどっかで見たことある。かなり高機能。 gcbasic-out.png 入力支援: (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.html
Presently 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
posted by Copyright (C) avrin All Rights Reserved. at 00:00| Comment(0) | TrackBack(0) | PIC関連 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/399685697
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック