Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VPKS_v2_UKR_new.doc
Скачиваний:
21
Добавлен:
11.09.2019
Размер:
2.31 Mб
Скачать

Синхронізація за допомогою керуючих сигналів

Розглянемо більш докладно останній приклад з попереднього розділу. Припустимо, що в модельованій системі процес-джерело генерує дані, які повинні однаково й досить швидко оброблятися. Природно, ці дані спробувати обробляти паралельно (рис.2).

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

Рис.2

Рис. 3

3. Мовні засоби для програмування в реальному масштабі часу

У багатьох випадках, наприклад при програмуванні пристроїв вводу-виводу, необхідно, щоб програміст мав можливість порівнювати або вимірювати відрізки часу. Це дозволяє програмувати коректні протоколи обміну даними, що перешкоджають втратам інформації в мережах, а також будь-які інші керуючі процеси, що працюють у темпі зі змінами, що відбуваються в навколишнім середовищі.

У мові Оккам є два процеси-примітиви для програмування завдань у реальному часі: запис у локальну змінну показання годин і затримка виконання програми на певний часовий інтервал.

Процес запису показань годин виглядає в такий спосіб:

TIME ? змінна

Цей процес привласнює змінній змінна поточне значення локального часу процесора в тактах. Як і всі значення змінних або виразів у програмах мовою Оккам, показання таймера займає одне машинне слово. Таймер пробігає в зростаючому порядку всі можливі значення, які представлені в цьому слові, причому після самого старшого значення йде саме молодше й т.д.

Відзначимо, що зарезервоване слово TIME ? не є процесом-примітивом введення в буквальному значенні цього слова, а слово TIME - ім'ям каналу. Компілятор з мови Оккам розглядає послідовність символів TIME ? як атомарну лексему (ієрогліф) мови. На відміну від звичайного каналу, що зв'язує тільки два процеси, з "каналу" TIME ? мають право зчитувати показання годин всі процеси, що становлять програму мовою Оккам. Однак слід зазначити, що при багатопроцесорному виконанні програми показання локальних годин процесорів у той самий момент можуть відрізнятися друг один від одного.

Другий процес-примітив, що забезпечує програмування завдань у реальному масштабі часу, є процесом затримки виконання по локальних годинах:

TIME ? AFTER вираз

Цей процес подібно процесу-примітиву SKIP теж нічого не робить, але на відміну від нього доти, доки показання таймера не стануть більшими або дорівнюватимуть (залежно від конкретної реалізації) значенню виразу вираз. Після цього процес-примітив затримки виконання програми по годинах закінчується.

Послідовність символів TIME ? AFTER, так само як і TIME ?, є зарезервованим ідентифікатором мови Оккам. Правила цієї мови дозволяють використати даний процес-примітив (крім випадків звичайного використання будь-яких процесів-примітивів) як сторожовий процес у конструкторі ALT. Такий сторож буде готовий, як тільки закінчиться процес затримки виконання програми по годинах.

Наприклад, використання в якості сторожа процесу-примітива затримки дозволяє обмежити час очікування введення інформації з каналу зв'язку.

DEF timeout = 1:

DEF second = 1234 : - кількість тактів у секунді

CH AN screen AT 1:

CHAN keyboard AT 2:

VAR val, ch:

SEQ

output.string (screen, "Чекаю відповіді протягом 30 секунд")

TIME ? val

ALT

keyboard ? ch

to.program ! ch

TIME ? AFTER val + (30 * second)

to.program ! timeout

У цьому прикладі може здійснитися введення символу із клавіатури дисплея й пересилання його в програму протягом 30 с. Якщо ж цього не відбулося, у канал to.program посилає значення константи timeout.

Тепер, допустимо, необхідно запрограмувати процес, що включає й виключає деякий пристрій кожні 10 с.

DEFsecond = 1234: - кількість тактів у секунді

CHAN device.on, device.off:

VAR started, flipflop:

SEQ

flipflop := TRUE

WHILE TRUE

SEQ

TIME ? started

TIME ? AFTER started + (10 * second)

IF

flipflop

device.on ! ANY

TRUE

device.off ! ANY

flipflop := NOT (flipflop)

Число 1234 в оголошенні константи second - довільне й залежить від мікропроцесора, на якому виконується програма. Якщо час затримки виконання процесу більше числа представлених в одному слові тактів, використовується ієрархія лічильників секунд, хвилин, годин, доби й т.д., яку організує вже сам програміст.

DEF second = 1234: -кількість тактів у секунді

DEF minute = 60 * second: - кількість секунд у хвилині

DEF hour = 60 * minute: - кількість хвилин у годині

CHAN device.on, device.off:

VAR started, flipflop:

SEQ

flipflop := TRUE

WHILE TRUE

SEQ

TIME ? started

TIME ? AFTER started + (10 * hour) + (15 * minute)

IF

flipflop

device.on ! ANY

TRUE

device.off ! ANY

flipflop := NOT(flipflop)

У цьому прикладі деякий пристрій включається й вимикається вже кожні 10 - 15 хв.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]