/*
 * _sleep_calib.h — внутренности калиброванного busy-wait, общие для
 * sleep() и delayms() (НЕ публичный заголовок).
 *
 * Калибровка лениво запускается ПЕРВЫМ вызовом sleep() ИЛИ delayms() —
 * если программа не зовёт ни одну из них, весь этот код даже не
 * линкуется (DCE по модулям).  См. sleep_redesign / delayms в памяти.
 */
#ifndef _SLEEP_CALIB_INTERNAL_H
#define _SLEEP_CALIB_INTERNAL_H

#include <stdint.h>

/* Итераций тесного цикла на ОДИН кадр (~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
