ページ 11

ArduinoのPROGMEMでの疑問

Posted: 2013年6月06日(木) 16:36
by non
マニュアルによると
PROGMEMはSRAMの代わりにFlashメモリ(プログラム領域)へデータを格納しますとあります。

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

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

Re: ArduinoのPROGMEMでの疑問

Posted: 2013年6月06日(木) 17:06
by softya(ソフト屋)
変数はSRAMに初期化を含めてC/C++のスタートアップが処理しているはずです。

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

PROGMEMと書くとAVRのフラッシュ専用の機械語命令コードが出力されるはずですので、フラッシュだけで処理されるはずです。

Re: ArduinoのPROGMEMでの疑問

Posted: 2013年6月06日(木) 17:30
by ISLe
PROGMEMのことは分からないので一般的な話ですが。

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

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

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

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

Re: ArduinoのPROGMEMでの疑問

Posted: 2013年6月06日(木) 18:05
by non
ソフト屋さん。ISLeさん。

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

Re: ArduinoのPROGMEMでの疑問

Posted: 2013年6月06日(木) 18:19
by softya(ソフト屋)
dataセクションは特別な初期値を持ちます。
bssはサイズだけです。
「変数の寿命とアロケーション - mkubara.com」
http://mkubara.com/index.php/%E5%A4%89% ... 7%E3%83%B3

Re: ArduinoのPROGMEMでの疑問

Posted: 2013年6月06日(木) 18:26
by non
ソフト屋さん、ありがとうございます。よくわかりました。では、解決といたします。