是否提供设置和循环以方便使用?


13

Arduino草图通常具有setuploop功能。这些功能仅仅是为了方便而提供的,还是实际上具有特殊目的?(例如:在设置和循环中是否禁止或允许某些操作)

这两个代码是否等效:

经典

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方法或其他入口点?

Answers:


10

这些代码几乎相同。

如果您查看Arduino源代码,将会看到:

setup();

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

(我不确定该怎么办serialEventRun()。)

我认为您不能“重载” main函数声明。还要注意,主要功能调用init,例如配置计时器,因此millis()等将起作用。


9

这些功能仅仅是为了方便而提供的,还是实际上有特殊目的?

Arduino库做了一些整理工作loop(),与串行处理有关

这两个代码是否等效:

仅当您从不使用串行事件时。

是否可以在没有设置或循环的情况下编写代码,例如提供主要方法或其他入口点?

不要同时通过IDE严格使用Arduino库;链接器将抱怨重复的main定义或缺少setuploop定义。


2

是否可以在没有设置或循环的情况下编写代码,例如提供主要方法或其他入口点?

我上一次使用IDE时,您可能有一个项目,该项目没有.ino/ .pde文件,只有.cpp文件;因为它的是混淆.ino成一个.cpp定义的main功能,如果你绕过这一步,那么你可以定义自己main

如果IDE不再允许这样做(如我所知),您仍然可以在IDE外部使用基于Makefile的构建进行相同的操作,而无需放弃Arduino库。我知道的警告是:

  • #include "Arduino.h"如果要访问库功能,则应该这样做。
  • init()如果您希望库以您惯常的方式设置外围设备,则应致电。
  • serialEvent如果要serialEvent运行处理程序,应将Gerben指出的代码放在主循环中(但如果要编写自己的主循环,则可能根本不需要此代码)。

1

Arduino草图通常具有设置和循环功能。这些功能仅仅是为了方便而提供的,还是实际上有特殊目的?

它们会引发一个额外的函数调用,init该函数将初始化让let的计时器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)所说,此后他们一直在摆弄它,但是基本上您可以忽略它。没有什么特别的setuploop

您可以main像上面显示的那样使用。您可以根据需要进行所有操作setup。您可以根据需要进行所有操作loop(如果您从不回来的话)。

请记住,您在这里使用的是C ++编译器。基于函数名称的功能没有神奇的意义。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.