Перейти к основному содержимому

ЛР №7 Таймер

Исследование работы интервального таймера и применение его в приложениях пользователя

Для кого этот документ

  • Студентам курса "Организация ЭВМ"
  • Необходимое ПО: Quartus II

Контекст

Данная лабораторная работа посвящена изучению интервального таймера в составе процессорной системы NIOS II. Студенты научатся настраивать таймер, использовать его для измерения времени выполнения кода, генерации периодических прерываний и создания часов реального времени.

Цель работы

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

Объект изучения

  • интервальный таймер, входящий в состав процессорной системы «DE 2-115»;
  • приложение «Intel Monitor Programm» (IMP).

Планируемые результаты обучения

После выполнения этой работы студенты должны уметь:

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

Исходные файлы лабораторной работы

Программа, демонстрирующая использование интервального таймера, входит в состав приложения АМР. Она доступна в разделе Sample program под именем interrupt_example.s. Текст программы приведен в листинге 5 приложения к третьей работе.

Подготовка к лабораторной работе

Для выполнения лабораторной работы необходимо изучить по материалам лекций и предложенной литературе:

  1. Назначение регистров и отдельных полей программно доступных регистров интервального таймера, входящего в состав процессорной системы «DE2-70 Media Computer» [9]. Включите в отчет их форматы и назначения.
  2. Реализацию прерываний в процессорной системе с процессором NIOSII. Используемые для этого аппаратные средства процессора и портов ввода – вывода [8].
  3. Уясните логику работы программы interrupt_example.s., в которой выполняется настройка интервального таймера. Текст программы содержится в листинге 5 приложения к третьей работе. Включите в отчет листинг этой программы.
  4. Уясните пункты задания, приведенного в текущей лабораторной работе, и подготовьте программные заготовки для их выполнения.

Чеклист выполнения

  • Изучена документация по интервальному таймеру.
  • Написана программа для запуска, остановки и чтения значения таймера (snapshot).
  • Проведены измерения времени в автоматическом и пошаговом режимах.
  • Исследовано влияние задержки перед чтением snapshot.
  • Определено время выполнения отдельных команд (subi, bne).
  • Рассчитан и экспериментально проверен программный цикл задержки.
  • Реализован программный счетчик секунд на светодиодах.
  • Написан обработчик прерывания от таймера для одиночного интервала.
  • Реализован счетчик секунд с использованием периодических прерываний.
  • Бегущая строка на LCD переведена на использование таймера.
  • Реализованы часы реального времени с настройкой через кнопки и переключатели.

Порядок выполнения лабораторной работы

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

  1. Напишите фрагмент программы, в котором вначале задается максимальное значение счетчика для интервального таймера. Следующая команда выполняет запуск таймера, а следующая – фиксирует его текущее значение. Для этого необходимо в программе выполнить запись в регистр snapshot таймера. Затем выполняется пересылка его содержимого в регистры процессора с использованием операций беззнакового полусловного чтения и вычисление отмеренного таймером временного интервала с последующей записью его в другой регистр процессора. Фрагмент кода завершается командой безусловного перехода на себя. (Заготовка для выполнения этого пункта задания приводится в приложении L4.P1.1)

  2. Поставьте контрольную точку на последней команде (команда br) и выполните программу в автоматическом режиме. Запишите в отчет считанные значения со счетчика таймера, вычисленный интервал и состояния битов RUN и TO регистра состояния таймера. Для наблюдения содержимого регистров таймера воспользуйтесь вкладкой memory приложения АМР.

  3. Выполните программу из пункта 1. по шагам. Запишите в отчет считанные значения со счетчика таймера, вычисленный интервал и значения битов RUN и TO регистра состояния таймера.

  4. Повторите выполнение предыдущего пункта, выдержав паузу в несколько секунд перед выполнением команды записи в регистр snapshot таймера. Прокомментируйте наблюдаемые результаты в отчете. Выполняя запись в регистр snapshot во вкладке memory делайте заключение о текущем состоянии таймера, занося его в отчет. Повторите это несколько раз до тех пор, пока таймер не завершит свою работу и несколько раз после завершения. Обратите внимание на то, что установленный в регистре состояния таймера бит ТО не изменяет свое состояние и для его очистки потребуется выполнить запись в регистр состояния. Проверьте это экспериментально.

  5. Добавьте в программный код из первой части команду очистки регистра состояния таймера, и сразу после запуска таймера, команду его останова. Выполните программу в автоматическом режиме. Оцените время выполнения команды останова таймера. Зафиксируйте в отчете его текущее состояние, вычисленный интервал, состояния битов RUN и TO.

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

Часть 2. Использование интервального таймера для измерения длительности выполнения отдельных команд и фрагментов кода

  1. Определите длительность выполнения команды вычитания единицы из какого- либо регистра процессора, например, R3, вставив эту команду (subi) в программу из первой части между командами запуска таймера и фиксацией его текущего состояния в регистре snapshot.

  2. Подтвердите вашу оценку, вставив в программу подряд несколько команд subi.

  3. Добавьте в программу из пункта 7 команду перехода на повтор команды subi, если текущее значение R3 не равно 0 (bne r3, r0, metka), организуя тем самым программный цикл. Перед командой запуска таймера выполните загрузку в регистр R3 начального значения n.

  4. Задавая n, равным единице, экспериментально определите время выполнения команды условного перехода, когда условие перехода не выполняется. Отразите в отчете.

  5. Задавая n, равным 2, экспериментально определите время выполнения команды условного перехода, когда условие перехода выполняется. Отразите в отчете.

  6. Рассчитайте длительность выполнения программного цикла уменьшения R3 для случая, когда R3 равняется n, и экспериментально проверьте ваши расчеты, задавая разные значения n. Рекомендуется эксперимент проводить следующим образом. Первую контрольную точку следует установить на команде запуска таймера, вторая контрольная точка устанавливается в конце программы.

  7. Рассчитайте начальное значение R3 таким образом, чтобы программный цикл выполнялся в соответствии с заданным вариантом временным интервалом. Проверьте рассчитанное значение экспериментально, сверяя время выполнения фрагмента программы с таймером на вашем смартфоне. Чтобы визуализировать момент завершения программного цикла сразу после его окончания следует зажечь все красные светодиоды. Покажите выполнение этого пункта преподавателю. Положите ваш смартфон с работающим таймером на стенд и сфотографируйте его вместе со стендом в момент загорания светодиодов. Важно, чтобы номер стенда, определяющий вариант задания попал в кадр. Поместите фото в отчетные материалы, вместе с расчетами величины n.

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

  9. Реализуйте в вашей программе программный счетчик секунд и выведите его состояние на зеленые светодиоды и hex индикаторы. Проверьте правильность его работы, сверяя с таймером на вашем смартфоне. (Можно воспользоваться готовой функцией из файла Hex_Display.s) Покажите выполнение этого пункта преподавателю.

Часть 3. Использование прерываний от интервального таймера

  1. Рассчитайте начальное значение счетчика таймера таким образом, чтобы он отмерил одиночный временной интервал, заданный в соответствии с вашим вариантом длительности и по завершении сформировал сигнал прерывания. Основная программа разрешает прерывания от таймера, задает требуемую длительность интервала для таймера и запускает его. Затем она выводит Ваши фамилию, имя и отчество на экран LCD в режиме бегущей строки. Обработчик прерывания зажигает красные светодиоды и выполняет возврат в основную программу. Экспериментально проверьте работу программы, сопоставив отмеренный интервал с показаниями таймера на вашем смартфоне. Запишите в отчет значение регистра состояния таймера. Покажите выполнение этого пункта преподавателю.

  2. Рассчитайте длительность максимального интервала, формируемого таймером, с учетом того, что его тактовая частота равна 50 МГц. Проверьте экспериментально, сопоставив отмеренный интервал с часами на вашем смартфоне. Отразите в отчете.

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

  4. Модифицируйте процедуру из 2 лабораторной работы, в которой осуществляется вывод на дисплей LCD текстовой информации в режиме бегущей строки. Вместо программной задержки используйте прерывания от таймера, формируемые через каждые 200 мс.

Часть 4. Создание часов реального времени с использованием таймера

Модифицируйте программу таким образом, чтобы реализовать на устройствах отображения информации стенда часы реального времени. Причем, для задания текущего значения времени используйте переключатели и кнопки. Рекомендуется использовать переключатели SW для задания значения текущего часа и текущей минуты. Причем ввод их осуществите последовательно, используя двоично – десятичное кодирование (код D1), нажатием кнопок KEY3 и KEY2, соответственно. Для запуска часов, начиная с нулевой секунды используйте кнопку KEY1. Вывод текущего времени выполните на HEX-индикаторы. Вывод времени должен осуществляться в режиме прерываний на фоне работы другой программы, выполняющей, например, вывод Вашей фамилии имени и отчества на экране LCD в режиме бегущей строки.

Отчетные материалы

Отчетные материалы должны содержать:

  1. Цель лабораторной работы.
  2. Материалы, связанные с подготовкой к работе, включая теоретическую часть.
  3. Информацию по выполнению каждого пункта задания. Причем в отчете должны содержаться выполняемые Вами действия, наблюдаемые результаты, и Ваши объяснения.
  4. Фото, подтверждающие правильность выполнения пунктов задания.
  5. Написанные Вами фрагменты программ.
  6. Краткое заключение.

Защита работы

Примерные задания для защиты лабораторной работы:

  1. С помощью интервального таймера оцените время выполнения отдельной команды или фрагмента программы. Примерами могут служить следующие программы:

    • тестирования статической памяти и такого же размера фрагмента динамической памяти.
    • инкремент содержимого регистра до тех пор, пока не произойдет его переполнение.
    • вычисление факториала числа в регистре процессора до тех пор, пока не произойдет его переполнение.
  2. С помощью интервального таймера определите количество нажатий и временные интервалы между последовательными нажатиями, например, кнопки Key [2] в пределах общего интервала в 90 секунд.

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

  4. На фоне работы основной программы реализуйте на 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 в регистр состояния). Если этого не сделать, следующее прерывание может сработать сразу же или не сработать корректно.

Дополнительные материалы