Apakah pengaturan dan loop disediakan untuk kenyamanan?

13

Sketsa Arduino biasanya memiliki fitur setupdan loopfungsi. Apakah fungsi-fungsi ini hanya disediakan untuk kenyamanan atau apakah mereka sebenarnya memiliki tujuan khusus? (misalnya: apakah beberapa operasi tidak diizinkan atau diizinkan dalam pengaturan dan putaran)

Apakah kedua kode ini setara:

Klasik

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

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

Tanpa loop

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

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


void loop() {
}

Apakah mungkin untuk menulis kode tanpa setup atau loop, menyediakan, misalnya, mainmetode atau titik masuk lainnya?

Sebazzz
sumber

Jawaban:

10

Potongan-potongan kode itu hampir sama.

Jika Anda melihat kode sumber Arduino Anda akan melihat:

setup();

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

(Saya tidak yakin apa yang serialEventRun()terjadi.)

Saya tidak berpikir Anda bisa 'membebani' maindeklarasi fungsi. Juga perhatikan bahwa panggilan fungsi utama init, yang misalnya mengkonfigurasi timer, millis()dll. Akan berfungsi.

Gerben
sumber
9

Apakah fungsi-fungsi ini hanya disediakan untuk kenyamanan atau apakah mereka sebenarnya memiliki tujuan khusus?

Perpustakaan Arduino melakukan sedikit perawatanloop() , terkait dengan penanganan serial .

Apakah kedua kode ini setara:

Hanya jika Anda tidak pernah menggunakan acara serial.

Apakah mungkin untuk menulis kode tanpa setup atau loop, menyediakan, misalnya, metode utama atau titik masuk lainnya?

Tidak sementara benar-benar menggunakan perpustakaan Arduino melalui IDE; penghubung akan mengeluhkan maindefinisi duplikat atau hilang setupatau loopdefinisi.

Ignacio Vazquez-Abrams
sumber
2

Apakah mungkin untuk menulis kode tanpa setup atau loop, menyediakan, misalnya, metode utama atau titik masuk lainnya?

Terakhir kali saya menggunakan IDE, Anda dapat memiliki proyek tanpa .ino/ .pdefile, hanya .cppfile; karena itu adalah .inocampuran dari .cppyang mendefinisikan mainfungsi, jika Anda melewati langkah itu maka Anda dapat menentukan sendiri main.

Jika IDE tidak lagi mengizinkan ini (seperti yang saya dengar), Anda masih dapat melakukan hal yang sama dengan mis. Build berbasis Makefile di luar IDE, tanpa meninggalkan perpustakaan Arduino. Peringatan yang saya tahu adalah:

  • Anda harus melakukannya #include "Arduino.h"jika Anda ingin mengakses fungsi perpustakaan.
  • Anda harus menelepon init()jika Anda ingin perpustakaan mengatur periferal seperti dulu.
  • Anda harus meletakkan serialEventkode yang Gerben tunjukkan di mainloop Anda jika Anda ingin serialEventhandler dijalankan (tetapi Anda mungkin tidak membutuhkan ini jika Anda ingin menulis mainloop Anda sendiri).
hobbs
sumber
1

Sketsa Arduino biasanya menampilkan fungsi pengaturan dan loop. Apakah fungsi-fungsi ini hanya disediakan untuk kenyamanan atau apakah mereka sebenarnya memiliki tujuan khusus?

Mereka melempar panggilan fungsi ekstra inityang menginisialisasi timer yang memungkinkan millis, microsdan delaybekerja tanpa upaya lebih lanjut. Selain itu, tidak.

Kode ini mengkompilasi (dan menjalankan) di bawah IDE:

int main ()
  {
  }

Secara efektif, IDE menghasilkan kode seperti ini:

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

Mereka telah memainkannya sejak itu, seperti yang dikatakan Ignacio Vazquez-Abrams, tetapi pada dasarnya Anda dapat mengabaikannya. Tidak ada yang spesial setupdan istimewa loop.

Anda dapat menggunakan mainseperti yang saya tunjukkan di atas. Anda dapat melakukan semuanya setupjika Anda mau. Anda dapat melakukan semuanya loopjika Anda mau (jika Anda tidak pernah kembali darinya).

Ingat, Anda berurusan dengan kompiler C ++ di sini. Fungsi tidak memiliki arti magis berdasarkan nama mereka.

Nick Gammon
sumber