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

 


По базе:  

микроэлектроника, микросхема, микроконтроллер, память, msp430, MSP430, Atmel, Maxim, LCD, hd44780, t6963, sed1335, SED1335, mega128, avr, mega128  
  Главная страница > Статьи > Микроконтроллеры

реклама

 




Мероприятия:




AVR32: новый микроконтроллер для мультимедийных приложений

В современном мире растет количество приборов для обработки нетекстовой информации, включаемой в понятие мультимедиа. Мультимедийные данные обрабатываются во всех биометрических приложениях, пользовательских системах позиционирования (GPS), развлекательных приборах для повседневной жизни и прочих устройствах, которые сегодня называют мультимедийными. В данной статье рассказывается о новом аппаратном решении фирмы Atmel, ориентированном на такие задачи - микроконтроллере AP7000 c архитектурой AVR32.

Введение

Всё новые и новые задачи, стоящие перед мультимедийными приборами, требуют выполнения всё более сложных алгоритмов обработки мультимедийной (и не только!) информации, что увеличивает вероятность достижения предела возможностей любого встраиваемого микроконтроллера. Алгоритмы быстрого преобразования Фурье (FFT), инверсного дискретного косинусного преобразования (iDCT) и другие математически-насыщенные алгоритмы, которые редко реализовывались на встраиваемых микроконтроллерах еще несколько лет назад, становятся более востребованными сегодня. В мультимедийных системах такие алгоритмы, как правило, используются для кодирования/декодирования данных, в т.ч. форматов MP3 и MPEG-4. Это требует высокой производительности элементной базы, на которой построены указанные приборы.

Исторически, задача повышения производительности решается за счет увеличения рабочей тактовой частоты процессора либо реализации многоядерных решений (ARM+DSP). По причине высокого энергопотребления такие решения могут использоваться не во всех встраиваемых системах, да и отладка двуядерных микроконтроллеров - задача не из легких. Массогабаритные характеристики портативных приборов определяются не только размерами печатной платы, но и батарей (а чем ниже энергопотребление, тем меньше и легче батарея).

Рассматривая задачу в таком контексте, складываются следующие требования к микроконтроллеру:

  • Высокая производительность
  • Низкое энергопотребление
  • Высокая степень интеграции
  • Простота использования
  • Развитые средства разработки
  • Постановка задачи

Задачей построения микроконтроллера с перечисленными выше требованиями еще в 2001 году занялась группа разработчиков компании Atmel, которая предложила решать её не повышением тактовой частоты, а улучшением архитектуры ядра процессора, который должен выполнить максимальное количество действий за один такт. Были начаты разработки в следующих направлениях:

  1. максимально уменьшить количество инструкций пересылки данных (записи в память/чтения из памяти). Количество команд пересылки данных в RISC-контроллерах составляет порядка 30% от общего числа команд. Каждая из этих команд требует одного и более тактов. Избавление от этих операций должно дать существенный прирост производительности.
  2. увеличить эффективность выполнения каждой инструкции в конвейере за счет операций с множественными данными (SIMD, Single Instruction Multiple Data). Многие алгоритмы, особенно в мультимедийных приложениях, требуют выполнения упорядоченных циклических операций над потоковыми данными. Так, например, при поиске смещения элементов движущихся фрагментов изображения при кодировании/декодировании MPEG-4, требуется вычисление суммы абсолютных разностей (SAD) в макроблоке размером 8х8 (или 16х16) (1), которая находится для каждого пикселя в каждом кадре. Вычисление значения (1) потребует 24 операции на каждый пиксель (а их, допустим, 320х240):

где (x,y) - координаты точки, (dx,dy) - смещение относительно этой точки, Ниже приведен фрагмент кода на С, написанный для выражения (1).

/* From sad.c of the open source xvid codec */
uint32_t sad = 0;
uint32_t j;
uint8_t const *ptr_cur = cur;
uint8_t const *ptr_ref = ref;
for (j = 0; j < 8; j++) {
//Compute SAD for 4 bytes
sad += ABS(ptr_cur[0] - ptr_ref[0]);
sad += ABS(ptr_cur[1] - ptr_ref[1]);
sad += ABS(ptr_cur[2] - ptr_ref[2]);
sad += ABS(ptr_cur[3] - ptr_ref[3]);
//Compute SAD for next 4 bytes
sad += ABS(ptr_cur[4] - ptr_ref[4]);
sad += ABS(ptr_cur[5] - ptr_ref[5]);
sad += ABS(ptr_cur[6] - ptr_ref[6]);
sad += ABS(ptr_cur[7] - ptr_ref[7]);
ptr_cur += stride;
ptr_ref += stride;
}

