首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Linux C 高精度定時器:POSIX Timer (timer_create) 實作與應用

     編輯:關於C語言

POSIX Timer 核心優勢

  • 納秒級精度 (struct itimerspec 的 tv_nsec)
  • 信號驅動非同步通知 (SIGEV_SIGNAL)
  • 支援 CLOCK_REALTIME、CLOCK_MONOTONIC 等時鐘源
  • 可移植至符合 POSIX.1b 的系統

關鍵結構體

struct sigevent {
    int sigev_notify;      // SIGEV_SIGNAL/SIGEV_THREAD/SIGEV_NONE
    int sigev_signo;       // 通知信號編號
    union sigval sigev_value; // 傳遞給處理函數的值
};

struct itimerspec {
    struct timespec it_interval; // 週期間隔
    struct timespec it_value;    // 首次觸發/下次觸發
};

struct timespec {
    time_t tv_sec;   // 秒
    long   tv_nsec;  // 奈秒 (0-999,999,999)
};

完整範例:100ms 週期定時器 + rdtsc 校驗

#include <stdio.h>
#include <signal.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>

#define rdtsc(low,high) __asm__ __volatile__("rdtsc" : "=a"(low), "=d"(high))

timer_t timerid;

void handler(int sig, siginfo_t *si, void *uc) {
    static unsigned last = 0;
    unsigned low, high;
    rdtsc(low, high);
    unsigned diff = low - last;
    printf("TSC: %u, diff: %u, freq: %.1f MHz\n", low, diff, diff * 10.0 / 1e6);
    last = low;
}

int main(void) {
    struct sigaction sa = {0};
    sa.sa_flags = SA_SIGINFO;
    sa.sa_sigaction = handler;
    sigfillset(&sa.sa_mask);
    sigdelset(&sa.sa_mask, SIGRTMIN);
    sigaction(SIGRTMIN, &sa, NULL);

    struct sigevent sev = {0};
    sev.sigev_notify = SIGEV_SIGNAL;
    sev.sigev_signo = SIGRTMIN;
    sev.sigev_value.sival_ptr = &timerid;

    struct itimerspec its = {0};
    its.it_interval.tv_sec = 0;
    its.it_interval.tv_nsec = 100 * 1000 * 1000;  // 100ms
    its.it_value = its.it_interval;

    timer_create(CLOCK_REALTIME, &sev, &timerid);
    timer_settime(timerid, 0, &its, NULL);

    for (int i = 0; i < 10; i++) pause();
    timer_delete(timerid);
    return 0;
}

編譯與輸出

gcc -o posix_timer posix_timer.c -lrt
./posix_timer

輸出顯示 TSC (Time Stamp Counter) 差值與估算頻率,驗證定時器精度。需連結 -lrt (Real-Time Library)。

遷移建議

  • 高精度週期任務 → timer_create + CLOCK_MONOTONIC
  • 簡單秒級定時 → setitimer / alarm
  • 多執行緒定時 → SIGEV_THREAD 模式
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved