1

hrtimer を開始する Linux モジュールを作成します。これは、20us ごとに呼び出されるコールバック関数です。開始時間を 0 とすると、コールバック関数の実行時間は 20us、40us、60us になるはずです。長い時間。なぜこれが起こったのか疑問に思っています。

私のモジュールは x86_64 プラットフォームで実行されており、遅延の計算には tsc が使用されています。以下は私のコードです:

static enum hrtimer_restart hwt_timer_fn(struct hrtimer *timer) {
    unsigned long long tick_start;

    rdtscll(tick_start);
    tick_err = tick_start - cmp_cycle;
    cmp_cycle += tick_cycle;                //cmp_cycle means the next execute time of the callback function 
    hrtimer_add_expires(timer, expires);

    count++;
    if(tick_err > max_err)
            max_err = tick_err;
    if(tick_err < min_err)
            min_err = tick_err;

    return HRTIMER_RESTART;
}

static int kthread_hrtimer(void *arg) {
    struct timespec val;
    unsigned long long tick_start;

    val.tv_sec = 0;
    val.tv_nsec = 20*1000;
    expires = timespec_to_ktime(val);

    count = 0;
    max_err = min_err = 0;
    tick_cycle = cpu_khz/50;        //the tsc cycle of 20us
    printk("cpu_freq:%u,tick_cycle:%llu\n",cpu_khz,tick_cycle);

    hrtimer_init(&timer, CLOCK_REALTIME, HRTIMER_MODE_ABS);
    timer.function = hwt_timer_fn;

    rdtscll(tick_start);
    hrtimer_start(&timer,expires,HRTIMER_MODE_REL);
    cmp_cycle = tick_start + tick_cycle;

    return 0;
}

int hwt_timer_init(void) {
    cpumask_t mask;

    cpus_clear(mask);
    cpu_set(0,mask);

    thread = kthread_create(kthread_hrtimer,NULL,"kthread_hrtimer");
    if(IS_ERR(thread))
    {
            printk("create failure\n");
            return 1;
    }
    set_cpus_allowed_ptr(thread,&mask);
    wake_up_process(thread);

    return 0;
}

void hwt_timer_exit(void) {
    while(hrtimer_try_to_cancel(&timer) < 0);
    printk("max_err:%lld,min_err:%lld\n",max_err,min_err);
    printk("count:%lld\n",count);
    printk("\n\n");
}
4

2 に答える 2

0

Safayet Ahmed の回答を支持します。とにかくコメントを追加したい。

システムの CONFIG_HZ オプションを確認してください。通常、CONFIG_HZ は 1000 です。これは、システム タイマーの精度が約 1 ミリ秒になることを意味します (通常は 1 ミリ秒よりも優れていますが、「us」精度には達しません)。

CONFIG_HZ をより大きな値に変更して、hrtimer の精度が向上するかどうかを確認してください。そうでない場合は、hrtimer API を確認してください。この問題は、hrtimer API の誤用に関連している可能性があります。

于 2013-07-26T03:07:05.443 に答える