便宜上、セットアップとループが提供されていますか?


13

Arduinoスケッチは通常、機能setuploop備えています。これらの機能は便宜上提供されているだけですか、それとも実際には特別な目的がありますか?(例:セットアップとループで許可または許可されていない操作があります)

これらの2つのコードは同等ですか?

クラシック

void setup() {
    pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
    digitalWrite(LED_BUILTIN, HIGH);
    delay(1000);
    digitalWrite(LED_BUILTIN, LOW);
    delay(1000);
}

ループなし

void setup() {
    pinMode(LED_BUILTIN, OUTPUT);

    while(true) {
        digitalWrite(LED_BUILTIN, HIGH);
        delay(1000);
        digitalWrite(LED_BUILTIN, LOW);
        delay(1000);
    }
}


void loop() {
}

たとえば、mainメソッドやその他のエントリポイントを提供して、セットアップやループなしでコードを記述することは可能ですか?

回答:


10

これらのコードはほとんど同じです。

Arduinoのソースコードを見ると、以下が表示されます:

setup();

for (;;) {
  loop();
  if (serialEventRun) serialEventRun();
}

(何serialEventRun()が起こるかわかりません。)

main関数宣言を「オーバーロード」できるとは思いません。またinit、例えばタイマーを設定するmillis()などのメイン関数がを呼び出すことに注意してください。


9

これらの機能は便宜上提供されているだけですか、それとも実際には特別な目的がありますか?

Arduinoライブラリはシリアルハンドリングloop()に関連したちょっとしたハウスキーピングをします。

これらの2つのコードは同等ですか?

シリアルイベントを使用しない場合のみ。

たとえば、メインメソッドやその他のエントリポイントを提供して、セットアップやループなしでコードを記述することは可能ですか?

IDEを介してArduinoライブラリを厳密に使用している間ではありません。リンカは、main定義の重複setupまたはloop定義の欠落または不満を訴えます。


2

たとえば、メインメソッドやその他のエントリポイントを提供して、セットアップやループなしでコードを記述することは可能ですか?

前回IDEを使用したとき、.ino/ .pdeファイルがなく、.cppファイルのみのプロジェクトを作成できました。関数を定義するのはのマングリングである.inoため、そのステップをバイパスする場合、独自のを定義できます。.cppmainmain

IDEがこれを許可しなくなった場合(聞いたとおり)、Arduinoライブラリを放棄せずに、たとえばIDEの外部でMakefileベースのビルドを使用して同じことを実行できます。私が知っている警告は次のとおりです。

  • #include "Arduino.h"ライブラリ関数へのアクセスが必要な場合に必要です。
  • init()ライブラリで使用している方法で周辺機器をセットアップする場合は、呼び出す必要があります。
  • あなたは置く必要がありますserialEventしたい場合は、あなたのメインループでGerbenが指しているコードをserialEvent実行するためのハンドラを(ただし、あなたがあなた自身のメインループを書きたい場合は、おそらくこのとにかく必要ありません)。

1

Arduinoスケッチは通常、セットアップとループ機能を備えています。これらの機能は便宜上提供されているだけですか、それとも実際には特別な目的がありますか?

彼らは余分に関数呼び出しで投げinitてみましょうタイマー初期化されmillismicrosそしてdelay更なる努力なしに仕事を。それ以外はありません。

このコードは、IDEの下でコンパイル(および実行)します。

int main ()
  {
  }

事実上、IDEは次のようなコードを生成します。

int main ()
  {
  init ();  // set up timers
  setup (); // your own initialization
  while (true)
    loop ();  // stuff you want to keep doing
  }

Ignacio Vazquez-Abramsが言ったように、彼らはそれ以来それをいじっていますが、基本的にあなたはそれを無視することができます。setupおよびについて特に特別なことはありませんloop

main上記で示したように使用できます。必要にsetup応じてすべてを行うことができます。必要にloop応じてすべてを行うことができます(戻らない場合)。

ここでは、C ++コンパイラを扱っていることに注意してください。関数は、名前に基づいて魔法のような意味を持ちません。

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