SourceBoost/資料

実際に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上に置くには不便すぎる。なんとかならないものだろうか


2005/07/25 komina