Принципы организации взаимодействия микропроцессора с внешними устройствами. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Принципы организации взаимодействия микропроцессора с внешними устройствами.



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

- программно управляемый обмен;

- обмен по готовности внешнего устройства;

- обмен по прерыванию.

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

Второй механизм обмена (обмен по готовности) предполагает перед началом обмена проверку состояния готовности внешнего устройства.

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

Если при разработке МП системы необходимо подключить к ОМК ВЕ51 внешнюю память данных (ОЗУ), или внешнюю память программы (ПЗУ), или дополнительное устройство ввода/вывода информации, то ОМК предварительно формирует внешнюю системную магистраль.

Наиболее часто используют трех шинную внешнюю системную магистраль, состоящую из:

–ША(максимальношестнадцатиразрядная);

–ШД(восьмиразрядная);

–ШУ.

Общая схема формирования внешней системной магистрали имеет вид, изображенный на рисунке 20.1

 

Рисунок 20.1 – Схема формирования внешней системной магистрали

 

Формирование ША Для формирования разрядов ША используется порт Р2 и Р0, при этом передача адреса по линиям порта Р0 сопровождается активным сигналом ALE. Для сохранения адресной информации на время выполнения команды используется регистр защелка DD2.

Формирование ШД Для формирования используется разряды порта Р0. В то время, когда по ним не передается адресная информация. Формирование ШУ

Используется разряды Р3 в альтернативном режиме работы, а также сигнал PSEN– чтение информации из внешнего ПЗУ.

Основными сигналами ШУ является ЧТПП (PSEN) –чтениевнешней памяти программы (ПЗУ).

ЧТПДчтение внешней памяти данных (ОЗУ).

ЗППДзапись информации во внешней памяти данных (ОЗУ). IO/M- сигнал выбора устройства для обмена информацией.

Если IO/M=0, то обмен осуществляется с внешней памятью данных (ОЗУ).

Если IO/M=1, то обмен осуществляется с внешними устройствами ввода/вывода.

Замечание: Сигнал IO/M формируется пользователем программно с использованием любой свободной линии порта Р1. Наличие этого сигнала IO/M объясняется тем, что внешние ячейки ОЗУ и внешние устройства ввода/вывода подключаются к системной магистрали одинаково и используется единое адресное пространство.


Тема 3 Программирование на языке Си

 

Лекция 21 Лексические основы языка C++

Цели лекции:

Изучение лексических основ: алфавита, лексем, идентификаторов, предложений.

 

Состав языка

В тексте на любом естественном языке можно выделить четыре основных элемента: символы, слова, словосочетания и предложения.

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

- Алфавит языка, или его символы — это основные неделимые знаки, с помощью которых пишутся все тексты на языке.

- Лексема, или элементарная конструкция, — минимальная единица языка, имеющая самостоятельный смысл.

- Выражение задает правило вычисления некоторого значения.

- Оператор задает законченное описание некоторого действия.

Рисунок 21.1 - Состав алгоритмического языка

 

Для описания сложного действия требуется последовательность операторов. Операторы могут быть объединены в составной оператор, или блок (Блоком в языке С++- считается последовательность операторов, заключенная в фигурные скобки { }). В этом случае они рассматриваются как один оператор. Операторы бывают исполняемые и неисполняемые. Исполняемые операторы задают действия над данными. Неисполняемые операторы служат для описания данных, поэтому их часто называют операторами описания или просто описаниями.

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

Объединенная единым алгоритмом совокупность описаний и операторов образует программу на алгоритмическом языке.

// HELLO.CPP - имя файла с программой

#include void main()

{ cout << "\nHello, World!\n";

}

Основная программная единица на языке Си++ - это текстовый файл с названием <имя>.срр, где cpp - принятое расширение для программ на Си++, а имя выбирается достаточно произвольно. Для удобства ссылок и сопоставления программ с их внешними именами целесооб­разно помещать в начале текста каждой программы строку коммен­тария с именем файла, в котором она находится.

Текстовый файл с программой на Си++ вначале обрабатывает препроцессор, который распознает команды (директивы) препроцессора (каждая такая ко­манда начинается с символа '#') и выполняет их.

