ArduinoのPROGMEMでの疑問

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
non
記事: 1097
登録日時: 13年前

ArduinoのPROGMEMでの疑問

#1

投稿記事 by non » 11年前

マニュアルによると
PROGMEMはSRAMの代わりにFlashメモリ(プログラム領域)へデータを格納しますとあります。

そこで疑問を持ちました。ローカル変数ならSRAMが使われるだろうけど、グローバル変数の初期値がある場合は、何もしなくても、Flashメモリに書かれているのでは、ないでしょうか。静的領域はFlashメモリに取られるのではないのでしょうか。

でも、現実に、大きな配列を用意すると、エラーは出ませんが、動かなくなります。やっぱりSRAMを消費しているようで、PROGMEMを使って、Flashに格納したらうまく動きます。PROGMEMをつけないグローバル変数は実行の時に、FlashからRAMに転送されるのでしょうか。
ご存じの方、いませんか?
non

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: ArduinoのPROGMEMでの疑問

#2

投稿記事 by softya(ソフト屋) » 11年前

変数はSRAMに初期化を含めてC/C++のスタートアップが処理しているはずです。

「Arduinoメールチェッカー(その3): PS3とLinux、電子工作も」
http://todotani.cocolog-nifty.com/blog/ ... -36b3.html

PROGMEMと書くとAVRのフラッシュ専用の機械語命令コードが出力されるはずですので、フラッシュだけで処理されるはずです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: ArduinoのPROGMEMでの疑問

#3

投稿記事 by ISLe » 11年前

PROGMEMのことは分からないので一般的な話ですが。

例えばC言語で配列変数を大量に外部定義しても実行ファイルのサイズは増えません。
実行ファイルがロードされた後、実行コードとは別に変数用の領域が確保されるからです。
実行ファイルの中に変数用の領域があらかじめ確保されているわけではありません。

配列変数に初期値がある場合、変数用の領域が確保されたあと、初期値がコピーされます。
この場合も、初期値を直接変数用領域として使うわけではありません。

配列変数はあくまで変数なので変数用領域を消費します。

コードや初期値はROMに置かれ、変数はRAMに置かれると考えると分かりやすいかと。

non
記事: 1097
登録日時: 13年前

Re: ArduinoのPROGMEMでの疑問

#4

投稿記事 by non » 11年前

ソフト屋さん。ISLeさん。

RESありがとうございます。
やっぱり、実行したときにflashからSRAMにコピーされるようですね。使用メモリの調べ方が、紹介してあったページにありましたから、いろいろと試してみます。.dataや.bssセクションの違いがよくわからないので、もしどこかに情報がありましたら、教えてください。だいぶ探しましたが、見つかりませんでしたので。
avr-nmコマンドにて、シンボル毎のメモリ割付を確認すれば、検討がつくのかも知れませんが。
non

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: ArduinoのPROGMEMでの疑問

#5

投稿記事 by softya(ソフト屋) » 11年前

dataセクションは特別な初期値を持ちます。
bssはサイズだけです。
「変数の寿命とアロケーション - mkubara.com」
http://mkubara.com/index.php/%E5%A4%89% ... 7%E3%83%B3
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

non
記事: 1097
登録日時: 13年前

Re: ArduinoのPROGMEMでの疑問

#6

投稿記事 by non » 11年前

ソフト屋さん、ありがとうございます。よくわかりました。では、解決といたします。
non

閉鎖

“C言語何でも質問掲示板” へ戻る