Если вы используете циклы for, вам лучше знать, для чего они собираются, и сколько времени эти инструкции занимают при заданной тактовой частоте, и гарантируют, что процессор выполняет ваши инструкции и ничего больше ( это может быть сделано во встроенных системах, но это сложно, так как запрещает прерывания).
В противном случае вы не сможете сказать, сколько времени это действительно займет.
Ранние игры для ПК имели эту проблему - они были созданы для ПК с частотой 4,7 МГц, и, когда появились более быстрые компьютеры, они были неиграбельны.
Наилучший способ, которым может работать «сон», - это чтобы процессор знал, который час в данный момент. Не обязательно фактическое время (7:15 утра), но, по крайней мере, относительное время (8612 секунд с некоторого момента времени).
Таким образом, он может применить дельту к текущему времени и ждать в цикле, пока текущая + дельта не будет достигнута.
Все, что зависит от числа циклов ЦП, по своей сути ненадежно, поскольку ЦП может перейти к другой задаче и оставить ваш цикл зависшим.
Допустим, у вас есть 16-битный порт ввода-вывода с отображением в памяти, который ЦП увеличивает раз в секунду. Предположим также, что он находится в ячейке памяти 0x33 во встроенной системе, где целые числа также 16 бит. Функция, называемая сном, становится примерно такой:
void sleep (unsigned int delay) {
unsigned int target = peek(0x33) + delay;
while (peek(0x33) != target);
}
Вы должны будете убедиться, что peek () каждый раз возвращает содержимое памяти (чтобы оптимизирующие компиляторы не портили логику) и чтобы ваш оператор while выполнялся более одного раза в секунду, чтобы вы не пропустили цель , но это эксплуатационные проблемы, которые не влияют на концепцию, которую я представляю.