Проектирование устройств на сигнальных процессорах: Учебное пособие (Проектирование цифровых устройств аппаратуры связи на ЦСП семейства ADSP-21xx), страница 22

Стрелки поясняют работу программы при возникновении прерывания. По команде 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 ), которая содержит рабочую часть кода.

8.2. Оформление  подпрограммы на языке ассемблера

Цель этого этапа – оформление в окончательном виде программного продукта – подпрограммы на языке ассемблера.

При оформлении подпрограммы (и программы) учитывается ряд правил, которые обусловлены тем, что трансляция программы будет выполняться в компьютере. Поэтому основные графы программы – метка, инструкция и комментарий – разделяются пробелами. Метка выделяется двоеточием, а комментарий выделяют, как в языке С. Комментарий предназначен лишь для улучшения восприятия программы человеком. Транслятор его не воспринимает.

Десятичные числа в программе не размечают. Шестнадцатеричные  числа начинаются с символов 0x, например 0x17C3. Двоичные числа выделяют апострофами, например '0111'.