만져보는 임베디드 시스템/아두이노 소프트웨어

아두이노 소프트웨어-xi. 함수 -시간함수

hanjinee 2020. 12. 31. 00:42
728x90
반응형

아두이노는 여러가지의 함수를 가지고 있는데요, 오늘은 시간 함수에 대해서 알아보도록 하겠습니다.

이번 포스트에서 소개할 시간 함수는 프로그램이 구동되고 '얼마만큼의 시간이 지났는 가'를 측정하는 -경과 시간 체크 함수-와, 프로그램을 지정한 시간만큼 멈추어 주는 -동작 시간 지연 함수-에 대해서 알아보겠습니다. 

 

 

경과시간 체크 함수

경과시간 체크 함수에는 두 가지가 있습니다. 

millis

micros

 

millis 함수

unsigned long millis(void)

프로그램이 시작한 후의 경과 시간 밀리초(milli-seconds, 1/1000초) 단위로 반환하는 간단한 함수입니다. 

 50의 시간이 경과하면 overflow로 인해 다시 0이됩니다.

경과시간은 4바이트 크기의 unsigned long 형식을 가지므로, 2바이트 크기의 int와 함께 사용하는 경우 데이터 손실이 발생할 수 있음을 주의하세요. 또한 경과 시간은 항상 양수값이기에 unsigned 자료형으로 선언후에 저장하시면 됩니다. 

사용은 다음과 같이 하시면 됩니다. 

time = millis();

 

micros 함수

unsigned long micros(void)

millis와 마찬가지의 원리를 지닌 함수입니다. 프로그램이 실행되고 경과된 시간을 마이크로초(micro-seconds, 1/1000 밀리초) 단위로 반환하는 함수입니다. 약 70분의 시간이 경과하면 overflow가 발생하여 0이됩니다. 

반환되는 값은 항상 4의 배수로 주어집니다. micros 함수 자체가 4마이크로초의 해상도를 가지기 때문입니다.

유의하실 점은 millis 함수와 같습니다. 

time = micros();

 

 

동작 시간 지연 함수

delay

delayMicroseconds

 

delay함수

void delay(unsigned long time)

time에는 밀리초(milli-seconds, 1/1000초) 단위의 값을 넣어주시면 됩니다.

간단하게, 지정한 시간(time값)만큼 프로그램을 일시 중지 시키는 함수 입니다. 

 

delay(1000);

위와 같이 쓰시게 되면 1초(=1000/1000 밀리초)를 일시 중지 합니다. 

매우 간단한 함수이기 때문에, 많이 쓰이기는 하지만 주의하실 점이 있습니다.

 

10밀리초 이상의 대기시간이 필요한 경우 delay 함수를 쓰지 않는 것이 바람직합니다. 

-delay함수가 가진 가장 큰 특징 '프로그램을 일시 중지 시킨다.' 라는 점이 문제로 작용할 때 입니다. 

delay 함수가 실행중인 동안에는 센서, 다른 부품들의 기능, 작업들이 정지하게 됩니다. 

pc와는 다르게, 아두이노는 '싱글 스레드'이기 때문에(쉽게 일꾼 한 마리 라고 생각하시면 됩니다.) 한번에 한 가지 일 밖에 못합니다. 즉, 프로그램이 멈춰있으라는 명령이 실행되는 동안 전송중인 데이터가 누락되거나,. 데이터 임시 저장소인 버퍼가 넘치게 되는 문제점이 발생할 수 있지요. 따라서 설계중인 프로그램이 복잡할 수록 사용하지 않는 것이 바람직합니다. 외에 millis 함수를 통해 경과 시간을 측정하는 방법을 권장합니다.

 

delay함수가 실행중인 동안에도 몇 가지 작업은 계속되는 데요, 

ex) RX핀으로 수신되는 시리얼 통신 데이터는 수신 버퍼에 기록되기도 하고, analogWrite에 쓰인 PWM값은 그대로 유지되며, 인터럽트 역시 동작합니다. 

 

delayMicroseconds 함수

void delayMicroseconds (unsigned long time)

time: 마이크로초 단위의 시간.

delay함수와 같습니다. 차이점은, 마이크로초(micro-seconds, 1/1000 밀리초) 단위로 프로그램을 일시 중지 시키는 함수입니다. 

현재 최대 지연 시간은 16383 마이크로초입니다. (www.arduino.cc 발췌)

이보다 긴 지연시간을 필요로 할 때는 delay함수를 사용하시면 됩니다. delayMicroseconds 함수는 3마이크로초 이상에서 정화가게 동작하며, 그 미만에서는 정확성을 보장하지 못합니다.

 

특징, 문제점 모두 delay함수와 같습니다. 

 

 

 

 

 

 

 

728x90
반응형