아두이노 기초 강좌 12 – delay 함수와 싱글 스레드
아두이노 기초 강좌는 아두이노를 처음 접하시는 전자분야 비 전공자를 위한 강좌입니다. 이해를 위해서는 간단한 프로그래밍 지식이 필요할 수 있습니다. 프로그래밍이 처음이라면 [아두이노 프로그래밍 기초] 강좌를 먼저 읽으시길 권해 드립니다.
=============================================================
이번 강좌에서는 delay 함수에 대해서 얘기해 보겠습니다.
1. delay 함수와 주의 사항
delay(milli_second);
굉장히 간단한 함수입니다. 이 함수를 사용하면 아두이노가 이 함수를 처리할 때 지정된 milli-second(밀리초, 1/1000초 단위) 동안 아무것도 안하고 쉬게됩니다. 이 함수는 아두이노에서 굉장히 빈번히 사용되는데, 사용할 때 주의할 점이 있습니다.
아두이노 기초강좌 5편을 보시면 버튼 예제가 있습니다. 버튼을 눌렀을 때 이를 감지하고 그 결과를 Serial Monitor로 출력하는 예제입니다.
/* DigitalReadSerial Reads a digital input on pin 2, prints the result to the serial monitor This example code is in the public domain. */ // digital pin 2 has a pushbutton attached to it. Give it a name: int pushButton = 2; // the setup routine runs once when you press reset: void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); // make the pushbutton's pin an input: pinMode(pushButton, INPUT); } // the loop routine runs over and over again forever: void loop() { // read the input pin: int buttonState = digitalRead(pushButton); // print out the state of the button: Serial.println(buttonState); delay(1); // delay in between reads for stability }
주석을 제거하고 보면 간단한 코드입니다. loop 구문 안에서 수행되는 작업은
버튼 상태 읽기 –> 시리얼로 상태 출력 –> delay 로 잠시 쉼 (1/1000 초)
이 순서를 반복합니다.
그런데 여기서 delay(1000); 으로 수정하면 어떻게 될까요?
void loop() { int buttonState = digitalRead(pushButton); Serial.println(buttonState); delay(1000); }
그럼 버튼 상태 읽기 –> 상태 출력 –> 1초 쉽… 이렇게 바뀌니까 버튼 상태를 읽고 다음번 버튼 상태를 읽기까지 적어도 1초가 걸리는 겁니다. 매우 짧은 시간동안 버튼의 상태를 읽고 1초를 기다려버리니 사용자가 버튼을 길게 누르지 않고 짧게 누르면 떼버리면 ‘클릭’ 상태를 인식하지 못할 가능성이 커집니다.
그래서 버튼과 같이 특정 상태가 지속되지 않는 입력을 체크해야 하는 경우 반복문이 최대한 빨리 수행될 수 있도록 주의해야 합니다. delay 함수와 같이 아두이노가 멈춰버리는 함수 혹은 시간이 오래 걸리는 작업을 최대한 줄여야 합니다.
.
2. 아두이노는 일꾼이 한 명 뿐
사실 delay 함수에 이런 제약이 생기는 것은 아두이노가 오로지 싱글 프로세스, 싱글 스레드 만을 지원하기 때문입니다. 뭔 소리냐면…
아두이노에서는 우리가 작성한 코드를 처리하기 위해 오로지 한 명의 일꾼만을 투입한다는 얘기입니다. PC나 폰은 다중 프로세스, 다중 스레드를 지원합니다. 즉 여러명의 일꾼들을 투입할 수 있다는 의미입니다. 따라서 PC나 폰에서 똑같은 버튼 입력 작업을 한다면 한명은 버튼 상태만 감지하도록 시키고 다른 한 명은 버튼 상태에 따라 원하는 작업을 하도록 하면 되죠. 아두이노는 이게 안된다는 의미입니다.
만약에 입력장치로 버튼을 사용하지 않고 포텐셔미터를 사용한다면 어떨까요?? 포텐셔미터는 휠의 위치에 따라 저항이 변하는 입력 장치이기 때문에, 사용자가 움직임을 주면 변경된 상태(저항값)가 유지됩니다. 그래서 이런 문제에서 더 자유롭죠.
버튼과 delay 함수 사용시 발생하는 이런 문제는 다른 곳에서도 발생합니다. 앞선 강좌에서.. PC에서 시리얼 모니터로 글자들을 전송하면 아두이노에서 아래 함수를 사용해서 읽어옵니다.
if( Serial.available() ) { char input = Serial.read(); ... }
그런데 PC에서 전송한 데이터를 읽기 전후에 굉장히 복잡한 작업을 처리하거나 delay 함수를 써서 아두이노가 상당한 시간동안 손 놓고 있다면?? PC에서 많은 데이터를 전송할 때 전송한 데이터가 누락되거나 버퍼(데이터 임시 저장소)가 흘러넘쳐 알 수 없는 문제가 발생할 수 있습니다.
delay 함수는 굉장히 유용하고 간단한 함수이지만 프로젝트가 복잡해 질 수록 사용에 주의가 필요합니다.
===============================================================
이 문서는 작성자의 동의없이 개인적인 목적 외의 상업적인 목적으로 활용되어서는 안됩니다.
이 문서의 일부 혹은 전체를 수정, 삭제, 재배포 하여서는 안됩니다.
작성자 : GodsTale (godstale@hotmail.com)