서버나 어플 같은 경우는 비교적 시간을 계산하는 게 굉장히 간단합니다.
왜냐하면 자체적인 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일의 측정 범위를 가집니다.
'임베디드' 카테고리의 다른 글
[임베디드] 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 |
댓글