メモリサイズ

このトピックには 6 返信 、 2 ボイス が含まれます。 最終更新 by  Naka 2 年、 1 月 前.

表示中の投稿 1 (合計 7 中)
  • 著者
    投稿
  • #2127

    Naka

    プログラム内で、配列を確保できますが、
    byte buf[BUFFER];

    単純に setup() 内で配列だけ確保するプログラムの場合、
    どれぐらいのサイズまで確保できるのでしょうか?

    buf[10][256];

    ぐらいを確保したいと思っているのですが、大丈夫でしょうか?

    #2129

    Lazuriteの開発者 1号
    キーマスター

    Lazurite Sub-GHzの場合、関数内で宣言されたメモリはスタックメモリ内に確保されるのですが、そのスタックメモリは512バイトとなっています。
    よって、256*10 = 2.56kバイトはメモリ領域がありませんのでご動作をするはずです。

    確保できるメモリ容量はプログラムの構造の深さにもよりますので一概に申し上げることはできませんが、32バイト程度を目安にして頂ければと思います。

    #2134

    Naka

    32 byte じゃ、、何もつくれませんね。。。
    測定器からのデータが、すでに50バイトあるのですけど。。

    もっとメモリを増やしてほしいですね。

    #2137

    Lazuriteの開発者 1号
    キーマスター

    Lazurite Sub-GHzは、いわゆる組込マイコンになります。組込マイコンは通常のコンピュータと比較するとメモリに制約があります。その中でもコンピュータにない概念はスタックメモリと呼ばれるものです。
    関数を呼ぶということは、関数が終了したときに戻る場所や、関数内で使用していた情報をすべて記憶した状態で次の関数を呼ぶことになります。
    これらの情報をすべて記憶しておくメモリがスタックメモリであり、Lazuriteではそれを512バイトに設定しています。

    Lazuriteの無線パケットは最大で250バイトになっているのですが、ちゃんと250バイトのデータを送受信することができます。
    それを実現する方法は「print_subghz.c」を参考になさっていただければと思います。
    30行目で256バイトのメモリ空間を準備しています。関数の外でメモリを確保すると、スタック領域ではない領域にメモリを確保します。
    比較的大きなメモリは、このように関数の外でメモリを宣言して頂けるようお願いします。
    同じ領域のメモリを関数内で宣言すると、スタックポインタに割り当てられて正常に動作しないシステムになります。

    メモリに制約を受けない設計がご希望の場合はLazurite Pi Gateway+Raspberry Piを組み合わせたゲートウェイで親機を開発して頂ければと思います。

    #2138

    Naka

    関数の外(外部変数?)とした場合、
    buf[10][256]
    は、確保可能でしょうか?

    (いろいろ依存する部分はあると思いますが、、setup(), loop() も、空とした場合)

    #2153

    Lazuriteの開発者 1号
    キーマスター

    print_subghz.cのサンプルプログラム中に、
    uint8_t buf[10][250];
    を挿入して実行すると、正常にコンパイルが完了しますが、
    uint8_t buf[100][250];
    に変更すると、LazuriteIDEのコンソール部分に次のようなメッセージが表示され、bufがメモリにマッピングできないというエラーを表示します。

    *******メモリが確保できなかった時のログ ******
    Loading segments and symbols…
    Allocating segments…
    Error E015: Segment not allocated ‘_buf’

    Discontinue! Allocation error detected.
    Link error occurs. Stopped build.
    *******メモリが確保できなかった時のログ ******

    一番左の「ビルド」ボタンを押してコンパイルのみを行うと、プログラムが格納されているフォルダにコンパイル時に生成される中間ファイルが多数残ります。
    (「ファイル」 -> 「環境設定」 -> 自動クリーンのチェックを外しても、中間ファイルを残すことができます。)

    この中間ファイルに、「プログラム名.map」というファイルが生成されますので、そのファイルをテキストエディタで開くと、メモリのマッピング状態を見ることができます。

    以下は、bufのサイズを2500バイトにしてビルドした時にできたmapファイルの475行目付近です。

    ①500行目に、「_buf」という名称で2500バイトのメモリが確保されているのが分かります。
    ②479行目から、メモリの空き空間576バイトのメモリが余っていることがわかります。

    #2163

    Naka

    完璧な回答、ありがとうございます。
    これで、安心して、設計できます!

表示中の投稿 1 (合計 7 中)

フォーラム「Lazurite Basic/Sub-GHzのソフトウエアについて」は閉鎖されていて、新しいトピックも返信もできません。