Arduino'da bir defalık icra kodu


12

Soru: Arduino başlangıcında yalnızca bir kez yürütülmesini istiyorsanız kodu nereye koyabilirim?

Arka plan: Arduino'mu her güç döngüsü için bir kez yapılması gereken görevleri yapmak için kullanma eğilimindeyim. (Örneğin, robotum her açtığımda yalnızca bir kez ileri gitmeli - bundan daha fazla ve masadan düşebilir.)

Standart Arduino IDE "şablonu" bir loop()ve bir setup()fonksiyondan oluşur . setupKod güç döngüsü başına bir kez çalıştırılır ve loopo bitirir her zaman yeniden başlatılır.

"1 zaman görevleri" kodlamak için iki yaklaşım görüyorum:

Yöntem 1: "Bir kez döngü"

void setup() {
  //do setup stuff
}

void loop() {
  //do task

  while(1) ; //Repeat forever, preventing function from re-starting
}

Yöntem 2: "Yalnızca kurulum"

void setup() {
  //do setup stuff

  //do task
}

void loop() {
  //do nothing
}

Daha ayrıntılı soru formu: Bu yöntemlerden biri donanım / yazılım açısından "daha iyi" mi? (örneğin setupişlev hakkında yalnızca çok uzun süre çalışabileceği gibi "özel" bir şey var mı?)
Ve eğer bir donanım / yazılım açısından aynıysa, "en iyi uygulama" veya standart kod yazma yolu Arduino topluluğundaki bu durumlar için?


Bazı kullanım exitkomutu tartışılmıştır arduino.stackexchange.com/questions/188/...
TheDoctor

Yanıtlar:


13

Sorunuz biraz karıştı. Başlangıç ​​başına bir kez kurulum işlevlerini nereye koymak istediğinizi sorar ve sonra kurulum işlevini tartışırsınız. Kurulum işlevi bunun içindir.

Bu nedenle, bir defalık kurulum işlevi kurulum işlevine girer.

FWIW, dosyada bakarsanız çağırırsetup ve loopişlevleri:

#include <Arduino.h>

int main(void)
{
    init();

#if defined(USBCON)
    USBDevice.attach();
#endif

    setup();
    for (;;) {
        loop();
        if (serialEventRun) serialEventRun();
    }
    return 0;
}

Tüm niyetler ve amaçlar için, iki seçenek tamamen aynıdır. Her iki durumda da boş bir meşgul-bekleme döngüsü elde edersiniz. Açıkçası, iki farklı seçeneğin muhtemelen aynı makine kodunu yaymasını beklerdim, bu yüzden her şey sorun değil.

Not:
if (serialEventRun) serialEventRun();Seri verilerin alınması üzerine çağrılan bir fonksiyon eklemenize izin veren bir tesis gibi görünmektedir, ancak void serialEvent(){}kodunuzda bir fonksiyon tanımlamazsanız , tamamen derlenecek ve üretilen makine kodunda mevcut olmayacaktır.


(Henüz) en yüksek oyu alan bir cevabı kabul etmek garip geliyor. Ancak, main()işlev tanımını görmek sorum için gerçekten yararlı oldu. (Ve, setupyerine grubu ile bir fikir birliği belirtirsiniz loop). Yardımın için teşekkürler.
apnorton

1
@anorton - Şüphe duyduğunuzda, örtü altına bakın. Arduino platformunu prototipleme için uygun buluyorum, ancak büyük ölçüde sadece kaynak plakası kodu. Ne yaptığını anlamak, bir şeyi nasıl tasarlayacağınıza karar vermede çok yardımcı olabilir.
Connor Wolf

6

Genellikle Yöntem 2 ile gitmek, ancak bunu sonunda:

void setup() {
  //do setup stuff

  //do task
  init(); //Do start-up initialization steps
}

void init() {
  // do tasks on startup
}

void loop() {
  //do looping code
}

Yukarıdaki kurulum ile kodumun daha da organize olmasını sağlar.


bugüne kadarki en iyi cevap +1, teşekkürler dostum beni kurtardın!
Kyle

5

Yöntem 2'yi kesinlikle tercih ederim. Giriş, çıkış vb. İşlemek için kod eklemeyi planlıyorsanız, Yöntem 2 ile kolaydır - sadece doldurun loop(), ancak Yöntem 1'de yeniden çalışma / yeniden düzenleme gerektirir.


3

Kurulum işlevinde zaman sınırı yoktur. Yöntem 2'yi tercih ederim çünkü döngü daha sonra ihtiyacınız olan her şeyle doldurulabilir.


1

Kesinlikle yöntem iki gidin. Kurulum işlevi bunun için var. Okuması da çok daha kolay. Bu imadaki herhangi bir şey loop()bir döngü içinde çalıştırılacaktır.


0

Diğer cevapların çoğu gibi, yöntem 2 için giderdim.

Ancak, Arduino kütüphanesi tarafından loop(), Atmel'i boşuna "çok" akım tüketen bir boşluğa çağırmaktan kaçınırım .

Düzenle:

Bazı yorumlar olsa belirttiği gibi, kullanarak delay()içinde loop()güç tüketimi için hiçbir şey değişecektir.

Bu nedenle, setup()çalıştırıldıktan sonra güç tüketimini azaltmak istiyorsanız, Atmel uyku modlarıyla oynamak zorunda kalacaksınız. Arduino skeçlerinizden uyku modlarıyla nasıl başa çıkacağınızı gösteren bu makaleye göz atabilirsiniz ; Atmel'i uykuya koymaktan daha fazlasını yapar, ancak uyku modlarıyla oynamak istiyorsanız iyi (ve basit) bir okumadır.

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.