본문 바로가기
임베디드

[임베디드] Timer를 이용해 1시간 이상 측정하기

by 코딩히어로 2021. 8. 17.
728x90

서버나 어플 같은 경우는 비교적 시간을 계산하는 게 굉장히 간단합니다.

 

왜냐하면 자체적인 Date 함수를 지원하기 때문에 프로그래머는 이 함수를 이용하면

 

현재시간 및 내가 원하는 시간대와의 시간차등을 손쉽게 구할 수 있습니다.

 

하지만 마이컴을 사용하는 임베디드 시스템에서는 시간 측정에 대한 부분은 제한적이기 때문에

 

몇 분 정도의 시간은 Timer로 구현이 쉽지만 시간 단위가 1시간 이상을 훌쩍 넘어갔을 시에는

 

어떻게 측정해야 하는지 간단하게 설명하도록 하겠습니다.

 

 

1) 문제점 고민


먼저 임베디드 시스템에서 Timer는 시스템상의 Clock을 이용해 시간을

 

측정할 수 있는 하나의 도구라고 생각하면 됩니다.

 

예를들어 시스템상의 Timer에서는 1ms마다 숫자를 하나식 세고 있다고 가정하겠습니다.

 

우리가 1분의 시간을 측정하기 위해서는 1분 = 60초이며

 

우리는 위에서 1ms마다 하나식 숫자를 세기 때문에 초를 ms로 변경해서 계산해야 합니다.

 

즉 1초 = 1000ms 가 되고 60초 = 60000ms이라는 결과가 나옵니다.

 

우리는 1분을 측정하기 위해서 60000개의 숫자를 세어야 가능하다는 것입니다.

 

자 그러면 1시간을 측정하려면 어떻게 해야 할까요??

 

1시간 = 60분

 

60분 = 3600초

 

3600초 = 3600000 ms

 

1시간 측정을 위해서는 시스템 Timer는 3,600,000개의 숫자를 세어야 하는 것입니다.

 

그럼 세면 되지 뭐가 문제냐?!

 

바로 임베디드 시스템은 메모리가 크지 않기 때문에 이 자료형에도 한정적이라는 것입니다.

 

즉 Timer를 통해 숫자를 세기 위해서는 지금까지 계산한 숫자를 저장할 변수가 필요하고

 

만약 short형을 사용했을 시에 저장 가능한 카운터 값은 32,767 가 됩니다.

 

즉, 우리는 3,600,000개를 세어야 하는데 32,767까지만 셀 수 있다는 결론에 도달합니다.

 

대게 8비트 마이컴 사용 시에는 int8이라는 자료형을 많이 사용하는데 이는 1byte와 같습니다.

 

즉 unsigned int8을 사용하더라도 범위는 255까지가 됩니다.

 

short형을 사용 시에는 32,767ms = 약 32초

 

unsigned int8형을 사용시에는 255 = 약 0,2초

 

를 측정할 수 있는 것입니다.

 

그러면 int형을 사용하게 되면 몇 시간을 셀 수 있을까요??

 

2,147,483,647 ms = 2,147,483초

 

2,147,483초 = 약 35,791분

 

약 35,791분 = 약 596시간

 

약 596시간 = 약 24일

 

이론상으로는 약 24일의 시간을 측정할 수 있습니다.

 

임베디스 시스템 상에서 이 정도 시간 측정이면 충분히 사용 가능하지만 만약에

 

이 이상 한 달 이상의 시간을 측정해야 한다면 어떻게 해야 할까요?

 

 

 

 

2) 해결방법은?


사실상 조금만 생각해보면 될 문제입니다.

 

정말 간단하게는 int형보다 정수형이 큰 unsigned int형을 쓴다거나의 방법으로도 충분히 가능합니다.

 

하지만 이렇게 되면 프로그램 가독성면에서도 떨어지는 점은 숫자가 너무 커지게 된다는 점입니다.

 

자 우리는 간단하게 변수를 여러 개로 늘려줌으로써 이 문제를 간단하게 해결할 수 있습니다.

 

예를 들어 아래와 같이 3개의 변수를 추가해줍니다.

 

int8 Hour

 

int16 Min

 

int8 Sec

 

이렇게만 선언해도 결론적으로 int32 즉 int형과 같은 4byte만 사용합니다.

 

로직은 어떻게 해야 하는가??

 

Timer가 1000ms 경과했을 경우에 Sec를 +1

 

Sec가 60개가 되면 Min을 +1

 

Min이 60개가 되면 Hour을 +1

 

해주는 방식으로 프로그램을 구성합니다.

 

자 이렇게 되면 일단 가독성면에서는 전과 확연히 차이가 나게 됩니다.

 

기존 245시간 측정 시 값은 882,000이 됩니다.

 

딱 보기에도 몇 시간인지 잘 모르겠습니다.

 

하지만 가독성을 높인 로직은

 

Hour = 245

Min = 0

Sec = 0

 

으로 한눈에 보기에도 245시간이라는 점을 알 수 있습니다.

 

여기서 Hour이 int8로 1byte이지만 시간 값을 늘리려면 int32로 변경해준다면

 

총 측정 가능한 시간은 2,147,483,647시간이 됩니다.

 

기존 시스템은 약 24일의 측정범위를 가진다면 변경한 시스템은 약 89,478,485일의 측정 범위를 가집니다.

728x90
반응형

'임베디드' 카테고리의 다른 글

[임베디드] CAN 통신이란?  (0) 2021.12.27
[임베디드] Timer란?  (0) 2021.10.12
[임베디드] RS485 통신이란?  (0) 2021.08.26
[임베디드] RS232 TX Interrupt란?  (0) 2021.03.12
[임베디드] 하드웨어 테스트지그  (0) 2020.09.29

댓글