В приведенной вы­ше программе использована препроцессорная команда include <имя вставляемого файла> Выполняя препроцессорные директивы, препроцессор изменяет исходный текст программы. Команда вставляет в програм­му заранее подготовленные тексты из включаемых файлов. Сформи­рованный таким образом измененный текст программы поступает на компиляцию. Компилятор, во-первых, выделяет из поступившего к нему текста программы лексические элементы, т.е. лексемы, а затем на основе грамматики языка распознает смысловые конструкции языка (выражения, определения, описания, операторы и т.д.), построенные из этих лексем. Фазы работы компилятора здесь рассматривать нет необходимости. Важно только отметить, что в результате работы компилятора формируется объектный модуль программы. Компилятор, выполняя лексический анализ текста программы на языке Си++, для распознавания начала и (или) конца отдельных лек­сем использует пробельные разделители. К пробельным разделителям относятся собственно символы пробелов, символы табуляции, символы перехода на новую строку. Кроме того, к пробельным разделите­лям относятся комментарии.

Для того чтобы выполнить программу, требуется перевести ее на язык, понятный процессору — в машинные коды. Этот процесс состоит из нескольких этапов. Рисунок 21.2 иллюстрирует эти этапы для языка С++.

 

Рисунок 21.2 - Этапы создания исполняемой программы

 

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

 

Получившийся полный текст (файл с расширением.cpp) программы поступает на вход компилятора, который выделяет лексемы, а затем на основе грамматики языка распознает выражения и операторы, построенные из этих лексем. При этом компилятор выявляет синтаксические ошибки и в случае их отсутствия строит объектный модуль. (создается файл – имя.obj).

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

Исполняемый модуль имеет расширение имя.ехе и запускается на выполнение обычным образом.

 

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

Например, запись

[ void | int ] имя():

означает, что вместо конструкции имя необходимо указать конкретное имя в соответствии с правилами языка, а перед ним может находиться либо void, либо int, либо ничего. Фигурные скобки используются для группировки элементов, из которых требуется выбрать только один. В тех случаях, когда квадратные скобки являются элементом синтаксиса, это оговаривается особо.

 

Алфавит языка С (С++)

Алфавит языка С (С++) включает в себя:

Прописные и строчные буквы латинского алфавита и знак подчёркивания

Цифры от 0 до 9

Специальные знаки: " { }, | [ ] () + - / % *. \? < = >! & # ~; ' '

Пробельные символы: пробел, символы табуляции, символ перехода на следующую строку.

Лексемы

Из символов алфавита формируются лексемы:

1) идентификаторы

2) ключевые (зарезервированные) слова

3) знаки операций

4) константы

5) разделители

Идентификаторы – имя программного объекта. Используются латинские буквы, цифры, знак подчеркивания. Первый символ имени – буква или знак подчеркивания. Пробелов не должно быть, длина имени не ограничивается. В Borland C++ -- 1-32 символов. Идентификатор не должен совпадать с ключевыми словами.

Ключевые слова – слова, имеющие специальные значения для компилятора.

!!! Все ключевые слова пишутся только строчными буквами.

Примеры некоторых ключевых слов:

asm class inline return

auto double int static

bool do new this

break enum operator try

case friend public typedef

Знаки операций – один или более символов, определяющих действия над операндами.

Знаки операций делятся на:

- унарные

- бинарные

- терарные

Один и тот же знак может интерпретироваться по-разному, в зависимости от контекста.

Унарные операции приведены в таблице 21.1.

 

Таблица 21.1 - Унарные операции

Обозначение Описание
& Oперация получения адреса операнда int i; int *i_ptr; i_ptr = &i
* операция обращения по адресу, т.е. раскрытия ссылки, ина­че операция разыменования (доступа по адресу к значению того объекта, на который указывает операнд). Операндом должен быть адрес; *i_ptr = 10; // i = 10
- унарный минус - изменяет знак арифметического операнда;
+ унарный плюс (введен для симметрии с унарным минусом);
~ поразрядное инвертирование внутреннего двоичного кода целочисленного аргумента (побитовое отрицание);
! логическое отрицание (НЕ) значения операнда; применяется к скалярным операндам; целочисленный результат 0 (если операнд ненулевой, т.е. истинный) или 1 (если операнд ну­левой, т.е. ложный). В качестве логических значений в языке Си++ используют целые числа: 0 - ложь и не нуль (!0) - ис­тина. Отрицанием любого ненулевого числа будет 0, а от­рицанием нуля будет 1. Таким образом:!l равно 0;!2 равно 0;!(-5) равно 0;!0 равно 1;
++ увеличение на единицу (инкремент или автоувеличение): префиксная операция - увеличение значения операнда на 1 до его использования; постфиксная операция - увеличение значения операнда на 1 после его использования. Операнд не может быть константой либо другим праводопустимым выражением. Записи ++5 или 84++ будут невер­ными. Операндом не может быть и произвольное выражение. Например, ++(j+k) также неверная запись. Операндом унарных операций ++ и — должны быть всегда леводопустимые выражения, например, переменные разных типов);
-- уменьшение на единицу (декремент или автоуменьшение). Правила применения такие же как и для операции ++
sizeof операция вычисления размера (в байтах) для объекта того типа, который имеет операнд. Разрешены два формата опе­рации: sizeof унарное_выражение sizeof (тип)

 

