기사

C 표준 라이브러리 시간 및 시계 함수 사용

C 표준 라이브러리 시간 및 시계 함수 사용하기

C 표준에는 "time.h"에 선언된 시간 및 날짜에 대한 정의된 라이브러리가 있습니다. 이 라이브러리는 임베디드 애플리케이션에만 국한되지 않고 시간과 날짜에 대한 정보를 얻기 위해 널리 사용됩니다. 이 라이브러리는 IAR 임베디드 워크벤치에서 지원되며, 이 글에서는 툴체인에서 이 라이브러리를 사용하는 방법을 살펴보겠습니다.

time.h에서 지원하는 기능

C 언어의 시간 및 날짜 라이브러리는 time.h에 정의되어 있습니다. 이 헤더에는 시간, 상수 및 함수와 관련된 데이터 유형이 포함되어 있습니다:

데이터 유형 및 상수

clock_t 시간을 나타내는 데이터 타입
time_t 시간을 나타내는 데이터 타입
구조체 tm

다음 데이터를 담는 구조체입니다:
int tm_sec;// 초
int tm_min;// 분
int tm_hour;// 시간
int tm_mday; // 일
int tm_mon;// 월
int tm_year;// 년
int tm_wday;// 요일
int tm_yday;// 연초부터 경과한 날짜 중 날짜
int tm_isdst;// 서머타임과 같은 시즌 플래그

CLOCKS_PER_SEC 내부 타이밍 이벤트가 초당 발생하는 횟수입니다.

시간에 따라 작동하는 함수

clock 프로그램이 시작된 이후 경과한 시간을 반환합니다.
time 현재 시간을 1970년 1월 1일 00:00:00 이후 경과된 시간(초)으로 반환합니다.
diffftime 두 시간 사이의 경과 시간을 초 단위의 차이로 반환합니다.

변환 함수

asctime tm 객체를 문자열 표현으로 변환합니다.
ctime time_t 객체를 문자열 표현으로 변환합니다.
gmtime time_t 객체에서 tm 객체로 변환합니다.
localtime 현재 시간을 현지 시간으로 변환합니다.
strftime tm 객체를 지정된 형식으로 변환합니다.
mktime tm 객체에서 time_t 객체로 변환합니다.

IAR 임베디드 워크벤치에서 time.h를 사용하는 방법

임베디드 시스템에서 time.h 함수를 사용하려면 날짜와 시간을 계산하는 코드를 작성해야 합니다. IAR 임베디드 워크벤치에서 시간 라이브러리를 사용하고 구현하는 방법에 대한 두 가지 사례를 소개합니다.

첫 번째 경우는 디버거를 사용할 때 적용 가능합니다. 시간 정보는 디버거에서 제공됩니다. 디버거가 대상 보드에서 분리된 경우에는 이 정보를 사용할 수 없습니다. 두 번째 예는 디버거를 사용하지 않고 시간을 관리하는 방법을 보여줍니다.

예 1: 디버깅 중 시간 정보 관리하기

디버거를 사용할 수 있는 경우 애플리케이션에서 데이터/시간 라이브러리를 사용할 수 있으므로 시간 정보를 관리하기 위해 다른 것을 구현할 필요가 없습니다. 다음은 시계()를 사용하는 코드와 시간()을 사용하는 코드 예제 두 가지입니다.

다음과 같은 방법으로 시계를 사용하여 시스템 시작부터 경과된 시간을 얻을 수 있습니다:

clock_t clk_time;

clk_time = clock ();
printf ("clock time:% dsec \ n", clk_time / CLOCKS_PER_SEC);

문자열 표시 변환을 사용하여 날짜와 시간을 가져올 수도 있습니다:

time_t now;
struct tm * ts;
char buf [80];

now = time (NULL);
ts = localtime (& now);
strftime (buf, sizeof (buf), "% a% Y-% m-% d% H:% M:% S% Z", ts);
printf ("% s \ n", buf);

위 코드 예제의 결과는 다음과 같습니다:

시계 시간: 234초
2015-07-11 00:11:40
...

예제 2: 디버거 없이 구현하기

디버거가 없으면 애플리케이션은 날짜 및 시간 라이브러리의 저수준 구현을 구현해야 합니다. RTOS를 사용하는 경우 유사한 기능이 제공될 수 있으며 이를 사용할 수 있습니다.

아래 예는 스틱 타이머가 있는 ARM Cortex-M 디바이스에 대한 예입니다. 타이머를 사용하면 데이터 및 시간 함수를 쉽게 구현할 수 있습니다. 이 예제에서는 1msec마다 인터럽트를 생성합니다.

시간과 시계에 대한 두 개의 변수를 정의하고 CLOCKS_PER_SEC를 1초 단위의 틱으로 정의합니다:

#define CLOCKS_PER_SEC (1000)
clock_t clk_count = 0;
time_t time_dat;

SysTick에 대한 인터럽트 핸들러를 생성합니다. 오버플로우를 방지하기 위해 clk_count에 64비트 변수를 사용하는 것이 좋습니다. 인터럽트가 발생하면 clk_count가 증가하고 1초가 지나면 time_dat가 증가합니다:

void SysTick_Handler (void) {
clk_count ++;
if ((clk_count% 1000) == 0) {
time_dat ++;
}
}

두 함수는 변수를 사용하여 구현됩니다:

clock_t clock (void) {
return (clk_count);
}

time_t __time32 (time_t * p) {
return time_dat;
}

시계()는 경과 시간을 반환하므로 변수 "clk_count"는 0으로 초기화됩니다. 변수 "time_dat"는 현재 시간으로 초기화되어야 합니다. 변환 함수를 사용하여 초기화할 수 있습니다. 이 예제에서는 변환에 mktime을 사용합니다:

구조체 tm orig;
orig.tm_sec = 10;
orig.tm_min = 46;
orig.tm_hour = 9;
orig.tm_mday = 10;
orig.tm_mon = 6;
orig.tm_year = 115;
orig.tm_wday = 5;
orig.tm_yday = 19;
orig.tm_isdst =-1;
time_dat = mktime (& org);

이렇게 하면 날짜가 2015년 7월 10일 09:46:10(금)이 됩니다.

결과적으로 SysTick 핸들러를 호출할 때마다 변수가 업데이트됩니다. 이러한 저수준 구현을 적용하면 애플리케이션에서 시계 및 시간 함수를 사용할 수 있습니다.

결론

time.h에 구현된 표준 C 라이브러리 날짜 및 시간 연산을 IAR 임베디드 워크벤치에서 사용할 수 있습니다. 디버거에서 제공하는 정보를 사용하여 저수준 구현을 작성하지 않고도 이러한 함수를 사용할 수 있습니다. 디버거를 사용하지 않고 라이브러리를 사용하려면 이 문서에 설명된 대로 로우레벨 코드를 구현하여 날짜 및 시간 함수를 사용할 수 있습니다.