Arduino의 일회성 실행 코드


12

질문 : Arduino 시작시 한 번만 실행하려면 코드를 어디에 두어야합니까?

배경 : 전원주기마다 한 번씩 실행해야하는 작업을 수행하기 위해 Arduino를 사용하는 경향이 있습니다. (예를 들어, 로봇은 전원을 켤 마다 한 번만 앞으로 나아가 야 합니다. 그 이상으로 탁자가 떨어질 수 있습니다.)

표준 Arduino IDE "템플릿"은 loop()setup()기능으로 구성됩니다 . setup코드는 전원을 껐다 한 번씩 실행하고는 loop이 끝난 때마다 다시 시작됩니다.

"일회성 작업"을 코딩하는 두 가지 방법이 있습니다.

방법 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 커뮤니티에서 이러한 상황에 대해?


exit명령 의 일부 사용은 arduino.stackexchange.com/questions/188/…
TheDoctor

답변:


13

나는 당신의 질문에 혼란 스럽습니다. 시작 당 한 번 설정 기능을 어디에 배치 할 것인지 묻고 설정 기능에 대해 설명합니다. 이것이 바로 설정 기능입니다.

따라서 일회성 설정 기능은 설정 기능에 적용됩니다.

FWIW, and 함수 를 호출 하는 파일을 보면 : 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

1
@anorton-의심 스러우면 표지를보십시오. 아두 이노 플랫폼은 프로토 타이핑에 편리하지만, 대부분 상용구 코드입니다. 무엇을하고 있는지 이해하는 것은 무언가를 설계하는 방법을 결정하는 데 큰 도움이 될 수 있습니다.
코너 울프

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

방법 2와 함께하십시오. 이것이 바로 설정 기능입니다. 읽는 것도 훨씬 쉽습니다. 그 안에있는 loop()것은 루프에서 실행될 것임을 의미합니다.


0

대부분의 다른 답변과 마찬가지로 방법 2를 사용합니다.

그러나 저는 아두 이노 라이브러리에 의해 loop()Atmel이 "많은"전류를 전혀 소비 하지 않도록하는 공란에 대한 호출을 피하려고합니다 .

편집하다:

일부 의견에서 지적했듯이 delay()in loop()을 사용 하면 전력 소비에 아무런 변화가 없습니다.

따라서 일단 setup()실행 한 후 전력 소비를 줄이려면 Atmel 절전 모드를 사용해야합니다. Arduino 스케치에서 슬립 모드를 처리하는 방법을 보여주는 이 기사 를 살펴보십시오 . Atmel을 잠자기 상태로 만드는 것 이상을 할 수 있지만 잠자기 모드로 놀고 싶다면 좋은 (그리고 간단한) 독서입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.