Бинарные операции.

Эти операции делятся на следующие группы:

- аддитивные;

- мультипликативные;

- сдвигов;

- поразрядные;

- операции отношений;

- логические;

- присваивания;

- выбора компонента структурированного объекта;

- операции с компонентами классов;

- операция "запятая";

- скобки в качестве операций.

Бинарные аддитивные операции приведены в таблице 21.2.

 

Таблица 21.2 - Аддитивные операции

Обозначение Описание
+ бинарный плюс (сложение арифметических операндов к сложение указателя с целочисленным операндом);
- бинарный минус (вычитание арифметических операнддов или указателей).

 

Бинарные мультипликативные операции приведены в таблице 21.3.

 

Таблица 21.3 - Мультипликативные операции

Обозначение Описание
* умножение операндов арифметического типа;
/ деление операндов арифметического типа. При целочисленных операндах абсолютное значение результата округляется до целого. Например, 20/3; равно 6, -20/3 равняется -6
% получение остатка от деления целочисленных операндов (целение по модулю). При неотрицательных операндах остаток положительный. В противном случае остаток опре­деляется реализацией.

 

Операции сдвига (определены только для целочисленных операндов). Формат выражения с операцией сдвига: операнд_левый операция сдвига операнд_правый. Операции сдвига приведены в таблице 21.4.

 

Таблица 21.4 – Операции сдвига

Обозначение Описание
<< сдвиг влево битового представления значения левого цело­численного операнда на количество разрядов, равное зна­чению правого целочисленного операнда;
>> сдвиг вправо битового представления значения левого це­лочисленного операнда на количество разрядов, равное значению правого целочисленного операнда

 

 

Поразрядные операции приведены в таблице 21.5.

 

Таблица 21.5 – Поразрядные операции

Обозначение Описание
& поразрядная конъюнкция (И) битовых представлений зна­чений целочисленных операндов;
| поразрядная дизъюнкция (ИЛИ) битовых представлений значений целочисленных операндов;
^ поразрядное исключающее ИЛИ битовых представлений значений целочисленных операндов

 

Следующая программа иллюстрирует особенности  операций сдвига и поразрядных операций.

//Р2.СРР - операции сдвига и поразрядные операции

#include <iostream.h>

void main()

{

cout << "\n 4<<2 равняется " << (4<<2);

coot << "\t 5 >>l равняется " << (5>>1);

coou << "\n 6&5 равняется " << (6&5);

coat << "\t 6|5 равняется " << (6|5);

coot «"\t 6^5 равняется " << (6^5);

}

 

Результат выполнения программы:

4<<2 равняется 16 5>>1 равняется 2

6&5 равняется 4   6|5 равняется 7

6^5 равняется 3

 

Операции отношения (сравнения) приведены в таблице 21.6

 

Таблица 21.6 - Операции отношения (сравнения)

Обозначение Описание
< меньше, чем;
> больше, чем
<= меньше или равно
>= больше или равно
== равно;
!= не равно;

    

Операнды в операциях отношения арифметического типа или ука­затели. Результат целочисленный: 0 (ложь) или 1 (истина).

Логические бинарные операции приведены в таблице 21.7

 

Таблица 21.7 - Логические бинарные операции

Обозначение Описание
&& конъюнкция (И) арифметических операндов или отношений. Целочисленный результат 0 (ложь) или 1 (истина);
|| дизъюнкция (ИЛИ) арифметических операндов или отношений. Целочисленный результат 0 (ложь) или 1 (истина).

 

