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*/

RTI; NOP; NOP; NOP; /* 0x0008: IRQL1*/

RTI; NOP; NOP; NOP; /* 0x000C: IRQL0*/

RTI; NOP; NOP; NOP; /* 0x0010: SPORT0 transmit*/

RTI; NOP; NOP; NOP; /* 0x0014: SPORT0 receive*/

RTI; NOP; NOP; NOP; /* 0x0018: IRQE*/

RTI; NOP; NOP; NOP; /* 0x001C: BDMA*/

RTI; NOP; NOP; NOP; /* 0x0020: SPORT1 transmit*/

RTI; NOP; NOP; NOP; /* 0x0024: SPORT1 receive*/

RTI; NOP; NOP; NOP; /* 0x0028: Timer*/

RTI; NOP; NOP; NOP; /* 0x002C: Power down*/

После объявления необходимых переменных и описания таблицы векторов прерываний в .ASM файле должен располагаться раздел кода программы.

Пример раздела кода программы:

.section/code program;

start:

/* тело программы */

end: IDLE;

JUMP end;

В данном разделе используется метка start, которая описана в таблице векторов прерываний и к которой осуществляется переход при запуске программы. После исполнения тела программы реализуется ожидание прерывания в бесконечном цикле. Команды ассемблера подробно описаны в приложении.

 

3.3 Компоновка проекта и создание исполняемого .DXE файла

При создании исполняемого. DXE файла исходный текст подвергается с помощью собственно ассемблера трансляции, в результате которой получается промежуточная объектная программа. В процессе трансляции ассемблер обнаруживает синтаксические ошибки – нарушения правил языка – и выдает листинг трансляции, содержащий диагностическую информацию и сообщения об ошибках. При наличии ошибок необходимо вернуться к исходному тексту программы для ее коррекции. Объектные программы, полученные в результате трансляции, не привязаны к каким-либо определенным адресам памяти, т.е. они являются перемещаемыми и могут выполняться при размещении в разных местах памяти.

Следующим после трансляции этапом подготовки исполняемого. DXE файла является компоновка одного или, как правило, нескольких оттранслированных исходных файлов. Основным средством компоновки проекта является компоновщик, который решает следующую задачу: привязывает перемещаемые разделы объектной программы к абсолютным адресам памяти. При этом разделы размещаются именно в той памяти, тип которой указан идентификатором тип_памяти.

Компоновку проекта и создание исполняемого .DXE файла рассмотрим на примере. В примере создаются два массива: массив исходных данных и массив, соответствующие элементы которого являются квадратами элементов исходного массива.

Создадим проект, для этого необходимо:

- создать папку Lab1 для хранения всех файлов, включаемых в проект;

- из меню Пуск\Программы\ VisualDSP запустить 21xx Environment, после чего на экране появится окно, изображенное на рис.1;

- создать новый файл проекта – меню File\New, далее в окне “Новый документ” выбрать Project и нажать OK;

- сохранить файл проекта в папке Lab1 под названием Lab1.dpj;

- в окне Project options, вкладке Project, поле Processor выбрать тип процессора ADSP-2189 и нажать OK;

- создать новый файл для текста программы на ассемблере – меню File\New, далее в окне “Новый документ” выбрать Editor File и нажать OK;

- в появившемся окне (рис.1 – окно 2) ввести текст программы:

/* начало файла Lab1.asm */

#define N 19

.section/data data1;

.VAR x[N];

.VAR y[N];

.section/code interrupts;

__reset: JUMP start; NOP; NOP; NOP;/* 0x0000: Reset vector*/

RTI; NOP; NOP; NOP; /* 0x0004: IRQ2*/

RTI; NOP; NOP; NOP; /* 0x0008: IRQL1*/

RTI; NOP; NOP; NOP; /* 0x000C: IRQL0*/

RTI; NOP; NOP; NOP; /*x0010: SPORT0 transmit*/

RTI; NOP; NOP; NOP; /* 0x0014: SPORT0 receive*/

RTI; NOP; NOP; NOP; /* 0x0018: IRQE*/

RTI; NOP; NOP; NOP; /* 0x001C: BDMA*/

RTI; NOP; NOP; NOP; /* 0x0020: SPORT1 transmit*/

