ScalaやらGoやらclojureやらKotlinといった華々しいモダン言語の世界とは真逆で、組み込み屋の言語発達は遅いです。アセンブリです。良くてCです。それもC88だったりすますデス(遠い目)。
また、政治的理由によりドマイナーなマイコン使わされると、なんだか聞いたこともないようなドマイナーなコンパイラーを使わされることになります。
このときに困るのが、エディタがそのマイナーコンパイラーの「方言」に対応していないことです。まぁ、個人的にはEmacsで良くね?と思いますが、そこも政治的いろいろな理由が絡むことがあります。
そのマイナーなコンパイラの一つに、SDCCというC88のコンパイラーがあります。
このSDCCの方言に対応したEclipse CDTの言語パーサー作ったのでご報告。
インストール
新規ソフトウェアのインストールからサイト「https://nodamushi.github.io/nodamushi_sdcc/」を入力し、インストールしてください。たぶん、必須ライブラリも勝手に入ると思います。
設定方法
プロジェクトの設定画面の「C/C++ General」→「Language Mappings」でContent typeが「C Source File」と「C Header File」に対してLanguage「SDCC」を割り当ててください。
SDCCしか使わない、という人はプロジェクトごとに設定するのではなく、ワークスペースの設定のLanguage Mappingsで設定することもできます。
使い方と注意点
SDCCの方言をざっと挙げると、以下のようなものがあります。
//変数の配置場所を明示できる __xdata __at(0xF800) unsigned char hoge; //割り込み指示とかを書ける void test() __interrupt __reentrant; void test() __interrupt(1) __reentrant{ //インラインアセンブラ(旧式) __asm nop nop nop __endasm; // critical block __critical{ } }
この方言を単にEclipse CDT上で書こうものなら、以下のようにエラー警告地獄になります。
今回私が作ったプラグインをLanguageに設定しておくと、こうなります。
やったね!エラーが消えたよ!
ただし、いくつかの注意点があります。
- エディタ上でエラーが出てなくても、コンパイルは通らないかもしれない
- __sbitなどはint型と解釈されてしまう
- __asm~__endasmの間は何も解析していない
- シンタックスハイライトの機能ではないので、__asm~~__endasmの中のコメント等も通常のCと同じように表示される
- __interruptなどの指示をした後に改行するとインデントが変
1については、まぁ、一番重要なのは構文エラーじゃないところでエラーが出ることを解消することだったんで。。。特にC99を元にしてパーサーが作られているので、変数宣言をどこでやってもエラーにならないなど、実際のSDCCとは異なっています。ビルドしてからじゃないと問題がわかりません。SDCCにsyntax-onlyみたいなオプションがあれば、エラーチェックはそっちに任せられるんだけどなぁ。
2については、現状諦めた。__sbitと__bitをBuiltin型に指定しようと努力はしたんだけど、良くわからんかった。3,4については、まぁ警告の黄色い線が出なくなっただけでもましと思ってください。
5について何ですが、関数定義の後に、__interruptなどの指示をつけ、改行してから{を書くと以下のようになってしまいます。
void main() {//<- ok } void test() __interrupt(1) __reentrant{ }//<= indent ok void test1() __reentrant { // <- (´・д・`) int test; } // <- (´・д・`)
改行せずに{を書くと変にはならないので、改行しない書き方を標準としてください。
手動ダウンロード
手動でインストールしたい人はここからダウンロードしてください。
github.com
手動インストール方法:
- 依存ライブラリのC99 LR Parserを導入する
- 上記のダウンロードのところからzipを落としてきて、展開したものをdropinに突っ込む
1. C99 LR Parserのインストール
まずは、C99 LR Parserが入っているかどうか確認してください。「help」→「Installation Ditails」の「Plug-ins」タブを選択し、「lrparser」で検索してください。インストールされている場合は、こんな感じになります。
インストールがされていない場合は、「Help」→「Install New Software」でCDTのアップデートサイトを選択し、「CDT Optional Features」の中の「C/C++ C99 LR Parser」をインストールしてください。
2. SDCCパーサーのインストール
ダウンロードしたzipを展開したものをEclipseが保存されているディレクトリにある「dropin」に入れる。