Cmakeパッカヌアセンブリたたは子猫のトレヌニング

-あなたは今、零䞋䜕床ずは蚀いたせんか

-なんで

-たあ、私は... トレヌニング䞭です。

-よりよく蚓緎する..モルグノフを芋る...猫に぀いお。


この蚘事では、組み蟌みシステムにバむアスをかけながらCMAKEずLZ4を䜿甚した経隓に぀いお説明したす。 MakefileやCMAKEに粟通しおいる人は、最初の数段萜を安党にスキップできたす。



ねこ


猫ずしお、少数のファむルずいく぀かの目暙実行可胜ファむルずラむブラリで構成されるネットワヌク䞊で、小さなオヌプン゜ヌスプロゞェクトを取るこずをお勧めしたす。 倚くの人気のあるプロゞェクトはすでに倚数のファむルで倧きくなりすぎおいるため、このようなプロゞェクトを芋぀けるこずは困難です。 しかし、 LZ4パッカヌは良い候補であるこずが刀明したした。 LZ4はただ若く、最も重芁なこずは、非垞にシンプルであり、SUPER FAST情報圧瞮を目的ずしおいるためです。おそらく、それが小さい理由です。倧郚分のコヌドがすぐに動䜜しないためですキャッシュで最適化されたせん。

LZ4は情報をすばやく圧瞮できたす。これは、組み蟌みの䞖界では、パフォヌマンスずメモリの芁件がほずんどないこずを意味したす。 LPC2478の圧瞮に適合させるこずができたしたが、必芁なRAMの量は12k4k入力バッファ+ 4k出力+ 4k蟞曞でした。 このボリュヌムは、圓然圧瞮率の損倱により、256 +256 + 256に削枛できるず思いたす。 それにもかかわらず、これでも良いオプションですので、サむズが30〜100バむトの「ほが」繰り返し蚘録がある堎合、䞀郚のシステムのポヌリング履歎を圧瞮するためのunningなアルゎリズムを䜜成したせん。 圧瞮アルゎリズムに興味がある人のために、LZ4はLZ77アルゎリズムの最適化バヌゞョンであるこずに泚意しおください。

別の賞賛は、解凍機胜です。 これは非垞にシンプルで、数十行のコヌドに収たりたす。これにより、最新のPCで1GB / sの解凍速床を実珟できたす。



組み蟌みシステムのアセンブリシステムずは䜕ですか


原則ずしお、組み蟌みシステムのプロゞェクトはすべお「hellow word」 、぀たりUartInit+ uart_put_charで始たりたす。 しかし、それはいく぀かのファむルに非垞に急速に成長し、そしおもちろん、専門家は静的ラむブラリの圢で蚭蚈された倚くの既補の゜ヌスコヌドを持っおいたす。 数十から数癟キロバむトのコヌドの深刻なプロゞェクトで実行可胜むメヌゞを䜜成するには、コンパむラから数十から数癟のファむルを枡す必芁がありたす。 これは、たさにアセンブリシステムが行うこずです。 組立図は次のように簡略化できたす。



゜ヌスコヌド→ビルドシステム→コンパむラヌ→実行可胜ファむル



もちろん、新しく開発された独自のIDEは、すべおのビルド䜜業を行うために最善を尜くしたす。[すべおビルド]をクリックするだけです。 「コヌドベヌス」が倧きくなるず、既存のコヌドをできるだけ頻繁に、さたざたな方法で収集するこずを怜蚎したす。

コヌドを構築するためのいく぀かのオプションがある理由は、次の芁因の存圚かもしれたせん

  1. いく぀かのプロゞェクト
  2. いく぀かのボヌド
  3. 数皮類のコントロヌラヌでも
  4. PCでコヌドの䞀郚をテストする
  5. 倧芏暡なチヌムによるいく぀かの開発ブランチ


このような芁件に察する最初の反応は垞に「ifdefを入れたしょう」ですが、ifdefだけではできない、たたは回避できないこずにすぐに気づきたすが、コヌドはあたり芋栄えがよくありたせん。



メむクファむル


Makeナヌティリティがアリヌナに入り、残忍な男たちがコンパむラずそのキヌを受け取り、アセンブリルヌルの蚘述を開始したす。 Makeは十分にすばやく孊習できたすが、既に3぀のプロゞェクトず倚くのフォルダヌがあり、それぞれにラむブラリヌがある堎合は、Makefileの䜜成にもっず熱心でなければなりたせん。 Makeを䜿甚したビルド図は次のようになりたす。



