Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы на вопросы по экзамену ЦУ и МП.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
350.07 Кб
Скачать

Вопросы по курсу ЦУМП

  1. Микропроцессор, его структура, структура МК.

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

Микропроцессор выполняет следующие основные функции:

  1. чтение и дешифрацию команд из основной памяти;

  2. чтение данных из основной памяти и регистров адаптеров внешних устройств;

  3. прием и обработку запросов и команд от адаптеров на обслуживание внешних устройств;

  4. обработку данных и их запись в основную память и регистры адаптеров внешних устройств;

  5. выработку управляющих сигналов для всех прочих узлов и блоков компьютера.

В состав микропроцессора входят следующие устройства.

1. Арифметико-логическое устройство предназначено для выполнения всех арифметических и логических операций над числовой и символьной информацией.

2. Устройство управления координирует взаимодействие различных частей компьютера. Выполняет следующие основные функции:

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

  • формирует адреса ячеек памяти, используемых выполняемой операцией, и передает эти адреса в соответствующие блоки компьютера;

  • получает от генератора тактовых импульсов обратную последовательность импульсов.

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

4. Интерфейсная система микропроцессора предназначена для связи с другими устройствами компьютера. Включает в себя:

  • внутренний интерфейс микропроцессора;

  • буферные запоминающие регистры;

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

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

Математический сопроцессор используется для ускорения выполнения операций над двоичными числами с плавающей запятой, над двоично-кодированными десятичными числами, для вычисления тригонометрических функций. Математический сопроцессор имеет свою систему команд и работает параллельно с основным микропроцессором, но под управлением последнего. В результате происходит ускорение выполнения операций в десятки раз. Модели микропроцессора, начиная с МП 80486 DX, включают математический сопроцессор в свою структуру.

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

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

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

Все микропроцессоры можно разделить на группы:

    1. микропроцессоры типа CISC с полным набором системы команд;

    2. микропроцессоры типа RISC с усеченным набором системы команд;

    3. микропроцессоры типа VLIW со сверхбольшим командным словом;

    4. микропроцессоры типа MISC с минимальным набором системы команд и весьма высоким быстродействием и др.

Важнейшими характеристиками микропроцессора являются:

  1. тактовая частота. Характеризует быстродействие компьютера. Режим работы процессора задается микросхемой, называемой генератором тактовых импульсов. На выполнение процессором каждой операции отводится определенное количество тактов. Тактовая частота указывает, сколько элементарных операций выполняет микропроцессор за одну секунду. Тактовая частота измеряется в МГц;

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

  1. Порты ввода-вывода.

Порт ввода-вывода – логическое объединение сигнальных линий, через которое принимаются и передаются данные. Каждая линия порта, как правило, обозначается как Pnx, где

  • n – обозначение порта;

  • x – номер бита (линии) в порте.

Каждый порт ввода-вывода обслуживают как минимум 3 служебных регистра:

  • регистр, содержащий данные (уровни сигналов) на всех линиях порта и используется для записи сигналов в порт;

  • регистр, содержащий состояния входов порта, доступен только для чтения, используется при чтении данных из порта;

  • регистр направления линий порта: каждая линия порта может быть сконфигурирована как вход или как выход в зависимости от значения бита этого регистра.

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

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

Для всех линий портов ввода-вывода, как правило, доступна программная конфигурация входных подтягивающих резисторов. Подтягивающие резисторы осуществляют доопределение потенциалов «брошенных» входов напряжением высокого (Pull-up) или низкого (Pull-down) уровня.

Для обращения к отдельным линиям порта используется маскирование битов.

Входные элементы управления

В качестве входных элементов управления могут использоваться

  • другие элементы схемы;

  • тумблеры;

  • джамперы;

  • множественные переключатели;

  • кнопки.

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

Различают 1-позиционные и 2-позиционные тумблеры:

1-позиционные 2-позиционные Джамперы, как правило, используются для переключения режима работы, и их состояние проверяется только в момент включения питания микроконтроллера. Установка джампера замыкает 2 вывода, между которыми он установлен. Множественные переключатели представляют собой набор 1-позиционных тумблеров в миниатюрном формате. Кнопки предназначены для коммутации цепей управления. Обрабатываемый сигнал с кнопки – импульсный и фиксирует момент нажатия кнопки и момент ее отжатия.

Выходные элементы управления

В качестве выходных элементов управления могут использоваться

  • другие элементы схемы;

  • элементы индикации (единичные светодиоды или светодиодные сборки, в частности, - 7-сегментные индикаторы).

Единичные светодиоды

  1. Кнопка: подключение и алгоритм борьбы с дребезгом.

Подключение кнопки к микроконтроллеру