RTI; NOP; NOP; NOP; /* 0x0024: SPORT1 receive*/

RTI; NOP; NOP; NOP; /* 0x0028: Timer*/

RTI; NOP; NOP; NOP; /* 0x002C: Power down*/

.section/code program;

start:

ena m_mode;

I0=x;

L0=0;

I1=y;

L1=0;

M0=1;

AR=-9;

CNTR=N;

DO Mloop UNTIL CE;

DM(I0,M0)=AR;

MY1=AR;

MR=AR*MY1 (SS);

DM(I1,M0)=MR0;

Mloop: AR=AR+1;

end: IDLE;

JUMP end;

/* конец файла Lab1.asm */

- сохранить этот файл в папке Lab1 под названием Lab1.asm - меню File\Save As…;

- включить файл Lab1.asm в проект – меню Project\Add to Project\File(s)…;

- создать новый. LDF файл – меню File\New, далее в окне “Новый документ” выбрать Editor File и нажать OK;

- в появившемся окне (рис.1 – окно 2) ввести следующий текст:

/* начало файла ADSP-2189.ldf */

ARCHITECTURE(ADSP-2189)

$OBJECTS = $COMMAND_LINE_OBJECTS;

MEMORY

{

seg_inttab { TYPE(PM RAM) START(0x00000) END(0x0002f) WIDTH(24) }

seg_code { TYPE(PM RAM) START(0x00030) END(0x01fff) WIDTH(24) }

seg_data1 { TYPE(DM RAM) START(0x02000) END(0x02fff) WIDTH(16) }

seg_heap { TYPE(DM RAM) START(0x03000) END(0x037ff) WIDTH(16) }

seg_stack { TYPE(DM RAM) START(0x03800) END(0x03fdf) WIDTH(16) }

}

PROCESSOR p0

{

LINK_AGAINST($COMMAND_LINE_LINK_AGAINST)

OUTPUT($COMMAND_LINE_OUTPUT_FILE)

SECTIONS

{

sec_inttab

{

INPUT_SECTIONS($OBJECTS(interrupts))

} >seg_inttab

sec_code

{

INPUT_SECTIONS($OBJECTS(program))

} >seg_code

sec_data1

{

INPUT_SECTIONS($OBJECTS(data1))

} >seg_data1

sec_stack

{

ldf_stack_limit =.;

ldf_stack_base =. + MEMORY_SIZEOF(seg_stack) - 1;

} >seg_stack

sec_heap

{

.heap =.;

.heap_size = MEMORY_SIZEOF(seg_heap);

.heap_end =. + MEMORY_SIZEOF(seg_heap) - 1;

} >seg_heap

}

}

/* конец файла ADSP-2189.ldf */

- сохранить этот файл в папке Lab1 под названием ADSP-2189.ldf - меню File\Save As…;

-

 
 

включить файл ADSP-2189.ldf в проект – меню Project\Add to Project\File(s)…

Рис. 1. Стандартный вид отображения интегрированной среды разработки­­­­.

- сохранить проект, сделав активным окно Lab1.dpj, target: Lab1 (рис.1 – окно 1), и выбрать пункт меню File\Save.

Компоновка созданного проекта осуществляется с помощью пункта меню Project\Rebuild All. Если в процессе компоновки не было обнаружено ошибок, то VDSP в окне Output Window (рис.1 – окно 3) выдаст сообщение Build completed successfully. В результате в папке …\Lab1\debug\ будет создан файл LAB1.DXE.

 

4. ЗАПУСК И ОТЛАДКА ПРОЕКТА.

 

4.1 Запуск проекта Lab1

Запуск и отладка программ осуществляется с помощью отладчика (рис.2), входящего в состав VDSP. Отладчик имеет множество важных особенностей. Визуализация данных с помощью встроенного графического пакета позволяет существенно поднять уровень гибкости отладки проекта. Эта форма графического представления данных позволяет программисту быстро оценить выполнение алгоритма. Поскольку сложность алгоритмов стремительно увеличивается, это свойство может существенно облегчить процесс создания высокопроизводительных приложений. Отладка программ в режиме симуляции позволяет производить ее без обращения к DSP. Запуск и отладку проекта, с описанием основных средств отображения информации в отладчике, покажем на примере проекта Lab1.

