반응형

아두이노 내에서 시간을 이용한 함수를 알아보고 주기성을 맞추는 방법, 실행 성능 계측 방법을 알아보자.

 

시간 관련 함수

시간 지연 함수

  • void delay(unsigned long DELAY_MS)
  • void delayMicroseconds(unsigned long DELAY_US)

내부 시계 시간 획득 함수

  • unsigned long millis()
  • unsigned long micros()

시간 지연 함수는 정확하게 시간을 맞춰주지 않는다.

이게 설정한 시간 만큼 추가로 쉬는건데, 심지어 정확하게 쉬지도 않는다.

주기성을 보장하지 않는다.

 

주기성을 보장하는 구현 방법

그나마 주기성을 가지게 하려면 내부 시계 값을 가져오는 것이 맞다.

이를 이용한 아두이노 구현 예시는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
unsigned long last_loop_time = micros();
unsigned long now_loop_time = micros();
unsigned long size_loop_time = 100*1000;
 
setup(){
  // Place your set-up code
}
 
loop(){
  // Place your code
 
  // If interval time is over pre-defined time,
  // Escape iteration loop
  while(1){
    now_loop_time = micros();
    if(now_loop_time - last_loop_time > size_loop_time){
      last_loop_time = last_loop_time + size_loop_time;
      break;
    }
  }
}
cs

요약하면 정해진 시간이 지날 때까지 반복문을 돌면서 대기하되,

루프를 나올 때, 지금 시간을 적는게 아니라 직전 시간+시간 간격 으로 설정하는 것이다.

 

이 방법은 주기성은 반드시 지켜주지만, loop()의 실행 속도에 따라서 들쭉날쭉 할 수 있다.

예를 들면 101ms, 100ms, 99ms, 101ms, 99ms 이런 식으로

소모시간이 주기 시간을 넘지 않는 이상, 주기는 반드시 맞춰주지만 정확한 시간 간격을 보장해주진 않는다.

 

실행 시간 측정 방법

실행 시간 측정 클래스 Tictok_us 를 만들어서 다음과 같이 구현할 수 있다.

tic() 과 toc() 간의 시간 차이를 구하고 getdt()으로 차이를 얻는다.

Main Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include "tictok_us.h"
 
Tictok_us* health_main  = new Tictok_us();
 
unsigned long last_loop_time = micros();
unsigned long now_loop_time = micros();
unsigned long size_loop_time = 100*1000// 100 ms
 
setup(){
  // Place your set-up code
}
 
loop(){
  health_main.tic();
  // Place your code
  health_main.toc();
 
  printf("Consumed time(us) : %d", health_main.getdt());
 
  // If interval time is over pre-defined time,
  // Escape iteration loop
  while(1){
    now_loop_time = micros();
    if(now_loop_time - last_loop_time > size_loop_time){
      last_loop_time = last_loop_time + size_loop_time;
      break;
    }
  }
}
cs

tictoc_us.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#pragma once
#ifndef _TICTOC_US_H_
#define _TICTOC_US_H_
 
#include <Arduino.h>
 
class Tictok_us{
public:
  Tictok_us();
  ~Tictok_us();
 
public:
  void tic();
  unsigned long toc();
  unsigned long getdt();
 
public:
  unsigned long last_tic = 0;
  unsigned long dt = 0;
};
 
#endif // _TICTOC_US_H_
cs

tictoc_us.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "tictok_us.h"
 
Tictok_us::Tictok_us(){
  last_tic = 0;
}
void Tictok_us::tic(){
  last_tic = micros();
}
unsigned long Tictok_us::toc(){
  dt = micros() - last_tic;
  return dt;
}
unsigned long Tictok_us::getdt(){
  return dt;
}
cs

 

끝.

 

728x90

+ Recent posts