QNX RTOS: 8-2. Getting and Setting the System Clock

2026. 1. 2. 11:19운영체제/QNX

1. QNX 내부 시간 표현 방식

QNX는 내부적으로 시간을 64비트 나노초(nanoseconds) 단위로 관리한다.

  • 기본 단위: uint64 (nanoseconds)
  • 높은 해상도와 긴 시간 범위를 동시에 만족
  • 모든 상위 POSIX 시간 API는 이 내부 표현을 기반으로 동작

QNX는 이 시간을 두 가지 주요 클록(clock) 으로 외부에 제공한다.


2. QNX에서 제공하는 두 가지 주요 Clock

2.1 CLOCK_MONOTONIC

  • 의미: 시스템 부팅 이후 경과한 시간
  • 기준: boot 시점
  • 특징
    • 절대 줄어들지 않음 (monotonic)
    • 시스템 시간이 바뀌어도 영향 없음
    • 내부적으로 ClockCycles() 기반
      • CPU 하드웨어 클록 카운터를 사용
  • 용도
    • 타이머, 시간 측정, 성능 분석
    • 지연 시간 계산, 주기 제어
    • 실시간 제어 로직

→ 실시간/제어/측정용은 항상 CLOCK_MONOTONIC 권장


2.2 CLOCK_REALTIME

  • 의미: 1970년 1월 1일 00:00:00 UTC 이후 경과 시간
    (POSIX Epoch Time)
  • 특징
    • CLOCK_MONOTONIC + 부팅 시점의 기준 시간(offset)
    • 일반적으로 “시스템 시간(system clock)”이라 부름
    • 날짜/시간 개념을 가지는 유일한 clock
  • 용도
    • 로그 타임스탬프
    • 파일 시간
    • POSIX 시간 API (time(), gettimeofday() 등)

→ 사람이 보는 시간, 로그, 파일 시간은 CLOCK_REALTIME


3. POSIX 시간 자료구조

QNX는 POSIX 표준 시간 타입을 그대로 사용한다.

3.1 time_t

  • 1970년 1월 1일 이후 초(second) 단위
  • QNX에서는 int64 타입으로 정의
  • 2038년 문제(Y2038) 없음
 

3.2 struct timespec

고해상도 POSIX 시간 구조체

struct timespec {
    time_t tv_sec;   // seconds
    long   tv_nsec;  // nanoseconds (0 ~ 999,999,999)
};
  • 초 + 나노초 단위
  • QNX 내부 64-bit nanoseconds 표현과 직접 매핑 가능
  • clock_gettime(), clock_settime()에서 사용

4. 시스템 부팅 시 시간 초기화

부팅 시 CLOCK_REALTIME은 다음과 같이 결정된다.

  • startup 코드에서 현재 시간을 제공하면
    • 해당 시간이 system time으로 설정됨
  • 아무 설정도 없으면
    • boot time = 0
    • 결과적으로 시스템 시간은 1970년 1월 1일 기준으로 시작

따라서 실제 시스템에서는 부팅 후 다음 중 하나로 시간을 설정하는 것이 일반적이다.

4.1 시스템 시간 공급 방법

  • RTC (Real-Time Clock)
    • 배터리 백업 하드웨어 시계
  • 네트워크 시간
    • NTP(Network Time Protocol)
    • PTP(Precision Time Protocol)
  • GPS
    • GPS 위성 기반 절대 시간

이러한 유틸리티/드라이버가 부팅 후 CLOCK_REALTIME을 갱신한다.


5. 시스템 시간 읽기 / 설정하기

5.1 시간 읽기 (clock_gettime)

struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
  • CLOCK_REALTIME → 시스템 시간
  • CLOCK_MONOTONIC → 부팅 이후 경과 시간

5.2 시간 설정 (clock_settime)

clock_settime(CLOCK_REALTIME, &ts);
  • 설정 가능한 것은 CLOCK_REALTIME뿐
  • CLOCK_MONOTONIC은 읽기 전용
  • 시스템 시간을 변경하려면 권한(ability) 필요

예: 하루(24시간)를 더하는 경우

ts.tv_sec += 24L * 60 * 60;
clock_settime(CLOCK_REALTIME, &ts);

long을 사용하는 이유는 컴파일러에서 정수 오버플로우를 방지하기 위함


6. 시간 점프 없이 보정하기: ClockAdjust

시스템 시간을 한 번에 확 바꾸면 문제가 생길 수 있다.

  • 로그 시간이 갑자기 튐
  • 타이머가 뒤로 감
  • 실행 중인 애플리케이션이 시간 역행을 경험

이를 방지하기 위해 QNX는 부드러운 시간 보정 API를 제공한다.

6.1 ClockAdjust 개념

  • 시간을 조금씩 나누어 점진적으로 보정
  • 일정 기간 동안 나노초 단위로 누적 조정
  • NTP/PTP와 같은 시간 동기화에 적합

6.2 보정 방식 예시

  • 총 보정량: 1초
  • 한 번에 적용할 변화량: 10,000 ns (10 μs)
  • 적용 횟수: 100,000번
  • 적용 기간: 100,000 ticks
    • 1 tick = 1 ms
    • 총 100초 동안 서서히 1초 보정

즉,

100초 동안 아주 조금씩 시간을 빠르게/느리게 흘려서
최종적으로 1초를 맞춘다

  • 음수 값을 주면 시간을 뒤로 보정하는 것도 가능
  • 이 역시 권한(ability) 필요

7. 나노초 ↔ timespec 변환 유틸리티

QNX는 나노초 기반 API를 편하게 쓰기 위한 헬퍼 함수들을 제공한다.

7.1 timespec ↔ nanoseconds

  • timespec2nsec()
  • nsec2timespec()
uint64_t ns = timespec2nsec(&ts);
nsec2timespec(&ts, ns);

7.2 나노초 단위로 바로 시간 읽기

uint64_t ns = timespec2nsec(&ts);
nsec2timespec(&ts, ns);
 

또는 더 간단하게:

uint64_t now = ClockCycles();       // monotonic 기반
uint64_t rt  = ClockTime();         // realtime 기반
  • uint64 나노초 값 바로 반환
  • 타이머/성능 측정에 매우 편리

8. 정리 요약

  • QNX 내부 시간 단위는 64-bit nanoseconds
  • 주요 클록
    • CLOCK_MONOTONIC: 부팅 이후 시간 (제어/측정용)
    • CLOCK_REALTIME: 1970 기준 절대 시간 (로그/시스템용)
  • 시스템 시간 설정은 CLOCK_REALTIME만 가능
  • 시간 동기화 시에는 ClockAdjust로 점진적 보정
  • POSIX 호환 time_t, timespec 완전 지원
  • 실시간 시스템에서는
    측정은 MONOTONIC, 표현은 REALTIME이 기본 패턴

'운영체제 > QNX' 카테고리의 다른 글

QNX RTOS: 8-4. High-Resolution Timers  (0) 2026.01.02
QNX RTOS: 8-3. Timers  (0) 2026.01.02
QNX RTOS: 8-1. Timing Architecture  (1) 2026.01.02
QNX RTOS: 7-3. Handling Interrupts 실습  (0) 2025.12.26
QNX RTOS: 7-3. Handling Interrupts  (0) 2025.12.26