0

私は最近、フラッシュ メモリが 2kB しかないマイクロコントローラ用の組み込みソフトウェアを C 言語で開発しています。プログラミングの終わりに近づいて、コードの制限に達しています。これまでは、この問題が発生した場合にコンパイラの最適化のレベルを上げて、再テストを行ってから、楽しく続けてきました。しかし、最近最適化の限界に達し、最後の機能を追加したところ、再びメモリ不足になりました。その結果、George Foreman にソース コードを公開して、無駄を省かなければなりませんでした。

私はあちこちでいくつかの抽象化の層を減らすことにいじりました。これは問題をわずかに改善しましたが、十分ではありませんでした。次に見たのは、関数プロトタイプを持っていることでした

void process_event(Event event, void *data);

これは、処理するイベントと、呼び出しに追加データを渡すために使用できるvoid ポインターをパラメーターとして取ります。余分なデータが必要ない場合は、合格しNULLました。この関数は、開発の非常に早い段階で作成されたもので、 を使用したことがないことに気付いたdataので、除外しました。この 1 つの変更により、必要なコンパイル済みコードのサイズを節約できました (~100バイトNULL) process_event

4

1 に答える 1

1

約 100 バイトは、関数が呼び出されるたびに呼び出しサイトが追加の引数を渡さなければならないという事実とおそらく一致します。これには、少なくともレジスタのクリアが必要であり、チップによっては、それを呼び出しの前にスタックします。

また、呼び出しごとに 1 つの命令を単純に削減すると、ジャンプの実装方法によっては、より多くのコードが削除される可能性があります。これは、一部のコードが短い相対オフセットを使用するジャンプ命令の範囲内にあることがわかる場合があるためです。長いものではなく。定数をロードしようとすると、同様の節約ができます。

于 2012-10-16T14:10:12.917 に答える