Arduino中一次性执行的代码


12

问题:如果我希望每次Arduino启动仅执行一次代码,该将代码放在哪里?

背景:我倾向于使用Arduino执行应该在每个电源周期执行一次的任务。(例如,我的机器人每次打开时都只能向前行驶一次 -超过此次数,它就有可能从桌子上掉下来。)

标准的Arduino IDE“模板”由loop()setup()函数组成。该setup代码在每个电源循环中运行一次,并且loop每次结束时都会重新启动。

我看到两种编码“ 1次任务”的方法:

方法1:“循环一次”

void setup() {
  //do setup stuff
}

void loop() {
  //do task

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

方法2:“仅安装”

void setup() {
  //do setup stuff

  //do task
}

void loop() {
  //do nothing
}

问题的更详细形式: 从硬件/软件的角度来看,这些方法之一是否“更好”?(例如,有关该setup功能的任何“特殊”之处,例如它只能运行这么长时间?)
而且,如果从硬件/软件角度来看它们相同,那么是否存在“最佳实践”或标准的代码编写方式? Arduino社区中的这些情况?


Answers:


13

我对您的问题感到困惑。您询问要在每次启动时放置一次安装功能的位置,然后讨论安装功能。这就是设置功能的目的。

这样,一次性设置功能将进入设置功能。

FWIW,如果该文件中查找调用setuploop功能:

#include <Arduino.h>

int main(void)
{
    init();

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

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

出于所有意图和目的,这两个选项是完全相同的。无论哪种方式,您都会得到一个空的繁忙等待循环。坦白地说,我希望这两个不同的选项无论如何都可能发出相同的机器代码,所以整个事情都是没有问题的。

注意:
if (serialEventRun) serialEventRun();似乎是一种允许您附加在接收到串行数据时调用的功能的工具,但是,如果未void serialEvent(){}在代码中定义功能,则它将完全编译出来,并且不会出现在生成的机器代码中。


接受尚未(最高)投票的答案感到很奇怪。但是,看到main()函数定义确实对我的问题有所帮助。(并且,您确实使用setup而不是表示与小组达成共识loop)。谢谢您的帮助。
apnorton 2014年

1
@anorton-如有疑问,请看底下。我发现arduino平台可方便地进行原型制作,但很大程度上只是样板代码。了解它的功能可以极大地决定如何设计某些东西。
康纳·沃尔夫

6

我通常会使用方法2,但最终会这样做:

void setup() {
  //do setup stuff

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

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

void loop() {
  //do looping code
}

通过以上设置,它可以使我的代码更加井井有条。


到目前为止最好的答案+1,谢谢你,我救了我!
凯尔(Kyle)

5

我强烈希望使用方法2。如果您打算添加代码来处理输入,输出等,那么使用方法2则很容易-只需填写loop(),但需要在方法1中进行重做/重构。


3

设置功能没有时间限制。我更喜欢方法2,因为循环可以填充以后需要的任何东西。


1

绝对可以使用第二种方法。这就是设置功能的用途。它也更容易阅读。loop()暗示中的任何内容都将循环运行。


0

与大多数其他答案一样,我将使用方法2。

但是我会尽量避免由Arduino库调用到一个空的调用,该调用loop()使Atmel一无所有地消耗“大量”电流。

编辑:

正如一些评论指出的那样,使用delay()in loop()不会改变功耗。

因此,如果您想setup()在运行后降低功耗,则必须使用Atmel睡眠模式。您可以看一下这篇文章,其中展示了如何处理Arduino草图中的睡眠模式。它不仅可以使Atmel进入睡眠状态,而且,如果您想使用睡眠模式,那是一本好书(且简单)。

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.