Arduino IDE 1.6.xコンパイラ最適化=より速いコード:7ステップ

Arduino IDE 1.6.xコンパイラ最適化=より速いコード:7ステップ

目次:

Anonim

最新のArduino IDE(1.6.1)をダウンロードした後、私のスケッチのいくつかがIDE 1.0.6の下でコンパイルされた同じスケッチよりかなり遅く走ったことにかなりがっかりしました。これは、TFTディスプレイを動かした私のスケッチの1つで特に顕著でした。

しかし良いニュースは、1.6.1 IDEが20%小さいスケッチを作成したことです。これは、私がUNOのFLASHのスペースを使い果たし始めたときに素晴らしかったです。

コンパイルされたコードサイズとスピードの違いの謎を解決するために、さらに調査することにしました。理想的には、プログラムのFLASHスペースを節約することができる一方で、古いIDEが私に与えたスピードを戻したいと思っていました!

用品:

ステップ1:コンパイラ

インターネットで検索すると、コンパイラーについて私ができる以上に多くのことがわかります。ここでは、簡単な要約を示します。

Arduinoのスケッチは高水準言語、すなわちC ++またはCで書かれていますが、マイクロコントローラが機械語命令を実行するため、コンパイラの仕事は人間が読めるコードをマイクロコンピュータが実行する一連の命令に変換することです。 - コントローラは実行することができます。基本的に、コンパイラはある言語を別の言語に変換します。

実行可能コードを作成するためにコンパイラーが要求されると、呼び出すことができるオプションがいくつかあります。ArduinoIDEで使用されるGCCコンパイラーの場合、ここで詳述するように5つの速度/サイズ最適化オプションがあります。オプションが異なると、コンパイラーは実行可能コードのサイズまたは速度を最適化するためにより多くの努力を払うことになります。

Arduino IDEで使用されるデフォルトの最適化はサイズに対するもので、これはコマンドラインのオプション "-Os"です。 2つのArduino IDEによって生成されるコードサイズと速度が大きく異なるのは、最新のIDEではGCCコンパイラのはるかに新しいバージョンが使用されているためです。明らかにこの新しいバージョンはかなり小さい実行可能ファイルを作成しますが、それが現れるペナルティはかなり遅い実行速度です。

いくつかの軽度の注意

ごくまれに、最適化レベルを変更すると、プログラムの実行時の動作に影響を与える可能性があることに注目する価値があります。これは、最適化がソフトウェアを「書き換え」て「時間」と「サイズ」の効率的な実行可能ファイルを作成しようとするためです。ソフトウェア機能が影響を受ける可能性は、コンパイラがコードをどの程度「積極的に」修正するかによって異なります。

Arduino IDEのデフォルトの最適化レベル(-Os)はすでにかなり積極的なので、最適化レベルを変更した場合に新しい動作の問題が発生することはほとんどありません。

コンパイラは一連の規則に従っているため、最適化プロセス中の問題を回避するためにソフトウェア自体に「コンパイラ指令」を含める必要がある場合があります。これは、メインプログラムで変数を使用するときに変数を「揮発性」として宣言できないことです。割り込みルーチン…あなたが "揮発性"が何を意味するのかわからない場合は、Googleは "なぜ揮発性が必要なのか"。

ステップ2:サイズと速度の違い

私がテストに使ったスケッチはグラフィックスピードテストでした。

Arduino Mega用に編集されたスケッチのテスト結果は次のとおりです。UNOでも同様の結果が予想されます。

IDE 1.0.6:

  • コンパイルサイズ:26,620バイト
  • 実行時間:13.3秒

IDE 1.6.1:

  • コンパイルサイズ:19,558バイト
  • 実行時間:17.8秒

これらの結果は、私がそのような劇的な速度差に気付いた理由を示しました…

また、1.6.1 IDEでは、7062バイト小さいFLASHイメージが生成されることがわかります。これは、UNO上での実行とメガへのアップグレードが必要な場合との間で違いが生じる可能性があることを考えると重要です。

残念ながら、実行速度は34%低下しましたが、これは役に立ちません。私が答えたかった質問は、

実行時間が短くスケッチが小さいという両方の長所がありますか。

ステップ3:コンパイラの最適化を変更した結果

1つのスケッチをテストしたばかりなので、状況によってはさまざまなオプションのほうが良い場合があります。

これらは、IDE 1.6.1を使用してコンパイラ最適化ディレクティブを変更したときに得られた結果です。

-Os(Arduino IDEのデフォルト)

  • コンパイルサイズ:19,558バイト
  • 実行時間:17.8秒

-O0(まったく最適化されていません!)

  • コンパイルサイズ:31,382バイト
  • 実行時間:44.7秒

-O1

  • コンパイルサイズ:20,428バイト
  • 実行時間:17.0秒

-O2

  • コンパイルサイズ:20,500バイト
  • 実行時間:12.7秒

-O3

  • コンパイルサイズ:25,550バイト
  • 実行時間:12.2秒