В начале необходимо загрузить в отладчик нужную программу (а именно Lab1.dxe), для этого выполняется следующая последовательность действий:

- запустить отладчик - меню Пуск\Программы\ VisualDSP\21xx Debugger, вид окна отладчика изображен на рис.2;

- загрузить исполняемый файл – File\Load Program …, выбрать файл …\Lab1\debug\LAB1.DXE.

- выбрать тип DSP и режим выполнения – меню Session\New Session…, далее в окне Target Selection в полях Debug target и Processor выбрать ADSP-21xx Family Simulator и ADSP-2189 соответственно, после чего нажать OK.

Для запуска программы необходимо выбрать пункт меню Debug\Run (F5), для остановки – меню Debug\Halt (Shift+F5),а для повторного запуска – Debug\Restart. Если есть необходимость в пошаговом выполнении программы, то для этой цели существует команда Debug\Step Into (F11).

Чтобы установить начальные значения данных в программе, необходимо последнюю перезагрузить – меню File\Reload Program (Ctrl+R).

 
 

Для контроля работы программы, изменения регистров и памяти требуется пошагово выполнять программу (F11).

Рис. 2. Вид окна отладчика.

 

4.2 Отображение содержимого памяти

Меню Memory позволяет просматривать, заполнять, а также сохранять в файл определенные области памяти, изменять формат данных памяти. Изменить формат данных можно, выделив щелчком мыши нужное окно и затем нажатием клавиш Ctrl+T циклически менять формат. В зависимости от DSP, форматы данных памяти бывают: шестнадцатеричный (hexadecimal), беззнаковый целый (unsigned integer), знаковый целый (signed integer), восьмеричный (octal), дробный (fractional), символьный (character), ассемблерный (assembly), двоичный (binary).

В отладчике существует 4 типа памяти:

- Program Memory (память программ), может содержать команды ассемблера и собственно данные в любом сочетании;

- Data Memory (память данных);

- Byte Memory;

- I\O Memory (память ввода-вывода).

Для просмотра содержимого памяти необходимо:

1. Два раза щелкнуть мышью по колонке адреса в окне Disassembly или в окне, выбранном из меню Memory \…;

2. В диалоговом окне Go to Address ввести адрес в шестнадцатеричной форме или щелкнуть Browse, чтобы выбрать метку адреса памяти из списка.

При необходимости заполнить область памяти или отдельную ячейку определенными значениями (например, обнулить) следует:

1. Щелкнуть правой клавишей мыши в окне Disassembly или окне Memory \…;

2. В появившемся меню выбрать Fill

3. В диалоговом окне Fill Memory,если необходимо заполнить область памяти из файла, использовать условие Fill from a file, иначе перейти к пункту 5;

4. В поле File name указать имя файла, из которого необходимо получить данные, далее перейти к пункту 6;

5. В поле Value ввести значение (в формате 0 или NOP), которым надо заполнить память;

6. В поле Address ввести начальный адрес заполняемой памяти;

7. В поле Memory выбрать тип используемой памяти;

8. В поле Count ввести количество заполняемых ячеек;

9. В поле Stride ввести шаг, с которым будут заполняться ячейки.

Отладчик предоставляет возможность сохранять в файл данные из любой области памяти, для экспорта их в другие проекты или приложения (например, Microsoft Excel). Для этого надо:

1. Щелкнуть правой клавишей мыши в окне Disassembly или окне Memory \…;

2. В появившемся меню выбрать Dump

3. В диалоговом окне Dump Memory в поле Address ввести начальный адрес сохраняемой памяти;

4. Установить флаг Dump to a file;

5. В поле Format выбрать нужный формат сохраняемых данных;

6. Значение полей Memory, Count и Stride см. выше;

7. Установить флаг Write format to file, что позволит отладчику считывать данные из создаваемого файла в правильном формате.

4.3 Отображение содержимого регистров

Пункт меню Register позволяет просматривать и изменять содержание регистров, а также изменять формат данных регистров. Форматы данных регистров те же, что и у данных памяти, но отсутствует ассемблерный.

Для изменения формата регистров необходимо щелкнуть правой клавишей мыши по окну, выбранному из меню Register \…, в появившемся меню выбрать формат. Для изменения содержания регистра необходимо щелкнуть мышью в поле данных регистра и в контекстном меню выбрать Edit …, ввести значение и нажать Enter. Следует отметить, что вводить значение нужно в том формате, в котором представлены данные в окне просмотра регистров.

