MDKコンパイラの最適化に関する注意事項

最適化コンパイラは、最適化レベル02を開いて、MDKコンパイラの最適化レベルが比較的高い機能である最初の使用時には発見されないブログの要約をたくさん読んで試運転、異常があらわれました。

  • あなたのメインプログラムが使用する場合、変数は、だけでなく、揮発性の修正を追加するために、割り込みを使用します。これはかなり前にキャッシュ内のレジスタの値を使用するよりも、そのプログラムコンパイラ、データはRAMから毎回内部を読んでいるときことを、変数は随時変更される可能性があり、コンパイラに指示します。
  • 変数は、パブリックタスクの数で使用されている場合はマルチタスクプログラムの場合、揮発性の修正を追加する必要があります。
  • 同時に、変数は、キーワード揮発性の修正を使用して定義する場合、他の文書が参照されたときに、コンパイラによって離れて最適化されるように、揮発性の変数の変更なし。今MDKは、コンパイル時に順番に、それについて考える、理由は非常に単純ですが、複数のファイルを別々にコンパイルされ、その後、最終的には、リンカーのリンク別のモジュールは、変数の宣言は完全に信頼されたときにモジュール参照変数をコンパイルするときに、文が揮発性を追加しない場合は、参照先のモジュールは、元の変数に追加された場合、その後、逆推力は、揮発性の通常の変数として確実に変数をではないだろうが、声明は、揮発性の追加時に、このモジュールで参照されていないとして、変数になりますvolatile変数を

  CコンパイラCの各ファイルをOBJにコンパイルされる基本単位と呼ばれるモジュールとしてコンパイルされ、アクセス・モジュールとの間の関数または変数が参照符号によって達成される、参照符号は、任意のプロパティを持っていない、唯一の利用可能にのみリンカによって使用されるシンボル名、label属性は完全に決定するために、ローカルコールのプロトタイプ宣言に依存しています!したがって、あなただけ.Cモジュールに別のモジュールでは、この変数を使用し、それを最適化するようにコンパイラに教えていない、.Cモジュールが揮発性である定義が、彼らはそう、どのような変数の属性を知りません唯一のプロトタイプ宣言により、コンパイラに情報を伝えるために。

最後に、シンプルに要約する:DOは属性情報は、さまざまな出力シンボルであるブリッジの各モジュールに連絡することであるプロトタイプ宣言を、過小評価しません。コンパイラの理論はああ理解していない損失を比較することです。

最後にコンパイルオプションのいくつかのMDKの説明を追加します。

USEクロスモジュールの最適化

 クロスモジュールの最適化は、未使用の機能を以前のビルドから情報を取得し、それを使用する対応するオブジェクトファイル内の独自のELFセクションに。このオプションは、リンカフィードバックとして知られている、我々は、コードサイズを小さくするためにそれを使用するために、二回のプログラムを構築する必要があります。

使用MicroLIBMicroLIB

それは1つが埋め込まれたCライブラリのサイズに最適化されたアプリケーションプラットフォームを減らすことができるということです。彼は、いくつかの標準のCライブラリ関数のmemcpyが遅いマイクロコントローラの動作速度に適用されるようなトレードオフ性能およびコードサイズとの間を提供するために、標準のCライブラリのサブセットです。オリジナル(デフォルトライブラリの一部の機能がサポートされていませんが、このようなmemcpyのような標準のCライブラリ関数のいくつかは()、遅くなります。)ここで、デフォルトでは、ライブラリは、機能の一部をサポートしていないことを言いました:

含みます:

  1. オペレーティングシステムの機能、例えば、アボート()、出口()時間()、システム()、(GETENV)
  2. ワイドおよびマルチバイト支持体、例えば同時にmbtowc()、wctomb()
  3. I / O機能、標準入力、stdoutとstderrを除いて標準入出力ファイル
  4. かかわらず、位置およびスレッドセーフコードの

タイムコード生成・リンク(このオプションは、新しいバージョンのようではありません)
、コードジェネレータは、リンカーは、さらに、コードの最適化を実行できるように、中間フォーマットへのオブジェクトリンクを作成するようにコンパイラに指示します。これはコード・ジェネレータは、同時に、それは洗練のより高いレベルを適用することができ、すべてのオブジェクト間でのファイルの依存関係を表示することができます。リンクコード生成は、コードサイズを縮小し、アプリケーションを高速に実行することができます。
最適化レベル