゜ヌスコヌド-> GNU MAKE->コンパむラ->実行可胜ファむル



CMAKE



CMAKEは高床なメむクです。 CmakeLists.txtで説明されおいるアセンブリルヌルに基づいお、CMAKEは、MAKEおよびその他のナヌティリティず開発環境のアセンブリ制埡ファむルを生成したすサポヌトされおいるナヌティリティのリストは、「cmake -help」を実行しお取埗できたす。 回路は次のずおりです。



゜ヌスコヌド→CMAKE→GNU MAKEたたはNMAKEたたは.... ->コンパむラ->実行可胜ファむルs



CMAKEの利点の䞭で、私は泚意したす。

  1. Lisp-oアセンブリ芏則蚀語自䜓は、MAKEよりも類䌌しおおり、より開発されおいたす。 埓来のCパラダむムずは異なる䜕かを詊す良い機䌚です。
  2. このナヌティリティはクロスプラットフォヌムであり、ビルドはIDEおよび動䜜䞭のOSに䟝存したせん。
  3. アセンブリルヌルだけでなく、コヌドブロック、Eclipse、およびVisual Studioのプロゞェクトも生成されたす。
  4. ゜ヌスコヌド自䜓を生成するだけでなく、AutomakeずQmakeを眮き換えるこずができる倚くのモゞュヌルを生成する十分な機䌚がありたす。
  5. 自動アセンブリシステムCDASH、パッケヌゞングCPACK、およびテストCTESTがありたす。
  6. CMAKEが人気です。 倚くの開発チヌムは、その䞋にあるプロゞェクトKDEなどを翻蚳したす。


組み蟌み゜リュヌションの分野での䞻な利点は、最終的にコヌドの移怍性が向䞊するこずです。デバッグをより快適にするために、PC甚のアプリケヌションの䞀郚を収集するこずに䞀歩近づきたす。 BUILDテストを自動的に実行できたすが、Code RedたたはCoCoxで蚱可されおいるかどうかはわかりたせんが、CMAKEを䜿甚するずIDEに䟝存したせん。



最小限のプロゞェクト


以䞋は、単玔なただし最も単玔ではないCmakeLists.txtファむルです。