Arduino Megaを使用しているので、FLASHサイズについては特に心配していません。そのため、オプション-O3を使用すると速度が速くなり(実行時間が短くなり)、スケッチはIDE 1.0.6よりも小さくなります。しかし、私は1.6.1 IDEを最適化-O2に設定することにしました。それはより速いスピードとより小さいFLASHコードの間の良い妥協のように見えます。

あなた自身のスケッチのために得られたサイズとスピードの改善は良いか悪い結果をもたらすかもしれません、そして異なるコンパイラオプションは良い結果を与えるかもしれません。

ステップ4:最適化レベルを変更する方法

コンパイラのコマンドラインはArduinoのアプリケーションイメージの中に埋め込まれたテキストファイルの中に含まれています、それは "platform.txt"と呼ばれるテキストファイルを見つけるためにいくつかのディレクトリレベルを通して掘り下げる必要があります。

Windows環境では、arduino.exeがあるフォルダーを開き、フォルダーパスでファイルを見つける必要があります。

arduino-1.6.1 hardware arduino avr platform.txt

platform.txtへのファイルパスが変更されているので、最新の1.6.x IDEを使用している場合は、このInstructableの手順6を参照してください。

あなたが何かをめちゃくちゃにすることに不安があるなら、どこかにファイルのコピーを作成してください!

開く platform.txt ワードパッドのファイル(メモ帳はファイルが構造化されている方法のために動作しません)。行をより簡単に数えることができるように "折り返し"をオフにします。

上から約16行下のこの行を見つけます。

compiler.c.flags = -c -g -Os -w -ffunction-sections -fdata-sections -MMD

以下のように-Osを-O2に変更します。

compiler.c.flags = -c -g -O2 -w-関数セクション-fdataセクション-MMD

次に、ファイルの少し下の2行目、上から約23行を見つけます。

compiler.cpp.flags = -c -g -Os -w -fno-exceptions -ffunction-sections -fdataセクション-fno-threadsafe-statics -MMD

もう一度、以下のように-Osを-O2に変更します。

compiler.cpp.flags = -c -g -O2 -w -fno-exceptions -ffunction-sections -fdataセクション-fno-threadsafe-statics -MMD

実際には、 "s"を "2"に変更するだけの場合です。コマンドラインでは文字 "O"がゼロではないことに注意してください。

ファイルを保存してください。フォーマットに関する警告はありません。次回はメモ帳で開きますOK!

Arduino IDEを開いている間にコンパイラー・オプションを変更しても効果はありません。変更を認識させるには、すべてのArduinoウィンドウを閉じてIDEをもう一度開く必要があります。

最初の行を-O1に変更すると、スケッチの実行時間がわずかに短くなりました(数マイクロ秒!)が、違いはスケッチが実行されているときに気付くには小さすぎることです。

ステップ5:結果!

任務完了!コードTICKが小さいほど、スピードTICKが速いので、私にとっては有利でした。

楽しむ!

ステップ6:Arduino IDE 1.6.2から1.6.3 - Platform.txtの場所

最新の1.6.x IDEがArduinoのWebサイトで公開されています。同じ方法でコンパイラの最適化を変更できますが、 "platform.txt"ファイルは別の場所にあります。

Arduino IDEのファイルメニューを開いた場合は、設定を選択すると、ウィンドウ下部のファイルパスが表示されます。私のWindowsセットアップでは、これは次のとおりです。

C: Users XXXX AppData ローミング Arduino15

XXXXはあなたのユーザー名です。

そのディレクトリレベルにはすでにplatform.txtがありますが、その中のコンパイラオプションを変更する方法はありません。このplatform.txtファイルを見つけるには、さらにいくつかのディレクトリレベルを掘り下げる必要があります。

C: Users XXXX AppData Roaming Arduino 15 packages arduino hardware avr 1.6.x platform.txt

ファイルを開き、コンパイラオプションを編集し、手順4の説明に従って保存します。私のtxtファイルのコピーでは、変更する行は17と24です。

うまくいけば、将来のIDEバージョンでは、ファイルは同じ場所にあるでしょう。

うっとうしいことに、新しい1.6.x IDEバージョンは、常駐している可能性がある他の古いIDEバージョンで使用されているいくつかのファイルを上書きします。そのため、新しいIDEをロードした場合は、コンパイラオプションをもう一度変更する必要があります。

ステップ7:IDE 1.6.6と1.6.7

スタートレックのMcCoyを引用する 「私はエンジニアを知っています、彼らはものを変えるのが好きです」 。それでplatform.txtファイルは最新バージョンのIDEフォルダに戻ってきました(良い動きです)。例えば:

C: Users xxx xxxx Arduino arduino-1.6.6 ハードウェア arduino avr

私のソフトウェアプログラミングのスキルが向上したか、その他の不可解な理由でそれが原因かどうかはわかりませんが、-Oではなく-O2最適化レベルを使用することによる速度向上は、最近数パーセントでやや低くなっています。そのため、その増加はソフトウェアが実行していることに非常に依存しており、努力する価値がない可能性があります。私は私のスケッチのいくつかで私がラッキーになったことと、いくつかのタイトなループが-O2によってかなり速く作られたことを疑っています。