- •1. Цель работы
- •2. Структура проекта
- •3. Рекомендуемый путь и этапы создания проекта в vdsp
- •3.1 Пример и описание .Ldf файла
- •Search_dir() - определение путей к текущей рабочей директории и к директории lib.
- •3.2 Структура простейшего .Asm файла
- •Rti; nop; nop; nop; /* 0x0008: irql1*/
- •3.3 Компоновка проекта и создание исполняемого .Dxe файла
- •Rti; nop; nop; nop; /* 0x0008: irql1*/
- •Rti; nop; nop; nop; /* 0x0020: sport1 transmit*/
- •Rti; nop; nop; nop; /* 0x0028: Timer*/
- •4. Запуск и отладка проекта.
- •4.1 Запуск проекта Lab1
- •4.2 Отображение содержимого памяти
- •4.3 Отображение содержимого регистров
- •4.4 Построение графиков
- •5. Задание к лабораторной работе
- •1. Особенности и типы команд сигнального процессора
- •2. Используемые условия
- •2.1 Подробное описание регистров состояния и значения их битов
- •2.2 Логическое описание условий (cond), используемых с оператором if
- •2.3 Условия завершения цикла do until (term)
- •3. Многофункциональные инструкции
- •3.1 Операции alu/mac с одновременным чтением памяти данных и памяти программ
- •3.2 Чтение памяти данных и памяти программ
- •3.3 Вычисления с чтением из памяти
- •3.4 Вычисления с записью в память
- •3.5 Вычисления с пересылкой регистр-регистр
- •4. Инструкции alu, mac и shifter
- •4.1 Инструкции и стандартные функции
- •4.2 Инструкции и стандартные функции
- •4.3 Инструкции и основные функции
- •5. Команды пересылки данных
- •6. Инструкции управления исполнением программы
- •If eq jump my_label; call (i6);
- •7. Другие инструкции и команды не вошедшие в
- •8. Обобщённая таблица команд
Search_dir() - определение путей к текущей рабочей директории и к директории lib.
$ADI_DSP – макроопределение, указывающее путь к директории, в которую установлено VDSP.
$COMMAND_LINE_OBJECTS – макроопределение, при использовании которого компоновщик добавляет к имеющемуся списку файлов имена объектных и архивных файлов из командной строки.
$COMMAND_LINE_LINK_AGAINST – открытие списка исполняемых (.DXE или .SM) файлов из командной строки компоновщика.
$COMMAND_LINE_OUTPUT_FILE – указатель на имя выходного исполняемого (.DXE или .SM) файла, который описан в командной строке с ключом компоновщика – о.
3.2 Структура простейшего .Asm файла
Базовой единицей ассемблерных программ сигнальных процессоров является программный раздел. Программа состоит из нескольких разделов, выполняющих разные функции. Раздел включает символические инструкции процессора и директивы, управляющие процессом ассемблирования, компоновки и загрузки. Имена всех директив пишутся с точкой впереди, описание директивы, как и инструкции, завершается точкой с запятой. Внутри раздела используются директивы объявления и описания констант, переменных, инициализации переменных. Разделы начинаются с директивы .section и имеют следующую общую форму:
.section /тип_памяти имя_раздела ;
Идентификатор тип_памяти должен быть одним из стандартных:
data или dm, используемая память - память данных (DATA MEMORY);
code или pm, используемая память - память программ (PROGRAM MEMORY);
Идентификатор имя_раздела может быть произвольным сочетанием латинских букв, цифр и знаков, но должен быть описан в .LDF файле.
Например, директива:
.section/data data1; - объявляет раздел с именем data1, размещенный в памяти данных.
Переменные в ассемблере ADSP-21хx представляются одномерными массивами и объявляются директивой .VAR. Массив с одним значением соответствует простой переменной. Он задается своим именем и длиной. Его называют также буфером данных. Он может быть линейным или циклическим в зависимости от используемого режима косвенной адресации данных. Общее описание директивы .VAR следующее:
.VAR имя_переменной[длина_массива]=значение_переменной;
Идентификатор имя_переменной может быть произвольным, длина массива должна быть константой, значение переменной имеет следующие формы представления:
константа;
выражение;
имя файла с расширением .DAT, в котором хранятся значения переменной.
Примеры объявления переменных:
1)
.section/data data1;
.VAR y_input=50; - здесь объявляется простая переменная в десятичной системе исчисления у_input, которая размещается в памяти данных.
Объявление переменной у_input в шестнадцатеричной системе исчисления осуществляется следующим образом:
.section/data data1;
.VAR y_input=0x032;
2)
.section/pm pm_da;
.VAR x_input[n]=”x.dat”; - эти директивы объявляют массив размерностью n, значения которого (массива) считываются из файла x.dat и размещаются в памяти программ. В этом случае константа n должна быть заранее объявлена.
Часто используемые в программе константы можно заменить осмысленными идентификаторами при помощи директивы #define. Синтаксис объявления констант следующий:
#define имя_константы значение_константы
Пример:
#define n 10 – следует обратить внимание на отсутствие “;” в конце строки.
Для того чтобы закрепить за аппаратными прерываниями DSP определенные программные действия, необходимо описать в .ASM файле таблицу векторов прерываний.
Пример таблицы векторов прерываний, осуществляющий переход на метку start при запуске программы:
.section/code interrupts /* --- таблица векторов прерываний ---*/
__reset: JUMP start; NOP; NOP; NOP; /* 0x0000: Reset vector*/
RTI; NOP; NOP; NOP; /* 0x0004: IRQ2*/