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!
OriginalL'auteur Mason | 2012-11-03
Vous devez vous connecter pour publier un commentaire.
Si vous regardez dans kernel/sched.c autour de la ligne 170 dans la fonction sched_rt_period_timer, vous verrez un exemple d'utilisation. Les lignes essentielles sont
Maintenant obtenir de la minuterie à l'heure actuelle comme un ktime_t et rt_b->rt_period est un autre ktime_t en précisant la période au cours de laquelle à l'avance de la minuterie. Le délai d'expiration de la hrtimer sera continuellement incrémenté par la période jusqu'à ce qu'il est supérieur à l'heure actuelle. S'il a fallu plus d'une outre de la période de l'heure d'expiration supérieure à l'heure actuelle, la valeur de retour sera supérieur à 1 (ce qui indique plus de overrruns). Il peut être égal à zéro, si le timer expire avais pas avancé du tout.
Référence: http://lwn.net/Articles/167897/
L'API, il utilise est à partir d'une autre version du noyau, de sorte que certains des arguments ont changé. L'idée de base est toujours le même.
OriginalL'auteur Zhehao Mao
Ci-dessous est la solution simple,
OriginalL'auteur Ayyappan Rathinam