最適化のさまざまなレベルでは、情報とのレベルの間で利用可能なコードにコンパイルされたコードをデバッグ、パフォーマンスのトレードオフを行うことができます。利用できる以下の最適化レベル:
-O0使用最小限の最適化。
ほとんどの最適化は、最良のデバッグビューで生成されたコードを閉じています。
-O1限られたアプリケーションの最適化。
例えば、未使用のインライン関数と、未使用の静的関数を削除します。最適化のこのレベルでは、コンパイラが自動的に、そのような事態を避けるために連動冗長コードと再発注指示を削除するなどのアプリケーションを、最適化します。生成されたコードは、合理的な最適化の後、デバッグが良いのビューを持っています。
-O2高い最適化アプリケーション(これはデフォルトの設定です)。
このレベルで最適化アプリケーションは、ARMプロセッサの動作中に目標の特定のセットの使用のプロセッサアーキテクチャに関する深い知識を活用します。これは、最適化されたコードが良いですが生成されますが、限られたデバッグビュー。
最も肯定-O3最適化アプリケーション。
最適化-Ospace / -Otimeユーザーの選択を満たしています。デフォルトでは、複数ファイルのコンパイルは長いコンパイル時に生じる可能性がある、有効になっているが、最高レベルの最適化を提供します。

時間は、最適化のための
「最適化」チェックボックスをチェックするときまたは最小コードサイズが(-Ospace)選択したときのパフォーマンス(-Otime)最良の結果を達成するためにもっと注意を払う、コンパイラの最適化を可能にします。
チェックを外し価格のための画像ファイルのサイズを小さくするために、実行時間増加の可能性への最適化を実行するようにコンパイラーに指示し時間平均選択-Ospaceオプション、のために最適化します。例えば、非インライン関数呼び出しではなく大型のインラインコードのレプリカ構造。これがデフォルトのオプションです。コマンドラインコンパイラからの実行は、このオプションを呼び出し使用「-Ospace」が最適化コードの実行に最速タイムをコンパイラに指示-Otimeオプション、のための最適化を選択した場合は、画像ファイルのサイズを大きくすることが可能です。あなたのコードのコンパイル時の重要な部分は、-Otime残り使用-Ospace命令を使用することをお勧めします。

スプリットロード・ストア倍数は、
LDMおよびSTM命令は、ロード/ストアの小さい複数のレジスタのシリーズに分け多数のレジスタを必要とするようにコンパイラに指示します。レジスタLDM 16は、それぞれ4つのレジスタからなる4つの別々のLDM、LDMに分けることができ、この手段。このオプションは、削減することができますまたは割り込みレイテンシはARMシステムバッファの書き込み、および、ゼロ・ウェイト・ステート・メモリ32ビットシステムの使用にキャッシュされていません。
例えば、ARM7 ARM9プロセッサ、および命令境界においてのみ異常。例外はLDMバッファなしARM7とARM9システム16個のレジスタの最初に発生した場合、システムが異常取得する前に、メモリ16へのアクセスを完了します。非常に高い割り込み遅延をもたらすことができるメモリ調停システム、。4×4の独立したレジスタにLDM分割は大幅割り込みレイテンシを低減、4個のレジスタまでロードした後に異常なプロセッサ手段をLDM。システム全体のパフォーマンスを向上させるためには、このオプションを選択します。
一つのELFセクション機能ごとの
オプションは、それぞれのELFセクションのすべての機能を置くようにコンパイラに指示します。この機能は削除未使用で.elfコードセクションへのリンカーは、一般的に、コードの多くの機能が含まれていることができます。ELFリンカーは通常のみ代わりに使用されていない機能のうち、未使用部分を削除します。すべての内容は未使用されている場合にのみ、あなたはELFの一部を除去することができます。したがって、各分割機能は、コンパイラが未使用のどの部分を識別することは容易でELFを所有することができ、それを削除します。このオプションを選択すると、コードをコンパイルするのに必要な時間が長くなりますが、それは、パフォーマンスを向上させることができます。

共通の目的の最適化オプション

最小オブジェクトコード:

選択
microlibをで•Cライブラリ
•クロスモジュールの最適化
•最適化レベル2(-O2)

コードのパフォーマンスの最高のパフォーマンス:

选中
•クロスモジュールの最適化
•最適化レベル3(-O3)
•最適化のための時間