В отладчиках для процессоров семейства ADSP - 21xx выделяют следующие типы регистров (подробное описание регистров приведено в приложении):

1. Register\Computational (вычислительные), к ним относятся:

- регистры арифметико-логического устройства (ALU - Arithmetic Logic Unit): AX0,AX1,AY0,AY1 – 16-битные входные регистры; AR – регистр результата (16 бит); AF – регистр обратной связи, дополнительный Y -вход (16 бит);

- регистры умножителя-накопителя (MACMultiplier Accumulator): M X0, MX1, MY0, MY1 – 16-битные входные регистры; MR0 - MR2 – регистры результата (40 бит – 16 бит MR0, 16 бит MR1, 8 бит MR2); MF – регистр обратной связи, дополнительный Y -вход (16 бит);

- регистры устройства циклического сдвига (Shifter): SR0,SR1 – регистр результата (32 бит – 16 бит SR0, 16 бит SR1); SI – входной регистр (16 бит); SE – регистр порядка (16 бит); SB – используется для операций с блочной плавающей точкой (5 бит).

2. Register\ Alternate Computational – регистры дублирующие вычислительные.

3. Register\DAGS – регистры генератора адреса данных (DAG - Data Address Generator): I0 - I7 (Index) – 14-битные регистры, которые содержат непосредственные адреса для доступа к данным; M0 - M7 (Modify) – 14-битные регистры, содержащие значения для последующего изменения в ходе программы I регистров; L0 - L7 (Length) – 14-битные регистры, определяющие длину циклических буферов данных.

4. Register\Program Control – регистры, содержащие информацию относительно выполнения программы: PC – программный счетчик, указывает адрес инструкции, которая выполняется в данное время (14 бит); CNTR – счетчик цикла, равен количеству итераций (14 бит); CYCLES – счетчик цикла, считает число выполненных циклов процессора (32 бита); PM _ ADDR – содержит последний адрес памяти программы, к которому обращались (22 бита); DM _ ADDR – содержит последний адрес памяти данных, к которому обращались (22 бита).

5. Status – регистры состояния: ASTAT – регистр состояния арифметических устройств (8 бит);

SSTAT – регистр состояния стеков, может только считываться (8 бит); MSTAT – регистр состояния операционного режима процессора (8 бит).

Остальные регистры не входят в объем данной лабораторной работы и будут рассмотрены по мере необходимости.

 

4.4 Построение графиков


Построение графиков производится в отладчике. Это является дополнительным средством анализа качества работы программы. Данными необходимыми для построения графиков, являются значения, содержащиеся в выбранных ячейках памяти.

Рис. 3. Построение графиков в отладчике

 

Построим в одном окне два графика (см. рис.3), данными для которых будут служить значения массивов x и y, загружаемые в память после выполнения программы LAB1.DXE. В пункте меню View\Debug Windows выберите подпункт Plot. Появится окно конфигурации графика (Plot Configuration). Выбираем тип графика (Graph Type) - 2D Line Plot, заголовок графика (Graph title) Graph ”. В установках данных (Data Setting) в поле Name записываем – “ x ”. В поле Memory выбираем тип памяти, в нашем случае – память данных (DM). В поле Address, используя кнопку Browse, выставляем x или начальный адрес используемого в построении графика участка памяти в нашем случае – 0x2000. В поле Count выставляем размер участка памяти, в пределах которого содержатся данные, необходимые для построения графика, в нашем случае – 19. В поле Stride выставляем шаг, с помощью которого можно выбирать периодичность извлечения данных из памяти, в нашем случае, этот шаг равен 1. В поле Data выбираем тип данных – шестнадцатеричные (hexadecimal). Добавляем в поле выбора рядов (Series selection) данные к построению графика на основе массива x, нажатием клавиши Add.

В установках данных аналогичные действия проводим для массива y.

Удалить запись из поля выбора рядов можно, выделив запись и нажав кнопку Remove. Изменить параметры по записи можно с помощью кнопки New. Можно менять число графиков в окне, снимая или выставляя флажки у соответствующих записей в поле выбора рядов.

