マニュアルによると
PROGMEMはSRAMの代わりにFlashメモリ(プログラム領域)へデータを格納しますとあります。
そこで疑問を持ちました。ローカル変数ならSRAMが使われるだろうけど、グローバル変数の初期値がある場合は、何もしなくても、Flashメモリに書かれているのでは、ないでしょうか。静的領域はFlashメモリに取られるのではないのでしょうか。
でも、現実に、大きな配列を用意すると、エラーは出ませんが、動かなくなります。やっぱりSRAMを消費しているようで、PROGMEMを使って、Flashに格納したらうまく動きます。PROGMEMをつけないグローバル変数は実行の時に、FlashからRAMに転送されるのでしょうか。
ご存じの方、いませんか?
ArduinoのPROGMEMでの疑問
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: ArduinoのPROGMEMでの疑問
変数はSRAMに初期化を含めてC/C++のスタートアップが処理しているはずです。
「Arduinoメールチェッカー(その3): PS3とLinux、電子工作も」
http://todotani.cocolog-nifty.com/blog/ ... -36b3.html
PROGMEMと書くとAVRのフラッシュ専用の機械語命令コードが出力されるはずですので、フラッシュだけで処理されるはずです。
「Arduinoメールチェッカー(その3): PS3とLinux、電子工作も」
http://todotani.cocolog-nifty.com/blog/ ... -36b3.html
PROGMEMと書くとAVRのフラッシュ専用の機械語命令コードが出力されるはずですので、フラッシュだけで処理されるはずです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: ArduinoのPROGMEMでの疑問
PROGMEMのことは分からないので一般的な話ですが。
例えばC言語で配列変数を大量に外部定義しても実行ファイルのサイズは増えません。
実行ファイルがロードされた後、実行コードとは別に変数用の領域が確保されるからです。
実行ファイルの中に変数用の領域があらかじめ確保されているわけではありません。
配列変数に初期値がある場合、変数用の領域が確保されたあと、初期値がコピーされます。
この場合も、初期値を直接変数用領域として使うわけではありません。
配列変数はあくまで変数なので変数用領域を消費します。
コードや初期値はROMに置かれ、変数はRAMに置かれると考えると分かりやすいかと。
例えばC言語で配列変数を大量に外部定義しても実行ファイルのサイズは増えません。
実行ファイルがロードされた後、実行コードとは別に変数用の領域が確保されるからです。
実行ファイルの中に変数用の領域があらかじめ確保されているわけではありません。
配列変数に初期値がある場合、変数用の領域が確保されたあと、初期値がコピーされます。
この場合も、初期値を直接変数用領域として使うわけではありません。
配列変数はあくまで変数なので変数用領域を消費します。
コードや初期値はROMに置かれ、変数はRAMに置かれると考えると分かりやすいかと。
Re: ArduinoのPROGMEMでの疑問
ソフト屋さん。ISLeさん。
RESありがとうございます。
やっぱり、実行したときにflashからSRAMにコピーされるようですね。使用メモリの調べ方が、紹介してあったページにありましたから、いろいろと試してみます。.dataや.bssセクションの違いがよくわからないので、もしどこかに情報がありましたら、教えてください。だいぶ探しましたが、見つかりませんでしたので。
avr-nmコマンドにて、シンボル毎のメモリ割付を確認すれば、検討がつくのかも知れませんが。
RESありがとうございます。
やっぱり、実行したときにflashからSRAMにコピーされるようですね。使用メモリの調べ方が、紹介してあったページにありましたから、いろいろと試してみます。.dataや.bssセクションの違いがよくわからないので、もしどこかに情報がありましたら、教えてください。だいぶ探しましたが、見つかりませんでしたので。
avr-nmコマンドにて、シンボル毎のメモリ割付を確認すれば、検討がつくのかも知れませんが。
non
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: ArduinoのPROGMEMでの疑問
dataセクションは特別な初期値を持ちます。
bssはサイズだけです。
「変数の寿命とアロケーション - mkubara.com」
http://mkubara.com/index.php/%E5%A4%89% ... 7%E3%83%B3
bssはサイズだけです。
「変数の寿命とアロケーション - mkubara.com」
http://mkubara.com/index.php/%E5%A4%89% ... 7%E3%83%B3
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。