Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.04.2008, 14:55   #1
falabella
 
Регистрация: 25.04.2008
Сообщений: 7
По умолчанию Системный таймер и частота процессора

Всем привет. На носу диплом.. в процессе разработки зашла в тупик. у меня есть функция для определения тактовой частоты процессора. Нужно с помощью нее получать конкретные временные зедержки (привязку нужно сделать через системный таймер). Не могу придумать как это реализовать. Частота получается с помощью RdtSC(если нужно взглянуть на функцию, могу выложить исходник). Очень надеюсь на вашу помощь..
falabella вне форума Ответить с цитированием
Старый 25.04.2008, 15:04   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Делается простой пустой цикл в котором проверяется количество прошедших тактов. Если через таймер,то выкладывайте исходник, Вы даже не указали ОС.
B_N вне форума Ответить с цитированием
Старый 25.04.2008, 15:55   #3
falabella
 
Регистрация: 25.04.2008
Сообщений: 7
По умолчанию

ОС виста. процессор 2 ядерный


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
var hF, T, sc, et : int64;

function RdTSC : int64;
begin
asm
db $0f, $31
end;
end;


function GetCyclesPerSecond:int64; stdcall;
begin
QueryPerformanceFrequency(hF);
QueryPerformanceCounter(T);
et := T + hF;
sc := RdTSC;
repeat
QueryPerformanceCounter(T);
until (T >= et);
Result := RdTSC - sc;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
GetCyclesPerSecond;
end;

end.
falabella вне форума Ответить с цитированием
Старый 25.04.2008, 16:10   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Не совсем ясно вот это:
Цитата:
Сообщение от falabella Посмотреть сообщение
.........получать конкретные временные зедержки (привязку нужно сделать через системный таймер)..............
Зачем здесь RDTSC, если речь идёт о системном таймере?
P.S.
Цитата:
db $0f, $31
Дельфи до сих пор не знает про RDTSC??
B_N вне форума Ответить с цитированием
Старый 25.04.2008, 16:22   #5
falabella
 
Регистрация: 25.04.2008
Сообщений: 7
По умолчанию

на системный таймер нужно завязать вызов функции определения частоты. Нет, Delphi про RDTSC пока не в курсе).
falabella вне форума Ответить с цитированием
Старый 25.04.2008, 16:42   #6
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от falabella Посмотреть сообщение
на системный таймер нужно завязать вызов функции определения частоты.
Опять ничего не понял. Вы собираетесь периодически проверять количество прошедших тактов и делить их на <тактов в секунду>? Что в Вашем случае понимается под системным таймером? И какой величины задержка нужна?
B_N вне форума Ответить с цитированием
Старый 25.04.2008, 22:36   #7
falabella
 
Регистрация: 25.04.2008
Сообщений: 7
По умолчанию

мин. вел. определяется тактовой частотой МП. Системный таймер i8253(4)
falabella вне форума Ответить с цитированием
Старый 25.04.2008, 22:58   #8
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от falabella Посмотреть сообщение
мин. вел. определяется тактовой частотой МП.
Минимальная величина определяется операционной системой. Особенно в Ring3
Цитата:
Сообщение от falabella Посмотреть сообщение
Системный таймер i8253(4)
А при чём здесь счётчик тактов процессора? И как Вы собираетесь из дельфи таймер программировать?
Вы можете объяснить собственный вопрос? Если Вы собираетесь строить задержки по таймеру, зачем Вам RDTSC? Если по тактам, зачем таймер? По какой схеме Вы их хотите связать?
B_N вне форума Ответить с цитированием
Старый 25.04.2008, 23:25   #9
falabella
 
Регистрация: 25.04.2008
Сообщений: 7
По умолчанию

Я, к сожалению, не выбираю каким способом их организовать. Мне поставлена задача: сделать с помощью указанных средств(частота МКП и системный тайиер). И если бы я знала как их связать я бы здесь не написала...
Я надеюсь получить здесь конкретный ответ (читай код), как мне прикрутить формирование задержки на таймер. Мой опыт программирования на Delphi пока ограничен институтом, и я не могу поспорить с Вами, можно ли там запрограммировать таймер. Но раз такая задача поставлена, то, наверное, это реально.
falabella вне форума Ответить с цитированием
Старый 25.04.2008, 23:42   #10
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от falabella Посмотреть сообщение
Я, к сожалению, не выбираю каким способом их организовать. Мне поставлена задача: сделать с помощью указанных средств(частота МКП и системный тайиер). И если бы я знала как их связать я бы здесь не написала...
Я надеюсь получить здесь конкретный ответ (читай код), как мне прикрутить формирование задержки на таймер. Мой опыт программирования на Delphi пока ограничен институтом, и я не могу поспорить с Вами, можно ли там запрограммировать таймер. Но раз такая задача поставлена, то, наверное, это реально.
Да дело в том, что я никак не могу понять Ваше задание. Частота МП определяется элементарно:
Код:
#include <windows.h>
#include <iostream>

long main()
{
	LARGE_INTEGER c1, c2, freq;
	LARGE_INTEGER Peek1, Peek2;
	double lapse;
	__int64 CyclesPerSecond;

	QueryPerformanceFrequency(&freq);

	QueryPerformanceCounter(&c1);
	__asm RDTSC
	__asm MOV		DWORD PTR Peek1.LowPart,		EAX
	__asm MOV		DWORD PTR Peek1.HighPart,		EDX

	Sleep(100);

	QueryPerformanceCounter(&c2);
	__asm RDTSC
	__asm MOV		DWORD PTR Peek2.LowPart,		EAX
	__asm MOV		DWORD PTR Peek2.HighPart,		EDX

	lapse			= (double)(c2.QuadPart - c1.QuadPart) / (double)freq.QuadPart;
	CyclesPerSecond	= (__int64)( (Peek2.QuadPart - Peek1.QuadPart) / lapse );

	std :: cout << CyclesPerSecond << " Hz."<< std :: endl;
	return 0;
}
Но зачем сюда прикручивать таймер я не понимаю. Может быть, всё-таки, речь идёт о том, чтобы получать в цикле таймстампы через RDTSC, это дело другого рода, это можно легко организовать. Но NT не даст программировать системную плату из третьего кольца, тем более такую вещь, как таймер, поэтому я и пытаюсь уточнить Вашу задачу.
B_N вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Превышена частота Showy Компьютерное железо 6 08.07.2008 12:48
Частота и количество valko12 Microsoft Office Excel 14 21.05.2008 11:41
Частота процессора. Delphi Disb Помощь студентам 1 20.02.2008 09:28