Kurulum ve döngü kolaylık sağlamak için sağlanmış mı?


13

Arduino skeçlerinde genellikle a setupve loopfonksiyonu bulunur. Bu işlevler yalnızca kolaylık sağlamak için mi sunuluyor yoksa gerçekte özel amaçları mı var? (örneğin: kurulum ve döngüde bazı işlemlere izin verilmiyor veya izin veriliyor)

Bu iki kod eşdeğeri mi:

Klasik

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

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

Döngü olmadan

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

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


void loop() {
}

Örneğin bir mainyöntem veya başka bir giriş noktası sağlayarak kurulum veya döngü olmadan kod yazmak mümkün müdür ?

Yanıtlar:


10

Bu kod parçaları hemen hemen aynı.

Arduino kaynak koduna bakarsanız şunları görürsünüz:

setup();

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

(Ne yaptığından emin değilim serialEventRun().)

mainİşlev beyanını 'aşırı yükleyebileceğinizi' sanmıyorum . Ayrıca init, zamanlayıcıları yapılandıran millis()vb. Gibi ana işlev çağrılarının da işe yarayacağını unutmayın.


9

Bu işlevler yalnızca kolaylık sağlamak için mi sunuluyor yoksa gerçekten özel amaçları mı var?

Arduino kütüphaneleri loop(), seri taşıma ile ilgili küçük bir temizlik işi yapar .

Bu iki kod eşdeğeri mi:

Sadece seri olayları kullanmıyorsanız.

Örneğin bir ana yöntem veya başka bir giriş noktası sağlayarak, kurulum veya döngü olmadan kod yazmak mümkün müdür?

Arduino kütüphanelerini kesinlikle IDE üzerinden kullanırken değil; bağlayıcı, yinelenen maintanımlardan veya eksik setupveya looptanımlardan şikayet edecektir .


2

Örneğin bir ana yöntem veya başka bir giriş noktası sağlayarak, kurulum veya döngü olmadan kod yazmak mümkün müdür?

IDE'yi en son kullandığımda, dosya .ino/ .pdedosya olmayan, sadece .cppdosya içeren bir projeniz olabilir ; bunun bozma beri .inobir içine .cpptanımlayan maino adımda baypas sonra kendi tanımlayabilirsiniz eğer, fonksiyon main.

IDE artık buna izin vermiyorsa (duyduğum gibi) aynı şeyi Arduino kütüphanelerinden vazgeçmeden IDE dışındaki Makefile tabanlı bir yapı ile yapabilirsiniz. Bildiğim uyarılar:

  • #include "Arduino.h"Kütüphane işlevlerine erişmek istiyorsanız gerekir .
  • init()Kütüphanenin çevre birimlerini alıştığınız şekilde ayarlamasını istiyorsanız aramalısınız .
  • serialEventBir serialEventişleyicinin çalışmasını istiyorsanız Gerben'in analoopunuza işaret ettiği kodu koymalısınız (ancak kendi analoopunuzu yazmak istiyorsanız muhtemelen buna ihtiyacınız yoktur).

1

Arduino skeçlerinde genellikle bir kurulum ve döngü fonksiyonu bulunur. Bu işlevler yalnızca kolaylık sağlamak için mi sunuluyor yoksa gerçekten özel amaçları mı var?

Onlar için ekstra bir işlev çağrısında atmak initizin zamanlayıcılar başlatır hangi millis, microsve delayayrıca bir çaba olmadan çalışmalarını. Bunun dışında hayır.

Bu kod IDE altında derlenir (ve çalışır):

int main ()
  {
  }

IDE etkili bir şekilde aşağıdaki gibi kod üretir:

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

Ignacio Vazquez-Abrams'ın söylediği gibi o zamandan beri onunla uğraştılar, ancak temelde bunu görmezden gelebilirsiniz. setupVe hakkında özel bir şey yoktur loop.

mainYukarıda gösterdiğim gibi kullanabilirsiniz . İsterseniz her şeyi yapabilirsiniz setup. İsterseniz her şeyi yapabilirsiniz loop(asla geri dönmezseniz).

Unutmayın, burada bir C ++ derleyicisi ile uğraşıyorsunuz. Fonksiyonların isimlerine göre sihirli bir önemi yoktur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.