外部変数のRAM上の配置について

Hewを使ってH8/3048Fで動作させるF/W開発を行っています。

外部変数を、定義した順にRAM上に配置させる事はできますでしょうか?

たとえば、あるCソース上で外部変数を

int a;

int b

char c;

int d[2];

というように書いてビルドした時、マップファイルをみると、a,b,c,d,・・・の順で

配置されていませんでした。Hewからの設定、または pragmaなどを使って

順番に配置させることはできるのでしょうか?

昔、H8をIARで開発していた時や、78K0をCubeSuiteで開発していたときは、定義した順番で

配置されていた記憶があるのですが。。。やはりコンパイラに依存するものなのでしょうか?

大して重要な事ではないのですが気になって質問しました。

  • 「大して重要な事ではない」とのことなのでレスポンスをつけるのもどうかとも思ったのですが

    #if 1
    #pragma section 0
    int a;
    #pragma section 1
    int b;
    #pragma section 2
    char c;
    #pragma section 3
    int d[2];
    #pragma section
    

    とそれぞれの変数を別のセクションとして宣言し、各セクションについてツールチェーンの最適化リンカの設定でセクション B の後に B0, B1, B2, B3 を追加してビルドを行えば

         SECTION=B0
                     _a
                                     00ff9420
         SECTION=B1
                     _b
                                     00ff9422
         SECTION=B2
                     _c
                                     00ff9424
         SECTION=B3
                     _d
                                     00ff9426
    

    各セクションの並びは設定の通りとなるので変数の並びもその通りとなりますね。

  • わわいです
    言語仕様的には配置順ってのは定義されてないので、あえて順番にこだわるんであれば、セクションを定義して割り振るか、あるいはその変数を全部構造体にしてまとめてしまう、ってぐらいですねー
    まあ、一般的には、ソースで出て来る順番で配置されていくもんだとおもいますが、コンパイラやリンカの最適化で、順番が変えらたりとかありそーなはなしではあります
  • fujita nozomuさん、わわいさん、お返事ありがとうございました。
    セクションか構造体を使うしかなさそうですね。
    ありがとうございました。
  • > セクションか構造体を使うしかなさそうですね。

    大域変数の記述をアセンブラで行うことでも可能です。

    #pragma asm
            .section b,data,align=2
            .export _a
            .align 2
    _a:
            .res.w 1
    
            .export _b
            .align 2
    _b:
            .res.w 1
    
            .export _c
    _c:
            .res.b 1
    
            .export _d
            .align 2
    _d:
            .res.w 2
    #pragma endasm