Комплексное руководство по программированию Dsp процессоров с использованием языка сборки
Цифровые процессоры сигналов (DSP) - это специализированные микропроцессоры, предназначенные для высокоскоростных численных вычислений, особенно для задач обработки сигналов, таких как аудио, видео и связь. Программирование этих процессоров эффективно требует глубокого понимания их архитектуры и использования языка ассемблера для оптимальной производительности. Это всеобъемлющее руководство вводит основы программирования процессора DSP с использованием языка ассемблера, с целью оснащения студентов и преподавателей необходимыми знаниями, которые выходят за рамки основных концепций в практические, готовые к производству методы.
Понимание архитектуры DSP
Прежде чем погрузиться в программирование сборки, важно понять архитектуру DSP. Большинство DSP имеют специализированные компоненты, которые отличают их от процессоров общего назначения, что позволяет обрабатывать непрерывные потоки данных в режиме реального времени.
Гарвардская архитектура и несколько автобусов
В отличие от машин фон Неймана, DSP обычно используют модифицированную архитектуру Гарварда с отдельными программными пространствами и пространствами памяти данных. Эта конструкция позволяет одновременно получать доступ к инструкциям и данным через несколько автобусов. Многие DSP включают в себя три или более внутренних автобуса: программную шину, шину чтения данных и шину записи данных. Этот параллелизм имеет решающее значение для выполнения операций с множественным накоплением (MAC) в одном цикле.
Единицы многократного накопления (MAC)
Сердцем любого DSP является выделенный модуль множителя-аккумулятора . MAC выполняет в одном тактовом цикле, тогда как процессор общего назначения может потребовать несколько циклов. Современные DSP часто включают несколько блоков MAC для использования параллелизма на уровне инструкций. Понимание того, как эффективно подавать данные в эти блоки, является основной задачей программирования сборки DSP.
Циркулярные буферы и Modulo адресация
Алгоритмы обработки сигналов часто работают на раздвижных окнах данных. DSP обеспечивают круглые буферы, поддерживаемые аппаратной адресацией модуля. Программист настраивает начальный адрес буфера и длину, а аппаратное обеспечение адресации автоматически оборачивается, когда указатель достигает конца. Эта функция устраняет накладные расходы пограничных проверок в петлях, что делает его необходимым для реализации фильтров и бабочек FFT.
Специализированные адресные режимы
DSP поддерживают несколько режимов адресации за пределами стандартной прямой и косвенной: , обращенной на биты для переупорядочения FFT, , как упоминалось, круговой адресации, и , непрямой регистрации с пост-приращением/декрементом. Эти режимы позволяют использовать шаблоны доступа к данным с нулевым накладным расходом, которые соответствуют потребностям общих алгоритмов. Необходимо глубокое понимание справочного руководства по набору инструкций для вашего конкретного семейства DSP.
Языки сборки для DSP
Язык сборки обеспечивает низкоуровневый контроль над аппаратным обеспечением DSP. В то время как компиляторы высокого уровня улучшились, критические внутренние циклы в обработке сигналов все еще вручную кодируются в сборке для достижения максимальной пропускной способности. Ключевые концепции включают:
- Регистры: DSP обычно имеют специализированные регистровые файлы: регистры данных общего назначения, регистры аккумуляторов (часто шире регистров данных для предотвращения переполнения), регистры указателей для адресации и регистры управления/статуса. Например, Texas Instruments TMS320C55x имеет четыре регистра аккумуляторов (AC0-AC3) по 40 бит каждый.
- Инструкции: Общие инструкции включают [загрузка/магазин]], , , , , и условные ветви.Многие инструкции DSP могут выполняться параллельно со следующей инструкцией, особенностью, часто обозначаемой параллельной строкой в сборочном синтаксисе.
- Форматы инструкций: Слова инструкций DSP часто имеют фиксированную длину для упрощения декодирования. Некоторые семейства используют инструкции переменной длины для уменьшения размера кода. Понимание упаковки кодов операций, режимов адресации и полей регистрации имеет важное значение для ручного кодирования.
- Слоты задержки: Пипелинированные DSP часто выставляют слоты задержки — инструкция после того, как ветвь выполняется до вступления в силу ветви. Программисты должны заполнить эти слоты полезной работой (оптимизация слота задержки ветви).
- Конструкции петли: Аппаратные петли (нулевые накладные петли) являются отличительной чертой DSP. Такие инструкции, как (повторить), (блок-петля)) позволяют блоку кода выполнять определенное количество раз без счетчиков петли программного обеспечения, сохраняя циклы.
Освоение этих основ имеет важное значение для написания эффективных процедур сборки для приложений DSP. Хорошей отправной точкой является работа с учебным пособием по сборке в официальной таблице данных DSP или руководстве программиста для выбранной вами архитектуры.
Создание среды развития DSP
Разработка программ сборки DSP требует специализированных инструментов. Большинство производителей предоставляют интегрированные среды разработки (IDE), которые упрощают рабочий процесс.
Сборщик и линкер
Сборщик переводит исходные файлы сборки в объектный код. Ключевые функции для понимания включают в себя директивы сборщика (например, , , , ), которые управляют размещением кода и определением данных. Линкер объединяет модули объектов и разрешает внешние ссылки, создавая исполняемое изображение. Файлы команд Linker определяют карты памяти и размещение разделов, что имеет решающее значение для удовлетворения временных ограничений.
Симулятор и эмулятор
Перед развертыванием на реальном оборудовании используйте симулятор набора инструкций для тестирования кода. Симуляторы предлагают возможности точного выполнения и профилирования по циклам, позволяющие измерять узкие места производительности. Эмулятор (на основе JTAG) обеспечивает отладку в реальном времени на целевой плате с такими функциями, как точки останова оборудования и буферы трассировки.
Популярные DSP-семейства и инструменты
- Texas Instruments TMS320C6000/C5000: Используйте IDE Code Composer Studio (CCS) с компилятором/ассемблером C6000 или C5000. Обширная документация доступна на портале DSP TI.
- Аналоговые устройства SHARC или Blackfin: Используйте CrossCore Embedded Studio (CCES) для ассемблера.Аналоговые устройства DSP продукты.
- NXP StarCore или MSC815x: Используйте CodeWarrior или эквивалентные инструменты.
- CEVA XC/TL: Инструменты моделирования и отладки, доступные в среде разработки CEVA.
Выберите семейство DSP на основе производительности, мощности и стоимости вашего приложения. Для обучения TI TMS320C5515 Evaluation Module (EVM) является популярным выбором из-за его низкой стоимости и полной библиотеки программного обеспечения.
Методы оптимизации в сборке DSP
Эффективное программирование сборки DSP включает в себя несколько методов, которые непосредственно влияют на производительность в реальном времени.
Программное обеспечение Pipelining
Программное обеспечение перестраивает циклические итерации таким образом, чтобы несколько итераций перекрывались при исполнении. Пролог циклов, ядро и эпилог построены так, чтобы функциональные блоки были заняты каждый цикл. Например, в цикле фильтра FIR одна итерация может загружать следующий коэффициент, пока предыдущий MAC завершается. Этот метод особенно эффективен на VLIW (Very Long Instruction Word) DSP, таких как TMS320C6000.
Loop Unrolling скачать
Развертывание уменьшает накладные расходы на цикл (ветви и обновления указателей), реплицируя корпус цикла несколько раз. При аппаратном циклировании развертывание также может обеспечить лучшую упаковку инструкций. Однако развертывание увеличивает размер кода, поэтому его следует применять только к критически важным для производительности внутренним циклам, которые занимают небольшую часть программы.
Эффективное движение данных
Минимизируйте инструкции загрузки/сохранения, сохраняя часто используемые данные в регистрах. DSP часто имеют ограниченное количество регистров, поэтому распределение регистров жизненно важно. Используйте вращение регистра или круглые регистровые файлы, где это доступно. Кроме того, используйте контроллеры прямого доступа к памяти (DMA) для передачи данных между памятью и периферийными устройствами без вмешательства процессора, освобождая циклы для вычислений.
Использование MAC-подразделений
Используйте многократно аккумулированные инструкции для фильтрации, свертки, корреляции и быстрых преобразований Фурье. Убедитесь, что данные и коэффициенты выровнены должным образом, чтобы MAC мог быть выдан каждый цикл. На многих DSP инструкция MAC может быть сопряжена с двойной нагрузкой или храниться в одном слове инструкции, достигая двух результатов за цикл.
Использование круговых буферов
Для алгоритмов, обрабатывающих потоковые данные (например, адаптивные фильтры, фазовые петли), настраивают в памяти круглые буферы с аппаратной адресацией по модулю. Это устраняет явные граничные проверки и делает корпус петли более быстрым и предсказуемым. Настраивают начальный адрес буфера и длину в регистрах специального блока генерации адресов (AGU).
Расписание инструкций и объединение
На VLIW и суперскалярных DSPs порядок инструкций имеет значение. Устройте инструкции, чтобы избежать задержек трубопровода из-за зависимостей данных. Многие ассемблеры допускают явное параллельное выполнение с токенами . Например, в сборке TMS320C6000:
LDW .D1T1 *A0++, A1 ; load data into A1 || MPY .M1 A1, A2, A3 ; multiply A1 and A2 into A3 (parallel issue)
Объединяя независимые операции в один и тот же пакет выполнения, максимизирует пропускную способность.
Пример: использование фильтра FIR
Рассмотрим возможность внедрения фильтра Finite Impulse Response (FIR) в сборке. Это классический пример обучения DSP. Ключевые шаги включают:
- Настройка кругового буфера для входной истории выборки (линия задержки).
- Загрузка входных образцов и коэффициентов фильтрации в регистры.
- Выполнение многократно аккумулируемых операций для каждого образца.
- Хранение отфильтрованного вывода обратно в память.
Псевдосборка для FIR-фильтра TMS320C55x (N-капсул)
Предполагая буфер длины N, матрицу коэффициентов и новый образец в :
- Инициировать указатель на круговой буферный старт (например, в качестве буферного указателя, в качестве буферного размера).
- Напишите новый образец для буферизации в текущем положении (модульные адресные ручки обертывают).
- Установите количество циклов на N-1 (аппаратный цикл).
- В каждой итерации: загрузите образец данных и коэффициент, затем выполните MAC.
- После цикла храните аккумулятор для вывода и обновления указателя.
На C55x это можно сделать с помощью однократной (RPT) или блок-повторной (RPTB) конструкции. Ключевые инструкции: с круговой адресацией, и для управления аккумулятором. Фактический код будет варьироваться в зависимости от размеров операнда (16-битный или 32-битный) и требований к насыщению.
Оптимизация примечания
Для достижения одного MAC за цикл, убедитесь, что данные и коэффициент доступа не конфликтуют на внутренних шинах. Если DSP имеет два пространства памяти данных (например, отдельная память для коэффициентов и данных), поместите их в различные блоки памяти, чтобы позволить параллельные нагрузки. Кроме того, рассмотрите возможность использования команд dual-MAC , если DSP поддерживает их (некоторые выполняют два MAC за цикл).
Для фильтров более высокого порядка рассмотрите возможность разложения фильтра на параллельные секции (полифазная реализация) или с использованием распределенной арифметики. Каждая оптимизация должна быть сбалансирована с размером кода и временем разработки.
Расширенные приложения: IIR фильтры и FFT
Фильтры Infinite Impulse Response (IIR)
Фильтры ИДК требуют обратной связи с предыдущими выходами, что создает зависимости данных, которые ухудшают производительность трубопровода.
- Использование структур прямой формы I или транспонированной прямой формы II для минимизации переменных состояния.
- Объединение операций MAC в секциях биквада.
- Предварительная вычисление частичных сумм для уменьшения задержки.
Поскольку стабильность является проблемой в DSP с фиксированной точкой, обработка переполнения (насыщение или масштабирование) должна быть тщательно интегрирована в код сборки.
Быстрая трансформация Фурье (FFT)
FFT является основой спектрального анализа и OFDM модемов. Оптимизация сборки для FFT включает в себя:
- , обращенная в сторону бита для переупорядочения ввода.
- Программное обеспечение для вытягивания ядра бабочки.
- Использование таблиц коэффициента вертепа, хранящихся в отдельном банке памяти.
- Использование комплексного умножения с помощью DSP-специфических инструкций (например, или со сложными числами).
Радикс-2 децимация-в-время FFT бабочка может быть написана менее чем в 10 циклах инструкций на современном VLIW DSP. Достижение этого требует глубоких знаний конвейера и тщательного назначения регистра. Многие производители предоставляют оптимизированные FFT-библиотечные процедуры; изучение их - отличный способ изучить передовые методы кодирования.
Общие подводные камни и советы по отладке
Даже опытные разработчики сталкиваются с тонкими ошибками в сборке DSP. Вот общие проблемы и как их избежать:
- Опасности трубопроводов: Вводить NOP только при необходимости; использовать программную пиплайновую обработку для устранения ларьков.
- Неправильная конфигурация кругового буфера: Дважды проверьте, что размер буфера равен мощности двух, если это требуется для адресации аппаратного модуля.
- Перелив: ДСП обеспечивают аккумуляторные биты защиты, но они все еще могут переполняться в крайних случаях. Используйте инструкции по насыщению или масштабированию для предотвращения искажений.
- Выравнивание памяти: Многие DSP требуют, чтобы 32-битные или 64-битные доступы были выровнены с их естественными границами.
- Обработка прерываний: Сохранить и восстановить все регистры, используемые в процедурах обслуживания прерываний (ISR), включая байты расширения аккумулятора. Используйте минимальное количество инструкций для достижения приемлемого ответа в реальном времени.
- Инструменты отладки: Используйте дизассемблированный вид в IDE, чтобы проверить, что ассемблер генерировал ожидаемый машинный код. Используйте точки разрыва с условием, чтобы зацепиться за конкретные значения регистра. Для отладки в реальном времени используйте логический анализатор на внешней шине памяти для наблюдения за движением данных.
Заключение
Программирование DSP-процессоров на языке ассемблера предлагает беспрецедентный контроль и эффективность для задач обработки сигналов. Понимание архитектуры, освоение инструкций по сборке и применение методов оптимизации жизненно важны для разработки высокопроизводительных приложений. С правильными инструментами и знаниями, включая знакомство с архитектурой Гарварда, блоками MAC, круглыми буферами и программной конвейерировкой, студенты и преподаватели могут использовать весь потенциал технологии DSP для различных реальных приложений, таких как аудиокодеки, обработка радаров, программно-определяемые радиоприемники и управление двигателем. В то время как современные компиляторы продолжают улучшаться, способность читать, писать и настраивать код сборки остается ценным навыком, который отделяет опытных разработчиков DSP от остальных.