cmake_minimum_required (VERSION 2.8) PROJECT(LZ4 C) set(SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/) ADD_DEFINITIONS("-Wall") ADD_DEFINITIONS("-W") ADD_DEFINITIONS("-Wundef") ADD_DEFINITIONS("-Wcast-align") ADD_DEFINITIONS("-Wno-implicit-function-declaration") ADD_DEFINITIONS("-O3 -march=native -std=c99") INCLUDE_DIRECTORIES (${SRC_DIR}) set(LZ4_SRCS_LIB lz4_decoder.h lz4_encoder.h ${SRC_DIR}lz4.c ${SRC_DIR}lz4hc.c ${SRC_DIR}lz4.h ${SRC_DIR}lz4_format_description.txt) set(LZ4_SRCS ${LZ4_SRCS_LIB} ${SRC_DIR}xxhash.c ${SRC_DIR}bench.c ${SRC_DIR}lz4c.c ) set(FUZZER_SRCS #  -  ${LZ4_SRCS_LIB} ${SRC_DIR}fuzzer.c # ${SRC_DIR}ooops_commented_source_file.c ) #   lz4c add_executable(lz4c ${LZ4_SRCS}) #   fuzzer add_executable(fuzzer ${FUZZER_SRCS})
      
      





make_minimum_requiredは、 Cmakeの最小バヌゞョンを蚭定したす。 PROJECTコマンドは、プロゞェクトの名前ずプログラミング蚀語を蚭定したす。

コマンドは、小文字ず倧文字の䞡方で蚘述できたす。 最も䞀般的なsetコマンドは、Basicの「Let」のような倉数の割り圓おず䜜成の類䌌物です。少し面倒になり始めたすが、その埌は慣れたす。 他の倉数はCMAKEで事前定矩されおおり、そのうちの1぀は$ {CMAKE_CURRENT_SOURCE_DIR}です。 makeず同様に、 SRC_DIRは倉数の名前であり、 $ {SRC_DIR}は倀です。 CMAKEの倉数はリストずしお扱われたすが、文字列たたは数倀ずしお解釈される堎合がありたす。 ファむルのリストは数行に簡単に分割できたす。

ADD_DEFINITIONSは実際にはプリプロセッサマクロを指定するために䜿甚する必芁がありたすが、ここでは単にコンパむラキヌを指定するために䜿甚したす。

add_executableは、アセンブリの目的-実行可胜ファむルを蚭定したす。



構成


すでにそのような小さなCmakeLists.txtを䜿甚するず、LZ4パッカヌ珟圚のリビゞョン94を組み立おるこずができたす。 コマンドコン゜ヌルを開き、瀺されおいるゞェネレヌタヌでcmakeを実行したすeranのスクリヌンショットを参照。



TinyPicによる画像ずビデオのホスティング



メむクはいく぀かの基本的なメッセヌゞを生成したすが、この堎合は無芖されたす-非暙準は発生したせん-MakefileずCodeBlocksのプロゞェクトが生成されたす。

makeの前にCmakeを起動するずいう圢で予備構成フェヌズが存圚するため、CMAKEを起動するための匕数ず、アセンブリが実行される゜フトりェアバヌゞョンOS、コンパむラに基づいおコンパむルプロセスを倉曎できたす。 ファむルのコピヌ、ファむルのダりンロヌド、パッチの適甚、゜ヌスファむルの生成などもできたす。 Cmakeには、远加のナヌザヌ定矩の匕数を枡す機胜がありたす。 Cmakeは、構成プロセス䞭にさたざたなナヌティリティを実行するこずもできたす。 これに぀いおは、次のパヌトで説明したす。



倧幅に拡匵されたため、アセンブリに関しおは、CMAKEはGentoo LinuxでPortage + automake機胜を実行できたすが、Cmakeはpythonディストリビュヌションよりもコンパクトで、倚くのプラットフォヌム䞻にWindowsに移怍可胜です。



ビルド開始


アセンブリは、aCodeBlocks bmake「make VERBOSE = 1」および「make help」も詊しおみるこずをお勧めしたすによっお起動されたす。 makeのその他の利点は、コン゜ヌルぞのカラヌ出力ず完了の割合です。



ニャヌ



それでは、lz4 packerをお楜しみください。

  C\デスクトップ\ lz4> lz4c.exe -H
 *** Yann ColletによるLZ4 Compression CLI2013幎5月1日***
䜿甚法
       lz4c.exe [arg]入力出力
匕数
  -c0 / -c高速圧瞮デフォルト
  -c1 / -hc高圧瞮
  -d解凍
  -yプロンプトなしで䞊曞き
  -Hヘルプこのテキスト+詳现オプション

詳现オプション
  -t圧瞮ファむルをテストしたす
  -Bブロックサむズ[4-7]デフォルト7
  -xブロックチェックサムを有効にしたすデフォルト無効
  -nxストリヌムチェックサムを無効にしたすデフォルト有効
  -b[0-1]圧瞮レベルを䜿甚したベンチマヌクファむル
  -i反埩ルヌプ[1-9]デフォルト3、ベンチマヌクモヌドのみ
入力 'stdin'パむプたたはファむル名
出力 'stdout'パむプたたはファむル名たたは 'null'
          䟋lz4c -hc stdin compressedfile.lz4




自分で梱包したす。


 C\デスクトップ\ lz4> lz4c.exe lz4c.exe lz4c.lz4
 *** Yann ColletによるLZ4 Compression CLI2013幎5月1日***
 98828バむトを56586バむトに圧瞮==> 57.26
 0.03秒で完了==> 3.04 MB /秒




ベンチマヌクを開始したす。


 C\デスクトップ\ lz4> lz4c.exe -b lz4c.exe lz4c.lz4
 *** Yann ColletによるLZ4 Compression CLI2013幎5月1日***
 lz4c.exe98828-> 5656757.24、163.3 MB / s、467.5 MB / s
 lz4c.lz456586-> 5627899.46、273.1 MB / s、1442.1 MB / s
  合蚈155414-> 11284572.61、191.3 MB / s、620.0 MB / s


私のコンピュヌタヌはそれほど高速ではなく、完党にテストされおいるずは蚀いたせんが、これらの数倀は非垞に印象的です。



合蚈



したがっお、この蚘事がCmakeナヌティリティの開発に圹立぀こずを願っおいたす。 次のパヌトでは、LZ4の組み立おの問題に関するさらなる研究に぀いお曞きたす。 奜奇心are盛な人のために、私が曞いたファむルの最終バヌゞョンはプログラムの䜜者に受け入れられたしたが、LZ4の珟圚のバヌゞョンには2぀のCmakeListsファむルがありたす。私はただ私の手に届きたせんでした。 グルmakeあえお



All Articles