Если взять за 100% всю операцию декодирования MPEG-4, то приведенный выше фрагмент кода занимает от 60 до 70% этого процессорного времени. Использование инструкций с множественными данными позволит оптимизировать данный алгоритм, так как за один такт можно выполнить несколько однотипных операций с разными входными данными.

  1. повысить производительность машинного цикла за счет использования свободных ресурсов конвейера. Некоторые арифметические операции требуют одного такта на команду, а другие - существенно больше (если нет аппаратного математического акселератора, то на RISC-процессоре операция деления займет 32 такта). Если процессор будет ждать выполнения многотактовой операции до выполнения следующей команды, то эффективность работы всего конвейера снижается. Использование свободных ресурсов конвейера для несвязанных с выполняемой операцией вычислений позволит повысить его эффективность.
  2. минимизировать задержки за счет прогнозирования переходов в циклах. В мультимедийных и криптографических алгоритмах всегда присутствуют блоки кода с внешним и внутренним циклом. Переход к внутреннему циклу может занимать от трех до пяти тактов. Так как таких циклических переходов может выполняться сотни (тысячи, десятки тысяч) в секунду, то задержки на переходы становятся заметными на фоне общего времени выполнения программы. Реализация логики, которая будет прогнозировать переход, позволит снизить до нуля задержку на переход уже после первого прохождения цикла.
  3. Повышение плотности кода. В настоящее время относительная стоимость памяти программ невелика, поэтому мало кто обращает внимание на возможность оптимизации кода в своей программе. Но такой подход не является верным, так как в контроллерах, где используется кэш-память программ, не оптимально написанный код может привести к снижению производительности. Чем компактнее исполняемый код, тем большая полезная часть программы сможет уместиться в кэш-памяти, а это значит, что будет меньше промахов кэш-памяти и меньше обращений к внешней памяти.

Какие результаты были достигнуты?

В начале 2006 года корпорация Atmel анонсировала новое ядро AVR32 и микроконтроллер AT32AP7000 на его основе. Ядро AVR32 показало лучшие значения по производительности и энергопотреблению по сравнению с аналогичными микросхемами, ориентированными на рынок мультимедийных приложений. Так, например, алгоритм iDCT (инверсное дискретное косинусное преобразование) платформа AVR32 может выполнять на 35% быстрее, чем ядро ARM11. Такой запас можно проиллюстрировать по-другому: декодирование с частотой 30 кадров/с видеофрагмента размером "четверть" VGA (QVGA) формата MPEG-4 на платформе AVR32 может выполняться на частоте 100МГц, в то время как ARM11 сможет выполнять эту задачу только на частоте от 150МГц. При выполнении общепризнанных тестов на производительность консорциума EEMBC AVR32 демонстрирует превосходство над архитектурами ARM9 и ARM11. На рисунке 1 приведены нормализованные результаты оценки производительности AVR32, ARM11 и ARM9 (рассчитаны в условных единицах на одинаковой частоте, где большее значение на графике обозначает большую производительность).

Нормализованные результаты оценки производительности AVR32, ARM11 и ARM9
Рис. 1. Нормализованные результаты оценки производительности AVR32, ARM11 и ARM9

Несомненно, разработчикам Atmel удалось создать оригинальное ядро нового поколения, способное конкурировать с лучшими микроконтроллерами для мультимедиа-приложений.

Среди оригинальных нововведений разработчики кристалла выделяют следующие:

  1. Инструкции записи в память/чтения из памяти могут оперировать с байтом (8-бит), полусловом (16-бит), словом (32-бит) и двойным словом (64-бит). Инструкции комбинированы с арифметическими операциями над указателями, что обеспечивает повышение производительности при доступе к таблицам, структурам и локальным переменным. При обмене байтами и полусловами поддерживаются знаковое и нулевое расширения данных.

    Среди популярных криптографических алгоритмов можно выделить алгоритмы блочного шифрования Blowfish и Triple-DES. Все эти алгоритмы используют особую адресацию в массиве данных, требующую длинной последовательности инструкций. Набор инструкций AVR32 оптимален для работы этих алгоритмов благодаря наличию инструкций чтения слова с извлечением указателя.

result = pointer0[offset0 >> 24] ^ 
pointer1[(offset1 >> 16) & 0xff] ^  
pointer2[(offset2 >> 8) & 0xff] ^  (2)
pointer3[offset3 & 0xff];