Изменять графическое представление можно в меню установок графика (Plot Settings), нажав кнопку Settings…. В закладке главных установок (General) указываются главный заголовок (Main title), в нашем случае, “ Graph ”, и подзаголовок (Sub title) графика. Там же можно указать наличие линий сетки: None – нет линий сетки, X – вертикальные линии, Y – горизонтальные линии, Both – горизонтальные и вертикальные линии сетки, Grid color – цвет линий сетки. Наличие легенды выставляется флажком в поле Legend. Цвет фона графика выбирается в поле Background color. В закладке осей Axis в поле X-Axis Title запишем название оси X – “ DM” (память данных), начальное значение (Start value) – -9, значение инкремента (Increment value) – 1. В поле шкала (Scale)для X-Axis выбираем ручное выставление шкалы (Manual), минимальное значение (Min value) – -10, максимальное значение (Max value) – 10, множитель (Multiplier) – 1. В поле Y-Axis Title запишем название оси Y – “ x, y”, тип оси – линейная (Linear). В поле шкала (Scale)для X-Axis выбираем ручное выставление шкалы (Manual), минимальное значение (Min value) – -10, максимальное значение (Max value) – 85, множитель (Multiplier) – 1. В закладке стиля линий графиков (Style) для каждого из рядов из поля выбора рядов можно указать: тип линии (Line type); ширину линии (Line width); символ в точках (узлах), по которым строится график (Symbol); цвет линии (Line color). В закладке обработки данных (Data processing) для каждого из рядов из поля выбора рядов можно указать вид обработки в поле выбора обработки данных (Data process selection): None – отсутствие обработки данных, Convert to dB – преобразование к дБ, FFT – быстрое преобразование Фурье. В нашем случае выберем None.

Теперь нажмём кнопку OK в окне установок графика и в окне конфигурации графика. В появившемся окне “ Graph ” можно видеть графики двух функций: график линейно нарастающей функции (в соответствии с данными массива x) и параболу (в соответствии с данными массива y). Какой график соответствует каким данным, можно определить по легенде.

При нажатии правой кнопки мыши на окно графика появляется меню. Выбрав пункт Configure…, можно поменять конфигурацию графика. Выбрав пункт Settings…, можно поменять установки графика. Если поставить флажок в пункте Data Cursor, то появляются две линии, скрещенные на одном из графиков. Нажимая левую и правую стрелки клавиатуры, можно перемещать этот так называемый “курсор данных” по узлам графика и читать значения этих узлов в левом верхнем углу окна. Нажимая стрелки вверх и вниз, «курсор данных» можно перемещать по графикам. При выборе пункта Export… открывается окно экспорта графика (Export Plot), где можно выбрать экспортный адресат (Export Destination): ClipBoard – скопировать содержимое окна графика в буфер обмена; File – сохранить содержимое окна графика в отдельном файле, расположение, имя и тип которого можно выбрать в открывающемся с помощью кнопки Browse… окне выбора экспортного файла (Select plot export file)файла, причем файл может быть не только графическим, но и текстовым; Printer – вывести график на печать. Сделав окно “ Graph ” активным, можно, нажав и удерживая левую кнопку мыши и перемещая мышь, выводить в окне только ту часть графика, которая попала в образовавшийся после перетаскивания мыши прямоугольник. Все эти изменения отменяются при выборе пункта Reset Zoom.

Как видно, использование графиков даёт возможность полностью оценить результаты работы программы, представив их в удобной для пользователя форме.

 

5. ЗАДАНИЕ К ЛАБОРАТОРНОЙ РАБОТЕ

 

I. Используя инструкции АЛУ и умножителя-накопителя, решить задачу в соответствии с номером варианта:

1. Найти произведение суммы нечетных элементов массива и числа 5.

2. Упорядочить одномерный массив по возрастанию модулей элементов, перемножить первый и последний элементы.

3. Переместить массив из 15 элементов из одной области памяти в другую, при этом умножить каждый элемент на 3.

4. Создать массив, содержащий 20 первых чисел Фибоначчи.

5. Найти сумму квадратов элементов массива.

6. Перемножить 1,3,5,7 элементы массива.

7. Найти произведение четных элементов массива.

