Стрелки поясняют работу программы при возникновении прерывания. По команде RTI возникает адрес на единицу больший, чем тот, при котором возникло прерывание.
// Начало программы
JUMP start; NOP; NOP; NOP; // Начальное прерывание
RTI; NOP; NOP; NOP;
/* - - - - - - - - - - - - - - - - - - - - - - - - */
RTI; NOP; NOP; NOP; // Прерывание от таймера
start:
AX0=260;
DM(0x3FFD)=AX0; // Установить в TPERIOD 260
DM(0x3FFC)=AX0; // Установить в TCOUNT 260
AX0=0;
DM(0x3FFB)=AX0; // Установить TSCALE=0
IMASK=0x01; // Разрешение прерывания от таймера
ICNTL=0x07; // Прерывания без вложения, с реакцией на перепад
ENA TIMER; // Таймер разрешён (включен)
DO takt UNTIL FOREVER; // Внешний цикл
/*- - - - - - - - - - - - - - - - Обработка с частотой манипуляции перед циклом diskret */
CNTR=128;
DO diskret UNTIL CE; // Внутренний цикл
/* - - - - - - - - - - - - - - - - - - - Обработка с частотой дискретизации */
IDLE; // Ожидание прерывания от таймера
diskret: NOP;
/*- - - - - - - - - - - - - - - - Обработка с частотой манипуляции после цикла diskret */
takt: NOP;
// Конец программы
Параметры таймера рассчитываются для получения отсчётов времени с частотой дискретизации:
Период прерываний от таймера равен (TPERIOD+1)*( TSCALE+1) циклов процессора.
Частота прерываний f = 1/(период прерывания * время цикла процессора).
Время цикла процессора равно периоду источника синхросигналов.
В результате выполнения этого этапа работы выбраны и выписаны рядом с графическими элементами инструкции для всех команд. Кроме того, потребуются директивы, обеспечивающие взаимодействие программы с подпрограммой, имена переменных и портов, значения констант и т. п.
Остановимся на общей структуре программы. Любая программа на языке Ассемблера для сигнального процессора ADSP-21xx содержит команды (инструкции) Ассемблера, директивы Ассемблера и команды препроцессора.
Синтаксис инструкций Ассемблера совпадает с синтаксисом системы команд. Каждая инструкция начинается ключевым словом и заканчивается символом “;”. Каждая директива начинается с символа “.” и заканчивается символом “;”. Команда препроцессора начинается с символа “#” и заканчивается символом возврата каретки.
Директива .VAR объявляет и может инициализировать переменные и массивы данных.
Программа состоит из одной секции памяти данных и двух секций памяти программы. Директива .section определяет начало секции. Ключевые слова /pm (или /code) и /dm (или /data) определяют тип памяти процессора для отображения данной секции программы. Следующее за ключом типа слово (data1, interrupts, program) представляет собой имя секции, которое используется в файле распределения памяти .ldf. Первая секция памяти программы (interrupts) содержит таблицу векторов прерываний. Нулевой вектор, возникающий при сбросе процессора, содержит команду перехода в начало второй секции памяти программы (program ), которая содержит рабочую часть кода.
Цель этого этапа – оформление в окончательном виде программного продукта – подпрограммы на языке ассемблера.
При оформлении подпрограммы (и программы) учитывается ряд правил, которые обусловлены тем, что трансляция программы будет выполняться в компьютере. Поэтому основные графы программы – метка, инструкция и комментарий – разделяются пробелами. Метка выделяется двоеточием, а комментарий выделяют, как в языке С. Комментарий предназначен лишь для улучшения восприятия программы человеком. Транслятор его не воспринимает.
Десятичные числа в программе не размечают. Шестнадцатеричные числа начинаются с символов 0x, например 0x17C3. Двоичные числа выделяют апострофами, например '0111'.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.