Операции присваивания приведены в таблице 21.8.

В качестве левого операнда в операциях присваивания может ис­пользоваться только модифицируемое первое-значение - ссылка на некото­рую именованную область памяти, значение которой доступно изменениям. Термин первое-значение (left value), иначе - леводопустимое выражение, происходит от объяснения действия операции присваива­ния, в которой операнд слева от знака операции присваива­ния может быть только модифицируемым первым-значением. Примером модифицируемого первого-значения служит имя переменной, которой выделена память и соответствует некоторый класс памяти.

 

Таблица 21.8 – Операции присваивания

Обозначение Описание
= присвоить значение выражения-операнда из правой части операнду левой части: р = 10.6 - 2*х
*= присвоить операнду левой части произведение значений обоих операндов: p *= 2 эквивалентно p = p * 2
/= присвоить операнду левой части частное от деления значе­ния левого операнда на значение правого: р /= 2.2 - d эквивалентно р = р / (2.2 - d);
%/ присвоить операнду левой части остаток от деления цело­численного значения левого операнда на. целочисленное значение правого операнда: n %=3 эквивалентно n = N % 3;
+= присвоить операнду левой части сумму значений обоих опе­рандов: A += B эквивалентно а = а + B;
-= присвоить операнду левой части разность значений левого и правого операндов: A -= B эквивалентно а = а - B;
<<= присвоить целочисленному операнду левой части значение, полученное сдвигом влево его битового представления на количество разрядов, равное значению правого целочис­ленного операнда: а <<= 4 эквивалентно а = a << 4;
>>= присвоить целочисленному операнду левой части значение, полученное сдвигом вправо его битового представления на количество разрядов, равное значению правого целочис­ленного операнда: b >>= 4 эквивалентно b = b >> 4;
&= присвоить целочисленному операнду левой части значение, полученное поразрядной конъюнкцией (И) его битового представления с битовым представлением целочисленного операнда правой части: c&=7 эквивалентно c = c & 4;
|= присвоить целочисленному операнду левой части значение полученное поразрядной дизъюнкцией (ИЛИ) его битового представления с битовым представлением целочисленного операнда правой части: а |=b эквивалентно a = а | b;
^= присвоить целочисленному операнду левой части значение полученное применением поразрядной операции исключающего ИЛИ к битовым представлениям значений обоих операндов: z ^= х + у эквивалентно z = z ^ (х + у).

 

Обратите внимание, что для всех операций сокращенная форма присваивания El ор= Е2 эквивалентна E1 = E1 ор (Е2), где ор обозначение операции.

Операции выбора компонентов структурированного объекта приведены в таблице 21.9

 

Таблица 21.9 - Операции выбора компонентов структурированного объекта

Обозначение Описание
.* (точка) прямой выбор (выделение) компонента структурированного объекта, например объединения. Формат применения опе­рации:  имя_структурированного_объекта. имя_компонента
-> косвенный выбор (выделение) компонента структурированного объекта, адресуемого указателем. При использовании операции требуется, чтобы с объектом был связан указа­тель. В этом случае формат применения операции имеет вид: указатель_на_структурированый_объект -> имя_компонента

 

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

 

Операции разадресации(*) и адреса(&)

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

- указатель является нулевым;

- указатель определяет адрес такого объекта, который не является активным в момент ссылки;

- указатель определяет адрес, который не выровнен до типа объекта, на который он указывает;

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

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

Операция адрес не может применятся к элементам структуры, являющимися полями битов, и к объектам с классом памяти register.

Примеры:

 int t, f=0, *adress;

adress = &t; /* переменной adress, объявляемой как

     указатель, присваивается адрес переменной t */

*adress =f; /* переменной находящейся по адресу, содержащемуся в переменной adress, присваивается значение

переменной f, т.е. 0, что эквивалентно t=f; т.е.t=0;*/

 

Операции с компонентами классов приведены в таблице 21.10.

 

Таблица 21.10 - Операции с компонентами классов

Обозначение Описание
* прямое обращение к компоненту класса по имени объекта и указателю на компонент;
->* косвенное обращение к компоненту класса через указатель на объект и указатель на компонент.

 

 



Поделиться:


Последнее изменение этой страницы: 2021-02-07; просмотров: 240; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.17.6.75 (0.085 с.)