8. Найти произведение самой длинной последовательности подряд стоящих ненулевых элементов в одномерном массиве.

9. Переместить из одной области памяти в другую элементы массива, не равные 5, умножив их на 3.

10. Найти наибольший отрицательный элемент массива и умножить его на наибольший положительный.

11. Найти сумму элементов массива с нечетными номерами и возвести её в квадрат.

12. Возвести элементы массива в степень, численно равную второму элементу массива.

13. По адресу 2000 (DM) поместить произведение элементов массива.

14. Найти наибольший четный элемент массива и умножить его на первый элемент массива.

15. Образовать из массива два новых: один, содержащий элементы, стоящие на нечетных местах, умноженные на 2 и второй – содержащий элементы, стоящие на четных, умноженные на 3.

16. Найти сумму кубов элементов массива.

17. Найти сумму положительных элементов массива и умножить её на сумму отрицательных.

18. Найти произведение элементов массива, стоящих до первого положительного элемента.

19. Возвести первый элемент массива в степень, численно равную количеству неотрицательных элементов массива.

20. Вычислить n!

21. Составить из данного массива другой, умноженный на 3 и чтобы в нем не было повторяющихся рядом стоящих элементов.

22. Упорядочить одномерный массив по возрастанию, умножив каждый элемент на наименьший.

23. Найти произведение модулей элементов массива, номера которых кратны трем.

24. Массив из 10 элементов переписать в другую область памяти в порядке номеров: 1,3,5,7,9,2,4,6,8, умножить все элементы на нулевой.

25. Найти сумму попарных произведений соседних элементов массива.

 

II. Используя инструкции устройства циклического сдвига, решить задачу в соответствии с номером варианта:

1. Найти количество нулей в 16-битном двоичном числе.

2. Найти количество элементов массива, содержащих единицу в третьем справа двоичном разряде.

3. Изменить на противоположный порядок следования бит 16-разрядного двоичного числа.

4. Поменять местами байты в 16-битном двоичном числе.

5. Циклически сдвинуть 16-битное число на 4 разряда влево.

6. Попарно поменять местами тетрады в 16-битном числе (например, вместо 1234Н должно получиться 2143Н).

7. Округлить двоичное 16-битное число до 5 справа двоичного разряда.

8. Найти длину самой длинной последовательности подряд стоящих нулей в двоичном представлении числа.

9. Найти сумму цифр двоичного 16-разрядного числа.

10. Дополнить 15-битное число битом проверки на нечетность.

11. Циклически сдвинуть каждый байт 16-разрядного двоичного числа на 3 разряда влево.

12. Определить количество разрядов двоичного числа, в которых стоит единица, обрамленная нулями.

13. Поменять местами соседние биты в 16-битном двоичном коде.

14. Дополнить 15-битное число битом проверки на четность.

15. 128-битное двоичное число расположено в 8 последовательных ячейках памяти. Найти число нулей в самой длинной группе подряд стоящих нулей.

16. Дано 16-битное двоичное число. Получить новое 32-битное число, состоящее из периодически чередующихся 3,4 и 7,8 разрядов исходного числа.

17. Найти количество повторений кода “…101…” в 16-битном двоичном числе.

18. 64-битное двоичное число хранится в 4-х последовательных ячейках памяти. Логически сдвинуть его на 4 разряда вправо и поместить на прежнее место.

19. Изменить последние 6 разрядов 16-битного двоичного числа на третий разряд этого же числа.

20. 128-битное двоичное число расположено в 8 последовательных ячейках памяти. Переставить его тетрады в обратном порядке.

21. Инвертировать все разряды в 16-битном коде, которые стоят после двух нулевых разрядов (например, 00 1 010100 0 …).

22. 64-битное двоичное число хранится в 4-х последовательных ячейках памяти. Циклически сдвинуть его на 4 разряда вправо и поместить на прежнее место.

23. 128-битное двоичное число расположено в 8 последовательных ячейках памяти. Переставить его биты в обратном порядке.

24. Поменять местами два первых и два последних разряда 16-битного двоичного числа.

25. 128-битное двоичное число расположено в 8 последовательных ячейках памяти. Найти сумму его цифр.

 

 

ПРИЛОЖЕНИЕ

 

Система команд сигнального процессора ADSP-2189M