最後にロングコードと同じくらい簡単に言えばは、関係なく、もし一方、達成することが難しいだけの増加にコードを最適化することは推奨されませんどのように高コンパイラの最適化のレベルは問題ありませんので、時間を最適化するために必要なリソースがなかった論理的に十分ではありませんあなたは、コードが削減されます悪用し、コンパイラのロジックを最適化し、この時点で0に完璧なバックに最適のレベルで0最適化問題の下に安定化機能を追求することができます。

  • あなたのメインプログラムが使用する場合、変数は、だけでなく、揮発性の修正を追加するために、割り込みを使用します。これはかなり前にキャッシュ内のレジスタの値を使用するよりも、そのプログラムコンパイラ、データはRAMから毎回内部を読んでいるときことを、変数は随時変更される可能性があり、コンパイラに指示します。
  • 変数は、パブリックタスクの数で使用されている場合はマルチタスクプログラムの場合、揮発性の修正を追加する必要があります。
  • 同時に、変数は、キーワード揮発性の修正を使用して定義する場合、他の文書が参照されたときに、コンパイラによって離れて最適化されるように、揮発性の変数の変更なし。今MDKは、コンパイル時に順番に、それについて考える、理由は非常に単純ですが、複数のファイルを別々にコンパイルされ、その後、最終的には、リンカーのリンク別のモジュールは、変数の宣言は完全に信頼されたときにモジュール参照変数をコンパイルするときに、文が揮発性を追加しない場合は、参照先のモジュールは、元の変数に追加された場合、その後、逆推力は、揮発性の通常の変数として確実に変数をではないだろうが、声明は、揮発性の追加時に、このモジュールで参照されていないとして、変数になりますvolatile変数を

  CコンパイラCの各ファイルをOBJにコンパイルされる基本単位と呼ばれるモジュールとしてコンパイルされ、アクセス・モジュールとの間の関数または変数が参照符号によって達成される、参照符号は、任意のプロパティを持っていない、唯一の利用可能にのみリンカによって使用されるシンボル名、label属性は完全に決定するために、ローカルコールのプロトタイプ宣言に依存しています!したがって、あなただけ.Cモジュールに別のモジュールでは、この変数を使用し、それを最適化するようにコンパイラに教えていない、.Cモジュールが揮発性である定義が、彼らはそう、どのような変数の属性を知りません唯一のプロトタイプ宣言により、コンパイラに情報を伝えるために。

最後に、シンプルに要約する:DOは属性情報は、さまざまな出力シンボルであるブリッジの各モジュールに連絡することであるプロトタイプ宣言を、過小評価しません。コンパイラの理論はああ理解していない損失を比較することです。

最後にコンパイルオプションのいくつかのMDKの説明を追加します。

USEクロスモジュールの最適化

 クロスモジュールの最適化は、未使用の機能を以前のビルドから情報を取得し、それを使用する対応するオブジェクトファイル内の独自のELFセクションに。このオプションは、リンカフィードバックとして知られている、我々は、コードサイズを小さくするためにそれを使用するために、二回のプログラムを構築する必要があります。

使用MicroLIBMicroLIB

それは1つが埋め込まれたCライブラリのサイズに最適化されたアプリケーションプラットフォームを減らすことができるということです。彼は、いくつかの標準のCライブラリ関数のmemcpyが遅いマイクロコントローラの動作速度に適用されるようなトレードオフ性能およびコードサイズとの間を提供するために、標準のCライブラリのサブセットです。オリジナル(デフォルトライブラリの一部の機能がサポートされていませんが、このようなmemcpyのような標準のCライブラリ関数のいくつかは()、遅くなります。)ここで、デフォルトでは、ライブラリは、機能の一部をサポートしていないことを言いました:

含みます:

  1. オペレーティングシステムの機能、例えば、アボート()、出口()時間()、システム()、(GETENV)
  2. ワイドおよびマルチバイト支持体、例えば同時にmbtowc()、wctomb()
  3. I / O機能、標準入力、stdoutとstderrを除いて標準入出力ファイル
  4. かかわらず、位置およびスレッドセーフコードの

タイムコード生成・リンク(このオプションは、新しいバージョンのようではありません)
、コードジェネレータは、リンカーは、さらに、コードの最適化を実行できるように、中間フォーマットへのオブジェクトリンクを作成するようにコンパイラに指示します。これはコード・ジェネレータは、同時に、それは洗練のより高いレベルを適用することができ、すべてのオブジェクト間でのファイルの依存関係を表示することができます。リンクコード生成は、コードサイズを縮小し、アプリケーションを高速に実行することができます。
最適化レベル

最適化のさまざまなレベルでは、情報とのレベルの間で利用可能なコードにコンパイルされたコードをデバッグ、パフォーマンスのトレードオフを行うことができます。利用できる以下の最適化レベル:
-O0使用最小限の最適化。
ほとんどの最適化は、最良のデバッグビューで生成されたコードを閉じています。
-O1限られたアプリケーションの最適化。
例えば、未使用のインライン関数と、未使用の静的関数を削除します。最適化のこのレベルでは、コンパイラが自動的に、そのような事態を避けるために連動冗長コードと再発注指示を削除するなどのアプリケーションを、最適化します。生成されたコードは、合理的な最適化の後、デバッグが良いのビューを持っています。
-O2高い最適化アプリケーション(これはデフォルトの設定です)。
このレベルで最適化アプリケーションは、ARMプロセッサの動作中に目標の特定のセットの使用のプロセッサアーキテクチャに関する深い知識を活用します。これは、最適化されたコードが良いですが生成されますが、限られたデバッグビュー。
最も肯定-O3最適化アプリケーション。
最適化-Ospace / -Otimeユーザーの選択を満たしています。デフォルトでは、複数ファイルのコンパイルは長いコンパイル時に生じる可能性がある、有効になっているが、最高レベルの最適化を提供します。

時間は、最適化のための
「最適化」チェックボックスをチェックするときまたは最小コードサイズが(-Ospace)選択したときのパフォーマンス(-Otime)最良の結果を達成するためにもっと注意を払う、コンパイラの最適化を可能にします。
チェックを外し価格のための画像ファイルのサイズを小さくするために、実行時間増加の可能性への最適化を実行するようにコンパイラーに指示し時間平均選択-Ospaceオプション、のために最適化します。例えば、非インライン関数呼び出しではなく大型のインラインコードのレプリカ構造。これがデフォルトのオプションです。コマンドラインコンパイラからの実行は、このオプションを呼び出し使用「-Ospace」が最適化コードの実行に最速タイムをコンパイラに指示-Otimeオプション、のための最適化を選択した場合は、画像ファイルのサイズを大きくすることが可能です。あなたのコードのコンパイル時の重要な部分は、-Otime残り使用-Ospace命令を使用することをお勧めします。

スプリットロード・ストア倍数は、
LDMおよびSTM命令は、ロード/ストアの小さい複数のレジスタのシリーズに分け多数のレジスタを必要とするようにコンパイラに指示します。レジスタLDM 16は、それぞれ4つのレジスタからなる4つの別々のLDM、LDMに分けることができ、この手段。このオプションは、削減することができますまたは割り込みレイテンシはARMシステムバッファの書き込み、および、ゼロ・ウェイト・ステート・メモリ32ビットシステムの使用にキャッシュされていません。
例えば、ARM7 ARM9プロセッサ、および命令境界においてのみ異常。例外はLDMバッファなしARM7とARM9システム16個のレジスタの最初に発生した場合、システムが異常取得する前に、メモリ16へのアクセスを完了します。非常に高い割り込み遅延をもたらすことができるメモリ調停システム、。4×4の独立したレジスタにLDM分割は大幅割り込みレイテンシを低減、4個のレジスタまでロードした後に異常なプロセッサ手段をLDM。システム全体のパフォーマンスを向上させるためには、このオプションを選択します。
一つのELFセクション機能ごとの
オプションは、それぞれのELFセクションのすべての機能を置くようにコンパイラに指示します。この機能は削除未使用で.elfコードセクションへのリンカーは、一般的に、コードの多くの機能が含まれていることができます。ELFリンカーは通常のみ代わりに使用されていない機能のうち、未使用部分を削除します。すべての内容は未使用されている場合にのみ、あなたはELFの一部を除去することができます。したがって、各分割機能は、コンパイラが未使用のどの部分を識別することは容易でELFを所有することができ、それを削除します。このオプションを選択すると、コードをコンパイルするのに必要な時間が長くなりますが、それは、パフォーマンスを向上させることができます。

共通の目的の最適化オプション

最小オブジェクトコード:

選択
microlibをで•Cライブラリ
•クロスモジュールの最適化
•最適化レベル2(-O2)

コードのパフォーマンスの最高のパフォーマンス:

选中
•クロスモジュールの最適化
•最適化レベル3(-O3)
•最適化のための時間

最後にロングコードと同じくらい簡単に言えばは、関係なく、もし一方、達成することが難しいだけの増加にコードを最適化することは推奨されませんどのように高コンパイラの最適化のレベルは問題ありませんので、時間を最適化するために必要なリソースがなかった論理的に十分ではありませんあなたは、コードが削減されます悪用し、コンパイラのロジックを最適化し、この時点で0に完璧なバックに最適のレベルで0最適化問題の下に安定化機能を追求することができます。

おすすめ

転載: www.cnblogs.com/CodeWorkerLiMing/p/12079963.html