Если мы подключим один из контактов, например, к общему проводу («земле»), а второй к выбранному выводу микроконтроллера, переключенного в режим входа, то выяснится, что такой метод не работает. При нажатии кнопки вывод микроконтроллера соединяется с землей, и программа будет считывать (с помощью функции digitalRead) логический 0 с этого вывода, но при отпущенной кнопке вывод микроконтроллера не будет соединен ни с какой линией, что часто называют «висит в воздухе». В таком режиме программа будет считать с вывода и 0 и 1 совершенно случайным образом.

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

Первый вариант предпочтительнее, поскольку подтягивающие к +5В резисторы уже есть внутри микроконтроллера – их нужно только программно включить. Кнопка будет либо соединять вывод микроконтроллера с землей, либо разъединять, и тогда он "притянется" резистором к +5В.

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

Пример программы, зажигающей светодиод на 13 выводе при нажатии кнопки на 2 выводе будет выглядеть примерно так:

void setup() {   pinMode(13, OUTPUT);   //13й вывод - выход   pinMode(2, INPUT);     //2й – вход. Здесь кнопка, замыкающая на землю   digitalWrite(2, HIGH); //включаем подтягивающий резистор } void loop() {   digitalWrite(13, !digitalRead(2)); }

Обращаем внимание на то, что значение, прочитанное с 2 вывода, инвертируется с помощью оператора «!», поскольку при нажатии на кнопку будет считываться «0», а при ее отпускании «1».

Дребезг контактов

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

Чтобы микроконтроллер не обработал такую пачку переключений как множественное нажатие и отпускание кнопки нужно либо применить специальную схему, либо побороть дребезг программно. Идея программной борьбы проста – после того, как произошло переключение (от момента нажатия или отпускания кнопки), в течение некоторого защитного интервала времени игнорировать любые другие переключения.

Существует специальная библиотека Bounce, упрощающая борьбу с дребезгом контактов, и имеющая дополнительные возможности:

http://www.arduino.cc/playground/Code/Bounce

http://www.arduino.cc/playground/uploads/Code/Bounce.zip

Как и в большинстве случаев, установка библиотеки сводится к распаковке архива в подпапку \hardware\libraries\ папки с ПО Arduino.

Полная документация на библиотеку может быть найдена на сайте разработчика, а здесь рассмотрим только наиболее важное.

Bounce – конструктор объекта

Вызов:

Bounce имя_объекта = Bounce(вывод, интервал);

Создает экземпляр класса Bounce, принимает номер вывода, с которого будет считываться сигнал, и длительность защитного интервала в миллисекундах. После создания объекта можно вызывать его методы.

Метод Bounce::update

Вызов:

имя_объекта.update()

Возвращает значение типа int – истину, если состояние вывода изменилось, ложь, если нет.

Метод Bounce::read

Вызов:

имя_объекта.read()

Возвращает значение типа int – состояние вывода.

Метод Bounce::rebounce

Вызов:

имя_объекта.rebounce(время_повтора)

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

Рассмотрим исходный код программы, посылающей в последовательный порт сообщение «pressed» при нажатии кнопки, сообщение «released» при ее отпускании, и повторяющей сообщение «pressed» каждые пол секунды при удержании кнопки.

  1. Сторожевой таймер.

Сторожевой таймер (контрольный таймерангл. Watchdog timer — букв. «сторожевой пёс») — аппаратно реализованная схема контроля над зависанием системы. Представляет собой таймер, который периодически сбрасывается контролируемой системой. Если сброса не произошло в течение некоторого интервала времени, происходит принудительная перезагрузка системы. В некоторых случаях сторожевой таймер может посылать системе сигнал на перезагрузку («мягкая» перезагрузка), в других же — перезагрузка происходит аппаратно (замыканием сигнального провода RST или подобного ему).

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

  1. Радиальные и векторные прерывания, примеры.

Режимы обмена по магистрали - Обмен по прерываниям.  Прерывание микропроцессорной системы бывает двух основных типов: векторное прерывание и радиальное прерывание .  При векторном прерывании код номера прерывания передаётся процессору тем устройством, которое запросило его. Для этого процессор проводит цикл чтения по магистрали и по шине данных и получает код номера прерывания. Шина адресов не используется. На каждый номер прерывания предусмотрена специальная программа обработки. Когда поступает какое-либо прерывание, процессор прекращает выполнение текущей программы, сохраняет содержимое основных регистров в специальной СТЭК-памяти (“stack”) и загружает начальный адрес программы обработки соответствующего прерывания. При завершении программы обработки прерывания процессор возвращает из СТЭК-памяти (“stack”) сохранённые значения регистра, и прерванная программа продолжается. При радиальном прерывании в магистрали имеются столько линий запроса прерывания сколько всего может быть разных прерываний, т.е. каждое устройство ввода/вывода имеют свою линию запроса. Процессор определяет номер прерывания по номеру линии, по которому пришел сигнал прерывания. При использовании радиальных прерываний в систему включается дополнительная система - контролер прерывания. Векторные прерывания обеспечивают системе большую гибкость, в системе их может быть очень много, однако, они требуют дополнительных аппаратных узлов во всех устройствах для обслуживания цикла безадресного чтения. Радиальных прерываний в системе немного. При этом тип прерывания каждое радиальное прерывание требует введение дополнительных линий в шину управления системой.

  1. Стек, очередь.

Стек

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

push

Добавить (положить) в конец стека новый элемент 

pop

Извлечь из стека последний элемент 

back

Узнать значение последнего элемента (не удаляя его) 

size

Узнать количество элементов в стеке 

clear

Очистить стек (удалить из него все элементы)

Хранить элементы стека мы будем в массиве. Для начала будем считать, что максимальное количество элементов в стеке не может превосходить константы MAX_SIZE, тогда для хранения элементов массива необходимо создать массив размера MAX_SIZE.

Объявим структуру данных типа stack.

     const int MAX_SIZE=1000;            struct stack {          int m_size;            // Количество элементов в стеке          int m_elems[MAX_SIZE]; // Массив для хранения элементов                stack();               // Конструктор          ~stack();              // Деструктор          void push(int d);      // Добавить в стек новый элемент          int pop();             // Удалить из стека последний элемент                                 // и вернуть его значение          int back();            // Вернуть значение последнего элемента          int size();            // Вернуть количество элементов в стеке          void clear();          // Очистить стек      };

Объявленная здесь структура данных stack реализует стек целых чисел. Поле структуры m_size хранит количество элементов в стеке в настоящее время, сами элементы хранятся в элементах массива m_elems с индексами 0..m_size-1. Элементы, добавленные позже, получают большие номера.

Упражнение a - простой стек

Реализуйте структуру данных "стек", реализовав все указанные здесь методы. Напишите программу (функцию main), содержащую описание стека и моделирующую работу стека. Функция main считывает последовательность команд и в зависимости от команды выполняет ту или иную операцию. После выполнения одной команды программа должна вывести одну строчку. Возможные команды для программы:

push n

Добавить в стек число n (значение n задается после команды). Программа должна вывести ok. 

pop

Удалить из стека последний элемент. Программа должна вывести его значение. 

back

Программа должна вывести значение последнего элемента, не удаляя его из стека. 

size

Программа должна вывести количество элементов в стеке. 

clear

Программа должна очистить стек и вывести ok. 

exit

Программа должна вывести bye и завершить работу.

Гарантируется, что набор входных команд удовлетворяет следующим требованиям: максимальное количество элементов в стеке в любой момент не превосходит 100, все команды pop_back и back корректны, то есть при их исполнении в стеке содержится хотя бы один элемент.

Пример протокола работы программы

     Ввод               Вывод            push 2              ok      push 3              ok      push 5              ok      back                5      size                3      pop                 5      size                2      push 7              ok      pop                 7      clear               ok      size                0      exit                bye

Упражнение b - стек с обработкой ошибок

Аналогично предыдущему заданию, только снимается ограничение на корректность вызовов методов back и pop. Данные операции должны перед исполнением проверять, содержится ли в стеке хотя бы один элемент. Если во входных данных встречается операция back или pop, при этом стек пуст, то программа должна вместо числового значения вывести строку error.

При этом должна быть реализована двойная защита: вызов методов forward и pop для пустого стека не должен приводить к обращению к несуществующим элементам массива m_elems, а функция main должна выводить сообщение error, при считывании некорректной операции.

Пример протокола работы программы

     Ввод               Вывод            push 2              ok      back                2      pop                 2      size                0      pop                 error      push 1              ok      size                1      exit                bye

Упражнение c - стек без ограничения на размер

Реализуйте стек динамического размера, то есть ограниченный только объемом свободной оперативной памяти. Для этого используйте указатели и динамически распределяемую память. Если для полностью заполненного стека вызывается метод push размер динамического массива, отведенного для хранения стека, должен увеличиваться.

Очередь

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

Элементы очереди будем также хранить в массиве. При этом из очереди удаляется первый элемент, и, чтобы не сдвигать все элементы очереди, будем в отдельном поле m_start хранить индекс элемента массива, с которого начинается очередь. При удалении элементов, очередь будет "ползти" дальше от начала массива. Чтобы при этом не происходил выход за границы массива, замкнем массив в кольцо: будем считать, что за последним элементом массива следует первый.

Описание структуры очередь:

     const int MAX_SIZE=1000;            struct queue {          int m_size;            // Количество элементов в очереди          int m_start;           // Номер элемента, с которого начинается очередь          int m_elems[MAX_SIZE]; // Массив для хранения элементов                queue();               // Конструктор          ~queue();              // Деструктор          void push(int d);      // Добавить в очередь новый элемент          int pop();             // Удалить из очереди первый элемент                                 // и вернуть его значение          int front();           // Вернуть значение первого элемента          int size();            // Вернуть количество элементов в очереди          void clear();          // Очистить очередь      };