Tips of optimize for SDCC with PIC18F

Sorry, Japanese only yet.

この文書では

SDCCをPIC18Fで使う上で知っとくと便利なTIPS(と言うか、コード書いてて見つけたTIPS)を随時書いていきます。

SDCCとは

フリーの(GPLv2+LEで配布されている)オープンソース組み込みコンパイラです。最新ヴァージョンは3.3です(Jul 02, 2013)

詳しくは、 http://sdcc.sourceforge.net/ 参照。

コードサイズについて(具体的なコードは後で書きます Jul 02,2013)

* Cの書き出すコードサイズに比べてプログラム領域が極めて小さいので、なによりコードサイズの圧縮が重要です( ・ω・´)

* ビット演算は、8ビット即値( foo = foo & bar)などを使うよりも、unionでビットフィールドを作った方が小さなコードを吐きます。OpenI2CRadioでは、 bitops_t 構造体を用意してあります。(See commondef.h)

* if {foo} else {bar}構造よりも、If構文の前にデフォルト値の代入(else以降のbar部分)を先に行なって、ifが成立するときにそれ(ifの中のfoo部分)を上書きするほうが圧倒的に小さなコードを吐きます。

* サブルーチンコールには、最低10バイトほど消費します。なので、簡単な関数は#define foo(x) {.... x=....} みたいな感じでマクロにしてしまいましょう。インライン展開はあるのかどうか今ひとつわかってない。

* シフト演算(<< , >>)よりも、掛け算割り算のの方がコードサイズが小さくなるようです。何故?

* これらの関係で、モジュール化に関しても、メモリリッチな通常のアプリ(これには、RTOSベースで動く大半の今時の組み込みも入る)とは違うテクニックが重要になりそうです。

拡張命令に関して

* 未だ真面目に吐かれるアセンブラコードを読んでないのですが、拡張命令付きでコンパイルすると20%近くコードが縮むもののブートすらしません_| ̄|●PIC18F45K20は拡張命令サポートしてるはずなのになぜだろう_| ̄|●

FAQ

* なぜ、XC8で未だ動かないのですか?

→ たぶんですが、割り込みの記述が拙いんだと思います。只、それをやる前にやらないとダメなことが沢山ある。(Jul 02,2013)

* なぜ、XC8で始めなかったのですか?

→ ライセンスを買わないと最適化が殆ど効かないので、オブジェクトサイズが殆どsdccと変わらない。上にGPLでこちらのコードを撒いていいのかいまいちわからなかったので、('A)マンドクセと言う感じです。(Jul 02, 2013)

* なんでアセンブラで書かないのですか?

→ 移植性が全くなくなりますから(;´Д`)だって、ATMegaとかColdFireとかあそこら辺で動かすGeekとか出ると元を作る側は幸せになれますし(;´Д`)(Jul 02,2013)

つづく。