Фиксация времени выполнения программ

Общая характеристика задач фиксации времени выполнения программ: выполнение процессов реального времени, профилирование. Программируемый интервальный таймер как весьма сложная система. Анализ основных функций, возвращающих стандартное время Windows.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 18.05.2014
Размер файла 82,7 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Введение

Фиксация времени выполнения программ является одной из ключевых функций в широком классе задач. К таким задачам относятся: выполнение процессов реального времени, задачи управления, профилирования, выполнение мультимедиа - приложений, организация сетевого обмена и так далее.

Различные задачи требуют различных параметров от систем измерения, зачастую входя в противоречия друг с другом. Так, например, при профилировании программ требуется чрезвычайно высокая разрешающая способность таймера (не ниже 1 миллисекунды) и в то же время нет необходимости в измерении больших промежутков времени (минуты, часы, дни). Для многих же систем наблюдения и сбора статистики наоборот требуется возможность измерения длительных интервалов с достаточно низкой разрешающей способностью. Задачи экспериментальных измерений требуют достаточно высокой точности и зачастую некритичны к скорости выполнения функций таймера. Напротив, мультимедиа-приложения требуют высокого быстродействия.

Все вышесказанное привело к появлению целого спектра средств для измерения времени на PC. На нижнем уровне все они основываются на аппаратных решениях в виде разнообразных счетчиков и регистров, расположенных как внутри микропроцессора, так и вне его. Однако кроме аппаратной реализации, использование которой напрямую зачастую запрещено операционной системой, существуют также и программные, представленные в виде различных функций и процедур операционных систем.

1.Аппаратные решения

Для решения задач, требующих измерения времени, в компьютерах IBM-PC и совместимых начиная с первых версий (XT) устанавливается специальный таймер. Программируемый интервальный таймер -- весьма сложная система, включающая в себя целых три устройства -- три канала таймера, каждый из которых можно запрограммировать для работы в одном из шести режимов. И более того, на большинстве современных материнских плат располагаются два таких таймера, так что число каналов оказывается равным шести. В пространстве портов ввода-вывода для таймера выделена область от 40h до 5Fh:

порт 40h -- канал 0 (генерирует IRQ0)

порт 41h -- канал 1 (поддерживает обновление памяти)

порт 42h -- канал 2 (управляет динамиком)

порт 43h -- управляющий регистр первого таймера

порты 44h - 47h -- второй таймер компьютеров с шиной MicroChannel

порты 48h - 4Bh -- второй таймер компьютеров с шиной EISA

Таймер можно использовать для управления динамиком, для точных измерений отрезков времени, для создания задержек, для управления переключением процессов и даже для выбора случайного числа с целью запуска генератора случайных чисел -- текущее значение счетчика канала 0 представляет собой идеальный вариант такого начального числа для большинства приложений.

Для таймера найдется много применений, единственное ограничение здесь: таймер -- это глобальный ресурс, и перепрограммировать его в многозадачных системах можно только с ведома операционной системы, если она вообще это позволяет. Так, прямое программирование возможно только в однозадачных операционных системах (таких как DOS, например).

В операционных системах семейства Windows прямое программирование таймера запрещено, так как таймер используется для внутренних нужд системы (в частности переключение процессов), изменение его работы может привести к выходу из строя всей системы. Надо заметить, что в системах Windows 9x возможен перехват прерывания таймера, что дает возможность для измерения времени с малой точностью (прерывание вызывается 18,2 раза в секунду), однако изменение периода в больших пределах невозможно.

Для задач, не требующих высокой точности измерения промежутков времени также возможно применение часов реального времени.

