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 |