функция сна - одно из мест, где используется таймер ЦП
Нет. Ядро Linux реализует планировщик . Когда вы вызываете nanosleep()
(библиотека GNU C на Linux использует nanosleep()
для реализации sleep()
), вы выполняете nanosleep syscall ; это заставляет ядро не планировать эту задачу (обычно поток в процессе пользовательского пространства) до того, как истечет желаемая продолжительность, или сигнал доставляется обработчику сигнала пользовательского пространства, установленному без флага SA_RESTART, с использованием этой задачи (в этом случае системный вызов возвращается с -EINTR
).
На микроконтроллере, скажем, Arduino или аналогичном, вы можете реализовать спящий режим, используя таймер.
Допустим, у вас есть таймер, который может отсчитывать от TIMER_MAX
до нуля, то есть спящий режим для любого количества единиц времени от 1 до TIMER_MAX
. Если вы хотите спать дольше, вы можете делать это через TIMER_MAX
интервалы:
/* 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);
}
Вы можете заменить последнее, а l oop на timer_sleep(duration)
, если timer_sleep(u)
всегда возвращает u
. Написано, как указано выше, с использованием двух циклов while, сон будет работать до тех пор, пока timer_sleep(u)
вернет u
или меньше.