В каждом компьютере есть микросхема, отвечающая за поддержку текущей даты и времени. Для того чтобы они не сбрасывались при каждом выключении питания, на микросхеме расположена небольшая область памяти (от 64 до 128 байт), выполненная по технологии CMOS, позволяющей снизить энергопотребление до минимума (фактически энергия в таких схемах затрачивается только на зарядку паразитных емкостей при изменении состояния ячеек памяти). Вся эта микросхема получает питание от аккумулятора, расположенного на материнской плате, и не отключается при выключении компьютера. Для хранения собственно времени достаточно всего четырнадцати байт такой энергонезависимой памяти, и остальная ее часть используется BIOS для хранения различной информации, необходимой для корректного запуска компьютера. Для общения с CMOS и регистрами RTC выделяются порты ввода-вывода от 70h до 7Fh.

Кроме того, процессоры, начиная с процессоров Pentium, содержат в себе специальный 64 разрядный регистр. При старте компьютера он принимает нулевое значение. Далее, при каждом такте работы значение регистра инкрементируется. Таким образом, регистр содержит номер текущего такта со старта компьютера. При использовании этого значения возможно наиболее точное измерение интервалов времени, но необходимо также иметь точное значение тактовой частоты работы процессора, что не всегда возможно без использования других методов измерения времени. Кроме того, метод неприменим для процессоров с функцией динамического изменения тактовой частоты и многоядерных процессоров.

2.Программные методы

Программные решения всегда базируются на аппаратных, но сильно отличаются от одной операционной системы к другой. Так, если в системе DOS полностью разрешен доступ непосредственно к регистрам таймера и часов реального времени, то в Windows подобная работа запрещена, и измерение интервалов времени должно вестись исключительно с помощью функций самой системы.

Будем рассматривать операционную систему Windows и средства, ею предоставляемые (в частности структуры и функции API 32).

3.Таймеры

Таймер в WinAPI рассматривается как стандартное устройство ввода. Подобно остальным устройствам он посылает сообщения оконной процедуре того окна, для которого назначен (сообщение WM_TIMER).

Для присоединения таймера к программе используется процедура SetTimer. Функция содержит целый параметр, задающий интервал, который может находиться (теоретически) в пределах от 1 до 4294967295, что составляет примерно 50 дней. Это значение определяет темп, с которым Windows посылает программе сообщение WM_PAINT. Каждая единица соответствует 1 мс, то есть значению 1000 соответствует интервал в секунду.

Для остановки потока сообщений от таймера необходимо вызвать процедуру KillTimer. Процедура также очищает очередь от сообщений WM_PAINT.

Необходимо заметить, что аппаратно таймер Windows опирается на системный таймер, а значит получить разрешение выше 55мс от него получить нельзя. Кроме того, использование системы сообщений Windows приводит к значительному снижению быстродействия и увеличению времени реакции приложения на прерывание таймера. Также вследствие округления интервалов до кратных частоте срабатывания системного таймера происходит дополнительное внесение погрешностей.

К достоинствам таймера можно отнести простоту его использования и возможность работы «по прерыванию». Для приложений и задач не чувствительных к точности и разрешающей способности применение таймера достаточно.

4.Функции, возвращающие стандартное время Windows

программируемый интервальный windows

Отсчет времени в операционных системах Windows ведется со старта самой операционной системы и обнуляется при каждой перезагрузке. Существует специальная 64 разрядная системная переменная, хранящая стандартное время в миллисекундах. Доступ к ней может осуществляться через целый ряд функций:

GetCurrentTime()

timeGetTime()

GetTickCount()

Все они возвращают время со старта Windows в миллисекундах.

Необходимо отметить рад особенностей этих функций. Прежде всего, их использование связано со значительно меньшими накладными расходами, чем при использовании других средств Windows, однако точность измерения времени также не превышает точности системного таймера.

Использование функций возможно только при работе «опросом», посылка сообщений невозможна, поэтому для определения интервалов времени необходимо вызывать одну из функций до и после выполнения исследуемого участка программы (или в начале/конце цикла работы программы).

Функции, возвращающие стандартное время Windows, используются, главным образом, в мультимедиа приложениях (в особенности в играх), где критическим параметром является быстродействие, а не точность.

5.Функции точного определения времени

