ПРОГРАМНЕ ЗАБЕЗПЕЧЕННЯ ВБУДОВАНИХ СИСТЕМ УПРАВЛІННЯ НА БАЗІ однокристальних мікропроцесорів (МП)
1. Програмна модель МП з регістр-акумуляторної архітектурою
Виконання певної функції за допомогою мікропроцесорного пристрою (МПУ) вимагає вивчення особливостей архітектурної організації застосовуваного МП. Складовою частиною архітектури є система команд, тобто повний набір інструкцій, розпорядчих МП виконувати на кожному кроці програми елементарні операції. Знаючи програмно-доступні ресурси МП і принципи переміщення даних, можна за допомогою набору команд запрограмувати будь-яку складну операцію.
Програмна модель МПС, побудованої на базі однокристального 8-розрядного МП складається з програмно доступних регістрів, восьмирозрядних осередків ОЗУ і восьмирозрядних портів введення / виводу. Розряди регістрів нумеруються справа наліво цілими числами починаючи з нуля. Програмно-доступними регістрами такого МП є регістри спеціальних функцій (РСФ) і регістри загального призначення (РОН). До регістрам спеціальних функцій відносяться: акумулятор (А), регістр ознак (F), регістр покажчика стека (SP), регістр лічильника команд (PC).
Регістр А призначений для тимчасового зберігання одного з операндів, що беруть участь в арифметичних або логічних операціях, і отриманого результату після її виконання. Крім того, А використовується для програмно керованого обміну з зовнішніми пристроями через порти введення / виводу.
Регістр ознак (F) - це восьмирозрядний регістр, що містить ознаки результату виконання команд (рис.1.1).
Для більшості команд ознаки встановлюються таким чином:
ознака S - одиниця, якщо сьомий розряд результату дорівнює одиниці, в іншому випадку - нуль;
ознака нуля Z - одиниця, якщо у всіх розрядах результату нулі, в іншому випадку - нуль;
ознака додаткового перенесення AC - одиниця при перенесенні з третього розряду або при позиці у третій розряд результату, в іншому випадку - нуль;
ознака парності P - одиниця, якщо результат у двійковому коді містить парну кількість одиниць, в іншому випадку - нуль;
ознака перенесення CY - одиниця при перенесенні з сьомого розряду або при позиці в сьомий розряд результату, в іншому випадку - нуль.
Регістр покажчик стека (SP) - це шестнадцатіразрядний регістр, який містить адресу вершини стека. Стік - це динамічна послідовна структура даних в ОЗУ, організована таким чином, що чергова запис даних завжди здійснюється в вершину (початок) стека. Максимальний розмір стека дорівнює адресується ємності пам'яті. У вершину стека можуть записуватися тільки шестнадцатібітних дані.
При запису даних у стек вміст регістра покажчика зменшується на 2, а при зчитуванні - збільшується на 2.
Регістр лічильника команд (PC) - це шестнадцатіразрядний регістр, який вказує адреса наступної команди, яка повинна бути виконана мікропроцесором.
Регістри загального призначення, як правило, позначаються літерами B, C, D, E, H, L, А. Регістри В і С, D і E, H і L в деяких командах розглядаються як шестнадцатіразрядние регістри, звані регістровими парами. Регістри B, D, і H утворюють старші вісім розрядів реєстрових пар, а регістри C, E, і L - молодші.
Програмно-доступні восьмирозрядних осередки ОЗУ використовуються в якості пам'яті МПС. Розряди осередки ОЗУ нумеруються справа наліво цілими числами, починаючи з нуля. Максимальна ємність пам'яті, реалізованої запам'ятовуючим пристроєм, дорівнює 65 536 байт.
Програмно-доступні восьмирозрядних порти використовуються для введення і виведення. Максимальне число регістрів для введення даних складає 256, для виведення даних - стільки ж.
Програмна модель 16-розрядного МП відрізняється збільшенням як кількості програмно-доступних регістрів, так і їх розрядністю [16]. За своїм призначенням вони поділяються на три групи.
Регістри загального призначення AX, BX, CX, DX використовуються для зберігання проміжних результатів і можуть без обмеження брати участь у виконанні арифметичних і логічних операцій. При виконанні операцій над ланцюжками байтів і слів цих регістрів пропонуються спеціальні функції.
Вказівні та індексні регістри (SP, BP, SI, DI) призначені для зберігання 16-розрядних адрес (внутрішньосегментний зсувів) і забезпечують при цьому непряму адресацію і динамічне обчислення ефективного адреси пам'яті.
Сегментні регістри (CS, DS, SS, ES) зберігають початкові адреси чотирьох сегментів пам'яті, використовуваних в поточній програмі: команд, стека, і двох сегментів даних.
Є програмно доступний регістр ознак (прапоровим) (рис.1.2), молодший байт якого FL повністю відповідає регістру прапорів розглянутого вище МП і називаються арифметичними прапорами, а старший байт FH містить чотири додаткових прапора (TF, IF, DF, OF), три перші з яких відносяться до прапорів управління МП.
TF - прапор трасування (простежування). При TF = 1 МП переходить в покомандний (покроковий) режим роботи, який застосовується при налагодженні програм, коли автоматично генерується сигнал внутрішнього переривання після виконання кожної команди. При цьому виконується перехід на відповідну підпрограму, яка зазвичай забезпечує індикацію вмісту внутрішніх регістрів МП.
IF - прапор дозволу переривань, керований за допомогою команди CLI і STI: при IF = 1 МП сприймає і реагує на запит переривання по входу INTR; при IF = 0 переривання з цього входу забороняються (маскуються) і МП ігнорує запити переривань.
DF - прапор напрямку, керований командами CLD і STD, визначає порядок обробки ланцюжків у відповідних командах (при DF = 0 від менших адрес до великих і навпаки при DF = 1).
OF - прапор переповнення, що сигналізує про втрату старшого біта результату складання або віднімання у зв'язку з переповненням розрядної сітки при роботі зі знаковими числами.
При виконанні команд операнди можуть зберігатися в програмно-доступних регістрах мікропроцесора або в пам'яті МПС. Для вказівки операнда в регістрі використовується: реєстрова адресація і реєстрова неявна адресація.
ПРИКЛАД:
MOVA, B
ADCB
CMA
Для вказівки операнда в пам'яті використовуються адресації: безпосередня, пряма, побічно-реєстрова і стекова.
ПРИКЛАД:
LDA 8324H; пряма
IN FA; пряма
ADC M; побічно-реєстрова
PUSH PSW; стекова
Таким чином, для більшості МП найбільш загальними є п'ять способів адресації операндів. У 16-розрядному МП і вище допускаються додаткові способи адресації, такі як базова, індексна, базова індексний, відносна, сторінкова та ін Вибір того чи іншого визначається мінімальним обсягом пам'яті для зберігання програм і найменший час їх виконання.
Для кожного МП є свій список команд. За функціональним призначенням, як правило, вони діляться на групи: команди пересилання даних, арифметичні команди, команди логічних операцій, команди передачі управління, команди управління мікропроцесором.
Група команд пересилки даних:
команди пересилання даних загального призначення (MOV, MVI, LDA, STA, LHLD, SHLD, LXI, LDAX, SPHL, STAX, XCHG, XTHL);
команди звернення до стека (PUSH і POP);
команди введення (IN) і виводу (OUT).
Група арифметичних команд:
команди складання (ADD, ADI, ADC, ACI, INR, INX, DAD);
команди віднімання (SUB, SUI, SBB, SBI, DCR, DCX);
команди множення (MUL);
команди поділу (DIV);
команда десяткової корекції вмісту акумулятора (DAA).
Група команд логічних операцій:
логічні команди (ANA, ANI, ORA, ORI, XRA, XRI);
команди порівняння (CMP, CPI);
команди зсуву (RLC, RRC, RAL, RAR);
команди інверсії вмісту акумулятора (CMA).
Група команд передачі управління:
команди безумовного переходу (JMP);
команди умовного переходу (JNC, JC, JNZ, JZ, JPO, JPE, JP, JM);
команди безумовного виклику підпрограм (CALL, RST);
команди умовного виклику підпрограм (CNZ, CZ, CNC, CC, CPO, CPE);
команда безумовного повернення з підпрограми (RET);
команда умовного повернення з підпрограм (RNZ, RZ, RNC, RC, RC, RPO, RPE, RP, RM).
Група команд управління мікропроцесором:
команди управління ознакою переносу (CMC, STC, CLC);
команди прапорами (EI, DI, CLI, STI);
команда "немає операції" (NOP);
команда зупину мікропроцесора (HLT).
Кількість базових команд МП становить кілька десятків, а з урахуванням їх модифікацій досягає декількох сотень.
Час виконання команди, що оцінюється числом тактів МП. Знаючи частоту генератора тактових імпульсів (FГТІ), можна визначити тривалість одного такту; T (мкс) = 1/FГТІ (МГц), а значить і час виконання команди, що має істотне значення при програмній генерації тимчасових інтервалів.
Для переважної кількості команд час виконання команди (число тактів) є незмінною, однак існують команди, для яких цей час може змінюватися. Такими командами є команди умовного виклику і повернення з підпрограм. Час виконання команди залежить від того, виконується умова чи ні. Як правило, якщо умова виконується, час виконання команди суттєво збільшується.
2. Мова проектування МПС, вбудованої в ЕА
Для системи, що містить МП, потрібне проектування як апаратних, так і програмних засобів. Проектування апаратної частини може бути виконано з використанням стандартної методології проектування апаратури.
Проектування програмного забезпечення краще за все може бути виконано з використанням мови проектування, подібного природного мови. Програмне забезпечення будується шляхом перетворення конструкцій мови проектування в мову програмування мікрокомп'ютера (МКП). Воно тестується і одночасно з апаратурою об'єднується в єдине ціле.
Схеми мови проектування можна розглянути за допомогою простого прикладу. Нехай маємо систему з мікрокомп'ютера з двома виходами (рис.1.3), яка повинна реалізовувати функцію перетворення, представлену на рис.1.1.
Малюнок 1.3 - Структурна схема мікрокомп'ютерної системи
З наявності у системи входів і виходів можна зробити висновок про те, що мікрокомп'ютер повинен мати можливість перевіряти значення кожного входу, а також встановлювати кожен з виходів у певні значення.
Мовою проектування в операціях перевірки і установки використовуються прості конструкції.
Перевірити Вх.1 і запам'ятати його значення.
Встановити значення Вих.1, рівне 6.
Малюнок 1.4 - Функція перетворення
Необхідно також мати можливість перевіряти умови, яким задовольняють збережені значення кожного з входів для установки вихідних значень. З цією метою використовується умовна конструкція, яка в загальному вигляді може бути представлена як: ЯКЩО (умови перевірки - істина). ТО (виконати що-небудь). ІНАКШЕ (виконати що-небудь інше). Таким чином, для даного прикладу опис мовою проектування спочатку буде мати вигляд:
1. Перевірити Вх1 і зберігати його значення.
2. Перевірити Вх2 і зберігати його значення.
3. Якщо 4 ≤ Вх1 ≤ 8, встановити Вих1 = 6.
1. Інакше Вих1 встановити = 0.
5. Якщо 2 ≤ Вх2 ≤ 6, встановити Вих2 = 1.
6. Інакше Вих2 встановити = 0.
Коли система функціонує, мікрокомп'ютер виконує запрограмовані операції крок за кроком. Після того, як входи перевірені, немає впевненості, що потім при повторній перевірці один з них не виявиться зміненим. Тому необхідна така операція, яка дозволяла б виконувати інші операції мови проектування нескінченне число разів.
Для цієї мети використовується конструкція:
«ВИКОНУВАТИ БЕЗПЕРЕБІЙНО». . . . . «КІНЕЦЬ»
У цій конструкції набір операцій, розташований між ВИКОНУВАТИ БЕЗПЕРЕБІЙНО і КІНЕЦЬ, повинен повторитися без кінця.
У цьому випадку, одного разу почавшись, операція перевірки значень входів буде повторюватися стільки часу, скільки система залишається в дії.
З вищенаведеного прикладу можна зробити наступні висновки:
мікрокомп'ютер є послідовним пристроєм і в кожний момент часу виконує тільки одну операцію;
в багатьох випадках, щоб змінити функціональне поведінка мікрокомп'ютерної системи, необхідно змінити лише деякі операції в описі програми на мові проектування;
МКП маніпулює тільки цифровими даними. Якщо в системі є аналогові сигнали, для перетворення вхідних сигналів в цифрову форму необхідний АЦП, а для перетворення вихідних сигналів в аналогову форму - ЦАП.
3 Складання схем алгоритмів
Реалізація будь-якої функції з допомогою мікрокомп'ютера завжди вимагає проектування необхідної послідовності дій, що отримала назву алгоритму. Найбільш зручна і наочна форма представлення алгоритму рішення задачі - графічна, у вигляді схеми. Вона складається з впорядкованої сукупності умовних геометричних фігур, які несуть інформацію про певний характер операцій, накладається умова, прийнятих позначеннях. Основні форми, які згідно з чинними стандартами представлені в додатку А.
Розглянемо як приклад завдання формування двох наборів цілих чисел, що лежать в діапазоні від -5 до +5. Шляхом сортування організується два набори, один з яких включає в себе позитивні числа, а інший - негативні.
Схема алгоритму вирішення цього завдання показана на рис. 1.5.
Малюнок 1.5 - Схема алгоритму з розгалуженням
4 Підпрограми
Підпрограма - це частина програми, яка використовується зазвичай кілька разів в процесі виконання програми. Однак текст підпрограми записується програмістом тільки один раз. Коли ж програмісту необхідно скористатися підпрограмою, достатньо вказати в програмі відповідну команду виклику (обігу до підпрограми), що адресуються до області пам'яті, в якій розташована підпрограма. З цією метою в мові програмування для більшості МП існує команда CALL (викликати). У цій команді після коду операції (CALL) вказується ім'я підпрограми, яке присвоєно фізичному адресою в області пам'яті, де розташована дана підпрограма.
Крім того, по команді виконуються дії, необхідні для повернення до основної програми після виконання підпрограми:
а) у лічильнику команд фіксується адресу команди в основній програмі, яка слідує за командою виклику;
б) вміст лічильника команд (адреса повернення) завантажується в стек, вміст покажчика стека модифікується;
в) в лічильник команд завантажується адреса, що задається командою виклику. Після цього може початися виконання підпрограми.
Останньою виконуваної командою підпрограми є команда RET (return - повернення). За цією командою виконується повернення до основної програми, перерваної командою виклику. Команда повернення містить тільки код операції. За цією командою відбувається наступне: а) лічильник команд отримує з стека адресу команди в основній програмі, наступної за командою виклику; б) вміст покажчика стека відповідно модифікується.
Основна перевага підпрограм полягає в тому, що завдяки можливості їх багаторазового використання, скорочується текст програми в цілому. Замість того, щоб у міру необхідності повторювати запис одного і того ж фрагмента програми, достатньо оформити запис фрагмента як підпрограму і звертатися до неї стільки разів, скільки потрібно відповідно до алгоритму рішення задачі.
З однієї програми можна робити звернення до кількох підпрограм.
Одна підпрограма може звернутися до іншої. Така побудова підпрограм називаються вкладеними.
Глибина допустимого рівня вкладення підпрограм залежить від типу обчислювальної машини і використовуваної мови програмування. Більшість сучасних МП та мов програмування допускає багаторівневе вкладення. Як випливає з вищевикладеного, використання підпрограм - не надто обтяжлива робота для програміста.
5 Програмування в машинних кодах
Реалізація необхідного алгоритму обчислення досягається шляхом підготовки, налагодження і запису до ПЗУ відповідної програми. МП здатний сприймати лише програми, які складаються з послідовності команд, представлених двійковими кодами. Програмування безпосередньо в машинних кодах вимагає постійного оперування багаторозрядним двійковими числами, які представляють як коди команд, так і коди операндів.
Як приклад лінійної програми в машинних двійкових кодах розглянемо програму складання двох чисел, одне з яких 01100100 знаходиться в регістрі загального призначення (РОН) У, а друге - 00010111 розташоване в комірці пам'яті з адресою 0000 0000 тисячі 1111. Нагадаємо, що даний МП має шестнадцатіразрядную шину адреси. Фрагмент програми наведено в табл. 1.1.
Таблиця 1.1 - Програма складання в машинних кодах
Адреса пам'яті
Мнемокод
0000 0000 0000 0100
01111000
0000 0000 0000 0101
00100001
0000 0000 0000 0110
10001111
0000 0000 0000 0111
00000000
0000 0000 0000 1000
10000110
0000 0000 0000 1001
01110110
. . . . . . . . . . . . . . . . .
. . . . . . . . .
0000 0000 0000 0100
00010111
Таблиця 1.2 - Програма складання в шістнадцятиричних кодах
Мнемокод
Адреса
Н - код
Vt
MOV A, B
0004
78
5
LXI H
0005
21
16
0006
8F
0007
00
ADD M
0008
86
7
HLT
0009
76
7
. . . . . . . . .
. . . . . .
. . . . . .
. . . .
008F
17
Перша команда - пересилання вмісту регістра У в акумулятор - є однобайтовий, має код операції. Код операції розташований в ПЗУ за адресою 0000 0000 0000 0100, який для даної програми є початковим.
Наступна команда - трехбайтовая, має код операції 00100001, представляє перший байт команди. Другий і третій байти, розташовані у чергових осередках ПЗУ, містять відповідно молодшу та старшу частини адреси 1000 1111 0000 0000, що передаються по цій команді в реєстрову пару H і L.
Мікропроцесор при виконанні програми послідовно звертається до комірок пам'яті і виконує по черзі всі команди. Нагадаємо, що коди операцій і операнди зберігаються в пам'яті в однаковому вигляді і їх розрізнення здійснюється мікропрограмами виконання команд, закладеними в МП. Остання команда має код 01110110 і є командою зупинки (HLT).
В результаті виконання програми в акумуляторі виявиться записаним число 01111011.
Навіть розгляд такої найпростішої програми показує, наскільки незручним і недостатньо наочним є представлення чисел у машинних двійкових кодах. Тому прийнято запис машинних кодів виробляти в шістнадцятковій системі.
У табл. 1.2 наведено фрагмент тієї ж самої програми, записаної в шістнадцятиричних кодах. Поруч з кодом операції показані його мнемонічне зображення і найменування операндів, прийняті в системі команд даного МП. Наприклад, шістнадцятковий код команди 78, що має мнемонічне позначення MOV A, B, відповідає операції пересилання вмісту регістра У в акумулятор А. У табл. 1.2 також вказано число тактів Vt, необхідне для виконання кожної команди. Для виконання всієї програми потрібно 35 машинних тактів.
Практично зручніше програмувати безпосередньо в мнемокода, а потім представляти шістнадцяткові коди адрес і операндів, отримані від розподілу пам'яті.
6 Програмування в мнемокода
Найбільш зручним методом написання програм є використання мнемонічних кодів, що складаються з абревіатури повної назви інструкції. У цьому випадку мнемокод відображає змістовний сенс виконуваної операції.
Приклад 1.1. Організація лічильників циклів. Схема алгоритму рахунку показана на рис. 1.6, а фрагмент програми наведено в табл. 1.3.
Малюнок 1.6 - Схема алгоритму рахунку циклів
Лічильником служить один з РОН - регістр В. За командою MVI B, N в нього заноситься число N, що визначає кількість повторюваних циклів. У даній програмі N = 16. Для визначеності прийнято, що ділянка програми, який необхідно повторити 16 разів, починається командою логічної операції «ВИКЛЮЧАЄ АБО» XRA A, розташованої за адресою 1002, і закінчується командою пересилання з акумулятора в регістр D: MOV D, A, розташований за адресою 10А1. Після кожного виконання цієї ділянки програми вміст лічильника (регістру В) зменшується на одиницю за допомогою команди DCR B (адреса 10А2). До тих пір, поки вміст регістра У відмінно від нуля, ознака Z має нульове значення і програма переходить до виконання команди, адреса 1002 який міститься у другому і третьому байтах команди JNZ (перехід по відсутності нуля). Вказана адреса відзначений у програмі міткою М1, тобто мітка М1 є мнемонічним позначенням адреси 1002.
Таблиця 1.3 - Програма рахунку циклів
Мітка | Мнемокод | Операнд | Адреса | Н - код | Коментар | Vt |
. . . . . . . | . . . . . . . | . . . . . . | . . . . . . | . . . . . . . . . . | . . | |
MVI | B, 16 | 1000 | 06 | Установка лічильника | 7 | |
1001 | 10 | N = 16 в (B) | ||||
M1: | XRA | A | 1002 | AF | Обнулення ознаки перенесення |