/* * _sleep_calib.h — внутренности калиброванного busy-wait, общие для * sleep() и delayms() (НЕ публичный заголовок). * * Калибровка лениво запускается ПЕРВЫМ вызовом sleep() ИЛИ delayms() — * если программа не зовёт ни одну из них, весь этот код даже не * линкуется (DCE по модулям). См. sleep_redesign / delayms в памяти. */ #ifndef _SLEEP_CALIB_INTERNAL_H #define _SLEEP_CALIB_INTERNAL_H #include /* Итераций тесного цикла на ОДИН кадр (~20 мс @ 50 Гц); 0 = ещё не * откалибровано (или калибровка не удалась — irq_install занят). */ extern uint16_t _sleep_units_per_frame; /* Итераций на 1 мс — производное от _sleep_units_per_frame/20, * вычисляется один раз при калибровке (одно 16-битное деление на * константу, НЕ умножение и НЕ 32 бита). */ extern uint16_t _sleep_units_per_ms; /* Один раз откалиброваться против реального кадрового тика; при * неудаче (EBUSY — фрейм-хук занят другим irq_install()-клиентом) * оставляет оба поля в 0 — вызывающий берёт свой fallback. */ void _sleep_calibrate(void); /* Прогнать units итераций тесного цикла — чистый busy-wait. */ void _sleep_spin(uint16_t units); #endif