Выражение (2) включает четыре операции доступа к памяти, которые извлекают по одному байту в 32-разрядном слове, дополняя их нулями, и добавляют к базовому указателю. На RISC-платформах такая операция будет выполнена за 14 инструкций, в то время как AVR32 потребует в два раза меньше операций за счет использования инструкций чтения с извлечением указателя, так как все четыре операции доступа к памяти будут выполнены за 4 такта со значениями смещения (offset0..3), хранящимися в одном регистре. Для повышения эффективности операций ввода-вывода могут быть использованы команды записи в память/чтения из памяти нескольких регистров (ldm, stm). Например, они могут использоваться для быстрого возврата из подпрограмм. В этом случае, при вызове подпрограммы, команда stm будет сохранять в кэш-памяти инструкций адрес возврата, а команда ldm - извлекать его, одновременно записывая это значение в программный счетчик. Это избавит от необходимости выполнения команды возврата в конце подпрограммы.

  1. Ядро AVR32 имеет 3 подконвейера (рис.2) и поддерживает одновременное исполнение несвязанных операций с изменением последовательности, предусмотренной программой. Например, 32-тактная команда деления поступает в блок умножения, а инструкции, следующие за ней, могут выполняться в ALU или блоке пересылки данных в течении этих 32-х тактов.

Конвейер AVR32
Рис. 2. Конвейер AVR32

Для экономии тактов также добавлена функция пересылки результата текущей операции на предыдущие ступени конвейера на случай, если следующая команда использует этот результат. Например, результат инструкции сложения (суммирования) в блоке ALU1 сразу пересылается на вход MUL1, ALU1 и блок адресации данных (Data Address). Это позволяет сразу воспользоваться результатом сложения и не ждать до 3-х тактов, которые потребуются для программной пересылки данных на вход конвейера. Такая функция реализована для всех инструкций AVR32.

  1. Операции с множественными данными (SIMD) позволяют увеличить скорость в 4 раза. Это относится к операциям с 8-разрядными значениями. Например, такая возможность нужна для описанного выше вычисления суммы абсолютной разности, где производится множество арифметических операций с 8-разрядными значениями пикселя.
  2. Функция прогнозирования переходов (ветвлений) в AVR32 обеспечивает минимальные потери тактов при переходах с помощью команд rjmp, rcall и if (в наборе Java-команд). Эта функция выполняется аппаратно и закрыта от программиста.
  3. При разработке системы команд максимальное внимание было уделено плотности результирующего кода при выполнении типичных операций в мультимедиа-приложениях. Помимо этого, хорошие результаты дала совместная работа с фирмой IAR Systems, разработавшей С-компилятор с максимальной на сегодняшний день плотностью генерируемого кода для AVR32 (рис.3: чем меньше столбик, тем меньше размер кода).

Сравнительный размер кода IAR 2.06 и ADS 1.2
Рис. 3. Сравнительный размер кода IAR 2.06 и ADS 1.2

  1. Введены дополнительные инструкции для операционных систем. Особое внимание было уделено обеспечению максимальной совместимости с ОС Linux: эта операционная система может полноценно использовать блок управления памятью (MMU) AVR32 и привилегированный/пользовательский режимы работы ядра AVR32. Для системных вызовов добавлена инструкция SCALL (System CALL), которая обращается непосредственно к подпрограммам ОС; для вызовов приложений добавлена функция ACALL (Application CALL), которая вызывает подпрограммы через 8-битные указатели в таблице переходов операционной системы.
  2. Когда разработчики AVR32 говорят об ультранизком энергопотреблении этой платформы, они имеют ввиду, что AVR32 может выполнять те же задачи, что и другие платформы, но на меньшей тактовой частоте. По приближенным расчетам, можно сказать, что 80% работы по энергосбережению решены за счет системы команд процессорного ядра AVR32, а 20% - на этапе реализации микроконтроллера в кремнии. Последнее достигается за счет размещения устройств хранения данных в непосредственной близости к ядру, так как это позволяет существенно сэкономить время на выполнение математически-насыщенных алгоритмов, требующих частого обращения к памяти, а, следовательно, позволяет снизить тактовую частоту.

Периферийные узлы микроконтроллера AT32AP7000

Первый микроконтроллер AT32AP7000 с ядром AVR32 выпущен с набором периферийных блоков, типичным для решения мультимедийных задач. Функциональная схема AT32AP7000 изображена на рисунке 4.

Функциональная схема AP7000
Рис. 4. Функциональная схема AP7000

