- •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. Обобщённая таблица команд
3. Рекомендуемый путь и этапы создания проекта в vdsp
3.1 Пример и описание .Ldf файла
Данные из .LDF файла вместе с объектными файлами (.DOJ) используются компоновщиком для создания исполняемого .DXE файла. LDF файл включает в себя команды, макроопределения, выражения, с помощью которых компоновщик распределяет программу в памяти. LDF файл описывает память процессора и размещает в ней программный код и данные для этого процессора.
Ниже приведён перечень основных команд и директив, используемых в LDF.
ARCHITECTURE() – определение типа процессора.
MAP() – определение выходного файла карты памяти.
MEMORY {} – определение карты памяти. Оно должно соответствовать типу процессора, указанного командой ARCHITECTURE. После того, как объявлены имена сегментов памяти с помощью этой команды, компоновщик может использовать их для размещения разделов программы в памяти через команду SECTIONS {}. Нет ограничений на число объявляемых сегментов и на длину имени раздела. Длина имени сегмента ограничена восьмью символами. Если не определена карта памяти процессора, компоновщик не может скомпоновать вашу программу. Если объединенные разделы требуют большего объема памяти, чем определено в сегменте, компоновщик выдаёт сообщение об ошибках и останавливает компоновку.
Синтаксис команды:
MEMORY
{
имя_сегмента {TYPE(тип_памяти) START(начальный_адрес_сегмента) LENGTH(длина_сегмента)| END(конечный_адрес_сегмента) WIDTH(разрядность_сегмента) }
………
}
Здесь:
| - знак альтернативы;
тип_памяти = DM|PM RAM|ROM|PORT;
START+LENGTH=END;
DM – память данных;
PM – программная память;
IOM – память ввода-вывода;
ROM – ПЗУ;
RAM – ОЗУ;
PORT – порт.
$LIBRARIES и $OBJECTS – макроопределения, получающие объектный (.DOJ) и библиотечный (.DLB) файл на входе.
LINK_AGAINST() – проверка компоновщиком указанных исполняемых программ (.DXE и .SM) для разрешения переменных и меток, которые не были разрешены локально. Эта команда должна присутствовать в LDF при компоновке мультипроцессорных программ.
PROCESSOR {} - объявление процессора и соответствующей ему информации. Инструкция PROCESSOR {} содержит команды MEMORY {}, SECTIONS {} и другие команды компоновщика, которые применяются только к данному процессору. Если не определён тип процессора инструкцией PROCESSOR {}, компоновщик не сможет скомпоновать вашу программу.
OUTPUT() – определение выходного исполняемого файла (.DXE), должно предшествовать команде SECTIONS {}.
SECTIONS {} – команда, определяющая место программных разделов выходного файла для данного процессора. Этот файл использует определения памяти. Команда SECTIONS{} определяет размещение разделов программы в памяти, используя сегменты, определенные командой MEMORY {}, и включает в себя описания (определения разделов и выражения).
Синтаксис определения разделов (символы “[“, “]” при определении разделов не печатаются):
имя_раздела [тип_раздела ] {команды_раздела} [ > сегмент_памяти ]
Одной из команд раздела является команда INPUT_SECTIONS(), определяющая раздел.
Её синтаксис:
INPUT_SECTIONS(исходный_файл часть_архива(входные_метки)])
Здесь:
исходный_файл – макроопределение типа $COMMAND_LINE_OBJECTS или список файлов;
часть_архива – этот параметр вместе с левой и правой скобками [ ] используется, в случае если, исходный файл с входной меткой является архивом;
входные_метки – входные метки раздела, берутся из имён раздела (директива .SECTION) ассемблерной программы.
MEMORY_SIZEOF() – размер в словах сегмента памяти, имя которого указано в скобках.
(.) –счётчик текущего расположения, то есть текущего адреса.