組み込み技術の研究ノート(3)

Linux開発ツール
vim(テキストエディター):使用方法とvim
gcc(コンパイラー)の構成方法を学ぶ:動的ライブラリーと静的ライブラリーの作成方法と
gdb(デバッガー)の使用方法と区別方法:ブレークポイントの設定、シングルステップ実行、メモリエラーのデバッグ
make(プロジェクトマネージャ):
vimを使用してmakefile vimを作成すること
は、最も強力なテキストエディタであり、その目的はマウスから離れることです。
vimが必要とする構成ファイルは、ユーザーの目的に応じて1つずつ入力され、コンテンツセットは、ユーザーの要件に最も適合するものです。多くの人がvimを使用したいので、vim / etc / vim / vimrcと入力して構成ファイルを入力します。
まず、vimを使用する場合は、sudo apt-get install vim in ubunteと入力してvimを入力し、vimと編集ファイル名を入力して編集します。vimを入力した直後に文字を入力することはできません。iキーを押して入力モードに入り、編集することができます。終了する場合は、最初にEscキーを押してからShift +キーを押します。最終行モードに入り、対応する文字を入力して適切な機能を実現します。ここで、wは保存、qは
コマンドラインモードを終了します(yyと入力して、コンテンツの行をコピーできます。 、pを入力して貼り付け、ddを入力して行を削除)
挿入モード(iまたはaを入力して入力)
最下行モード(Shift +:を入力して入力)
gccは
gccを使用します。フルネームはGNU cc
1
です。 GNUツールはクロスコンパイラです。これは、コンパイルCPU他のプラットフォーム・コード、またはターゲットコード(携帯電話、プレートの開発)における現在のCPUプラットフォームの実行は、ホスト名(PC)上で実行できるコンパイルするクロスコンパイラを指す
所望前処理対処法:ヘッダーファイルの拡張、マクロの置換、条件付きコンパイル
インクルード後に<>と ""の違いを使用します。<>の検索パスはシステムのヘッダーファイルディレクトリ(/ usr / include)です。 ""の検索パスは現在のディレクトリ検索です。 。
コンパイルの方法:前処理済みファイルをアセンブリファイルにコンパイルします
アセンブリの操作:アセンブリファイルをコンパイルしてターゲットファイル
を生成します。Oリンクの方法:シンボルテーブルを作成し、実行可能ファイルa.outを生成します。

GCCのコンパイルオプションが使用
のみ+ -E前処理表現GCCコマンドを
検索しない条件下でのGCCコマンド+ -Iヘッダファイルの指定されたサードパーティのサーチパスを表した後に
、GCCコマンドは+>再び出力に格納されたコンテンツを表した後に他の場所
でgccコマンド+ -Dはマクロを定義することを意味します
gccコマンド+ -Sはコンパイルの完了時に
gccコマンドを停止することを意味します+ -oは実行ファイルの名前を変更することを意味します
+ -wはコンパイル中に警告メッセージをオフにすることを意味しますが、この命令はお勧めできません
。gccコマンド+ -Wallがコンパイル中に警告メッセージを開いた後、プログラムの実行に影響するいくつかの情報を閉じることがあります
。gccコマンドの後--O1(-O2、-O3)は、コンパイラー最適化
2、静的ライブラリー、動的ライブラリの生成
:ライブラリファイル:保存された関数と変数機能:保存された関数と変数、使用のみ可能であるが、それらの実装を表示できない
静的ライブラリ:コンパイル段階で読み込まれ、読み込みはライブラリファイルのコードをソースファイルにサフィックス付きで読み込むことを指します。
ダイナミックライブラリ:実行時にロード。接尾辞は.soです

これらの2つのライブラリによって形成される実行可能ファイルには違いがあります。
(1)静的ライブラリによって生成される実行可能ファイルは、動的ライブラリによって生成される実行可能ファイルよりも大きいため、プログラムが実行するためにより多くのメモリが使用されます。
(2)静的ライブラリによって生成される実行可能ファイルこのファイルはアップグレードが難しく、ダイナミックライブラリを使用して生成された実行可能ファイルは簡単にアップグレードできます。
(3)静的ライブラリを使用して生成された実行可能ファイルは高速で実行され、動的ライブラリを使用して生成された実行可能ファイルは実行速度が遅い
(4)静的ライブラリを使用して生成された実行可能ファイルは簡単に展開でき、動的ライブラリを使用して生成された実行可能ファイルは展開が難しい

Linuxライブラリファイルの保存パス
/ lib:システム操作に必要なライブラリを保存
/ usr / lib:プログラム操作に必要なライブラリを保存

静的ライブラリの作成方法
(1)関数を保存するファイルをコンパイルしてターゲットファイルを生成
(2)静的ライブラリ生成ツール:ar ar rcs(存在しない場合は作成、存在する場合は更新)ライブラリ名ターゲット名
(3)静的ライブラリを使用:GCCソースファイル-Iライブラリ名-Lストックパス
ダイナミックライブラリの作り方
gcc -shared -fPICソースファイル-o libcal.so
使用方法:cp libcal.so / usr / lib
gcc main.c -lcal
gccmain.c。 /libcal.so -o cal

gcc -staticの役割
このオプションはダイナミックライブラリの使用を禁止するため、コンパイルされたものは通常非常に大きく、実行するためにダイナミックリンクライブラリを必要としません。

コンパイラ3レベル最適化
1、コンパイラ最適化レベル1
は、最適化の最初のレベルで基本コードの最適化を実行します。このレベルでは、9つの個別の最適化関数を実行しようとします。
-fdefer-pop:この最適化手法は、関数が完了したときのアセンブリ言語コードの動作に関連しています。一般に
、関数の入力値はスタックに格納され、関数によってアクセスされます。関数が戻るとき、入力値はまだ
スタック上にあります。通常、関数が戻った後、入力値はすぐにスタックからポップされます。そうすると
スタックの内容乱雑になります
-fmerge-スタンス:同じ定数をマージするために、コンパイラの試みを、この最適化手法を使用して、この機能を持っている。
コンパイラが使用する各定数CまたはC ++手順を分析しなければならないので、コンパイルに非常に長い時間になりますとき、
およびそれらが互いに比較される。
-fthread-ジャンプ:コンパイラ、アセンブラコードが条件と無条件処理する場合は、この最適化技術を使用して
関連の枝を。場合によっては、ジャンプ命令が別の分岐ステートメントに転送されることがあります。一連の
ジャンプを通じて、コンパイラーは複数のジャンプの間の最終ターゲットを決定し、最初のジャンプを最終ターゲットにリダイレクトします。
-floop-optimize:アセンブリ言語でループを生成する方法を最適化することにより、コンパイラーは非常に大きなプログラム
でのアプリケーションのパフォーマンスを向上させることができます通常、プログラムは多くの大きく複雑なループで構成されています。
ループ内で値を変更しない変数割り当て操作を削除することにより、ループ内で実行される命令の数を減らすことができ、パフォーマンスを大幅に向上させることができます
さらに、ループを終了するタイミングを決定する条件付きブランチは、ブランチの影響を減らすために最適化されています。
-fif-conversion:if-thenステートメントは、ループ後のアプリケーションで最も時間のかかる部分です。
単純なif-thenステートメントは、最終的なアセンブリ言語コードで多数の条件付き分岐を生成する場合があります。
コンパイラー
は、条件付きブランチを削減または削除し、条件付き転送を使用してフラグを設定し、算術手法を使用してそれらを置き換えることにより、if-thenステートメントで費やされる時間を削減できます
-fif-conversion2:この手法は、より高度な数学的機能を組み合わせて
if-thenステートメントの実装に必要な条件分岐を削減します。
-fdelayed-branch:この手法は、命令サイクル時間に基づいて命令を再配置しようとします。また
、プロセッサのガバナンスキャッシュを最大限に活用するために、条件分岐の前にできるだけ多くの命令移動しようとします。
-fguess-branch-probability:名前が示すように、この手法
条件付き分岐の最も可能性の高い結果と、対応する移動命令を決定しようとしますが、これは遅延分岐手法に似ています。コードの配置はコンパイル時に予測されるため、
このオプションを使用して同じCまたはC ++コードを2回コンパイルすると
、コンパイラがコンパイル時にそれを使用する考えるブランチに応じ、異なるアセンブリ言語コードが生成される可能性があります。このため、多くのプログラマーはこの機能の使用を好まず、
特に-fno-guess-branch-probabilityオプションを使用してこの機能をオフにします
-fcprop-registers:レジスターは関数内の変数に割り当てられるため、コンパイラーは2番目を実行します
スケジュールの依存関係を減らすためにチェックし(両方のセグメントに同じレジスタが必要)、不要なレジスタコピー操作を削除します。
2、コンパイラー最適化レベル2
第1レベルのすべての最適化手法といくつかの最適化を
組み合わせる-fforce-mem:この最適化は、命令が変数を使用する前に、メモリロケーションに格納されているすべての変数を強制的にレジスタにコピーします
単一の命令のみを含む変数の場合、これは大きな最適化効果をもたらさない可能性があります。しかし
多くの命令(数学演算でなければならない)に含まれる変数の場合、これはメモリへのアクセスとなるため、重要な最適化になります。の値と比較して、プロセッサはレジスタの値にはるかに
速くアクセスします
-foptimize-sibling-calls:この手法は、関連する関数呼び出しや再帰的な関数呼び出しを処理します。一般に、再帰的な関数呼び出し
は、分岐を使用する代わりに、一連の一般的な命令に展開できます。このようにして、プロセッサの命令キャッシュは拡張された命令をロードしてそれらを処理できます。これは、命令を分岐操作を必要とする個別の関数呼び出しとして保持するよりも高速です。
-fstrength-reduce:この最適化手法は、ループを最適化し、反復変数を削除します。反復変数は、変数を
使用するなど、ループカウンターに関連付けられた変数であり、ループカウンター変数を使用して、数学のfor-nextループを実行します。
-fgcse:この手法は、生成されたすべてのアセンブリ言語コードに対してグローバル式除去プロセスを実行します。これらの最適化操作は、
生成されたアセンブリ言語コードを分析し、共通のフラグメントを組み合わせて、冗長なコードセグメントを排除しようとします。コードが計算gotoを使用する場合、gcc命令は-fno-gcseオプションを推奨します。
-fcse-follow-jumps:この特殊な汎用副次式除去手法は、ジャンプ命令をスキャンして、他の手段では到達できないプログラム内のターゲットコードを見つけます。この最も一般的な例は、if-then-elseステートメントのelse部分です。
-frerun-cse-after-loop:この手法は、ループが最適化された後、一般的な部分式除去ルーチンを再実行します。
これにより、ループコードが展開された後、コードがさらに最適化され、コード化されます。
-fdelete-null-pointer-checks:この最適化手法は、生成されたアセンブリ言語コードをスキャンして、nullポインターをチェックするコードを探します。コンパイラー
は、NULLポインターへの間接参照がプログラムを停止すると想定します。間接参照の後にポインターをチェックする場合、nullにすることはできません。
-fextensive-optimizations:この手法は、コンパイル時の観点からコストのかかるさまざまな最適化手法を実装
しますが、ランタイムパフォーマンスに悪影響を及ぼす可能性があります。
-fregmove:コンパイラーは
、バインドされたレジスターの数を最大化するために、mov命令で使用されるレジスターを再割り当てし、それらを他の命令のオペランドとして使用しようとします
-fschedule-insns:コンパイラーは、データを待機しているプロセッサーを排除するために、命令を再配置しようとします。浮動小数点演算の実行時に遅延のあるプロセッサの場合、これによりプロセッサは、浮動小数点の結果を待っている間に他の命令をロードできます。
-fsched-interblock:この手法により、コンパイラーは命令ブロック全体で命令をスケジュールできます。これにより、命令を非常に柔軟に移動して、待機期間中に行われる作業を最大化できます。
-fcaller-saves:このオプションは、関数呼び出しのレジスターを保存および復元するようにコンパイラーに指示するため、関数はレジスター値を保存および復元せずにレジスター値にアクセスできます。複数の関数を呼び出す場合、レジスターの保存と復元はすべての関数呼び出しではなく1回で済むため、時間を節約できます。
-fpeephole2:このオプションを使用すると、コンピューター固有の観測ホールを最適化できます。
-freorder-blocks:この最適化手法を使用すると、命令ブロックを再配置して、分岐操作とコードの局所性を向上させることができます。
-fstrict-aliasing:この手法は、高級言語に厳密な変数ルールを適用します。CおよびC ++プログラムでは、
変数がデータ型間で共有されないことが保証されます。たとえば、整数変数は単精度浮動小数点変数と同じメモリ位置を使用しません。
-funit-at-a-time:この最適化手法は、最適化ルーチンを実行する前にアセンブリ言語コード全体を読み取るようコンパイラーに指示します。これにより、コンパイラーは、命令キャッシュを最適化するために、多くの時間を消費しないコードを再配置できます。ただし、これはコンパイル時にかなりの量のメモリを消費するため、小規模なコンピュータでは問題になる可能性があります。
-falign-functions:このオプションは、関数をメモリ内の特定の境界の先頭に揃えるために使用されます。ほとんどのプロセッサはページに従ってメモリを読み取り、すべての関数コードが単一のメモリページにあることを確認します。そのため、コードで必要なページを呼び出す必要はありません。
-fcrossjumping:これは、プログラム内に散在する同じコードを組み合わせるためのクロスジャンプの変換コード処理です。これにより、コードの長さを減らすことができますが、プログラムのパフォーマンスに直接影響を与えるとは限りません。
3.コンパイラー最適化レベル3
これは、第1レベルと第2レベルの左と右の最適化手法を統合し、次の最適化も含みます。
-finline-functions:この最適化テクノロジーは、関数の個別のアセンブリ言語コードを作成せず、関数を配置しますコードは、スケジューラーのコードに含まれています。複数回呼び出される関数の場合は、各関数呼び出しの関数コードをコピーします。これはコード長の短縮には有害ですが、各関数呼び出しで分岐する代わりに、命令キャッシュコードを最大限に活用することでパフォーマンスを向上させることができます。
-fweb:変数を保存するための疑似レジスターネットワークを構築します。疑似レジスターは、レジスターのようにデータを含みますが、cseやループの最適化手法など、他のさまざまな最適化手法を使用して最適化できます。
-fgcse-after-reload:この手法は、生成および最適化されたアセンブリ言語コードを完全に再ロードした後、2番目のgcse最適化を実行し、さまざまな最適化方法によって作成された冗長セグメントを排除します。

オリジナルの記事を14件公開しました Like1 訪問数477

おすすめ

転載: blog.csdn.net/a1152946932/article/details/104773112