- •1. Принципы и базовые алгоритмы обработки сигналов в цифровых системах. Требования к аппаратной базе для выполнения базовых операций цос.
- •3. Форматы представления данных в сигнальных процессорах. Сравнительные особенности процессоров, ориентированных на обработку фз- и пз-данных. Оценка необходимой разрядности процессора.
- •1. Данные с фиксированной запятой (Fixed-Point Numbers)
- •2. Данные с плавающей запятой (Floating-Point Numbers)
- •4. Этапы и средства разработки и отладки по для процессоров цос. Критерии выбора языка программирования и средств разработки по
- •6. Особенности программной организации ввода-обработки-вывода данных в системах цос, работающих в реальном времени. Работа по прерываниям. Использование буферов.
- •7. Методики оптимизации кода для risc-процессоров
- •Inline- функции
- •8. Dsp семейства adsp-2106x. Основные характеристики и особенности архитектуры.
- •9. Карта памяти adsp-2106x. Пространства внутренней памяти, памяти многопроцессорной системы и внешней памяти. Пространство памяти iop-регистров.
- •10. Физическая организация внутренней памяти. Блоки памяти. Возможные виды конфликтов при обращении к внутренней памяти и способы их устранения. Адресация нормальных и коротких слов.
- •12. Доступ к памяти в программе. Организация dag. Основные возможности. Особенности программирования регистров dag. Кольцевые буферы.
- •13. Системные регистры: назначение и работа с ними. Устройство обмена между шинами (px-регистры).
- •14. Общие принципы работы вычислительных блоков adsp-21ххх. Особенности организации вычислений с пз- и фз-данными. Регистровый файл. Поддерживаемые типы данных и их идентификация в программе.
- •15. Теневые регистры. Регистры флагов. Понятие "липких" флагов. Флаги аккумулирующих сравнений.
- •16. Описание и функции алу. Флаги состояния и режимы работы алу. Мас. Функционирование мас. Особенности выполнения операций округления и насыщения при работе с фз-операндами. Флаги состояния мас.
- •17. Сдвигатель. Функционирование сдвигателя. Выделение и депонирование битовых полей. Флаги состояния сдвигателя. Организация многофункциональных вычислений. Ограничения.
- •19. Организация циклов. Ограничения при организации циклов. Циклы не по счетчику. Достоинства и недостатки аппаратной поддержки циклов.
- •20. Кэш инструкций. Структура и функционирование. Возможности управления обновлением кэша. Примеры повышения/понижения эффективности выполнения кода с учетом работы кэша.
- •21. Обработка прерываний: общая последовательность действий. Таблица прерываний. Маскирование прерываний. Регистры, программного секвенсора, используемые при обработке прерываний.
- •22. Отличия работы процессора при разрешенных и запрещенных вложенных прерываниях.
- •23. Организация работы с таймером. Программные прерывания. Внешние прерывания.
- •24. Понятие и назначение dma-пересылок в adsp-2106x. Направления пересылок. Каналы dma. Принципы функционирования dma-контроллера adsp-2106x. Генерация прерываний dma-контроллером.
- •26. Цепочечные dma-пересылки в adsp-2106x. Tcb-блоки. Инициирование и завершение цепочечных dma-пересылок. Контроль состояния цепочечной dma-пересылки
- •27. Порты sharc-процессоров. Реализуемые виды интерфейсов. Организация взаимодействия между процессорным ядром и портами при вводе/выводе данных.
- •29. Архитектура и принципы функционирования линк-портов (звеньевых портов) adsp-2106x. Регистры управления работой линк-портов adsp-2106x. Связь между линк-буферами и линк-портами.
- •30. Организация взаимодействия между процессорами по выделенным каналом через линк-порты. Регистр lsrq и его назначение. Идея алгоритма "передачи маркера".
- •31. Механизм арбитража внешней шины. Схемы приоритетов. Приоритетный доступ процессорного ядра.
- •32. Операции вещательной записи. Блокировка шины. Использование "зеркальных" семафоров. Межпроцессорные сообщения и вектор прерывания virpt.
- •33. Отличительные особенности компилятора cc21k. Поддерживаемые типы данных и их реализация.
- •2.1. Общие сведения
- •2.2. Поддерживаемые типы данных
- •34. Расширения языка с. Ассемблерные вставки – использование регистров. Поддержка пространств памяти данных памяти команд. Доступ к круговым буферам.
- •2.3.1. Поддержка inline-функций
- •2.3.2. Ассемблерные вставки
- •2.3.3. Поддержка пространств памяти данных и памяти команд
- •2.3.4. Доступ к круговым буферам
- •2.4.1. Использование памяти
- •2.4.2. Регистры компилятора
- •36. Работа со стеком при вызове процедур в рамках rte. Передача и возврат параметров. Взаимодействие программ на с и ассемблере
- •2.4.4. Передача параметров в функции и возврат значений
- •2.5. Взаимодействие подпрограмм на с и ассемблере
- •2.5.1. Описания имен и области их видимости
- •2.5.2. Макросы для работы со стеком при вызове и возврате из функций на ассемблере
- •2.5.3. Вызов подпрограммы на ассемблере из программы на с
- •2.5.4. Вызов подпрограммы на с из подпрограммы на ассемблере
- •37. Разработка обработчиков прерываний. Диспетчер прерываний. Классификация обработчиков прерываний по "быстродействию" и накладным расходам.
2.5.3. Вызов подпрограммы на ассемблере из программы на с
Хорошим стилем программирования считается описание прототипа ассемблерной функции для определения аргументов функции и интерфейса между программой на С и подпрограммой на ассемблере.
Модель run-time среды выполнения определяет некоторые регистры как рабочие (Scratch), а некоторые – как "сохраняемые при вызове" (Call Preserved). Scratch-регистры могут использоваться в ассемблерной подпрограмме без ограничений, не нужно заботиться о восстановлении их старых значений при выходе из подпрограммы. Если рабочих регистров недостаточно, то можно использовать CallPreserved-регистры, однако при входе в функцию следует сохранить их значения, а при выходе – восстановить. Следует стремиться к тому, чтобы использовать выделенные регистры по их прямому назначению (например, для работы со стеком), поскольку компилятор, библиотечные функции и прерывания предполагают именно такое их использование.
Компилятор предполагает, что режимы работы процессора во время выполнения asm-функции не изменяются.
Пример взаимодействия подпрограмм на С и ассемблере.
Текст модуля на языке С #include <stdio.h> int a, b, c, d, e; // прототипы функций int SumC(int u, int v, int x, int y, int z); extern int SumAsm(int u, int v, int x, int y, int z);
int SumC(int u, int v, int x, int y, int z) { int temp1; temp1 = u + v + x + y + z; return temp1; }
int main() { a = 1; b = 5; c = 8; d = 3; e = 10; e = SumAsm(a, b, c, d, e); e = SumC(a, b, c, d, e); return 0; }
|
Код процедуры main() с оптимизацией: … r2=10; // r2 = e r1=3; // r1 = d dm(i7,m7)=r2; // push (e) r8=5; // r8 = b r12=8; // r12 = c r4=m14; // r4 = 1 dm(i7,m7)=r1; // push (d) //сохранить a,b,c,d,e dm(_a)=r4; dm(_b)=r8; dm(_c)=r12; dm(_d)=r1; dm(_e)=r2; // вызов cjump _SumAsm (DB); dm(i7,m7)=r2; dm(i7,m7)=pc; // возврат, результат в r0 – это e modify(i7,2); //очистка стека от параметров // подготовка к следующему вызову r2=dm(_d); // r2 = d dm(i7,m7)=r0; // push (e) r12=dm(_c); // r12 = c r8=dm(_b); // r8 = b r4=dm(_a); // r4 = a dm(i7,m7)=r2; // push (d) dm(_e)=r0; // сохранить e=SumC() // вызов cjump _SumC (DB); dm(i7,m7)=r2; dm(i7,m7)=pc; dm(_e)=r0; // сохранить результат в e modify(i7,2); // очистить стек от параметров … |
Код процедуры SumC без оптимизации (Debug) _SumC: // место под локальную temp и автопеременные modify(i7,-5); // полученные параметры -> в автопеременные dm(-4,i6)=r4; dm(-3,i6)=r8; dm(-2,i6)=r12; // вычисления (без оптимизации) r2=r4+r8; // r2 = u+v r1=r2+r12; // r2 = u+v+x r0=dm(1,i6); // r0 = y (i6+1) r2=r1+r0; // r2 = u+v+x+y r1=dm(2,i6); // r1 = z (i6+2) r0=r2+r1; // r0 = u+v+x+y+z dm(-6,i6)=r0; // temp = r0 // возврат i12=dm(m7,i6); jump(m14,i12) (DB); rframe; nop;
|
Код процедуры SumC с оптимизацией (Release) _SumC: modify(i7,-4); //место под локальную temp (лишнее) r2=dm(2,i6); r2=r2+r4, r1=dm(1,i6); r2=r2+r1, i12=dm(m7,i6); jump(m14,i12) (DB), r2=r2+r12; r0=r2+r8; rframe;
|
Модуль с кодом процедуры SumAsm, написанный вручную #include <def21060.h> #include <asm_sprt.h>
.section/pm seg_pmco; .global _SumAsm;
//int SumAsm(int u, int v, int x, int y, int z)
_SumAsm: r0 = r4+r8, r4 = dm(0x1,i6); // r0=u+v, r4=y; r0 = r0 + r4, r4 = dm(0x2,i6); // r0=u+v+y, r4=z; r0 = r0 + r4, i12=dm(m7, i6); // r0=u+v+y+z jump (m14, i12) (DB), r0 = r0 + r12; // r0=Sum, возврат nop; rframe; |
