Реальные ОС имеют sleep
системные вызовы.например, POSIX nanosleep(2)
, где пользовательское пространство передает указатели на структуры, в которых указывается, сколько времени нужно спать, и что ядро заполняется тем, как долго оно фактически спало, если вы просыпаетесь рано.Если бы вы писали код для Linux MIPS вместо SPIM, вы могли бы использовать это.
Но SPIM - это «игрушечная» система без какого-либо спящего системного вызова или даже настраиваемого тайм-аутав ожидании чего-то еще.Ваша единственная опция - это тупая петля задержки, где время зависит от скорости работы хост-компьютера.
MARS (другой основной симулятор MIPS) имеет расширенный набор системных вызовов сверх того, чтоSPIM обеспечивает разрешение в 101 миллисекундах sleep
: $v0 = 32
, $a0 = millis
.
MARS также имеет системный вызов time
, так что вы можете написать спин-цикл, который постоянно проверяет время допосмотрите, прошли ли вы желаемое время пробуждения.Вы могли бы потенциально использовать это (после sleep
, чтобы приблизиться), чтобы получить точность задержки до миллисекунды.(В SPIM этого тоже нет, поэтому петля задержки SPIM должна быть рассчитана исключительно на мертвые точки или внешне "откалибрована".)