OSDev

для всех
Текущее время: 02 май 2024, 21:46

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Системное время
СообщениеДобавлено: 19 июл 2007, 11:09 

Зарегистрирован: 27 апр 2007, 22:51
Сообщения: 75
Раз никто не хочет создавать новую тему, то я создам...
В теме План разработки операционной системы FOS (TODO) мы начали обсуждение таймеров и расчета времени, давайте тут продолжим...

В моей системе время расчитывается при помощи команды RDTSC и частоты процессора. Кому интересно могу выложить формулы и исходные коды этого метода, но не скоро, так как нет исходника под рукой... (кому невтерпеж, могут попросить исходники моей оси у DinamytE)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Системное время
СообщениеДобавлено: 19 июл 2007, 15:38 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Pushkoff,
А как ты определяешь, частоту процессора?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Системное время
СообщениеДобавлено: 19 июл 2007, 16:08 

Зарегистрирован: 26 апр 2007, 15:38
Сообщения: 129
Цитата:
Кому невтерпеж, могут попросить исходники моей оси у DinamytE

http://osdev.ru/store/myos.zip


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Системное время
СообщениеДобавлено: 19 июл 2007, 18:53 

Зарегистрирован: 27 апр 2007, 22:51
Сообщения: 75
Код:
#include <cpu.h>#include <systime.h>#include <sysdata.h>#include <lock.h>

/************************************************
 tacts=(1<<32)*time

  tact - tsc
  time - length of tacts

     1 tact = (1<<32) * time_per_tact

      time_per_tact = 1 sec / frequency

 1 tact = (1<<32) * 1 sec / frequency

      1 sec =1 000 000 usec

     1 sec / frequency = 1 000 000 usec / frequency = 50 000 usec / (frequency/20) 

   1 tact = (1<<32)*50 000 usec /(frequency/20)

      time[i+1] = (tacts[i]*(1 tact)+utacts[i])/(1<<32)
  utacts[i+1] = (tacts[i]*(1 tact)+utacts[i])%(1<<32)
       
************************************************/

static unsigned __int64 tsc_delta()
{
      __int64 tsc=sys_tsc;
       sys_tsc=cpu_read_tsc();
        return sys_tsc-tsc;
}

static SYSTEM_TIME tsc_to_time(unsigned __int64 tsc)
{
      SYSTEM_TIME time=0UL;
      unsigned factor=sys_factor;
        static unsigned __int64 utsc=0UL;
  tsc=tsc*factor+utsc;
       time=tsc/0x100000000UL;
        utsc=tsc%0x100000000UL;
        return time;
}
#define time_lock() lock_lock(&sys_timelock)#define time_unlock() lock_unlock(&sys_timelock);

// run only in interrupt disabled mode
SYSTEM_TIME time_update()
{
   time_lock();
   sys_time+=tsc_to_time(tsc_delta());
    time_unlock();
 return sys_time;       
}

SYSTEM_TIME time_get_time(unsigned *low, unsigned *hi)
{
       SYSTEM_TIME time;
  time_lock();
   time=sys_time+sys_start_time;
  time_unlock();
 if (low&&hi)
   {
  *low=((unsigned*)&time)[0];
  *hi=((unsigned*)&time)[1];
       }
  return time;
}

SYSTEM_TIME time_get_uptime(unsigned *low, unsigned *hi)
{
 SYSTEM_TIME time;
  time_lock();
   time=sys_time;
 time_unlock();
 if (low&&hi)
   {
  *low=((unsigned*)&time)[0];
  *hi=((unsigned*)&time)[1];
       }
  return time;
}



Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Системное время
СообщениеДобавлено: 19 июл 2007, 19:17 

Зарегистрирован: 27 апр 2007, 22:51
Сообщения: 75
ну и поясню
метод основывается на расчете количества секунд (изначально) в одном такте
так как это число будет дробным то домножим его на 2^32
отсюда получаем 1 (более общий случай) и 2 (для одного такта) формулу
Код:
  tacts=(1<<32)*time (1)

      tact - tsc
      time - length of tacts

1 tact = (1<<32) * time_per_tact (2)


с другой стороны, время одного такта вычисляется так (3)
Код:
time_per_tact = 1 sec / frequency (3)


обьединив (2) и (3) получим (4)

Код:
1 tact = (1<<32) * 1 sec / frequency (4)


то есть результатом (4) будет константа для перехода от количества тактов к времени, которая расчитывается заранее исходя из частоты процессора. дальнейшие формулы привязываются только к расчету частоты (я считал количество тактов за 50 мс и умножал его на 20 для получения частоты)
в программе эта константа называется factor.

время у меня расчитывается в микросекундах (отсюда значение 50000, тк 50 мс = 50000 мкс)

при умножении количества тактов (32 разрядная величина) на фактор времени мы получим 64 разрядное число в старших 32 разрядах которого будет храниться количество микросекунд.
Для увеличения точности, остаток (то есть младшие 32 разряда) сохраняются и при последующих вычислениях используется для корекции

таким методом можно расчитывать временные интервалы длинной до 1 с, так как на 4 ГГц проце разница показаний счетчика тактов, при разнице более чем в 1 секунду, не влезть в 32 разрядное число. (хотя при такой частоте фактор будет очень маленькой величиной, то есть если взять разницу показаний счетчика тактов как 64 разрядную величину, то умножение на фактор не даст переполнения)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Системное время
СообщениеДобавлено: 21 июл 2007, 10:39 

Зарегистрирован: 27 апр 2007, 22:51
Сообщения: 75
Я вот незнаю, как будет работать метод при изменяемой частоте процессора (на ноутбуках есть эта фишка), или на счетчик тактов это не влияет???


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Системное время
СообщениеДобавлено: 28 июл 2007, 15:33 

Зарегистрирован: 27 апр 2007, 22:51
Сообщения: 75
Ну если у кого есть какая инфа - делитесь, буду совершенствовать...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Системное время
СообщениеДобавлено: 28 июл 2007, 19:35 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Мой совет. Брать самый быстрый и точный таймер который есть в системе.

PROGRAMMABLE INTERVAL TIMER (PIT 8254) По дэфолту 65536/1193180 максимальная частота 1.193180Гц
В современных системах тактируется от таймера 14.31818 МГц/12

Power Management 1 Timer (PM Timer ) 3.579545 МГц (14.31818 МГц / 4)

High-Precision Event Timer (HPET) 14.31818 МГц

Частота процессора.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Системное время
СообщениеДобавлено: 30 июл 2007, 10:38 

Зарегистрирован: 27 апр 2007, 22:51
Сообщения: 75
вот статейку нашел
http://netch.livejournal.com/39976.html


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Системное время
СообщениеДобавлено: 10 авг 2007, 16:01 

Зарегистрирован: 27 апр 2007, 22:51
Сообщения: 75
Вот нашел в исходниках линукса определение частоты при SpeedStep'e
http://www.linux-m32r.org/lxr/http/sour ... step-lib.c


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 36


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB