共有体(構造体)のメモリ空間

おせわになります。

コンパイラのバージョンアップしてからか、共有体のメモリ配置でトラブルが起きているので相談させてください。

unsigned char とunsigned intを混合させた構造体を宣言した時に、合計8バイトで宣言しているはずが、unsigned char型の変数が2バイト分の領域が割り振られているらしく、共有体上で、他の変数とズレが発生してしまいます。具体的には、構造体を以下のように書いております。

union CAN_TX_DATA{
    unsigned char send_tx_data[8];  //アドレス:0xfdfec ~ 0xfdff3    ・・・8領域確保されている
    struct{
            unsigned char fowd_sw;    //アドレス:0xfdfec                     ・・・先頭アドレスはおなじ 
            unsigned int  slot_data;             //アドレス:0xfdfee       ・・・0xfdfedにならず、0xfdecからの開始になっている?????
            unsigned char mode_data;        //アドレス:0xfdff0
            unsigned char dummy1;             //アドレス:0xfdff1
            unsigned char dummy2;             //アドレス:0xfdff2
            unsigned char dummy3;             //アドレス:0xfdff3
            unsigned char dummy4;             //アドレス:0xfdff4                       ・・・結果的に10領域確保され予定していたメモリを共有できていない

    }DATA;
    
    struct{                                  ・・・こちらは正常に配置されている。
        unsigned int can_data01;
        unsigned int can_data23;
        unsigned int can_data45;
        unsigned int can_data67;
    }UINT;
};

 

以上、どなたか心当たりがある方は、どうかお助けください・・・

CS+ for CA,CXのバージョンは、V4.02.00

ビルドツールは、CA78K0RのV1.72を使用しております。

Parents
  • わわいです
    そういう構造体の配置では、
    RXなんかの場合、2バイト変数、4バイト変数には、それぞれ2バイトアドレス境界、4バイトアドレス境界になるようにパディング(ダミーバイト)が入ります
    で、ルネサスコンパイラの場合は、 #pragma pack なんちゃら、で、パディングを挿入しないでツメツメで配置できるような疑似命令があったりしますが、お使いのコンパイラにはそういうのはないでしょうか。

    それがないとなると、その構造体をバイト配列でサイズ確保しておき、int変数はそのオフセットでアクセスするようにすることでしょうか
Reply
  • わわいです
    そういう構造体の配置では、
    RXなんかの場合、2バイト変数、4バイト変数には、それぞれ2バイトアドレス境界、4バイトアドレス境界になるようにパディング(ダミーバイト)が入ります
    で、ルネサスコンパイラの場合は、 #pragma pack なんちゃら、で、パディングを挿入しないでツメツメで配置できるような疑似命令があったりしますが、お使いのコンパイラにはそういうのはないでしょうか。

    それがないとなると、その構造体をバイト配列でサイズ確保しておき、int変数はそのオフセットでアクセスするようにすることでしょうか
Children
No Data