]]>]]>
]]>]]>
]]>]]>
]]>]]>
]]>EN]]>
RU

Использование DSP-сопроцессора DM8168 с помощью фреймворка C6Accel

В этой статье мы познакомимся с отладочной платой DM816x/C6A816x/AM389x и фреймворком C6Accel (он же C6EZAccel), а также рассмотрим инструкции по наладке системы для выполнения встроенных тестовых приложений.

Всё началось с интересной идеи использовать алгоритмы нынче очень популярной библиотеки компьютерного зрения OpenCV на микропроцессоре. Однако, изучив немного тему, идея уточнилась. Почему бы не реализовать алгоритмы не просто на ядре ARM, а на специализированном ядре для цифровой обработки сигналов DSP? Тем самым разгрузим ядро ARМ, ускорим выполнение алгоритмов, и, глядишь, самое громоздкое приложение заработает в реальном времени.

Итак, что же использовать для решения задачи? Оказалось вариантов немного…

Рассмотрим всё логично и последовательно. Начнём с того, что позволяет работать с DSP процессором – это фреймворк C6Accel. Хорошо, он поддерживает OpenCV (причем 2.x) только в последней версии – 2.01.00.11. В свою очередь, этот фреймворк написан под микропроцессоры C6A81xx/DM81xx. По названию статьи вы уже догадались, что попался нам под руку DM8168, для работы с которым требуется программный интерфейс TI EZSDK (последняя версия – 5.05.02.00).

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

1. Описание отладочной платы DM816x/C6A816x/AM389x

Вычислительный модуль DM816x/C6A816x/AM389x, разработанный компанией Texas Instruments совместно с Spectrum Digital, позволяет производить разработку на DM816x DaVinci™ MPU (DM8168, DM8167, DM8166, DM8165), на C6A816x C6-Integra™ DSP+ARM процессорах (C6A8168, C6A8167) и на AM389x Sitara™ ARM MPUs (AM3894, AM3892).

Это чудо техники предназначено для широкого спектра решений, таких как видеорегистраторы (DVRs) для наблюдения, системы организации видеоконференций, системы телевизионного вещания, медиасерверы, одноплатные компьютеры, вычислительные шлюзовые машины, маршрутизаторы, серверы, промышленная автоматика, интерфейсы «пользователь-машина» (HMIs), терминалы пунктов обслуживания для сбора данных, машинное зрение, приложения для тестирования, измерения, слежения, контроля и др.

Теперь посмотрим на сам объект. Он состоит из двух блоков печатных плат:

  • вычислительный модуль 8168 (сверху);
  • дочерняя плата расширения входов-выходов (снизу).

Ввиду большого количества компонентов обратим своё внимание только на особо важные.

На рисунке выше изображён вычислительный модуль 8168 со следующими обозначенными компонентами:

Стандартно загрузка платы происходит с флеш-памяти NAND (однако существует много других режимов, например, загрузка с SD-карты), поэтому переключатели №3 и №4 были установлены в нужное положение: SW3[9:0]=”0000010010” и SW4[1:0]=”10” [NAND/SPI].

  1. переключателm №3 (SW3) 
  2. переключателm №4 (SW4) 
  3. Последовательный порт (COM-порт)
  4. Порт HDMI
  5. Порт Ethernet
  6. Порт USB
  7. Компонентный видеоразъем
  8. Слот для SD-карты
  9. Гнездо питания
  10. Переключатель питания
  11. Микропроцессор DM8168 (эмулирует AM3894 и C6A816)

Функциональная диаграмма:

Характерные особенности:
  • VLIW-процессор C674x DSP (до 1 ГГц, тип команд – с фиксированной и плавающей точкой).
  • RISC-процессор ARM Cortex-A8 (до 1,2 ГГц).
  • Укоритель 3D-графики SGX530.
  • Подсистема обработки видео высокой чёткости (HDVPSS).
  • 3 программируемых сопроцессора обработки видео высокой чёткости (HDVICP2), отвечающих за захват, кодирование, декодирование и анализ нескольких видеопотоков, а также поддерживающих стандарты H.264, MPEG4,H263, VC1/RTV, AVS, RV10, ON2, JPEG, MPEG2, DIVX.
  • Широкий набор периферийных модулей:
    • 2 канала Gigabit Ethernet;
    • 2 канала PCI Express;
    • 2 канала SATA с интегрированным физическим уровнем;
    • 2 канала USB 2.0 с интегрированным физическим уровнем;
    • интерфейсы DDR3, MMC/SD, HDMI и DVI.

Для дальнейшей работы мы подключались к компонентам 3, 5, 9 и настраивали переключатели 1, 2, 10.

2. Описание фреймворка C6Accel

C6Accel – абсолютно бесплатный инструмент разработки ПО от Texas Instruments (TI). Он предназначен для упрощения разработки кода DSP на двухъядерных гетерогенных процессорах SoC от TI, а именно для устройств ARM+DSP, которые запускают Linux на ARM и содержат процессор DSP из семейства C6000.

2.1. Из чего состоит C6Accel?

C6EZAccel состоит из алгоритмов цифровой обработки сигналов, которые придерживаются интерфейса алгоритмов под названием ]]>XDAIS]]> (eXpressDsp Algorithm Interoperability Standard). TI также предоставляет фреймворк под названием ]]>Codec Engine]]>, который позволяет эффективно выполнять алгоритмы, написанные с использованием интерфейса XDAIS. TI поставляет все свои кодеки в рамках ПО для SoC и рекомендует использование Codec Engine. C6EZAccel также состоит из библиотеки на стороне ARM, являющейся надстройкой над Codec Engine, который предоставляет APIs (интерфейсы программирования приложений). А они, в свою очередь, позволяют коду приложения на стороне ARM вызывать выполнение алгоритмов XDAIS на DSP. Эта библиотека содержит в себе управление кешем, преобразование адресов, передачу параметров и обработку ошибок из приложения, работающего на ARM.

2.2. Как работает C6Accel?

Код ARM-приложения (или промежуточное ПО, которое его использует) вызывает C6Accel. Он использует оболочку библиотеки APIs и/или Codec Engine, совместимый c iUniversal APIs, которые, как и VISA APIs, используются для вызова Audio/Video/Speech-кодеков. Потом эти APIs просматривают интерфейс Codec Engine и вызывают алгоритм C6Accel на DSP, который идентифицирует вызов функции и задействует соответствующую функциональность на DSP, используя параметры, переданные из приложения.


3. Использование EZSDK и C6Accel

Достаточно теории, приступим к практике. EZSDK 5.05.02.00 поддерживается только в ]]>Ubuntu 10.04 LTS 32-bit]]> или ]]>Ubuntu 11.10 32-bit]]>. Поэтому тем, у кого не установлена одна из этих ОС (конечно же, мы работали под более новой версией), придётся использовать виртуальную машину, например, VirtualBox. Инструкции по её установке и настройке имеются ]]>здесь]]>.

Далее используются следующие обозначения:

  • host $ – команда для выполнения на хосте;
  • target # – команда для выполнения на целевой ОС.

3.1. Установка и сборка EZSDK

Перед началом работы с EZSDK следует скачать и установить компилятор С CodeSourcery Toolchain 2009q-203. Просто распакуйте архив в домашнюю директорию.
Скачайте ]]>EZSDK 5.05.02.00]]> и выполните:

host $ sudo ./ezsdk_dm816x-evm_5_05_02_00_setuplinux

Запустится установщик. Укажите расположение CodeSourcery Toolchain, т. е. /home/%username%/arm-2009q1/bin, и путь для установки EZSDK – /home/%username%/ezsdk.

Разработчики данного ПО позаботились о нас и сделали интерактивный скрипт (одна из причин строгой привязки к версии OC):

host $ export EZSDK="${HOME}/ezsdk"
host $ sudo ${EZSDK}/setup.sh

