ターゲットのメモリ配置(アライメント)の注意すべき点


ISaGRAF Ver.4/5カーネルを新しいOSに移植する場合、ワークベンチデータベースで設定したメモリ配置の設定オプションは、ターゲットのCコンパイラやCPUのメモリ配置(構造体内のバイトデータのアライメント)の仕様を一致させる必要があります。




ISaGRAF Ver.4/5の場合
    ターゲット側のメモリ配置の仕様は、以下のような簡単なプログラムで確認できます。
    2つの構造体を作り、そのサイズを調べます。


    typedef unsigned char uchar;
    typedef unsigned long uint32;

    typedef struct typStruct2Types{
    uchar u1;
    uint32 u2;
    } structA;
    typedef struct typStruct3Char{
    uchar u1;
    uchar u2;
    uchar u3;
    } structB;

    main(){
    int n1=0;
    int n2=0;
    n1=sizeof(structA);
    n2=sizeof(structB);
    }

    実行結果のn1,n2の値でアライメントがわかります。以下の通りになります。

    n1 = 5 の場合
    アラインメントなし (アライメントサイズ=1バイト)
    structA メモリ境界
    u1 1バイト
    u2 1バイト
    1バイト
    1バイト
    1バイト
    n1 = 6 の場合
    アライメントサイズ=2
    structA メモリ境界
    u1 2バイト
       
    u2
     

     
     
    2バイト
     
    2バイト
     
    n1 = 8 の場合
    アライメントサイズ=4
    structA メモリ境界
    u1 4バイト
     
       
       
    u2 4バイト
     
     
     
    n2 = 3 の場合
    密着アラインメント
      structB
    structB u1
    u2
    u3
    structB u1
    u2
    u3
    n2 = 4 の場合
    密着しないアラインメント
      structB
    structB u1
    u2
    u3
     
    structB u1
    u2
    u3
     
最終更新:
2008-07-31 13:32
改訂:
1.2
評価点数:0 (0 件の投票)
Chuck Norris has counted to infinity. Twice.

このカテゴリー内のレコード

タグ