1. Особенности и типы команд сигнального процессора

 

Система команд поддерживает прямой и косвенный (линейный или циклический) режимы адресации для доступа к памяти. Прямая адресация возможна только для памяти данных и использует непосредственное выражение в качестве адреса памяти: DM (< addr >). Косвенная адресация памяти данных и памяти программ использует индексные (I) регистры генераторов адресов данных и регистры модификации (M), например: DM(I3, M3), PM(I4, M7). Она обеспечивает эффективную адресацию массивов данных и соответствующих им буферов.

Набор инструкций процессора ADSP-2189M разделен на следующие группы:

- вычислительные (инструкции ALU, MAC и SHIFTER);

- пересылки данных;

- управления программой;

- многофункциональные;

- другие инструкции.

При обобщенном описании инструкций процессора используются следующие синтаксические обозначения:

[ ] - необязательная часть инструкции;

| - разделитель в списке операторов, операндов или модификаторов инструкции, из которых должен быть выбран один;

cond - одно из следующих условий выполнения инструкции: EQ, NE, GT, GE, LT, LE, NEG, POS, AV, NOT AV, AC, NOT AC, NOT MV, NOT СЕ;

term - одно из следующих условий завершения цикла: EQ, NE, GT, GE. LT. LE, NEG, POS, AV, NOT AV. AC. NOT AC. MV, NOT MV, CE, FOREVER;

<data> =<const> | %<symbol> | ^<symbol> - обозначает непосредственное значение данных; это также может быть символ имени переменной/буфера, отмеченный операторами % или ^, означающими его длину или начальный адрес;

<addr> - обозначает непосредственное значение адреса, который кодируется в команде; в качестве <addr> может быть либо константа, либо метка программы;

конструкция […] - означает сколь угодное повторение предыдущего параметра;

<ALU>,<МАС,<SHIFT> - операции ALU, MAC, SHIFT соответственно;

< dregs > - один из регистров вычислительных устройств AX0, AX1, AY0, AY1, AR, МХО, МХ1, MY0, MY1, MRO, MR1, MR2, SI, SE, SR0, SR1;

< regs > - один из программно доступных регистров процессора AX0, AX1, AY0, AY1, AR, MX0, MX1, MY0, MYI, MR0, MR1, MR2, SI, SE, SR0, SR1, I0-I7, M0-M7, L0-L7, SB, PX, ASTAT, MSTAT, SSTAT (только для чтения), IMASK, ICNTL, CNTR, OWRCNTR (только для записи), IFC (только для записи), RXO, RX1, TXO, TX1;

< ехр > - константа от –127 до 127;

xop, yop – регистры X,Y -операндов в инструкциях ALU, MAC, SHIFTER;

Инструкции ALU:

xop - один из регистров AX0, AX1, AR, MR2, MRI, MRO, SRI, SR0;

yop - один из регистров AY0, AY1, AF.

Инструкции MAC:

xop - один из регистров MX0, MX1, AR, MR2, MR1, MR0, SR1, SR0;

yop - один из регистров MY0,MY1,MF.

Инструкции SHIFTER:

xop - один из регистров AR, MR2, MR1, MR0, SI, SR1, SR0.

При описании регистров состоянияиспользуются следующие обозначения:

* - звездочка означает, что данный бит изменяется после выполнения инструкции;

- черта означает, что данный бит не затрагивается инструкцией;

0 или 1 - означает, что этот бит всегда очищается или устанавливается инструкцией.

2. Используемые условия

 

2.1 Подробное описание регистров состояния и значения их битов

1) Регистр состояния арифметических устройств

Регистр ASTAT имеет разрядность 8 бит и содержит информацию о состоянии вычислительных устройств процессора. Биты состояния (0–7) (в порядке возрастания) имеют следующий смысл:

AZ – содержимое АЛУ равно нулю;

AN – содержимое АЛУ отрицательно;

AV – переполнение АЛУ;

AC – перенос бита в АЛУ;

AS – знак ввода порта X в АЛУ;

AQ – частное АЛУ;

MV – переполнение умножителя;

SS – знак ввода в устройство сдвига.

Биты состояния обновляются: AZ, AN, AV, AC – любой операцией АЛУ, кроме деления; AS – операцией нахождения абсолютного значения ABS; AQ – операциями деления; MV – любой операцией умножителя, кроме насыщения; SS – операцией нахождения порядка (EXP) устройства сдвига.

