Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
отчет_лаба2.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
33.6 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Федеральное государственное автономное образовательное

учреждение высшего профессионального образования

«ЮЖНЫЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»

Факультет автоматики и вычислительной техники

Кафедра систем автоматического управления

Отчет

по лабораторной работе №2

по теме: «Часы и таймеры»

по курсу

«Системы реального времени»

Выполнила:

студентка группы МГА-22

Денисова Г.В.

__________________

Проверил:

Заргарян Ю.А.

__________________

«__» ____________ 2012 г.

Таганрог 2012 г.

  1. Теоретические сведения.

    1. Часы и таймеры.

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

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

Большинство ОСРВ оперируют относительным временем. Что-то происходит “до” и “после” некоторого другого события. В системе, полностью управляемой событиями, необходим часовой механизм (ticker), т.к. там нет квантования времени (time slicing). Однако, если нужны временные метки для некоторых событий или необходим системный вызов типа “ждать одну секунду”, то нужен тактовый генератор и/или таймер.

Синхронизация в ОСРВ осуществляется с помощью механизма блокирования (или ожидания) до наступления некоторого события. Абсолютное время не используется.

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

    1. Часы.

time()

clock_gettime()

clock_settime()

clock_getres()

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

Функция time() позволяет получить значение часов с точностью до 1 секунды. Эта функция позволяет опрашивать только системные часы.

time

Синтаксис

#include <time.h>

time_t time(time_t *tloc);

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

Тип элемента

Идентификатор элемента

Описание

time_t

tv_sec

секунды

long

tv_nsec

наносекунды

Допустимым значением элемента tv_nsec является величина, большая или равная нулю и меньшая количества наносекунд в 1 секунде (1000 млн.). Временной интервал, описываемый данной структурой, составляет

(tv_sec * 1,000,000,000 + tv_nsec) наносекунд.

Оба типа данных (time_t и timespec) могут использоваться для хранения календарного времени. В этом случае хранящиеся в них данные интерпретируются как время, прошедшее с 0 часов 1 января 1970 года.

Структура tm позволяет хранить дату и время в общепринятом виде. Она содержит следующие элементы:

Тип элемента

Идентификатор элемента

Описание

int

tm_sec

секунды

int

tm_min

минуты

int

tm_hour

часы (с 0)

int

tm_mday

день месяца (с 1)

int

tm_mon

месяц (с 0)

int

tm_year

год с 1900

int

tm_wday

день недели (воскресенье - 0)

int

tm_yday

день в году (с 0)

int

tm_isdst

флаг летнее время

Система всегда содержит, по крайней мере, одни часы с идентификатором CLOCK_REALTIME (системные часы). Значение этих часов интерпретируется как календарное время, то есть время (в секундах и наносекундах), истекшее с 0 часов 1 января 1970 года.

Функция clock_settime() позволяет установить показания часов, функция clock_gettime() - опросить показания часов, а clock_getres() - узнать разрешающую способность часов. Все три функции работают с высокой точностью, так как используют структуру timespec. Отметим, однако, результаты измерения времени не могут быть точнее, чем разрешающая способность часов.

clock_gettime

Синтаксис

#include <time.h>

int clock_gettime(

clockid_t clock_id,

struct timespec *tp);

Аргументы

clock_id

идентификатор часов;

tp

указатель на структуру timespec, в которую записываются показания часов.

Описание

Функция clock_gettime() записывает текущие показания часов clock_id в структуру timespec, на которую указывает аргумент tp.

clock_settime

Синтаксис

#include <time.h>

int clock_settime(

clockid_t clock_id,

const struct timespec *tp);

Описание

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

clock_getres

Синтаксис

#include <time.h>

int clock_getres(

clockid_t clock_id,

struct timespec *res);

Описание

Функция clock_getres() позволяет выяснить разрешающая способность часов. Если значение аргумента res не равно NULL, то разрешающая способность указанных часов будет записана в структуру timespec, на которую указывает аргумент res.

Функции localtime() и localtime_r() позволяют получить локальное время, а функции gmtime() и gmtime_r() - мировое время. Все четыре функции формируют результат в структуре tm, а в качестве исходных данных получают календарное время в секундах, то есть количество секунд, истекших с 0 часов 1 января 1970 года, UTC. Таким образом, исходные данные для этих функций можно получить с помощью функции time().

Функция mktime() преобразует локальное время, записанное в структуре tm, в календарное время (количество секунд, истекшее с 0 часов 1 января 1970 года, UTC).