Для измерения отрезков времени с точностью, превышающей интервал системного таймера, используются иные функции:

QueryPerformanceFrequency()

QueryPerformanceCounter()

Функции являются функциями ядра Windows и позволяют измерять отрезки времени с точностью выше 1 миллисекунды. Аппаратно они опираются на дополнительный счетчик, расположенный на материнской плате.

В качестве параметров функциям передаются указатели на 64 разрядные целочисленные переменные, в которые функции помещают результат своей работы. Для функции QueryPerformanceCounter() это время с начала работы Windows в относительных единицах, а для QueryPerformanceFrequency() - количество относительных единиц в миллисекунде.

Для получения точного стандартного времени Windows необходимо разделить результат работы функции QueryPerformanceCounter() на результат QueryPerformanceFrequency().

Использование указанных процедур дает результат на порядки точнее, чем функции, опирающиеся на системный таймер. Это позволяет использовать их в задачах, критичных к точности и разрешающей способности таймера (даже в задачах профилирования программ), о чем заявляет сама Microsoft. Однако надо иметь в виду, что выполнение функций QueryPerformanceFrequency() и QueryPerformanceCounter() занимает достаточно большое время и количество их вызовов необходимо свести к минимуму или вообще отказаться по возможности в пользу менее точных методов.

6.Описание алгоритмов программ

В ходе курсовой работы написаны две программы, реализующие измерение интервалов времени с использованием процедур GetTickCount() и QueryPerformanceCounter().

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

Кроме того, обе программы выводят время со старта Windows и время со старта программы. Первое значение фактически является стандартным временем Windows, второе - разницей между временем старта программы и старта Windows.

Для простоты написания второй программы на основе функций QueryPerformanceCounter() и QueryPerformanceFrequency() написана процедура с интерфейсом, аналогичным интерфейсу GetTickCount(), что позволило почти не изменять исходной программы, лишь изменив название процедур и добавив необходимые фрагменты. В связи с этим в листинге вторая программа не приводится, показаны лишь её фрагменты, отличные от первой.

Кроме того, для расчета и отображения на экране результатов использованы процедуры деления 64 разрядных чисел и записи в строковую переменную числа в шестнадцатеричной системе счисления.

Для расчетов интервалов времени созданы 2 глобальные переменные: время старта программы и время последнего цикла. Первая переменная заполняется при старте и далее не изменяется. Вторая переменная заменяется в каждом цикле работы программы на текущее время, что позволяет на следующем цикле сравнивать его со временем со старта Windows и получать длину одного цикла программы.

7.Листинг программ

Текст первой программы.

386

model flat,stdcall

option casemap:none

include \masm32\include\windows.inc

include \masm32\include\user32.inc

includelib \masm32\lib\user32.lib

include \masm32\include\kernel32.inc

includelib \masm32\lib\kernel32.lib

include \masm32\include\winmm.inc

includelib \masm32\lib\winmm.lib

Прототипы некоторых функций

WinMain proto :DWORD,:DWORD,:DWORD,:DWORD ;Гланая процедура

StrConv proto :DWORD

;Конвертирование числа в строку

Delay proto

;Задержка

DATA

ClassName db "SimpleWinClass",0

;Имя класса окна

AppName db "timeGetTime",0

;Имя окна

Str1 db "LшъёрЎш тЁхьхэш тvяюыэхэш яЁюуЁрььv.",0 ;Строки текста,

Str2 db "¦хЄюф timeGetTime",0 ;выводимого в окне

Time1S db "TЁхь ёю ёЄрЁЄр Windows",0

Time2S db "TЁхь ёю ёЄрЁЄр яЁюуЁрььv",0

Time3S db "TЁхь Ўшъыр",0

OutStrdb " ",0;Строка, в которую записывается

;число при конвертировании

StartT DWORD 0; ;Время старта программы

LastT DWORD 0; ;Время выполнения предыдущего цикла

.DATA? ; Hеиницилизиpуемые данные

hInstance HINSTANCE ? ; Хэндл нашей пpогpаммы

CommandLine LPSTR ? ; Командная строка

;---------------------------------------------------------------------------

;Кодовый сегмент-

;----------------

.CODE ; Сегмент кода

start:

invoke GetModuleHandle, NULL ;Взять хэндл пpогpаммы

mov hInstance,eax

invoke GetCommandLine ;Взять командную стpоку.

mov CommandLine,eax

;вызвать основную функцию

invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT

invoke ExitProcess, eax ; Выйти из пpогpаммы.

;---------------------------------------------------------------------------

;Основной цикл программы-

;------------------------

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD

LOCAL wc:WNDCLASSEX ;Класс окна

LOCAL msg:MSG;Сообщение

LOCAL hwnd:HWND ;Хэндл окна

invoke timeGetTime ;Получаем время старта программы

mov StartT,eax ;и запоминаем его

mov LastT,eax

mov wc.cbSize,SIZEOF WNDCLASSEX ;заполнение стpуктуpы

mov wc.style, CS_HREDRAW or CS_VREDRAW ;класса окна

mov wc.lpfnWndProc, OFFSET WndProc

mov wc.cbClsExtra,NULL

mov wc.cbWndExtra,NULL

push hInstance

pop wc.hInstance

mov wc.hbrBackground,COLOR_WINDOW+1

mov wc.lpszMenuName,NULL

mov wc.lpszClassName,OFFSET ClassName

invoke LoadIcon,NULL,IDI_APPLICATION

mov wc.hIcon,eax

mov wc.hIconSm,eax

invoke LoadCursor,NULL,IDC_ARROW

mov wc.hCursor,eax

invoke RegisterClassEx, addr wc

;pегистpация класса окна

invoke CreateWindowEx,NULL,\

ADDR ClassName,\

ADDR AppName,\

WS_OVERLAPPEDWINDOW,\

CW_USEDEFAULT,\

CW_USEDEFAULT,\

350,\

110,\

NULL,\

NULL,\

hInst,\

NULL

mov hwnd,eax

invoke ShowWindow, hwnd,CmdShow ;отобpазить окно

invoke UpdateWindow, hwnd ;обновить клиентскую область

.WHILE TRUE;Основной цикл

invoke GetMessage, ADDR msg,NULL,0,0 ;получить сообщение

.BREAK .IF (!eax);выход

invoke TranslateMessage, ADDR msg;трансляция

invoke DispatchMessage, ADDR msg;сообщения

invoke Delay ;задержка

invoke InvalidateRect, hwnd, 0, TRUE ;обновление окна

ENDW

mov eax,msg.wParam ;передаем код окончания

ret

WinMain endp

-----------------------------

Оконная процедура-

------------------

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

LOCAL hdc:HDC ;контекст экрана

LOCAL ps:PAINTSTRUCT ;структура рисования

LOCAL rect:RECT ;прямоугольник вывода текста

LOCAL Time:DWORD ;Текущее время

LOCAL FStT:DWORD ;Время со старта программы

LOCAL DeltaT:DWORD ;Время одного цикла

IF uMsg==WM_DESTROY ;Закрыть окно

invoke PostQuitMessage,NULL

ELSEIF uMsg==WM_PAINT ;Нарисовать содержимое

invoke BeginPaint,hWnd, ADDR ps ;получить дескриптор

mov hdc,eax

mov rect.left,10 ;Устанавливаем область

mov rect.right,400 ;вывода текста

mov rect.top,0

mov rect.bottom,300

;----------------------------

;Выводим простые строки

invoke DrawText, hdc,ADDR Str1,-1, ADDR rect, DT_SINGLELINE

mov rect.top,16

invoke DrawText, hdc,ADDR Str2,-1, ADDR rect, DT_SINGLELINE

mov rect.top,32

invoke DrawText, hdc,ADDR Time1S,-1, ADDR rect, DT_SINGLELINE

mov rect.top,48

invoke DrawText, hdc,ADDR Time2S,-1, ADDR rect, DT_SINGLELINE

mov rect.top,64

invoke DrawText, hdc,ADDR Time3S,-1, ADDR rect, DT_SINGLELINE

invoke timeGetTime ;Получаем текущее время

mov Time,eax

mov rect.top,32 ;переходим на второй столбец

mov rect.left,250

invoke StrConv, Time ;конвертируем и выводим время

invoke DrawText, hdc,ADDR OutStr,-1, ADDR rect, DT_SINGLELINE

mov eax,Time ;Вычисляем время со старта

mov ebx,StartT ;для этого вычитаем из времени со

sub eax,ebx ;старта Windows время старта

mov FStT,eax ;программы

mov rect.top,48

invoke StrConv, FStT ;конвертируем и выводим время

invoke DrawText, hdc,ADDR OutStr,-1, ADDR rect, DT_SINGLELINE

mov eax,Time ;Вычисляем длительность одного цикла

mov ebx,LastT ;для этого вычитаем из времени со

sub eax,ebx ;старта Windows время

mov FStT,eax ;предыдущего цикла

mov rect.top,64

invoke StrConv, FStT

invoke DrawText, hdc,ADDR OutStr,-1, ADDR rect, DT_SINGLELINE

mov eax,Time;

mov LastT,eax ;Сохраняем время текущего цикла

invoke EndPaint,hWnd, ADDR ps

.ELSE

invoke DefWindowProc,hWnd,uMsg,wParam,lParam

ret

.ENDIF

xor eax, eax

ret

WndProc endp

;-------------------------------

;Конвертирование числа в строку-

;-------------------------------

StrConv proc Chislo:DWORD

mov ebx, 7 ;заносим счетчик символов

mov eax, Chislo ;конвертируемое число

mov ecx, 8 ;счетчик итераций

FCicl:

mov edx,eax ;копируем текущее число

shr eax,4 ;Смещаем число

and edx,15;;Выделяем младшую цифру

add edx,48 ;Переводим в ASCII

cmp edx,57 ;Если цифра больше 9

jna NoA

add edx,7 ;то корректируем символ

NoA:

mov OutStr[ebx],dl ;Записываем символ

dec ebx ;Смещаем счетчик

loop FCicl

ret

StrConv endp

;------------------------------

;Процедура задержки-

;-------------------

Delay proc ;Простой цикл

mov ecx,4000000 ; на большое количество

DCycl: loop DCycl ;итераций

ret

Delay endp

end start

Текст второй программы:

.386

.model flat,stdcall

option casemap:none

include \masm32\include\windows.inc

include \masm32\include\user32.inc

includelib \masm32\lib\user32.lib

include \masm32\include\kernel32.inc

includelib \masm32\lib\kernel32.lib

include \masm32\include\winmm.inc

includelib \masm32\lib\winmm.lib

;Прототипы некоторых функций

WinMain proto :DWORD,:DWORD,:DWORD,:DWORD ;Гланая процедура

StrConv proto :DWORD ;Конвертирование числа в строку

Delay proto ;Задержка

MyTimer proto

.DATA

ClassName db "SimpleWinClass",0 ;Имя класса окна

AppName db "QueryPerformenceCounter",0 ;Имя окна

Str1 db "LшъёрЎш тЁхьхэш тvяюыэхэш яЁюуЁрььv.",0 ;Строки текста,

Str2 db "QueryPerformenceCounter",0 ;выводимого в окне

Time1S db "TЁхь ёю ёЄрЁЄр Windows",0

Time2S db "TЁхь ёю ёЄрЁЄр яЁюуЁрььv",0

Time3S db "TЁхь Ўшъыр",0

OutStr db " ",0 ;Строка, в которую записывается

;число при конвертировании

StartT DWORD 0; ;Время старта программы

LastT DWORD 0; ;Время выполнения предыдущего цикла

Temp DWORD 0; ;Временная переменная.

.DATA? ; Hеиницилизиpуемые данные

hInstance HINSTANCE ? ; Хэндл нашей пpогpаммы

CommandLine LPSTR ? ; Командная строка

;---------------------------------------------------------------------------

;Кодовый сегмент-

;----------------

.CODE ; Сегмент кода

start:

invoke GetModuleHandle, NULL ;Взять хэндл пpогpаммы

mov hInstance,eax

invoke GetCommandLine ;Взять командную стpоку.

mov CommandLine,eax

;вызвать основную функцию

invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT

invoke ExitProcess, eax ; Выйти из пpогpаммы.

;---------------------------------------------------------------------------

;Основной цикл программы-

;------------------------

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD

LOCAL wc:WNDCLASSEX ;Класс окна

LOCAL msg:MSG ;Сообщение

LOCAL hwnd:HWND ;Хэндл окна

invoke MyTimer ;Получаем время старта программы

mov StartT,eax ;и запоминаем его

mov LastT,eax

mov wc.cbSize,SIZEOF WNDCLASSEX ;заполнение стpуктуpы

mov wc.style, CS_HREDRAW or CS_VREDRAW ;класса окна

mov wc.lpfnWndProc, OFFSET WndProc

mov wc.cbClsExtra,NULL

mov wc.cbWndExtra,NULL

push hInstance

pop wc.hInstance

mov wc.hbrBackground,COLOR_WINDOW+1

mov wc.lpszMenuName,NULL

mov wc.lpszClassName,OFFSET ClassName

invoke LoadIcon,NULL,IDI_APPLICATION

mov wc.hIcon,eax

mov wc.hIconSm,eax

invoke LoadCursor,NULL,IDC_ARROW

mov wc.hCursor,eax

invoke RegisterClassEx, addr wc ;pегистpация класса окна

invoke CreateWindowEx,NULL,\

ADDR ClassName,\

ADDR AppName,\

WS_OVERLAPPEDWINDOW,\

CW_USEDEFAULT,\

CW_USEDEFAULT,\

350,\

110,\

NULL,\

NULL,\

hInst,\

NULL

mov hwnd,eax

invoke ShowWindow, hwnd,CmdShow ;отобpазить окно

invoke UpdateWindow, hwnd ;обновить клиентскую область

.WHILE TRUE ;Основной цикл

invoke GetMessage, ADDR msg,NULL,0,0 ;получить сообщение

.BREAK .IF (!eax) ;выход

invoke TranslateMessage, ADDR msg ;трансляция

invoke DispatchMessage, ADDR msg ;сообщения

invoke Delay ;задержка

invoke InvalidateRect, hwnd, 0, TRUE ;обновление окна

.ENDW

mov eax,msg.wParam ;передаем код окончания

ret

WinMain endp

;-----------------------------

;Оконная процедура-

;------------------

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

LOCAL hdc:HDC ;контекст экрана

LOCAL ps:PAINTSTRUCT ;структура рисования

LOCAL rect:RECT ;прямоугольник вывода текста

LOCAL Time:DWORD ;Текущее время

LOCAL FStT:DWORD ;Время со старта программы

LOCAL DeltaT:DWORD ;Время одного цикла

.IF uMsg==WM_DESTROY ;Закрыть окно

invoke PostQuitMessage,NULL

.ELSEIF uMsg==WM_PAINT ;Нарисовать содержимое

invoke BeginPaint,hWnd, ADDR ps ;получить дескриптор

mov hdc,eax

mov rect.left,10 ;Устанавливаем область

mov rect.right,400 ;вывода текста

mov rect.top,0

mov rect.bottom,300

;----------------------------

;Выводим простые строки

invoke DrawText, hdc,ADDR Str1,-1, ADDR rect, DT_SINGLELINE

mov rect.top,16

invoke DrawText, hdc,ADDR Str2,-1, ADDR rect, DT_SINGLELINE

mov rect.top,32

invoke DrawText, hdc,ADDR Time1S,-1, ADDR rect, DT_SINGLELINE

mov rect.top,48

invoke DrawText, hdc,ADDR Time2S,-1, ADDR rect, DT_SINGLELINE

mov rect.top,64

invoke DrawText, hdc,ADDR Time3S,-1, ADDR rect, DT_SINGLELINE

invoke MyTimer ;Получаем текущее время

mov Time,eax

mov rect.top,32 ;переходим на второй столбец

mov rect.left,250

invoke StrConv, Time ;конвертируем и выводим время

invoke DrawText, hdc,ADDR OutStr,-1, ADDR rect, DT_SINGLELINE

mov eax,Time ;Вычисляем время со старта

mov ebx,StartT ;для этого вычитаем из времени со

sub eax,ebx ;старта Windows время старта

mov FStT,eax ;программы

mov rect.top,48

invoke StrConv, FStT ;конвертируем и выводим время

invoke DrawText, hdc,ADDR OutStr,-1, ADDR rect, DT_SINGLELINE

mov eax,Time ;Вычисляем длительность одного цикла

mov ebx,LastT ;для этого вычитаем из времени со

sub eax,ebx ;старта Windows время

mov FStT,eax ;предыдущего цикла

mov rect.top,64

invoke StrConv, FStT

invoke DrawText, hdc,ADDR OutStr,-1, ADDR rect, DT_SINGLELINE

mov eax,Time;

mov LastT,eax ;Сохраняем время текущего цикла

invoke EndPaint,hWnd, ADDR ps

.ELSE

invoke DefWindowProc,hWnd,uMsg,wParam,lParam

ret

.ENDIF

xor eax, eax

ret

WndProc endp

;-------------------------------

;Конвертирование числа в строку-

;-------------------------------

StrConv proc Chislo:DWORD

mov ebx, 7 ;заносим счетчик символов

mov eax, Chislo ;конвертируемое число

mov ecx, 8 ;счетчик итераций

FCicl:

mov edx,eax ;копируем текущее число

shr eax,4 ;Смещаем число

and edx,15;; Выделяем младшую цифру

add edx,48 ;Переводим в ASCII

cmp edx,57 ;Если цифра больше 9

jna NoA

add edx,7 ;то корректируем символ

NoA:

mov OutStr[ebx],dl ;Записываем символ

dec ebx ;Смещаем счетчик

loop FCicl

ret

StrConv endp

;------------------------------

;Процедура задержки-

;-------------------

Delay proc ;Простой цикл

mov ecx,4000000 ;на большое количество

DCycl: loop DCycl ;итераций

ret

Delay endp

;------------------------------

;Процедура таймера

;------------------

MyTimer proc

LOCAL TimeH:DWORD

LOCAL TimeL:DWORD

LOCAL FrecH:DWORD

LOCAL FrecL:DWORD

invoke QueryPerformanceFrequency, ADDR FrecL

invoke QueryPerformanceCounter, ADDR TimeL

mov ebx,FrecL ;Заполняем регистры перед делением

mov ecx,FrecH ;Frquency

shr ebx,10

mov edx,TimeH ;Время

mov eax,TimeL

pushad

; деление 64-битного числа в EDX:EAX на 64-битное число в ЕСХ:ЕВХ.

; Частное помещается в EDX:EAX, и остаток - в ESI:EDI

mov ebp,64 ; счетчик бит

xor esi,esi

xor edi,edi ; остаток = 0

bitloop:

shl eax,1

rcl edx,1

rcl edi,1 ; сдвиг на 1 бит влево 128-битного числа

rcl esi,1 ; ESI:EDI:EDX:EAX

cmp esi,ecx ; сравнить старшие двойные слова

ja divide

jb next

cmp edi,ebx ; сравнить младшие двойные слова

jb next

divide:

sub edi,ebx

sbb esi,ecx ; ESI:EDI = EBX:ECX

inc eax ; установить младший бит в ЕАХ

next:

dec ebp ; повторить цикл 64 раза

jne bitloop

mov Temp,eax

popad

mov eax,Temp

ret

MyTimer endp

end start

Результаты работы программ:

Рис.

Рис.

Обе программы выдают практически одинаковые результаты. Однако на достаточно быстродействующих компьютерах, где время цикла становится ниже периода системного таймера первая программа ведет себя некорректно, выдавая заметные пульсации параметра «Время цикла», что объясняется низкой точностью функции timeGetTime.

Вывод

В ходе курсовой работы были разобраны основные методы измерения интервалов времени на PC. Были показаны основные аппаратные и программные реализации решения рассматриваемой задачи. Составлены две программы на языке ассемблера для 32 разрядных микропроцессоров семейства Intel, демонстрирующие методы измерения времени и показывающие отличия методов для Windows. К сожалению операционная система Windows не позволяет измерять время с точностью существенно превышающей 1 миллисекунду, что является внутренним ограничением архитектуры системы.

Размещено на Allbest


Подобные документы

  • Основные характеристики систем реального времени, типы архитектур. Система приоритетов процессов (задач) и алгоритмы диспетчеризации. Понятие отказоустойчивости, причины сбоев. Отказоустойчивость в существующих системах реального времени (QNX Neutrino).

    контрольная работа [428,8 K], добавлен 09.03.2013

  • Таймер в Windows как устройство ввода информации, которое извещает приложение о том, что истек заданный интервал времени. Работа с таймером в условиях WinAPI, процесс 32-битного программирования на ассемблере под Windows. Результат выполнения программы.

    курсовая работа [165,6 K], добавлен 18.05.2014

  • Характеристики, основы применения, архитектура жестких и операционных систем реального времени. Последовательное программирование задач реального времени. Структура и языки параллельного программирования, мультипрограммирования и многозадачности.

    курсовая работа [195,9 K], добавлен 17.12.2015

  • Рассмотрение основных принципов и методов проектирования систем реального времени. Описание конструктивных и функциональных особенностей объекта управления, построение диаграммы задач. Выбор аппаратной архитектуры, модели процессов-потоков, интерфейса.

    курсовая работа [1,2 M], добавлен 19.01.2015

  • Планирование задач в операционной системе реального времени. Основные виды планирования применительно к задачам реального времени. Выбор приемлемого алгоритма планирования при проектировании RTS. Статическое прогнозирование с использованием таблиц.

    контрольная работа [40,7 K], добавлен 28.05.2014

  • Классификация систем реального времени. Ядра и операционные системы реального времени. Задачи, процессы, потоки. Преимущества и недостатки потоков. Свойства, планирование, синхронизация задач. Связанные задачи. Синхронизация с внешними событиями.

    реферат [391,5 K], добавлен 28.12.2007

  • Теоретические сведения о таймерах Windows. Описание используемых WinAPI функций для измерения текущего времени, для создания виртуальных таймеров. Выключение и перезагрузка компьютера по нажатию на кнопку и по таймеру, вывод текущей даты и времени.

    курсовая работа [50,0 K], добавлен 18.05.2014

  • Функция записи в сжатое представление массива. Распечатка внутреннего представления матрицы. Результат работы программы при Xm=4. Построение графика зависимости T=F(Xm) по начальному значению времени выполнения алгоритма. Запись элементов в массив.

    лабораторная работа [471,8 K], добавлен 05.12.2015

  • Обзор требований проблемной области. Особенности управления задачами. Исполнительные системы реального времени. Программирование на уровне микропроцессоров. Модели и методы предметной области. Реализация прототипа системы реального времени.

    курсовая работа [263,1 K], добавлен 15.02.2005

  • Использование драйвера режима ядра и управляющего приложения для создания системных потоков. Имитация обработки данных и организация задержек. Разработка драйвера на языке C++. Конфигурация тестового стенда. Точность изменения задержек и работы таймера.

    курсовая работа [182,4 K], добавлен 24.06.2009

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.