Скрипт установит необходимые пакеты и попросит уточнить:

  • путь установки целевой файловой системы – /home/%username%/targetfs;
  • путь корневой директории tftp – /tftpboot;
  • путь последовательного порта – /dev/ttyUSB0 (для подключения по USB-порту) или /dev/ttyS0 (для подключения по COM-порту);
  • ip-адрес хост-машины – у каждого свой (например, у нас 10.54.4.44);
  • расположение ядра Linux – 1-е из предложенного списка, т. е. TFTP;
  • расположение корневой файловой системы – 1-е из предложенного списка, т. е. NFS;
  • имя образа ядра, загружаемого из TFTP – uImage-dm816x-evm.bin;
  • создавать ли скрипт для minicom – согласитесь;
  • запускать ли сейчас созданный скрипт – откажитесь.

Cкорректируем этот скрипт: откроем его в текстовом редакторе и заменим текст «mem=364M@0x80000000 mem=320M@0x9FC00000» на «mem=364M», так как в дальнейшем невозможно будет загрузить необходимые модули ядра.

Далее, для выполнения каких-либо операций на плате нужно запустить minicom с настройками, указанными в скрипте, командой:

host $ minicom -S setup_uimage-tftp_fs-nfs.minicom

Далее нужно перезапустить плату.

Теперь при сборке EZSDK возникает проблема из-за отсутствия некоторого компонента. Можно починить, распаковав архив ]]>8272.pcie.tar.gz]]> в директорию /home/%username%/ezsdk/example-applications.

Наконец соберём EZSDK командами:

host $ cd ${HOME}/ezsdk
host $ sudo make all
host $ sudo make install


3.2. Установка и сборка С6Accel

Скачайте ]]>C6Accel 2.01.00.11]]> и выполните:

host $ sudo ./c6accel_2_01_00_11_Linux-x86_Setup.bin

Укажите путь установки /home/%username%/c6accel.

Операционная система реального времени SYS/BIOS является составной частью EZSDK, однако версии позже 6.32.02.09 не поддерживают Real Time Data eXchange (RTDX), который необходим при сборке С6Accel. Поэтому установим ]]>SYS/BIOS 6.32.02.09]]> специально для С6Accel:

host $ sudo ./bios_setuplinux_6_32_02_39.bin

Укажите путь установки /home/%username%/c6accel/bios_6_32_02_39.

Исправим пути в файле Rules.make в /home/%username%/c6accel на следующие:

DVSDK_INSTALL_DIR=$(HOME)/ezsdk
TARGETFS_INSTALL_DIR = $(HOME)/targetfs
C6ACCEL_INSTALL_DIR=$(HOME)/c6accel
BIOS_INSTALL_DIR = $(HOME)/c6accel/bios_6_32_02_39
DSPDEVKIT_INSTALL_DIR= $(DVSDK_INSTALL_DIR)/dsp-devkit
LINUXDEVKIT_INSTALL_DIR = $(DVSDK_INSTALL_DIR)/linux-devkit
PLATFORM = dm816x-evm

И, в конце концов, соберём С6Accel командами:

host $ cd ${HOME}/c6accel
host $ sudo make all
host $ sudo make install


3.3. Выполнение теста DSP

Приятно, что C6Accel содержит в себе пример для тестирования выполнения кода на DSP-процессоре. Выполним скрипт загрузки модулей cmem и dsplink (это библиотеки связки ARM и DSP, с помощью которых грузится CodecEngine) и запустим тестирующие приложение.

target # cd /opt/c6accel_app/c6accel_dsplib_testapp
target # ./loadmodules_ti8168_c6accel.sh
target # ./c6accel_dsplib_testapp


4. Тест сравнения работы функций OpenCV на ARM и DSP

OpenCV (Open Source Computer Vision Library) – библиотека алгоритмов компьютерного зрения, обработки изображений и численных алгоритмов общего назначения с открытым исходным ко-дом. Библиотека написана на C и C++, однако поддерживается Java, Python и др. Работает под Linux, Windows и Mac OS X.

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

Так как библиотека OpenCV является переносимым ПО, её можно скомпилировать в большинстве систем, в которых предусмотрен компилятор C/C++. OpenCV успешно используется на ARM, MIPS, Xscale и других процессорах.

Стоит заметить, что в C6Accel 2.01.00.11 имеются не все функции OpenCV, а лишь 50.

4.1. Установка и сборка OpenCV

Следуйте ]]>инструкциям]]> для сборки ]]>OpenCV 2.2.0]]> под ARM-платформу. При их выполнении помните, что CodeSourcery Toolchain уже установлен.

Скопируем разделяемые библиотеки OpenCV в целевую файловую систему.

host $ cp ${HOME}/build/lib/* ${HOME}/targetfs/usr/lib

4.2. Сборка и выполнение теста

Первая проблема, с которой пришлось столкнуться, – это ошибка при загрузке изображений. Почему-то не нравятся картинки с расширением png, ошибка локализована в функции cvCreateImage. Ладно, изменим на другое расширение, например, bmp. Это можно сделать так:

host $ cd ${HOME}/c6accel/soc/app/c6accel_opencv_testapp/opencv_images
host $ for fname in *.png; do convert "$fname" "$fname.bmp"; done

И конечно, не забудем изменить расширения в исходном коде. В файлах appMain.c и c6accel_opencv_testfxns.c расположенных в директории /home/%username%/c6accel/soc/app/c6accel_opencv_testapp заменим все вхождения строки «.png» на «.png.bmp», для этой цели удобен текстовый редактор gedit с комбинацией клавиш Ctrl+H.

Второй проблемой оказались ошибка при выполнении функции C6Accel_test_Matchshapes и отказ работы функции cvFindCornerSubPix (в связи с известным багом ]]>http://code.opencv.org/issues/963]]>).

В файле appMain.c закомментируем строку с функцией C6Accel_test_Matchshapes. А в файле c6accel_opencv_testfxns.c закомментируем текст со строки 

//cvFindCorner SubPix issue to be resolved

и включительно до строки 

printf("Called ARM FindCornerSubPix function (time: %f ms)\n", t_algo / 1000.0 / n);

Напоследок соберём и запустим тестовое приложение.

host $ cd ${HOME}/c6accel
host $ sudo make opencv_app
host $ sudo make opencv_app_install
target # cd /opt/c6accel_app/c6accel_opencv_testapp
target # ./loadmodules_ti8168_c6accel.sh
target # ./c6accel_opencv_testapp

По результатам можно сделать выводы:

  • У некоторых функций имеется разница между результатами выполнения. Архитектура сигнальных процессоров, по сравнению с микропроцессорами общего применения, имеет некоторые особенности, связанные со стремлением максимально ускорить выполнение типовых задач ЦОС. DSP ориентированы, в первую очередь, на многократное выполнение умножения с расчётом «на лету» адресов перемножаемых элементов массивов. Алгоритм, реализованный на различных базовых операциях, может давать различные результаты.
  • Не все функции работают быстрее на DSP, чем на ARM. Можно заметить закономерность: это функции базовых операции над матрицами или функции, которые в основном из них состоят. Такие «плохие» функции можно выполнять на ARM, в то время как другие пере-нести на DSP. В случае перегрузки процессора ARM использование некоторых «плохих» функций на DSP может быть терпимым.
  • При использовании «хороших» функции на DSP можно достичь улучшения в разы и даже более чем на порядок. Это, как правило, наиболее трудоёмкие функции.

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

Отправить запрос

* Телефон:

международный номер с кодом страны и города

Перезвоним сегодня или на следующий рабочий день. Skype для быстрой связи: sales.promwad

* E-mail:

На вашу почту придет копия отправленного запроса

Сообщение

Тут можно указать ваше имя, название компании, суть запроса и удобное время звонка