Состояние фиксируется в регистре ASTAT в конце цикла, в котором оно было сгенерировано.

2) Регистр состояния стеков

8-разрядный регистр SSTAT содержит информацию о четырех стеках процессора. Его биты состояния (0–7) (в порядке возрастания) имеют следующий смысл:

0 – стек счетчика команд пуст (PC_EMPTY);

1 – стек счетчика команд переполнен (PC _ OVERFLOW);

2 – стек счетчика пуст (COUNT _ EMPTY);

3 – стек счетчика переполнен (COUNT _ OVERFLOW);

4 – стек состояний пуст (STATUS _ EMPTY);

5 – стек состояний переполнен (STATUS _ OVERFLOW);

6 – стек циклов пуст (LOOP _ EMPTY);

7 – стек циклов переполнен (LOOP _ OVERFLOW).

Состояние “стек счетчика пуст” означает, что число операций по извлечению данных из стека превышает или равно числу операций по помещению информации в стек. Состояние “стек счетчика переполнен” означает превышение числа помещений над числом извлечений данных из стека, что ведет к потере информации.

3)Регистр состояния режима

Регистр MSTAT определяет операционный режим процессора. Его биты описываются следующим образом:

0 – выбор ряда регистров данных (0 – главный, 1 – теневой) – SEG _ REG;

1 – разрешение режима перестановки бит (DAG1) – BIT _ REV;

2 – разрешение режима фиксации переполнения АЛУ – AV _ LATCH;

3 – разрешение режима насыщения регистра ARAR _ SAT;

4 – тип результата в MAC 0 – дробный, 1– целый – M _ MODE;

5 – разблокирование таймера – TIMER;

6 – разрешение режима GOG _ MODE.

Содержимое регистра MSTAT модифицируется при записи в него нового значения при помощи команды пересылки. В отличие от других регистров состояний, содержимое этого регистра может также изменяться командой управления режимом (ENA, DIS), например:

ENA SEG_REG; DIS SEG_REG; ENA M_MODE (режим умножения целых чисел); DIS M_MODE (режим умножения дробных чисел) и т.д.

При разрешении режима GO процессор может продолжить выполнение команд из внутренней памяти программы во время предоставления шины. Процессор может приостановить работу, ожидая, когда освободятся шины, только в случае, когда требуется доступ к внешней памяти. При запрещении режима GO процессор всегда будет останавливать работу во время предоставления шины.

2.2 Логическое описание условий (cond), используемых с оператором IF

Синтаксис Условие выполнения Истинно, если:
EQ Равно нулю AZ=1
NE Не равно нулю AZ=0
LT Меньше нуля AN XOR AV=1
GE Больше или равно нулю AN XOR AV=0
LE Меньше или равно нулю (AN XOR AV) OR AZ=1
GT Больше нуля (AN XOR AV) OR AZ=0
AC Перенос в АЛУ AC=1
NOT AC Нет переноса в АЛУ AC=0
AV Переполнение АЛУ AV=1
NOT AV Нет переполнения АЛУ AV=0
MV Переполнение MAC MV=1
NOT MV Нет переполнения MAC MV=0
NEG Операнд X последней команды ABS был отрицателен AS=1
POS Операнд X последней команды ABS был положителен AS=0
NOT CE Счетчик не пуст -
FLAG_IN Значение на выводе FI. (Доступно только с командами JAMP и CALL). Последнее значение на выводе FI =1
NOT FLAG_IN Значение на выводе FI. (Доступно только с командами JAMP и CALL) Последнее значение на выводе FI =0

2.3 Условия завершения цикла DO UNTIL (term)

 

Условия завершения цикла DO UNTIL включают в себя все условия выполнения оператора IF за исключением трех последних условий: NOT CE, FLAG_IN, NOT FLAG_IN, а также содержат два дополнительных условия:

CE - счетчик пуст;

FOREVER - вечный цикл при отсутствующей части инструкции UNTIL.

 

3. Многофункциональные инструкции

 

Многофункциональные инструкции в наибольшей мере отражают возможности, обеспечиваемые архитектурой процессора д



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-11-19 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: