- •Абсолютное и относительное время
- •Источники времени
- •Соглашения POSIX
- •struct timespec { time_t tv_sec long tv_nsec
- •Текущее время
- •Операции задержки sleep(), usleep(), nanosleep()
- •sleep(), usleep(), nanosleep()
- •Тайм-аут. alarm(), signal(), pause()
- •Интервальный таймер
- •Интервальный таймер i8254
- •Примеры использования
- •Приложение – ISR (Interrupt Service Routine)
- •Сторожевой таймер (Watchdog Timer - WDT)
- •Часы реального времени (Real-Time Clock)
Интервальный таймер
Однократный запрос на прерывание
Периодические
Значение интервала, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
запросы |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
режим работы |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
От генератора |
Регистр управления |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Импульсов |
|
|
|
|
|
|
(1.1931816 МГц) |
|
|
|
|
|
Запрос на |
Счетчик |
|
|
|
РП |
||
|
|
|
|
|||
|
|
|
|
прерывание |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
Запрос |
|
Регистр-защелка |
|
|
|
|
|
|
|
|
|
текущего значения |
||
|
|
|
|
|
6. Время и таймеры v.01 |
11 |
|
Интервальный таймер i8254
Периодические запросы на прерывание
Однократные запросы на Прерывание
Генератор сигналов заданной длительности, скважности
Измерение временных интервалов между событиями
Счетчик событий, запрос на прерывание по заданному количеству событий
6. Время и таймеры v.01 |
12 |
|
Примеры использования
•В системе, где имеется возможность изменять содержимое вектора прерывания и создать свою процедуру обработки, приложение может быть написано как обработчик прерывания от таймера
•Предоставляется возможность написать функцию, которая будет вызываться с заданным периодом (например, 20 мс) (callback-функция)
void startTimer (<указатель на callback-функцию >, <интервал>)
startTimer(&Clock, 20) // функция Clock() будет вызываться
//каждые 20 мс
•Возможность получения текущего значения счетчика времени long getTime(void)
6. Время и таймеры v.01 |
13 |
|
Приложение – ISR (Interrupt Service Routine)
|
|
|
«Циклический |
Генератор |
Приложение |
Исполнитель» |
|
|
|||
|
|
|
|
1.1931816 МГц |
Фактически является |
flag1 |
|
|
Программой обработки |
|
|
|
прерывания от таймера |
|
|
|
|
|
Задача_1 |
Аппаратный |
|
|
|
таймер, |
Прерывание |
flag1 |
|
делитель на 11931 |
|
flagn |
|
|
|
… |
|
|
Часы |
|
|
|
flagn |
|
|
|
|
Задача_n |
|
|
|
|
|
|
Возврат |
|
|
ti+1= ti+10мс |
|
|
|
6. Время и таймеры v.01 |
|
|
14 |
|
|
|
|
Сallback функция |
|
|
|
Генератор |
Управляющая |
Приложение |
|
программа |
|
|
|
1.1931816 МГц |
сlock() |
|
|
|
|
|
|
Аппаратный |
|
StartTimer(сlock) |
|
таймер, |
|
|
|
делитель на 11931 |
|
|
|
|
|
T==t1 |
|
|
|
Задача_1 |
Работа с таймером |
|
|
|
через функции: |
|
T==tn |
|
А) |
void startTimer (<указатель на функцию >, <интервал>) |
|
|
В) |
long getTime(void) |
|
Задача_n |
|
clock() |
|
|
|
6. Время и таймеры v.01 |
|
15 |
|
|
|
Сторожевой таймер (Watchdog Timer - WDT)
|
|
# define interval |
20 |
|
|
main () { |
|
clock |
CPU |
while(true){ |
|
|
restartWDT(interval); |
||
|
|
||
|
|
measure(); |
|
restart |
RAM |
makeControlDecision(); |
|
WDT |
output(); |
|
|
|
|
||
reset |
|
sleep(10); |
|
Flash |
} |
|
} |
||
|
•Цикл работы системы составляет 10 с
•Перед началом каждого цикла WDT перезапускается на 20 с.
•В случае зависания системы через 20 с WDT выдает аппаратный запрос на ее перезапуск
6. Время и таймеры v.01 |
16 |
|
Часы реального времени (Real-Time Clock)
Генератор |
|
|
|
Делитель |
|
|
|
частоты |
|
|
|
|
|
|
|
|
|
|
|
Источник
питания
Счетчик |
|
Счетчик |
времени |
|
даты |
|
time_of_day
Внешний интерфейс
•Управляется низкоуровневой процедурой (BIOS, OS)
•Библиотечные процедуры ctime(&time_of_day).
String MMHHDDMMYYYY void loadRTC(String s) String getRTS()
15:34, 24 January, 2013 – 341524012003
6. Время и таймеры v.01 |
17 |
|