const配列宣言

こんにちは、つんじと申します。

R5F100MGをCS+forCCで使用していますが、const unisgned char配列が、32767バイトが最大で

それ以上にすると、「(E)    E0520095    eeprom.h(19):E0520095:配列が大きすぎます。」とコンパイルエラーが出ます。

プログラムサイズ的には全然余裕なので、100KBぐらいのデータを保管したいのですが、

なにか良い方法はないでしょうか?

  • つんじ さん、こんにちは。NoMaYです。#お久しぶりです。

    > 100KBぐらいのデータを保管したい

    少し確認させて下さい。上記のデータは1つの配列変数として管理したいですか?それとも、64KB未満のサイズの複数配列として管理するようなことも許容出来ますか?(たぶん、32KBは駄目だけど64KBなら可、ということは無いと思いますので、許容出来ないのだろう、とは思いますけれども。)

    CS+のCC-RLのHelpを見たところ、C言語の仕様上の事情で、仕様として、以下のようになっているようです。(まだ、RL78のMirror領域の制約の話の前の段階で、既に、こういうことになっているようですね。)

    (1) 配列の最大サイズは、基本的には、0x7fffバイトまで。
    (2) コンパイルオプションに -large_variable を指定すると、配列の最大サイズは、とある注意事項が付くが、0xffffバイトまで。

    詳細は、Helpで -large_variable を検索してみて下さい。

    なお、CC-RLでは、C言語の以下の配列要素取得文は、諸般の話が絡み合って、期待した通りにアクセスするコードが生成されませんので、ポインタをあれこれキャストして対処する文を書く必要があります。

    残念ながら使えない(もっとも、このサイズの配列は、CC-RLでは、上記の通り、定義出来ませんけれども)

    v = array[0x12345];

    こうしないといけない(もっとも、書くのが面倒なので、マクロ化して使うことになる、と思うけれども)

    v = *(uint8_t __far *)((uint32_t)pointer + 0x12345);

  • NoMaYさま

    データは32KB単位でも可能です。

    (2) コンパイルオプションに -large_variable を指定すると、配列の最大サイズは、とある注意事項が付くが、0xffffバイトまで。

    -large_variable を指定したのですが、

    配列の最大が40704(0x9f00)までしか宣言できず、これ以上だとconstセクションがオーバーフローしたとの

    エラーが出ました。

    (E) F0563100 F0563100:Section address overflow out of range : ".const" 

    あと、__far宣言したものと、していないもので2つ作ることができましたが、

     const unsigned char FPGA_DATA1[0x7fff]

     const unsigned char __far FPGA_DATA2[0x7fff]

    で64KBまでは出来ることがわかりました。

    アセンブラでデータを配置して、ポインタで参照することって出来るのかな?

  • つんじ さん、こんにちは。NoMaYです。

    考えてみると、どうしてもCC-RLでは前の投稿の最後に書いたような文になってしまいますので、いっそのこと以下のようにしてみてはどうだろうか、と思いました。

    ソース例:

    #pragma address FPGA_DATA=0x8000, FPGA_DATA2=0xC000, FPGA_DATA3=0x10000, FPGA_DATA4=0x14000 // 以後省略
    const uint8_t FPGA_DATA[0x4000];
    const uint8_t FPGA_DATA2[0x4000];
    const uint8_t FPGA_DATA3[0x4000];
    const uint8_t FPGA_DATA4[0x4000];
    // 以下省略

    char ch = 0;
    char str[100] = { 0 };

    void main(void)
    {
        ch = *(const char *)((uint32_t)FPGA_DATA + 0xfedc);
        strncpy(str, (const char *)((uint32_t)FPGA_DATA + 0xfedc), sizeof(str) - 1);

        for(;;);
    }

     
    追加するコンパイルオプション: (CS+でのGUIでの設定方法はHelpを参照して下さい)

    -far_rom

    追加するリンクオプション: (CS+でのGUIでの設定方法はHelpを参照して下さい)

    -CHECK_64K_ONLY

    それから、もともとバイナリファイルがあるような場合、バイナリファイルを直接リンクしてしまう手法もあります。

  • NoMaYさま

    ありがとうございます。

    コンパイルできました。これでなんとかできそうです。