Là thiết lập và vòng lặp được cung cấp cho thuận tiện?


13

Bản phác thảo Arduino thường có một setuploopchức năng. Là những chức năng này chỉ được cung cấp cho thuận tiện hoặc chúng thực sự có mục đích đặc biệt? (ví dụ: một số thao tác không được phép hoặc được phép trong thiết lập và vòng lặp)

Là hai đoạn mã tương đương:

Cổ điển

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

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

Không có vòng lặp

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

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


void loop() {
}

Có thể viết mã mà không cần thiết lập hoặc lặp, cung cấp, ví dụ, một mainphương thức hoặc điểm nhập khác?

Câu trả lời:


10

Những đoạn mã này khá giống nhau.

Nếu bạn nhìn vào mã nguồn Arduino bạn sẽ thấy:

setup();

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

(Tôi không chắc chắn những gì serialEventRun().)

Tôi không nghĩ bạn có thể 'quá tải' mainkhai báo hàm. Cũng lưu ý rằng các lệnh gọi hàm chính init, ví dụ như cấu hình bộ định thời, vì vậy, millis()vv sẽ hoạt động.


9

Là những chức năng này chỉ được cung cấp cho thuận tiện hoặc chúng thực sự có mục đích đặc biệt?

Các thư viện Arduino thực hiện một chút công việc dọn phòng loop(), liên quan đến xử lý nối tiếp .

Là hai đoạn mã tương đương:

Chỉ khi bạn không bao giờ sử dụng các sự kiện nối tiếp.

Có thể viết mã mà không cần thiết lập hoặc lặp, cung cấp, ví dụ, một phương thức chính hoặc điểm nhập khác?

Không phải trong khi sử dụng nghiêm ngặt các thư viện Arduino thông qua IDE; trình liên kết sẽ khiếu nại về các mainđịnh nghĩa trùng lặp hoặc thiếu setuphoặc loopđịnh nghĩa.


2

Có thể viết mã mà không cần thiết lập hoặc lặp, cung cấp, ví dụ, một phương thức chính hoặc điểm nhập khác?

Lần cuối cùng tôi sử dụng IDE, bạn có thể có một dự án không có .ino/ .pdetệp, chỉ .cppcác tệp; vì đó là sự kết hợp của .inomột hàm .cppxác định mainhàm, nếu bạn bỏ qua bước đó thì bạn có thể xác định hàm của mình main.

Nếu IDE không còn cho phép điều này (như tôi đã nghe), bạn vẫn có thể làm điều tương tự với ví dụ: bản dựng dựa trên Makefile bên ngoài IDE, mà không từ bỏ các thư viện Arduino. Những lời cảnh báo mà tôi biết là:

  • Bạn nên #include "Arduino.h"nếu bạn muốn truy cập vào các chức năng thư viện.
  • Bạn nên gọi init()nếu bạn muốn thư viện thiết lập các thiết bị ngoại vi theo cách bạn đã quen.
  • Bạn nên đặt serialEventmã mà Gerben chỉ ra trong mainloop của bạn nếu bạn muốn một serialEventtrình xử lý chạy (nhưng có lẽ bạn không cần điều này nếu bạn muốn viết mainloop của riêng bạn).

1

Bản phác thảo Arduino thường có chức năng thiết lập và lặp. Là những chức năng này chỉ được cung cấp cho thuận tiện hoặc chúng thực sự có mục đích đặc biệt?

Họ ném vào một cuộc gọi chức năng thêm để initmà khởi sự giờ mà để cho millis, microsdelaylàm việc mà không nỗ lực hơn nữa. Ngoài ra, không.

Mã này biên dịch (và chạy) trong IDE:

int main ()
  {
  }

Thực tế, IDE tạo mã như thế này:

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

Họ đã loay hoay với nó kể từ đó, như Ignacio Vazquez-Abrams đã nói, nhưng về cơ bản bạn có thể bỏ qua điều đó. Không có gì đặc biệt về setuploop.

Bạn có thể sử dụng mainnhư tôi đã trình bày ở trên. Bạn có thể làm mọi thứ trong setupnếu bạn muốn. Bạn có thể làm mọi thứ loopnếu bạn muốn (nếu bạn không bao giờ quay lại từ đó).

Hãy nhớ rằng, bạn đang làm việc với một trình biên dịch C ++ ở đây. Các hàm không có một số ý nghĩa kỳ diệu dựa trên tên của chúng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.