Arduino用に書かれたさまざまなオープンソースライブラリを使用して、Arduinoで実験しています。これらのライブラリのほとんどには何百ものメソッド/機能がありますが、実際に使用しているのはそのうちのごくわずかです。
そのような場合、Arduino はすべてをメモリにロードしますか? 言い換えれば、ライブラリから必要なものを抽出することに利点はありますか?
さらに、Arduino のメモリ管理について説明している良い記事を教えてください。
Arduino用に書かれたさまざまなオープンソースライブラリを使用して、Arduinoで実験しています。これらのライブラリのほとんどには何百ものメソッド/機能がありますが、実際に使用しているのはそのうちのごくわずかです。
そのような場合、Arduino はすべてをメモリにロードしますか? 言い換えれば、ライブラリから必要なものを抽出することに利点はありますか?
さらに、Arduino のメモリ管理について説明している良い記事を教えてください。
いいえ、違います。#include ステートメントで選択したライブラリを使用するだけです。
arduino のメモリは限られているため、必要なライブラリのみをロードし、それらをコンパイルすると、必要な関数のみがバイナリにコンパイルされます。したがって、メモリ使用量は最小限です。
arduino http://arduino.cc/en/Tutorial/Memoryのメモリモデルを見てください。かなり簡潔です。
静的リンクライブラリは、アーカイブ内のオブジェクトファイルのコレクションです。リンカはライブラリを検索してコード内の参照を解決し、そのようなシンボルを解決するために必要なコードを含むオブジェクトファイルのみを抽出してリンクします。
これがどれだけ効率的かは、ライブラリの粒度によって異なります。たとえば、すべての関数(不要な関数も含む)が単一のオブジェクトファイルで定義されている場合、リンカはオブジェクトファイル全体を抽出してリンクするため、コードが肥大化する可能性があります。理想的には、ライブラリの作成者は、オブジェクトファイルごとに1つの外部インターフェイス(または少なくとも常に一緒に使用されるインターフェイス)を定義します。
スマートリンカーは、リンカーフィードバックと呼ばれるものを実行できます。この場合、リンクは基本的に2回実行されるため、単一のオブジェクトファイル内でも参照されていないコードを削除できます。あなたのリンカーがそれをするかどうかはわかりませんが、おそらく情報はドキュメントにあります。
いずれにせよ、リンカにリンクマップを生成させて、リンクされているものとその大きさを正確に示すことができます。もちろん、多くのライブラリ関数は他のライブラリ関数に依存しているため、どのような場合でも直接参照していない可能性のあるコードが含まれていることに注意してください。
「avr-objdump -t」でエルフからマップを作成できます。および -d アセンブリ リストの場合。あなた自身のためにそれを見るように。elf ファイルを含む一時ディレクトリを表示するには、IDE の設定からコンパイルの詳細出力の表示を有効にする必要があります。
例:
C:\DOCUME~1\mflaga\LOCALS~1\Temp\build6395515806682540138.tmp>C:\projects\Arduino\hardware\tools\avr\bin\avr-objdump -t MP3Shield_Library_Demo.cpp.elf > MP3Shield_Library_Demo_wo_mem.cpp.elf.map
C:\DOCUME~1\mflaga\LOCALS~1\Temp\build6395515806682540138.tmp>C:\projects\Arduino\hardware\tools\avr\bin\avr-objdump -d MP3Shield_Library_Demo.cpp.elf > MP3Shield_Library_Demo_wo_mem.cpp.elf.lst
上記を実行し、後続のビルドの間に、ライブラリの関数メンバーへの呼び出しをコメントアウトしました。コードがアセンブリにリンクされていないことを確認します。