la fonction sommeil est l'un des domaines dans lesquels une minuterie de l'unité centrale est utilisée
Non. Le noyau Linux met en œuvre une fonction de planificateur . Lorsque vous appelez nanosleep()
(la bibliothèque GNU C sous Linux utilise nanosleep()
pour mettre en œuvre sleep()
), vous faites un nanosleep syscall ; cela fait que le noyau ne planifie pas cette tâche (généralement un thread dans un processus de l'espace utilisateur) avant que la durée souhaitée ne soit écoulée, ou un signal est délivré à un gestionnaire de signaux de l'espace utilisateur installé sans le drapeau SA_RESTART en utilisant cette tâche (dans ce cas, l'appel système retourne avec le drapeau -EINTR
).
Sur un microcontrôleur, par exemple un Arduino ou similaire, vous puede mettre en œuvre le sommeil à l'aide d'une minuterie, cependant.
Supposons que vous disposiez d'un dispositif de minuterie qui peut compter de n'importe où jusqu'à TIMER_MAX
à zéro, c'est-à-dire dormir pour tout nombre d'unités de temps compris entre 1 et TIMER_MAX
. Si vous souhaitez dormir plus longtemps, vous pouvez le faire en TIMER_MAX
intervalles :
/* Timer-based sleep function; returns the number of units slept,
at most 'units'. Can only sleep between 1 and TIMER_MAX, inclusive. */
static unsigned short timer_sleep(unsigned short units);
void sleep(unsigned long duration)
{
/* "long" sleep(s) */
while (duration >= TIMER_MAX)
duration -= timer_sleep(TIMER_MAX);
/* "short" sleep(s) */
while (duration > 0)
duration -= timer_sleep(duration);
}
Vous pouvez remplacer cette dernière boucle while par un simple timer_sleep(duration)
si timer_sleep(u)
renvoie toujours u
. Ecrit comme ci-dessus, en utilisant deux boucles while, le sommeil fonctionnera tant que timer_sleep(u)
retours u
ou moins.