makefile互換のスケッチを書く方法は?


9

Arduino IDEを使用して、またはオプションでGCCとメイクファイルを使用して、スケッチを作成/アップロードできるように、スケッチを書きたいと思います。

関数宣言を上部に含めることは知っていますが、私のスケッチがコンパイラーによって有効なC ++と見なされるようにするために、他に何かすることはありますか?

アップデート1

Arduino IDEが.inoおよび.pdeファイルに対して行うことを理解することは問題ありませんが、私の質問には無関係なので、これは重複ではありません。私が知りたいのは、「Arduino IDE g ++の両方で有効と見なされるようにプログラムを作成する方法です。

(?)のmakefile公式ここで利用可能ではメイクファイルを使用した場合の対処方法を説明代わりに IDEの:

# The Arduino environment does preliminary processing on a sketch before
# compiling it.  If you're using this makefile instead, you'll need to do
# a few things differently:
#
#   - Give your program's file a .cpp extension (e.g. foo.cpp).
#
#   - Put this line at top of your code: #include <WProgram.h>
#
#   - Write prototypes for all your functions (or define them before you
#     call them).  A prototype declares the types of parameters a
#     function will take and what type of value it will return.  This
#     means that you can have a call to a function before the definition
#     of the function.  A function prototype looks like the first line of
#     the function, with a semi-colon at the end.  For example:
#     int digitalRead(int pin);

...しかし、これはIDEとmakefileの両方の使用方法を説明していません。

アップデート2

私は最近、この質問に直接回答しないPlatformIOを見つけましたが、多くのプロセスを自動化し(Sconsファイルを生成します)、これまでのところ、Arduino IDEとsource + makefileの両方のアプローチよりもワークフローを好みます。著者からの良いサポートも。


したがって、質問は私の知識をはるかに超えていますが、Arduino.hファイルをインクルードすることを検討する必要があります。ブートローダーを組み込む; そして何でも。私はこの質問に従います:)
Madivad

Arduino-CMake(github.com/queezythegreat/arduino-cmake)をご覧になることをお勧めします。
jfpoilpret 14年


1
多くの犠牲を払わない限り、IDEとG ++の両方で有効と見なされる「プログラム」を直接作成することはできません。イノに対処する。
Ignacio Vazquez-Abrams 2014年

1
添付のメイクファイルのコメントで、ここで私の答えを見つけました。
hoosierEE 2014年

回答:


1

gcc / g ++では、具体的にはavr-gcc / avr-g ++を参照していると思います。gccはPCをターゲットシステムとしてコンパイルしようとするため、arduinoコードはおそらく有効なC / C ++コードとは見なされません。「WProgram.h」のマクロの多くは、ターゲットシステムのアクセスできないメモリを参照します。

ヘッダーファイル「WProgram.h」をインクルードし、上記のArduino Makefile(g ++ではなくavr-g ++を使用)を使用してコードをビルドすると、cppファイルは正しくコンパイルおよびリンクされます。同様に、IDE内でArduinoコードを開き、そこでコードを確認することができます。IDEは「WProgram.h」ファイルを挿入するため、技術的には2回インクルードされます。ただし、インクルードガードを使用すると、重複するコードがコンパイルされなくなります。


1

通常、setup()およびloop()関数を記述する必要があります。これらはIDEの単なるラッパーです。

void setup() {}
void loop() {}

int main() {
  setup();
  while (1)
    loop();

  return 0; // never reached
}

これはIDEとコマンドラインの両方で機能します。IDEでボードとシリアルポートを指定するときは、Makefileでも両方を指定する必要があります。したがって、2つの構成になります。

多くの人がIDEを離れます。なぜなら、彼らは異なるエディターを使用することを好むか、コンパイラーとリンカーのスイッチを設定してより多くの構成オプションを持っているからです。

本当に簡単にするには、Arduino Makefileを使用できます。今日は347で主演しました。

Makefileの例:

# try: make help
#
include /usr/share/arduino/Arduino.mk
ARDUINO_DIR = /usr/share/arduino
# list boards with: make show_boards
BOARD_TAG = promicro16
ARDUINO_LIBS = EEPROM 
# MONITOR_CMD = picocom -b 9600
MONITOR_CMD = moni -config ACM0-9600.cfg
ARDUINO_PORT = /dev/serial/by-id/usb-Arduino_LLC_Arduino_Leonardo-if00
# ARDUINO_PORT = /dev/ttyACM0
# ARDUINO_PORT = /dev/ttyUSB0
OPTIMIZATION_FLAGS = -Os -fexpensive-optimizations -fstrength-reduce
#

「* .ino」ファイルを変更する必要はなく、Makefileファイルは同じディレクトリに配置されます。

その間、私はそのMakefile方法を好みますが、それでも小規模なプロジェクトにはIDEを使用します。


1

私が知りたいのは、「Arduino IDEとg ++の両方で有効と見なされるようにプログラムを作成するにはどうすればよいですか。

参照:IDEスケッチファイルを前処理の癖を回避する方法

Makefileがどのように見えるかを今のところ無視すると、上のリンクで説明したように、質問に対する簡単な答えは、IDEのすべてを.cppおよび.hタブに入れ、メインの「スケッチ」(.inoファイル)空白。これはIDEでもコンパイルできるため、通常のC ++でも動作します。

.cppファイルの先頭は次のようにします。

#include <Arduino.h>

ライブラリ(SPIなど)を使用する場合は、それらをメインスケッチファイルに含める必要があります。これにより、IDEがライブラリを一時プロジェクトビルドファイルにコピーします。Makefileに必要なライブラリファイルがすべて含まれていることを確認するため、Makefileはそれを気にしません。

ここで私の答えも参照してください:クラスとオブジェクト:実際にそれらを使用するために必要なファイルタイプの数と種類。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.