最適化
組み込みシステムの低レベルプログラミングは、コンピューターや携帯電話などの汎用デバイスのプログラミングとはまったく異なります。リソースは貴重であるため、効率(速度とスペース)ははるかに重要です。つまり、スペースが不足した場合に最初に行うことは、コードのどの部分を最適化できるかを調べることです。
プログラムスペース(Flash)の使用量を削減するという点では、経験の浅い場合や、そのスキルを必要としないデスクトップコンピューターのプログラミングに慣れている場合、コードサイズを最適化するのは非常に困難です。残念ながら、すべての状況で機能する「魔法の弾丸」アプローチはありませんが、スケッチが本当に必要なものを真剣に検討すると役立ちます。機能が必要ない場合は、外します。
コードの複数の部分が同じ(または非常に似ている)部分を識別することも役立つ場合があります。それらを複数の場所から呼び出すことができる再利用可能な関数に凝縮できる場合があります。ただし、コードを再利用しすぎるようにしようとすると、実際にはより冗長になることがあります。ストライキには扱いにくいバランスがあり、それは練習に伴う傾向があります。コードの変更がコンパイラの出力にどのように影響するかを調べるのに役立ちます。
ランタイムデータ(SRAM)の最適化は、慣れると少し簡単になる傾向があります。初心者プログラマーにとって非常に一般的な落とし穴は、使用するグローバルデータが多すぎることです。グローバルスコープで宣言されたものはすべて、スケッチの有効期間全体にわたって存在しますが、それは常に必要なわけではありません。変数が1つの関数内でのみ使用され、呼び出し間で持続する必要がない場合は、ローカル変数にします。関数間で値を共有する必要がある場合は、値をグローバルにするのではなく、パラメーターとして渡すことができるかどうかを検討してください。そうすれば、実際に必要な場合にのみ、これらの変数にSRAMを使用できます。
SRAMを使用するもう1つの理由は、テキスト処理です(String
クラスの使用など)。一般的に、可能な場合は文字列操作を行わないでください。彼らは大規模なメモリ豚です。たとえば、大量のテキストをシリアルに出力する場合Serial.print()
は、文字列の連結を使用する代わりに、複数の呼び出しを使用します。また、可能であれば、コード内の文字列リテラルの数を減らしてください。
可能であれば再帰も避けてください。再帰呼び出しが行われるたびに、スタックが1レベル深くなります。代わりに、再帰関数をリファクタリングして反復型にします。
EEPROMの使用EEPROM
は、たまにしか変更されないものの長期保存に使用されます。固定データの大きなリストまたはルックアップテーブルを使用する必要がある場合は、事前にEEPROMに保存し、必要なときに必要なものだけを引き出すことを検討してください。
EEPROMのサイズと速度は明らかに制限されており、書き込みサイクルの数は限られています。データの制限に対する優れたソリューションではありませんが、フラッシュやSRAMの負担を軽減するには十分かもしれません。また、SDカードなどの同様の外部ストレージとインターフェイスすることもできます。
拡張
他のすべてのオプションを使い果たした場合、拡張の可能性があります。残念ながら、プログラムのスペースを増やすためにフラッシュメモリを拡張することはできません。ただし、SRAMを拡張することは可能です。これは、データサイズを増やすことを犠牲にして、コードサイズを減らすためにスケッチをリファクタリングできることを意味します。
より多くのSRAMを取得することは、実際にはかなり簡単です。1つのオプションは、1つ以上の23K256チップを使用することです。それらはSPI経由でアクセスされ、それらを使用するのに役立つSpiRAMライブラリがあります。5V ではなく 3.3Vで動作することに注意してください!
Megaを使用している場合は、ラグランジュポイントまたはRugged CircuitsからSRAM拡張シールドを入手することもできます。