Разработка устройств на основе цифровых сигнальных процессоров фирмы Analog Devices с использованием Visual DSP++
Шрифт:
Директива PORT является директивой системного построителя и ассемблера. Она объявляет порт ввода/вывода отображенный в памяти процессора. Каждый порт должен иметь уникальное имя и адрес в системе. Порты могут быть определены в памяти данных или памяти программ. Для процессоров с внутренней памятью портам могут быть присвоены адреса только во внешней памяти.
Директива PORT принимает одну из двух форм:
или
Параметр DM
Объявляет имя порта p1, который отображен в памяти данных по адресу 0x0020 (шестнадцатеричный) или 32 (десятичный). Ассемблерная программа обращается к этому имени, чтобы представить его редактору связей, базирующемуся на содержании файла описания системной конфигурации с расширением ach. Отображение порта в памяти данных позволяет 16-и разрядное чтение/запись, в то время как отображение порта в памяти программ допускает 16- или 24-разрядный обмен данными.
В программе директива PORT повторяет директиву системного построителя без указания адреса порта. Например, в файле конфигурации системы для системного построителя директива PORT объявляет порты CODEC и DAC по адресам 0x3000 и 0x3800 соответственно:
В программе директива PORT объявляет эти порты следующими строками:
После чего в программе можно делать обращения к описанным портам с помощью команд, подобным следующим:
Директива ENDSYS должна быть последней командой в файле. Системный конфигуратор останавливает свою работу на директиве .ENDSYS. Директива имеет форму записи:
Ниже приведен пример законченного файла example.sys для системного конфигуратора.
После обработки этого файла системным конфигуратором должен получиться файл example.ach с таким содержимым:
Теперь рассмотрим основные директивы
Директива MODULE обозначает начало программного модуля и определяет название модуля. Как было сказано ранее, программа для ADSP-2181 может состоять из одного или нескольких модулей, которые отдельно ассемблируются и затем связываются вместе. Каждый файл с исходным текстом программы может содержать только один программный модуль. Директива имеет следующую форму записи:
Параметры могут быть следующими:
RAM или ROM — тип памяти для размещения программы;
ABS=адрес — абсолютный стартовый адрес (не используется вместе с директивой STATIC);
SEG=сегмент — размещение программы в указанном сегменте;
STATIC — статичное размещение модуля в памяти (не используется вместе с директивой ABS).
Параметр RAM (ОЗУ) или ROM (ПЗУ) определяет тип памяти процессора для размещения программы. Если тип памяти не определен, то по умолчанию принимается тип RAM.
Параметр ABS размещает коды модулей программ по определенным адресам памяти программ, что делает их не перемещаемыми компоновщиком. Это означает, что компоновщик резервирует память для модулей по указанным адресам. Модули, которые не имеют параметра ABS, распределяются компоновщиком в памяти процессора автоматически.
Параметр SEG размещает модуль в указанный сегмент памяти, который объявлен в файле системной конфигурации. Если определить оба параметра ABS и SEG и указать абсолютные адреса, которых нет в данном сегменте, компоновщик выдаст сообщение об ошибке.
Параметр STATIC сохраняет модуль в памяти программ, когда загружаются страницы начальной загрузки. Пример записи директивы:
Директива CONST определяет соответствие между именем константы и ее значением. Данная директива имеет следующую форму записи:
Значения констант могут быть числовыми или символьными константами. Кроме того, допускается присваивать константам выражения. В выражениях разрешаются только арифметические или логические операции над двумя или более целыми константами. В качестве знаков выражений в ассемблере допускается использовать следующие символы:
+ — сложение;
– — вычитание;
* — умножение;
/ — деление;
% — модуль (целая часть от деления);
( — левая скобка;
) — правая скобка;
& — логическое «И» (AND);
| — логическое «ИЛИ» (OR);
~ — исключающее «ИЛИ» (XOR);
<< — логический сдвиг влево;
>> — логический сдвиг вправо.
Запись чисел в программах может осуществляться в нескольких форматах. Для записи шестнадцатеричных чисел используется префикс 0x (ноль и икс) или H#. Например: