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

おせわになります。

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

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を使用しております。

  • > 共有体のメモリ配置でトラブルが起きているので相談させてください。

    「共用体」ですか?
    ja.wikipedia.org/.../共用体

    > unsigned char型の変数が2バイト分の領域が割り振られているらしく、
    > 共有体上で、他の変数とズレが発生してしまいます。

    CA78k0r のヘルプの「3. 1. 1  処理系依存 」にある

    >(21) 構造体と共用体のメンバ
    > 共用体のメンバの値がそれと異なるメンバに格納される場合,整列条件に
    > 従って格納されるため,その共用体のあるメンバへのアクセスは,整列
    > 条件に従って行われます(「(b)構造体型」,および「(c)共用体型」を参照)。

    これですね。
  • tool-support.renesas.com/.../cd_EXP_LANG23.html

    を見ると RL78 用の比較的新しいコンパイラ製品である CC-RL には構造体メンバのパッキングを行う機能が提供されているようですが

    tool-support.renesas.com/.../bd_option_compile72.html

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

    それがないとなると、その構造体をバイト配列でサイズ確保しておき、int変数はそのオフセットでアクセスするようにすることでしょうか
  • 皆様ありがとうございます。

    ちょっと前のコンパイラのバージョンまでは、わわいさんの言われるように、つめつめでビルドされていて、久々にその時のプログラムを持ってきて動かしたら???な状態になってしまいました。
    RL78のビルドオプションで何かあるのでしょうか?
    昔、RXを使っていた時には、つめつめか、パディングを選ぶオプションがあったような気がするのですが、、、

    共用体ですね。
  • これかな?
    コンパイルオプションにデータ制御,構造体メンバをパッキンするという項目がありました。
  • コンパイルオプションの「構造体メンバをパッキングする」の設定は「いいえ」と「はい(-rc)」の選択になっていて、

    CS+ CARL78 Help に
    > 2. 2. 7  構造体の空き領域を詰める
    > 構造体のメンバ変数を2バイト・アラインしないようにするには,-rcオプションを
    > 指定してください。
    > ただし,構造体以外の変数をアラインメントしないようにする方法は,サポート
    > されていません。

    とあるのでこれのようですね。