ЛР №7 Таймер
Исследование работы интервального таймера и применение его в приложениях пользователя
Для кого этот документ
- Студентам курса "Организация ЭВМ"
- Необходимое ПО: Quartus II
Контекст
Данная лабораторная работа посвящена изучению интервального таймера в составе процессорной системы NIOS II. Студенты научатся настраивать таймер, использовать его для измерения времени выполнения кода, генерации периодических прерываний и создания часов реального времени.
Цель работы
Изучение работы интервального таймера и практическое применение его в приложениях пользователя.
Объект изучения
- интервальный таймер, входящий в состав процессорной системы «DE 2-115»;
- приложение «Intel Monitor Programm» (IMP).
Планируемые результаты обучения
После выполнения этой работы студенты должны уметь:
- Использовать интервальный таймер для измерения временных параметров работы, как аппаратных компонентов процессорной системы, так и программных, включая оценку длительности выполнения отдельных команд, процедур и фрагментов кода;
- Применять интервальный таймер для формирования временных отрезков для управления исполнительными устройствами, подключенными к процессорной системе;
- Вести учет реального времени и привязывать к нему события, происходящие в процессорной системе.
Исходные файлы лабораторной работы
Программа, демонстрирующая использование интервального таймера, входит в состав приложения АМР. Она доступна в разделе Sample program под именем interrupt_example.s. Текст программы приведен в листинге 5 приложения к третьей работе.
Подготовка к лабораторной работе
Для выполнения лабораторной работы необходимо изучить по материалам лекций и предложенной литературе:
- Назначение регистров и отдельных полей программно доступных регистров интервального таймера, входящего в состав процессорной системы «DE2-70 Media Computer» [9]. Включите в отчет их форматы и назначения.
- Реализацию прерываний в процессорной системе с процессором NIOSII. Используемые для этого аппаратные средства процессора и портов ввода – вывода [8].
- Уясните логику работы программы interrupt_example.s., в которой выполняется настройка интервального таймера. Текст программы содержится в листинге 5 приложения к третьей работе. Включите в отчет листинг этой программы.
- Уясните пункты задания, приведенного в текущей лабораторной работе, и подготовьте программные заготовки для их выполнения.
Чеклист выполнения
- Изучена документация по интервальному таймеру.
- Написана программа для запуска, остановки и чтения значения таймера (snapshot).
- Проведены измерения времени в автоматическом и пошаговом режимах.
- Исследовано влияние задержки перед чтением snapshot.
- Определено время выполнения отдельных команд (subi, bne).
- Рассчитан и экспериментально проверен программный цикл задержки.
- Реализован программный счетчик секунд на светодиодах.
- Написан обработчик прерывания от таймера для одиночного интервала.
- Реализован счетчик секунд с использованием периодических прерываний.
- Бегущая строка на LCD переведена на использование таймера.
- Реализованы часы реального времени с настройкой через кнопки и переключатели.
Порядок выполнения лабораторной работы
Часть 1. Исследование работы интервального таймера (запуск, считывание текущего состояния и останов)
-
Напишите фрагмент программы, в котором вначале задается максимальное значение счетчика для интервального таймера. Следующая команда выполняет запуск таймера, а следующая – фиксирует его текущее значение. Для этого необходимо в программе выполнить запись в регистр snapshot таймера. Затем выполняется пересылка его содержимого в регистры процессора с использованием операций беззнакового полусловного чтения и вычисление отмеренного таймером временного интервала с последующей записью его в другой регистр процессора. Фрагмент кода завершается командой безусловного перехода на себя. (Заготовка для выполнения этого пункта задания приводится в приложении L4.P1.1)
-
Поставьте контрольную точку на последней команде (команда br) и выполните программу в автоматическом режиме. Запишите в отчет считанные значения со счетчика таймера, вычисленный интервал и состояния битов RUN и TO регистра состояния таймера. Для наблюдения содержимого регистров таймера воспользуйтесь вкладкой memory приложения АМР.
-
Выполните программу из пункта 1. по шагам. Запишите в отчет считанные значения со счетчика таймера, вычисленный интервал и значения битов RUN и TO регистра состояния таймера.
-
Повторите выполнение предыдущего пункта, выдержав паузу в несколько секунд перед выполнением команды записи в регистр snapshot таймера. Прокомментируйте наблюдаемые результаты в отчете. Выполняя запись в регистр snapshot во вкладке memory делайте заключение о текущем состоянии таймера, занося его в отчет. Повторите это несколько раз до тех пор, пока таймер не завершит свою работу и несколько раз после завершения. Обратите внимание на то, что установленный в регистре состояния таймера бит ТО не изменяет свое состояние и для его очистки потребуется выполнить запись в регистр состояния. Проверьте это экспериментально.
-
Добавьте в программный код из первой части команду очистки регистра состояния таймера, и сразу после запуска таймера, команду его останова. Выполните программу в автоматическом режиме. Оцените время выполнения команды останова таймера. Зафиксируйте в отчете его текущее состояние, вычисленный интервал, состояния битов RUN и TO.
-
Поставьте контрольную точку на следующей после останова таймера команде. Запустите выполнение программы. После ее останова в первой контрольной точке выдержите паузу в несколько секунд, а затем продолжите выполнение программы в автоматическом режиме. Прокомментируйте наблюдаемые результаты в отчете.
Часть 2. Использование интервального таймера для измерения длительности выполнения отдельных команд и фрагментов кода
-
Определите длительность выполнения команды вычитания единицы из какого- либо регистра процессора, например, R3, вставив эту команду (subi) в программу из первой части между командами запуска таймера и фиксацией его текущего состояния в регистре snapshot.
-
Подтвердите вашу оценку, вставив в программу подряд несколько команд subi.
-
Добавьте в программу из пункта 7 команду перехода на повтор команды subi, если текущее значение R3 не равно 0 (bne r3, r0, metka), организуя тем самым программный цикл. Перед командой запуска таймера выполните загрузку в регистр R3 начального значения n.
-
Задавая n, равным единице, экспериментально определите время выполнения команды условного перехода, когда условие перехода не выполняется. Отразите в отчете.
-
Задавая n, равным 2, экспериментально определите время выполнения команды условного перехода, когда условие перехода выполняется. Отразите в отчете.
-
Рассчитайте длительность выполнения программного цикла уменьшения R3 для случая, когда R3 равняется n, и экспериментально проверьте ваши расчеты, задавая разные значения n. Рекомендуется эксперимент проводить следующим образом. Первую контрольную точку следует установить на команде запуска таймера, вторая контрольная точка устанавливается в конце программы.
-
Рассчитайте начальное значение R3 таким образом, чтобы программный цикл выполнялся в соответствии с заданным вариантом временным интервалом. Проверьте рассчитанное значение экспериментально, сверяя время выполнения фрагмента программы с таймером на вашем смартфоне. Чтобы визуализировать момент завершения программного цикла сразу после его окончания следует зажечь все красные светодиоды. Покажите выполнение этого пункта преподавателю. Положите ваш смартфон с работающим таймером на стенд и сфотографируйте его вместе со стендом в момент загорания светодиодов. Важно, чтобы номер стенда, определяющий вариант задания попал в кадр. Поместите фото в отчетные материалы, вместе с расчетами величины n.
-
Экспериментально определите длительность выполнения программного цикла с помощью интервального таймера. Отразите в отчете его показания и докажите, что они соответствуют заданному временному интервалу.
-
Реализуйте в вашей программе программный счетчик секунд и выведите его состояние на зеленые светодиоды и hex индикаторы. Проверьте правильность его работы, сверяя с таймером на вашем смартфоне. (Можно воспользоваться готовой функцией из файла Hex_Display.s) Покажите выполнение этого пункта преподавателю.
Часть 3. Использование прерываний от интервального таймера
-
Рассчитайте начальное значение счетчика таймера таким образом, чтобы он отмерил одиночный временной интервал, заданный в соответствии с вашим вариантом длительности и по завершении сформировал сигнал прерывания. Основная программа разрешает прерывания от таймера, задает требуемую длительность интервала для таймера и запускает его. Затем она выводит Ваши фамилию, имя и отчество на экран LCD в режиме бегущей строки. Обработчик прерывания зажигает красные светодиоды и выполняет возврат в основную программу. Экспериментально проверьте работу программы, сопоставив отмеренный интервал с показаниями таймера на вашем смартфоне. Запишите в отчет значение регистра состояния таймера. Покажите выполнение этого пункта преподавателю.
-
Рассчитайте длительность максимального интервала, формируемого таймером, с учетом того, что его тактовая частота равна 50 МГц. Проверьте экспериментально, сопоставив отмеренный интервал с часами на вашем смартфоне. Отразите в отчете.
-
Модифицируйте программу из первого пункта части 3 таким образом, чтобы прерывания от таймера формировались каждую секунду. Обработчик прерывания реализует счетчик секунд и выводит его значение на зеленые светодиоды и HEX-индикаторы в шестнадцатеричном виде. Используйте для этого процедуру из 3 лабораторной работы (приведена в приложении). Проверьте правильность работы программы, визуально наблюдая отображаемые значения и сопоставляя их с показаниями часов на вашем смартфоне.
-
Модифицируйте процедуру из 2 лабораторной работы, в которой осуществляется вывод на дисплей LCD текстовой информации в режиме бегущей строки. Вместо программной задержки используйте прерывания от таймера, формируемые через каждые 200 мс.
Часть 4. Создание часов реального времени с использованием таймера
Модифицируйте программу таким образом, чтобы реализовать на устройствах отображения информации стенда часы реального времени. Причем, для задания текущего значения времени используйте переключатели и кнопки. Рекомендуется использовать переключатели SW для задания значения текущего часа и текущей минуты. Причем ввод их осуществите последовательно, используя двоично – десятичное кодирование (код D1), нажатием кнопок KEY3 и KEY2, соответственно. Для запуска часов, начиная с нулевой секунды используйте кнопку KEY1. Вывод текущего времени выполните на HEX-индикаторы. Вывод времени должен осуществляться в режиме прерываний на фоне работы другой программы, выполняющей, например, вывод Вашей фамилии имени и отчества на экране LCD в режиме бегущей строки.
Отчетные материалы
Отчетные материалы должны содержать:
- Цель лабораторной работы.
- Материалы, связанные с подготовкой к работе, включая теоретическую часть.
- Информацию по выполнению каждого пункта задания. Причем в отчете должны содержаться выполняемые Вами действия, наблюдаемые результаты, и Ваши объяснения.
- Фото, подтверждающие правильность выполнения пунктов задания.
- Написанные Вами фрагменты программ.
- Краткое заключение.
Защита работы
Примерные задания для защиты лабораторной работы:
-
С помощью интервального таймера оцените время выполнения отдельной команды или фрагмента программы. Примерами могут служить следующие программы:
- тестирования статической памяти и такого же размера фрагмента динамической памяти.
- инкремент содержимого регистра до тех пор, пока не произойдет его переполнение.
- вычисление факториала числа в регистре процессора до тех пор, пока не произойдет его переполнение.
-
С помощью интервального таймера определите количество нажатий и временные интервалы между последовательными нажатиями, например, кнопки Key [2] в пределах общего интервала в 90 секунд.
-
С помощью интервального таймера определите время между двумя событиями на фоне работы основной программы: первым событием является нажатие одной кнопки на стенде, второе событие инициируется нажатием другой кнопки на стенде. Причем, измеренный интервал времени отображается на hex индикаторах после наступления второго события.
-
На фоне работы основной программы реализуйте на hex индикаторах стенда отображение состояния таймера в часах, минутах и секундах. После нажатия одной кнопки таймер запускается с нулевого значения и ежесекундно его состояние обновляется. После нажатия другой кнопки таймер останавливается.
FAQ
Q: Что такое интервальный таймер? A: Это аппаратное устройство, которое отсчитывает такты системной шины от заданного значения до нуля. При достижении нуля он может генерировать прерывание и/или устанавливать бит таймаута (TO).
Q: Зачем нужен регистр snapshot? A: Таймер постоянно декрементируется. Чтобы прочитать его текущее значение атомарно (сразу старшую и младшую части), необходимо записать любое значение в регистр snapshot. Это "заморозит" текущее значение счетчика в регистре snapshot для последующего чтения процессором, не останавливая сам счет.
Q: Как рассчитать начальное значение таймера для интервала 1 секунда? A: Если тактовая частота процессора составляет 50 МГц (50 000 000 Гц), то за 1 секунду пройдет 50 000 000 тактов. Следовательно, в таймер нужно загрузить число 50 000 000 (0x2FAF080).
Q: Почему бит TO (Timeout) нужно очищать вручную? A: Бит TO устанавливается в 1, когда таймер достигает 0. Он остается в этом состоянии до тех пор, пока программа явно не очистит его (обычно записью 0 в регистр состояния). Если этого не сделать, следующее прерывание может сработать сразу же или не сработать корректно.