実際にBoostCを使っていて気づいたことなどを記録してみます。
int型のメモリ格納方式はリトルエンディアンである。
こんな共用体を作っておくと便利かも知れません。
union body { struct { unsigned char low; unsigned char high; } b; unsigned short w; };
インラインアセンブラを使用するとき、レジスタへのアクセスはC言語の時と同じく変数名を用いる。ただし先頭に'_'を付ける。気を利かせて'gbl_portb'のように記述するとエラーとなる。単に'_portb'とするだけで良い。またバンク切替は自動的に記述されるようです。どのバンクからも参照できるレジスタについては未対応。だからといってレジスタアドレスの値の直接記述はできない。
インラインアセンブラでCALL文は使えない。正確には、関数の呼び出ししかできず、自分のインラインアセンブラのラベルへ飛ばすことができない。
関数処理や配列処理は一般化されておりコード的には冗長気味。引数がWレジスタだけで済むのにメモリを使ったりしている。そこで速度的にクリティカルな場合はインラインアセンブラを使うことで回避する。例は、0〜15までの数を引数にして’0’から’F’までの文字コードを返す関数です。変数aが引数、変数bに戻り値が入ります。
void dec2hex(void) { asm { ADDWF _pcl, F RETLW 0x30 RETLW 0x31 RETLW 0x32 RETLW 0x33 RETLW 0x34 RETLW 0x35 RETLW 0x36 RETLW 0x37 RETLW 0x38 RETLW 0x39 RETLW 0x41 RETLW 0x42 RETLW 0x43 RETLW 0x44 RETLW 0x45 RETLW 0x46 } } void main(void) { char a, b; asm { MOVF _a CALL dec2hex MOVWF _b } }
Version5.8を入手したので気になった文書を日本語に訳してみることにしました。(エキサイト翻訳と自分の勘を使用しました)今までのC2Cコンパイラとは別にBoostCというのが加わったようですね。MPLABからの使用にも対応しているようです。
BoostCコンパイラヘルプ(日本語翻訳中 2005/1/23)
const型がいまいち。const指定した場合、通常のC言語の場合はROM上に置かれる。しかし、BoostCではRAM上に展開されるようだ。そのため、ちょっとサイズの大きい固定データを持とうものならコンパイルできなくなってしまう。
const char data[10] = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512 };
ただし文字列であればROMに置くことが出来る。あらたな予約語romを使って次のように定義する。
rom const char *data = "abcdefghijklmn";
しかし、純粋にテーブルなどをROM上に置くには不便すぎる。なんとかならないものだろうか