Примечание: Приведенная ниже информация относится только к архитектурам POWER и POWER2 (и процессору 601). Приведенная программа будет работать и в системе PowerPC, но некоторые из команд будут эмулированы. Однако цель обращения к таймеру процессора заключается в получении точной информации о времени с минимальным влиянием на скорость выполнения программы, а эмуляция снижает точность получаемых результатов.
В процессорах POWER и POWER2 есть два специализированных регистра (верхний и нижний), в которых содержится сигнал таймера с высокой точностью. В верхнем регистре содержится время в секундах, а в нижнем регистре - доли секунды, выраженные в наносекундах. Точность времени в нижнем регистре зависит определяется частотой обновления регистра и зависит от модели процессора.
Приведенный ниже модуль на ассемблере (timer.s) содержит функции (rtc_upper и rtc_lower) для обращения к верхнему и нижнему регистрам таймера:
.globl .rtc_upper .rtc_upper: mfspr 3,4 # копирование RTCU в регистр возврата br .globl .rtc_lower .rtc_lower: mfspr 3,5 # копирование RTCL в регистр возврата br
Приведенный ниже модуль (second.c) содержит функцию на языке C, вызывающую функции timer.s для получения значений из верхнего и нижнего регистров. Эта функция возвращает значение времени в секундах в виде действительного числа с двойной точностью.
double second() { int ts, tl, tu; ts = rtc_upper(); /* секунды */ tl = rtc_lower(); /* наносекунды */ tu = rtc_upper(); /* Проверка переноса разряда из */ if (ts != tu) /* нижнего регистра в верхний */ tl = rtc_lower(); /* Возврат в исходное состояние. */ return ( tu + (double)tl/1000000000 ); }
Функцию second() можно вызывать из программ на языке C или FORTRAN.
Примечание: Точность результата, возвращаемого программой second.c, может зависеть от того, сколько времени прошло с момента последней перезагрузки системы. Чем оно больше, тем большее количество значащих разрядов может быть потрачено на представление целой части времени в секундах. Способ, описанный в первой части данного приложения, позволяет обойти эту проблему путем вычисления разности двух значений времени до преобразования в формат с плавающей точкой.