TOP > eMbedded Visual C++ Tips > 第2回 ALIGNって何?(その2 〜UNALIGNED〜)

eMbedded Visual C++ Tips 第2回 ALIGNって何?(その2 〜UNALIGNED〜)

■ Datatype Misalignment例外

 前回、XScale等RISC CPUでは奇数アドレスからのマルチバイトデータのアクセスはできないと書いた。ハードウェア的にはこれはどうやってもできないのだが、eMbedded Visual C++ではこれをソフトウェアで見かけ上実現するための魔法の言葉(そんなに大げさなものでもないか)が用意されている。

    char c[8];
    int* p;
    int q;

    p = (int*)&c[1];

    q = *p; // ここで例外発生
 このコードをコンパイルしてXScaleで実行するとqに*pを代入するところで例外(0x80000002 Datatype Misalignment)が発生する。pに代入された奇数アドレスから4バイトのデータを読み出そうとしたためである。(以下はeVCのデバッグ時のメッセージ。シグマリオンIIIを使用。)

misalignment

■ アラインされていないことを宣言する -UNALIGNED-

 これを回避する方法はいくつかあるが、最も簡単な方法は*p宣言時にUNALIGNEDキーワードを付加して、データがハードウェア固有のバイト境界にアラインされていないことをコンパイラに教えてやれば動作するようになる。(UNALIGNEDの代わりに__unalignedでも良い。)

    char c[8];
    UNALIGNED int* p;   // UNALIGNEDを宣言
    int q;

    p = (int*)&c[1];

    q = *p; // もう大丈夫

 ただし、UNALIGNEDキーワードを付加する方法も前回の構造体のパックと同様、コンパイラが特別なコードを挿入して見かけ上奇数アドレスからのデータアクセスを実現しているだけなので、速度を要求される処理の場合は注意が必要だ。

 x86ではこのようなアクセスもハードウェアでサポートされているため問題なく行えるが、レジスタへのロード時にメモリアクセスが2回に分かれたり等速度は低下する可能性がある。このようなことを頭に入れながらWindows CEプログラミングを楽しもう!

(2003/11/24)


Copyright(C) 2003 モバイル開発系(K) All rights reserved.

[Home]