Для сбалансированной работы ядра с быстродействующей и, наоборот, медленной периферией, все периферийные блоки были ранжированы по скорости. Самые быстрые узлы (ОЗУ, интерфейс внешней памяти, High-Speed USB и т.п.) были связаны с ядром многоуровневой матрицей шин (Bus Matrix), которая обеспечивает до 16 параллельных и независимых связей между ведущими и ведомыми устройствами по шинам AHB (Advanced Host Bus). Более медленные периферийные устройства (SPI, USART0..3, аудио-ЦАП) подключены к двум шинам APB (Advanced Peripheral Bus), работающим на разных частотах. Шина APB-A имеет рабочую тактовую частоту 37.5МГц, а шина APB-B - 75МГц. Согласование скорости передачи данных между шинами APB и Bus Matrix производится мостами AHB-APB (Advanced Host Bus - Advanced Peripheral Bus).

Для оптимизации энергопотребления микроконтроллера блок управления тактовой частотой (как системной, так и периферийной) имеет функцию динамического деления, которая позволяет регулировать тактовую частоту отдельно для каждой из 4-х вышеперечисленных подсистем. Такая функция полезна, когда интенсивные вычисления не производятся непрерывно во время работы микроконтроллера. Результат работы этой системы при декодировании фрагмента видеозаписи в формате MPEG-4 приведен на рисунке 5. Если принять тот факт, что ток, потребляемый микроконтроллером, пропорционален рабочей тактовой частоте, то можно сказать, что площадь на графике под кривой рабочей частоты пропорциональна энергии, потребленной за приведенный период.

Декодирование MPEG-4 c включением/выключением динамического деления частоты
Рис. 5. Декодирование MPEG-4 c включением/выключением динамического деления частоты

Для освобождения вычислительных ресурсов ядра при операциях обмена потоковыми данными между периферией и памятью, имеется блок прямого доступа к памяти (DMA). Разработчики произвели расчет и получили, что если пересылка данных между памятью и быстродействующей периферией (USB High-Speed, Ethernet и др.) будет производиться под управлением ядра, то его свободных ресурсов для других задач просто не останется. Блок DMA в AP7000 поддерживает обмен данными не только со внутренней памятью, но и со внешней, подключенной по шине EBI (External Bus Interface). Что касается шины EBI, то по ней можно подключать различные виды памяти: SRAM, SDRAM, NAND Flash и CompactFlash.

При реализации типичных математических операций при работе с изображениями могут потребоваться операции векторной математики. Они нужны для таких распространенных задач как, например, цифровой фильтрации изображений (КИХ-фильтров), преобразования его цветовой модели (RBG<->YUV) или масштабирования. Так, например, после декодирования изображения в формате MPEG-4, представленного в YUV-формате, требуется его преобразование в цветовую модель RBG, требуемую для отображения на любом дисплее. Для таких задач в микроконтроллер AP7000 включен сопроцессор для операций векторного умножения (VMU, Vector Multiplication Unit). При использовании этого блока, задача масштабирования изображения выполняется в 10 раз быстрее, чем с использованием ядра микроконтроллера.

Средства разработки

Как было упомянуто выше, для ядра AVR32 фирма IAR Systems разработала компилятор языка С, стоимость которого на российском рынке составит порядка 5000$. В качестве альтернативы этому коммерческому продукту предлагается бесплатный компилятор GCC, который по компактности кода проигрывает в 1.5-2 раза.

В качестве аппаратного средства разработки предлагается стартовый набор STK1000 (рис.6).

Стартовый набор STK1000
Рис. 6. Стартовый набор STK1000

В состав набора включен дистрибутив ОС Linux. Единственным на сегодняшний день недостатком построения системы на базе этой ОС является необходимость использования компилятора GCC, так как продукт IAR Systems не может компилировать проекты на основе Linux.

Заключение

Таким образом, разработчики фирмы Atmel реализовали в ядре AVR32 функции, позволяющие повысить производительность при решении мультимедийных задач, и в выпускающийся на базе этого ядра микроконтроллер AT32AP7000 интегрировали специализированные периферийные узлы. На сегодняшний день ядро AVR32 поддержано как коммерческими, так и бесплатными средствами разработки.

В рамках небольшой обзорной статьи нельзя рассмотреть все возможности такого мощного микроконтроллера. На официальном сайте фирмы Amel размещена полная документация как на процессорное ядро AVR32, так и на микроконтроллер AT32AP7000, и есть руководства по применению с примерами программ. На форуме неофициального сайта AVR добавлен раздел, посвященный AVR32.

Литература

  1. Jo Uthus, Joyvind Strjom. "MCU Architectures for Compute-Intensive Embedded Applications" //www.atmel.com
  2. www.eemoc.org
  3. www.avrfreaks.net

Алексей Курилин, инженер-консультант ЭФО

Статья опубликована в журнале «Электронные компоненты» №9`2006






 
Впервые? | Реклама на сайте | О проекте | Карта портала
тел. редакции: +7 (995) 900 6254. e-mail:info@eust.ru
©1998-2023 Рынок Микроэлектроники