hrtimer de répéter la tâche dans le noyau Linux

Mon but est de créer une tâche récurrente dans le noyau linux à l'aide de la hrtimer struct. Je tiens à répéter toutes les 500 ms.

Cependant, je suis un peu confus sur la façon hrtimer travaille dans le noyau linux (voir linux/hrtimer.h). Je sais que le temps est spécifié, la fonction de rappel doit retourner HRTIMER_RESTART ou HRTIMER_NORESTART. J'ai trouvé quelques sources en ligne que l'état de la minuterie doit être remis à zéro dans le rappel à l'aide du hrtimer_forward méthode. Toutefois, les sources que j'ai vu sont un peu floues sur la façon d'ajouter le temps de travaux. Voici le code que j'ai pour l'instant:

static struct hrtimer timer;

static enum hrtimer_restart timer_callback(struct hrtimer *timer)
{
    printk(KERN_ERR "Callback\n");
    //I know something needs to go here to reset the timer
    return HRTIMER_RESTART;
}

static int init_timer(void)
{   
    ktime_t ktime;
    unsigned long delay_in_ms = 500L;
    printk(KERN_ERR "Timer being set up\n");

    ktime = ktime_set(0,delay_in_ms*1E6L);
    hrtimer_init(&timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);

    timer.function = &timer_callback;
    printk(KERN_ERR "Timer starting to fire\n");
    printk(KERN_ERR "in %ldms %ld\n", delay_in_ms, jiffies);

    hrtimer_start(&timer, ktime, HRTIMER_MODE_REL);
    return 0;
}

static void clean_load_balancing_timer(void)
{
    int cancelled = hrtimer_cancel(&timer);

    if (cancelled)
        printk(KERN_ERR "Timer still running\n");
    else
        printk(KERN_ERR "Timer cancelled\n");
}

Quelqu'un peut m'expliquer exactement comment la réinitialisation de la minuterie serait de travailler dans la fonction de callback? Merci!

Je me demande si vous vous rappelez comment un saut de seconde s'est écrasé parties du web parce que hrtimer ai pas compris? wired.com/2012/07/leap-second-glitch-explained

OriginalL'auteur Mason | 2012-11-03