You are on page 1of 53

Міністерство освіти і науки України

Дніпровський національний університет

С.М.Вовк

Методичні вказівки до виконання


лабораторних робіт з курсу

“ЦИФРОВІ СИГНАЛЬНІ ПРОЦЕСОРИ”

Дніпропетровськ
2017
2
Лабораторна робота 1

Тема. Інтегроване середовище програмування VisualDSP++.


Мета. Освоєння програмних засобів середовища VisualDSP++ зі складання,
завантаження та виконання програм, призначених для сигнальних процесорів серії
Blackfin.

Основні відомості. Сигнальні процесори належать до класу спеціалізованих


мікропроцесорів. Вони розроблені для розв'язку задач цифрової обробки сигналів,
прикладами яких є задачі фільтрації, згортки, обчислень кореляційної та автокореляційної
функцій сигналів, а також прямого та оберненого дискретних перетворень Фур'є. Звичайно
задачі цифрової обробки розв'язуються в апаратурі зв'язку і передачі даних, засобах гідро- і
радіолокації, медичному устаткуванні та робототехніці, керуванні двигунами, в
автомобільній електроніці, телебаченні, вимірювальній техніці, тощо. Відмінною ознакою
задач цифрової обробки сигналів є потоковий характер обробки великих обсягів даних у
реальному режимі часу. Робота у реальному часі потребує підвищенної швидкодії
мікропроцесорів, а обробка великих масивів даних – відповідних апаратних засобів
інтенсивного обміну даними з зовнішніми пристроями.
Висока швидкодія сигнальних мікропроцесорів досягається завдяки: 1) застосуванню
модифікованої RISC-архітектури; 2) проблемно-орієнтованій системі команд, наприклад,
включенню в систему команд таких операцій, як множення з накопичуванням; 3)
застосуванню способів скорочення тривалості командного циклу, наприклад, за рахунок
конвеєризації команд; 4) розміщенню операндів для більшості команд у регістрах
мікропроцесора; 5) використанню тіньових регістрів для збереження стану обчислень під час
перемикання контексту задачі; 6) наявності апаратного множення, що дає змогу виконувати
множення двох чисел за один командний такт; 7) апаратній підтримці програмних циклів.
Сигнальні процесори різних компаній-виробників поділяють на два основні класи:
мікропроцесори обробки даних у форматі з фіксованою комою та мікропроцесори, що
апаратно підтримують операції над даними у форматі з плаваючою комою. Мікропроцесори
з фіксованою комою більш придатні для потокової обробки відео та звукової інформації, яка
звичайно подається цілими числами, тоді як дійсні обчислення виконуються відповідними
алгоритмами, які реалізують обчислення з плаваючою комою. Серед множини сигнальних
процесорів [1, 2] з фіксованою комою, які призначені саме для обробки відео та звукової
інформації, можна зазначити сигнальний процесор TMS320C80 (Multimedia Video Processor)
фірми Texas Instruments та сигнальні процесори серії Blackfin фірми Analog Devices.
Сигнальні процесори серії Blackfin [3-9] є сучасними потужними програмно-
апаратними засобами обробки великих за обсягом потоків аудіо та відеоінформації, а також
обробки одновимірних аналогових сигналів різного походження. Для програмування
сигнальних процесорів серії Blackfin використовується інтегроване середовище розробки
програм VisualDSP++ v.4.0, яке встановлюється та працює під ОС Windows XP або 2000.
Зазначене програмне середовище VisualDSP++ застосовується як кросове програмне
забезпечення, що забезпечує складання програм для сигнальних процесорів обраного типу
(які вказані в переліку середовища), завантаження програм до сигнального процесору
(наприклад, через USB-інтерфейс) та виконання програм сигнальним процесором з аналізом
його стану та проміжних результатів (вмісту регістрів, пам'яті, тощо) з загальною метою
налаштування та тестування розробленої програми.
Розробка програм для сигнальних процесорів серії Blackfin в інтегрованому
середовищі VisualDSP++ v.4.0 виконується мовою високого рівня С з можливістю залучення
мови Assembler, яка відповідає системі машинних команд обраного сигнального процесора.
Програмування мовою Assembler застосовується для отримання більш досконалого
програмного коду певної частини програми (підпрограми) у порівнянні з програмним кодом,
який можна отримати після компіляції С-коду тієї ж самої частини програми. Перелік
3
інструкцій мови Assembler для сигнальних процесорів серії Blackfin зазначено в довідковій
службі середовищі VisualDSP++ та у відповідних довідниках [10].
Процес програмування сигнального процесора серії Blackfin за допомогою
інтегрованого середовища VisualDSP++ має наступні головні етапи: 1) складання програми;
2) компіляція програми; 3) створення завантажувального файлу за типом .dxe; 4)
завантаження завантажувального файлу (програми) до сигнального процесора; 4) виконання
завантаженої програми. Зазвичай етапи компіляції, завантаження та виконання програми
йдуть неперервно один за одним, що визначається налаштуваннями інтегрованого
середовища VisualDSP++ за замовченням. Якщо ж інтегроване середовище VisualDSP++
налаштоване інакше, то ці етапи можуть потребувати окремого виконання.
Складання програми для сигнального процесора серії Blackfin виконується мовою С
та мовою Assembler у вигляді певних програмних текстів, які оформлюють в один чи
декілька файлів з відповідним розширенням (.c або .asm) та які остаточно збирають у певний
проект з розширенням .dpj . Наявність проекту дозволяє знехтувати прологом (заголовком) з
машинних інструкцій програми для сигнального процесора, які компілятор генерує
автоматично, і тому текст програми не буде "обтяженим" зайвими операторами (командами).
Як і для будь-якого іншого С-компілятора, текст програми для сигнального процесора на
мові С складається з головної функції int main() та допоміжних функцій, що встановлюють
потрібну функціональність розроблюваної програми. Як вже було зазначено, допоміжні
функції не обов'язково розташовувати в одному файлові з головною функцією.
Компіляція програми та створення завантажувального файлу проекту програми
виконуються неперервно одне за одним. Якщо текст програми має помилки, то компілятор
повідомляє про них у відповідному вікні (Output window), і створення завантажувального
файлу не відбувається. В іншому випадку (тобто при відсутності помилок в тексті програми)
автоматично виконується побудова (Build) завантажувального файлу з розширенням .dxe .
Якщо завантажувальний файл автоматично не завантажений до сигнального
процесора, то його слід завантажити (Load). Для цього можна натиснути комбінацію клавіш
Ctrl+L, яка призводить до передачі завантажувального файлу з комп'ютера через USB-
інтерфейс до плати сигнального процесора.
Запуск програми на виконання з середовища VisualDSP++ виконується шляхом
натиску клавіші F5.
Далі надаються відомості щодо завантаження середовища VisualDSP++, відкриття
проекту, його компіляції, створення завантажувального файлу та запуску програми на
виконання. При цьому використовуються приклади, подані в "Довіднику з використання"
середовища VisualDSP++.
Завантаження VisualDSP++ та відкриття проекту. Для завантаження середовища
VisualDSP++ та відкриття проекту необхідно виконати наступні дії.
1. Натиснути кнопку "Пуск" середовища Windows та послідовно обрати пункти Programs,
Analog Devices, VisualDSP++ 4.0 та VisualDSP++ Environment. Після цього з'явиться
головне вікно середовища VisualDSP++ 4.0 та буде завантажений останній проект. Далі
необхідно закрити цей проект, обравши пункт Close з меню File та натиснувши кнопку
No у відповідь на запит про збереження проекту.
2. В меню File обрати Open та потім Project. Середовище VisualDSP++ відкриє діалогове
вікно Open Project.
3. У віконці Look in відкрити папку за маршрутом:
c:\Program Files\Analog Devices\VisualDSP 4.0\Blackfin\Examples\Tutorial\dot_product_c.
4. Обрати файл проекту dotprodc.dpj. Після цього середовище VisualDSP++ завантажить
обраний файл проекту в вікно Project.
Завантажений проект складається з двох С-файлів dotprod.c та dotprod_main.c, які
визначають масиви та обчислюють їх по елементний добуток.
5. В меню Settings обрати Preferences для відкриття діалогового вікна Preferences.
4
6. На сторінці General під General Preferences упевнитися, що наступні опції є обраними:
"Run to main after load"
"Load executable after build"
7. Натиснути OK для закриття вікна Preferences dialog. Після цього знову з'явиться головне
вікно середовища VisualDSP++. Тепер все готове для побудови проекту.
Побудова проекту. Для побудови (компіляції та створення завантажувального файлу)
проекту dotprodc необхідно виконати наступні дії.
1. В меню Project обрати Build Project. В результаті цієї дії середовище VisualDSP++
спочатку перевіряє та оновлює зв'язки проекту і потім будує проект на основі вихідних
файлів проекту, а в вікні Output відображаються повідомлення про стан компіляції
(інформація про помилки та результат компіляції). Якщо буде знайдено помилку, то,
вказавши мишею на ім'я файлу з помилкою, можна відкрити вихідний файл з помилкою в
вікні редактора та відкоригувати цю помилку. Після цього слід перебудувати проект (для
цього краще використовувати команду Rebuild All). Якщо побудова проекту виконана без
помилок, у вікні Output з'явиться повідомлення "Build completed successfully".
В подальшому розгляді вважається, що текст файлу dotprod_main.c вміщує помилку,
бо замість назви цілочислового типу int написано itn. В цьому випадку компілятор генерує
помилку.
2. При наявності помилки необхідно вказати мишею на текстове повідомлення про
помилку в вікні Output. В результаті цього середовище VisualDSP++ відкриє вихідний файл
dotprod_main.c в вікні редактора на помістить курсор на рядок з помилкою (рис. 1).

Рис.1. Вікно Output та вікно редактора

Вікно редактора повідомляє про помилку в тексті програми.


3. В вікні редактора необхідно виправити помилку, замінивши itn на int.
4. Після виправлення помилок необхідно зберегти новий текст, обравши в меню File
пункт Save, а потім File dotprod_main.c.
5. Після збереження тексту слід знову обрати в меню Project пункт Build Project. Тепер
проект повинен бути побудованим без жодних помилок, що повинне бути видним з
повідомлень в вікні Output.
5
Тепер проект є побудованим успішно і можна завантажувати програму.
Завантаження програми. Перед запуском програми слід встановити сесію
налагодження програми та відповідні вікна для контролю за її роботою.
У разі, якщо на сторінці General діалогового вікна Preferences dialog було обрано Load
executable after build, то завантажувальний файл dotprodc.dxe, який було створено під час
побудови проекту, буде автоматично завантажено до плати сигнального процесора. Якщо ж
сесія налагодження не збігається з цільовою платформою (тобто код створено для BF539, а
цільовою платформою є BF533), то VisualDSP++ вкаже на невідповідність та зробить запит
на зміну цільової платформи перед завантаженням програмного коду до плати сигнального
процесора, відкривши для цього вікно Session List. Якщо VisualDSP++ не відкриває вікно
Session List, то наступні пункти 1-4 можна пропустити.
Встановлення сесії налагодження виконується за наступним алгоритмом:
1. В вікні Session List оберіть New Session для відкриття вікна New Session.
2. Вкажіть цільову платформу та процесор відповідно до табл.1.

Таблиця 1. Специфікація сесії


Box Value
Debug Target ADSP-BF5xx Blackfin Family Simulator
Platform ADSP-BF5xx Single Processor Simulator
Session Name ADSP-BF533 Simulator
Processor ADSP-BF533

3. Натисніть OK для закриття вікна New Session та повернення до вікна Session List.
4. Вкажіть на нове ім'я сесії (цільової платформи), яке повинне бути виділено
кольоровою смугою, та натисніть кнопку Activate. Примітка: якщо Activate не натиснути, то
знову буде повідомлення про невідповідність сесії.
Після цих дій вікно Session List зачинеться, а завантажувальний файл dotprodc.dxe
автоматично завантажиться до сигнального процесора та буде готовим до запуску з точки
входу в головну функцію main().
5. Прогляньте інформацію у відкритих вікнах, причому:
- вікно Output на сторінці Console вміщує повідомлення про стан сесії налагодження. В
даному випадку VisualDSP++ повідомляє, що завантаження файлу dotprodc.dxe успішно
завершено;
- вікно Disassembly показує асемблерний код програми;
- червоний кружок та жовта стрілка з'явилися в місці старту програми. Червоний кружок
вказує, що точка зупину встановлена на цій інструкції, а жовта стрілка вказує, що
процесор зупинено на цій інструкції. Коли VisualDSP++ завантажує С-програму, він
автоматично встановлює дві точки зупину: одну - на початку і одну - в кінці коду
програми.
6. В меню Settings оберіть Breakpoints для прогляду точок зупину, що встановлені в
програмі. VisualDSP++ відобразить в вікні Breakpoints всі встановлені точки зупину.
Для даного прикладу встановлені наступні точки зупину:
 at main + 0x4
 at __lib_prog_term
Діалогове вікно Breakpoints дозволяє бачити, додавати та видаляти точки зупину. В
вікні Disassembly та в вікні редактора також можна додати або видалити точки зупину,
вказуючи мишею на відповідний рядок коду.
7. Натисніть OK або Cancel для закриття вікна Breakpoints.
Запуск програми. Для запуску програми dotprodc слід натиснути кнопку Run ( )
або вибрати в меню Debug пункт Run. В цьому випадку VisualDSP++ обчислює добуток та
відображає на сторінці Console у вікні Output наступні результати:
6
Dot product [0] = 13273595
Dot product [1] = –49956078
Dot product [2] = 35872518

Створення нового проекту. Для створення нового проекту необхідно виконати


наступні дії.
1. В меню File оберіть Close і потім Project dotprodc для закриття проекту dotprodc.
- Натисніть Yes на запитання про закриття усіх відкритих вікон.
- Якщо проект був змінений під час цієї сесії, буде видано запитання про збереження
проекту. Натисніть No.
2. В меню File оберіть New, а потім Project для відкриття Project Wizard.
3. Натисніть кнопку огляду праворуч від поля Directory для відкриття діалогового вікна
Browse For Folder. Розташуйте dot_product_asm в директорії Tutorial і натисніть OK.
За замовченням ця директорія має наступне місце розташування:
Program Files\Analog Devices\VisualDSP 4.0\Blackfin\ Examples\Tutorial\dot_product_asm
У полі Directory не повинно бути назв кирилицею, бо інакше буде помилка компіляції.
4. В полі Name задайте dot_product_asm і натисніть Finish. Новий проект буде створений
і показаний у вікні Project.
5. В меню Project оберіть команду Project Options і буде відображене діалогове вікно
Project Options. Це діалогове вікно дозволяє визначити інформацію для побудови
проекту.
6. Діалогове вікно Project Options має наступні сторінки: Project, General, Compile,
Assemble, Link, Load, Pre-Build, і Post-Build. На кожній сторінці визначені опції, які
використовуються для побудови проекту.
7. Перевірте, щоб на сторінці Project були задані значення відповідно до табл.2.

Таблиця 2. Значення полів сторінки Project


Поле Значення
Processor ADSP-BF533
Revision Automatic
Type Executable file
Name dot_product_asm
Settings for configuration Debug

Ці значення визначають, що побудова виконувального файлу відбувається для


процесору ADSP-BF533. Виконувальна програма містить налагоджувальну інформацію, яка
дозволяє дослідити виконання програми.
8. Натисніть Compile і на сторінці Compile визначте значення для елементів групи Code
Generation.
9. Для визначення значень для елементів групи Code Generation необхідно:
- встановити прапорець Enable optimization для того, щоб дозволити оптимізацію;
- встановити прапорець Generate debug information для того, щоб дозволити
генерувати інформацію налагодження для мови С. Крім того, ця установка керує
С-компілятором для оптимізації коду процесора ADSP-BF533. Оскільки
оптимізація використовує переваги DSP архітектури та особливості мови
Assembler, то деяка налагоджувальна інформація С не зберігається. Тому
налагодження виконується завдяки налагоджувальній інформації на рівні мови
Assembler.
10. Натисніть OK, щоб застосувати зміни опцій проекту и закрити діалогове вікно Project
Options. Коли буде видано запит про додавання підтримки для ядра VisualDSP++, то
натисніть No.
7
Додавання вихідних файлів до dot_product_asm. Для додавання вихідних файлів до
нового проекту необхідно виконати наступні дії.
1. Натисніть кнопку Add File або з меню Project виберіть Add to Project і потім оберіть
File(s). Після цього з'явиться діалогове вікно Add Files.
2. В полі Look in розташуйте папку проекту dot_product_asm.
3. В полі Files of type виберіть All Source Files зі списку.
4. Утримуючи натиснутою клавішу Ctrl, виберіть файли dotprod.c та dotprod_main.c.
Потім натисніть Add. Після цього відобразяться файли, які були додані на 4-му кроці,
та відкриється папка Source Files у вікні Project.
Створення Linker Description File. В цій процедурі використовуєтся Expert Linker
для створення Linker Description File для проекту.
Для створення Linker Description File (LDF) необхідно виконати наступні дії:
1. В меню Tools оберіть Expert Linker і потім оберіть Create LDF для відкриття Create
LDF Wizard.
2. Натисніть Next для відображення сторінки Create LDF – Step 1 of 3. Ця сторінка
дозволяє призначити LDF filename (формується з імені проекту) і вибрати Project type.
3. Приміть обрані значення для проекту і натисніть Next для відображення сторінки
Create LDF – Step 2 of 3. Ця сторінка дозволяє встановити тип системи System type (за
замовченням однопроцесорна), тип процесора Processor type (за замовченням ADSP-
BF533 для відповідного проекту) та ім’я зв’язаного файлу для виведення даних Output
file (за замовченням ім’я береться з проекту).
4. Приміть значення за замовченням і натисніть Next для відображення сторінки Create
LDF – Step 3 of 3.
5. Перегляньте підсумок вибору і натисніть Finish для створення .LDF файлу.
- Зараз є новий .LDF файл у проекті. Новий файл знаходиться в папці Linker Files у
вікні Project.
- Вікно Expert Linker відкриється з відображенням нового .LDF файлу. Закрийте
вікно Expert Linker.
6. Натисніть кнопку Rebuild All, щоб побудувати проект. Вихідний С файл
відкривається у вікні редактора і виконується зупинка виконання.
Версія С-проекту тепер є повною. Далі можна змінити вихідні файли, щоб викликати
асемблерну функцію.
Зміна вихідних файлів проекту. Для цього необхідно виконати наступні дії:
- Змінити dotprod_main.c, щоб викликати a_dot_c_asm замість a_dot_c.
- Зберегти змінений файл.
Для того, щоб змінити dotprod_main.c для виклику асемблерної функції, виконайте
наступні дії:
1. Змініть розмір або максимізуйте вікно редактора для кращого перегляду.
2. В меню Edit виберіть Find для відкриття діалогового вікна Find.
3. В полі Find What введіть /* и натисніть Mark All.
- Помічаються усі рядки редактора, в яких є /*, і курсор переміщується туди, де
вперше зустрічається /* – на extern int a_dot_c_asm.
4. Виділіть символи коментаря /* і використовуючи комбінацію клавіш Ctrl+X виріжіть
символи коментаря з початку оголошення a_dot_c_asm. Перемістіть курсор на один
рядок вверх та використовуючи комбінацію клавіш Ctrl+V вставте символи коментаря
на початок оголошення a_dot_c. Оскільки синтаксичне розфарбування включене, то
код змінить колір, як тільки будуть вирізані та вставлені символи коментаря.
- Повторіть цей крок для символів кінця коментаря */ наприкінці оголошення
a_dot_c_asm. Оголошення a_dot_c зараз повністю прокоментоване і оголошення
a_dot_c_asm більше не прокоментоване.
5. Натисніть F2, щоб перейти до наступної помітки.
8
- Редактор переміщує курсор на /* в функцію виклику a_dot_c_asm, яка є
закоментованою. Зверніть увагу, що попередній рядок є функцією виклику
підпрограми a_dot_c.
6. Натисніть Ctrl+X для того, щоб вирізати символи коментаря з початку виклику
функції a_dot_c_asm. Потім перемістіть курсор на один рядок вверх і натисніть
Ctrl+V, щоб вставити символи коментаря на початок виклику a_dot_c.
- Повторіть цей крок для символів кінця коментаря */. Функція main() зараз викликає
підпрограму a_dot_c_asm замість функції a_dot_c.
7. В меню File оберіть Save, а потім File dotprod_main.c, щоб зберегти зміни в файлі.
8. Помістіть курсор у вікно редактора. Потім з меню File оберіть Close і потім File
dotprod_main.c для закриття файлу dotprod_main.c.
Використання Expert Linker для зміни dot_prod_asm.ldf. Для цього необхідно
виконати наступні дії:
- Розглянути в Expert Linker представлення створеного .LDF файлу.
- Змінити .LDF файл, щоб відобразити розділ a_dot_c_asm ассемблерної
підпрограми.
Дослідіть і потім змініть dot_prod_asm.ldf для зв’язку з ассемблерною функцією:
1. Натисніть кнопку Add File.
2. Виділіть dotprod_func.asm і натисніть Add.
3. Побудуйте проект, виконавши одну з цих дій:
- Натисніть кнопку Build Project.
- В меню Project оберіть Build Project.
4. У вікні Project виконайте подвійний щелчек на файлі dot_prod_asm.ldf. Вікно Expert
Linker відкриється з графічним представленням цього файлу.
- Змініть розмір вікна для кращого перегляду і змініть режим перегляду. Щоб
відобразити дерево перегляду натисніть праву кнопку миші в правій області вікна,
оберіть View Mode, а потім оберіть Memory Map Tree.
- Ліва область вікна (Input Sections) містить список вхідних розділів, які є у проекті,
або відображені в .LDF файлі. Червоний хрест на іконці попереду розділу з іменем
“my_asm_section” означає, що Expert Linker визначив, що цей розділ не
відображено в .LDF файлі.
- Права область вікна (Memory Map) містить представлення сегментів пам’яті, які
Expert Linker визначив, коли створював .LDF файл.
5. Відобразіть my_asm_section у сегменті пам’яті з іменем MEM_PROGRAM наступним
чином:
- В області вікна Input Sections відкрийте секцію my_asm_section, натиснувши на
знак плюс попереду неї. Вхідна секція розкриється і буде видно, що зв’язані
макроси $COMMAND_LINE_OBJECTS та $OBJECTS, та об’єктний файл
dotprod_func.doj мають секцію, яка не була відображена. В області вікна Memory
Map розкрийте MEM_L1_CODE та перетащіть іконку попереду $OBJECTS на
вихідну секцію program_ram, яка знаходиться в MEM_L1_CODE.
- Як показано на рис.2, червоний хрест повинен зникнути, тому що секція
my_asm_section була відображена.
9

Рис.2. Перетаскування $OBJECTS на вихідний розділ програми

6. В меню Tools оберіть Expert Linker, а потім Save, для того щоб зберегти змінений
файл. Потім закрийте вікно Expert Linker.
- Якщо не зберегти файл і потім перебудувати проект, VisualDSP++ побачить, що
був змінений файл і збереже його автоматично.
Перебудова та запуск dot_product_asm. Для запуску dot_product виконайте наступні
дії:
1. Побудуйте проект, виконавши одну з цих дій:
- Натисніть кнопку Build Project на панелі інструментів.
- В меню Project оберіть Build Project.
- В кінці побудови у вікні Output на вкладинці Build відобразиться повідомлення:
“Build completed successfully.”
- VisualDSP++ завантажить програму, запустить main і відобразить вікна Output,
Disassembly і вікно редактора.
2. Натисніть кнопку Run для запуску dot_product_asm.
- Програма обчислює три скалярні добутки і відображає результати у Console вікна
Output. Коли програма зупиняє виконання, повідомлення “Halted” з’являється в
рядку стану (внизу головного вікна VisualDSP++). Результати, показані нижче,
ідентичні результатам одержаним раніше.
Dot product [0] = 13273595
Dot product [1] = –49956078
Dot product [2] = 35872518

Завантаження програми FIR для скінченно-імпульсної фільтрації цифрових


даних. Для завантаження програми FIR необхідно виконати наступні дії:
1. Залиште відкритими вікно Disassembly та сторінку Console вікна Output, але закрийте
всі інші вікна.
2. В меню File оберіть Load Program або натисніть кнопку Load на панелі інструментів.
Відкриється діалогове вікно Open a Processor Program.
3. Оберіть FIR програму для завантаження наступним чином:
1) Відкрийте папку Analog Devices і оберіть:
VisualDSP 4.0\Blackfin\Examples\Tutorial\fir
2) Потім оберіть підпапку Debug.
3) Оберіть FIR.DXE для завантаження програми.
- Якщо VisualDSP++ не відкрив вікно редактора, то натисніть правою
кнопкою миші у вікні Disassembly і оберіть View Source.
10
4. Перегляньте вихідний текст програми FIR. В ньому є два глобальних масиви даних:
IN та OUT. Також є функція fir, яка використовує ці масиви.
Відкриття вікна графіка. Для відкриття вікна графіка виконайте наступні дії:
1. В меню View оберіть Debug Windows і Plot, а потім New, для того щоб відкрити
діалогове вікно Plot Configuration.
В ньому додаються набори даних, які потрібно переглянути у вікні графіка.
2. В групі Plot визначіть наступні значення:
- В полі Type виберіть Line Plot зі списку.
- В полі Title наберіть fir.
3. Введіть два набори даних для побудови графіка, використовуючи значення, які
наведені в табл. 3.

Таблиця 3. Два набора даних: Input and Output


Набір даних Набір даних
Поле Опис
Input Output
Name Input Output Набір даних
BLACKFIN BLACKFIN
Memory Пам’ять даних
Memory Memory
Адреса цього набора даних – вхідний або
вихідний масив.
Address IN OUT
Натисніть Browse для вибору значення зі
списку завантажуваних символів.
Масив довжиною 260 елементів, але графік
Count 128 128
будується для перших 128 елементів.
Stride 1 1 Дані суміжні в пам’яті.
Data short short Input і Output – масиви цілих значень.

- Після введення кожного набору даних, натисніть Add для додавання набору даних
до списку Data sets в лівій частині діалогового вікна.
- Діалогове вікно Plot Configuration повинно зараз нагадати рис. 3.
4. Натисніть OK для того, щоб застосувати зміни і відкрити вікно графіка з цими
наборами даних.
- Вікно графіка зараз відображає два масиви. За замовченням, симулятор ініціалізує
пам’ять нулями, тому набір даних Output відображається як одна горизонтальна
лінія.
Примітка: зміна розмірів вікна графіка змінює масштаб осей x та y.
5. Натисніть правою кнопкою миші на вікні графіка і оберіть Modify Settings. На
сторінці General в групі Options виберіть Legend і натисніть OK для відображення
поля умовних позначень.
11

Рис.3. Діалогове вікно Plot Configuration з наборами даних Input/Output.

Запуск програми FIR і перегляд даних. Для запуску програми FIR і перегляду даних
необхідно:
1. Натисніть F5 або натисніть кнопку Run панелі інструментів для того, щоб програма
відпрацювала.
- Коли програма зупиниться, результати FIR фільтра будуть знаходитись у
вихідному масиві. Два набори даних відображені у вікні графіка (рис. 4).

Рис.4. Вікно графіка після виконання програми FIR до її завершення.

Можна збільшити область, яка представляє інтерес на графіку.


2. Натисніть ліву кнопку миші всередині вікна графіка і перетащіть мишку для
створення прямокутника навколо області, яка представляє інтерес. Потім відпустіть
кнопку миші для збільшення виділеної області.
- Для повернення до попереднього вигляду (перед збільшенням), натисніть праву
кнопкою миші у вікні графіка і оберіть Reset Zoom.
3. Також можна переглядати окремі точки даних на графіку. Для цього натисніть
правою кнопкою миші всередині вікна графіка і оберіть Data Cursor. Зміщуйтесь до
кожної точки даних в поточному наборі даних, натискаючи і утримуючи клавіші
Вліво або Вправо на клавіатурі. Для переключення наборів даних натискайте клавіші
12
Вгору або Вниз. Значення поточної точки даних відображається у нижньому лівому
куті вікна графіку.
4. Натисніть праву кнопку миші у вікні графіка і оберіть Data Cursor.
Далі розглянемо перегляд даних в частотній області.
5. Натисніть праву кнопку миші у вікні графіка і оберіть Modify Settings для відкриття
діалогового вікна Plot Settings.
6. Виконайте кроки:
1) Натисніть на вкладку Data Processing для відображення сторінки Data
Processing.
2) В полі Data Sets перевірте, щоб було вибрано значення Input. В полі Data
Process оберіть FFT Magnitude.
3) В полі Sample rate (Hz) введіть 10000.
4) В полі Data Sets оберіть Output. В полі Data Process виберіть FFT Magnitude.
5) Натисніть OK для виходу з діалогового вікна Plot Settings.
VisualDSP++ виконує швидке перетворення Фур’є (FFT) на вибраному наборі
даних перед побудовою графіку. FFT дозволяє розглянути сигнал у частотній
області (рис. 5).

Рис.5. FFT виконане на вибраному наборі даних.

Зараз виконайте наступні кроки для того, щоб подивитись на характеристику FIR фільтра у
частотній області.
1. В меню View оберіть Debug Windows, потім Plot, і потім New для того, щоб відкрити
діалогове вікно Plot Configuration.
2. Задайте графік частотної характеристики фільтра, заповнюючи групи Plot і Data Setting
наступним чином:
1) В групі Plot визначіть такі значення:
- В полі Type виберіть Line Plot зі списку.
- В полі Title наберіть Filter Frequency Response.
2) В групі Data Setting задайте наступні значення:
- В полі Name наберіть h.
- В полі Memory наберіть BLACKFIN Memory.
- В полі Address оберіть h.
- В полі Count наберіть 8.
- В полі Stride – 1.
- В полі Data оберіть short.
3. Натисніть Add для додавання набора даних у поле Data sets.
4. Натисніть OK для того, щоб застосувати зміни і відкрити вікно графіка з цим набором
даних.
5. Натисніть правою кнопкою миші у вікні графіка і оберіть Modify Settings, щоб відкрити
діалогове вікно Plot Settings.
13
6. Натисніть на вкладку Data Processing для відображення сторінки Data Processing.
Заповніть цю сторінку наступним чином:
1) В полі Data Sets оберіть h.
2) В полі Data Process оберіть FFT Magnitude.
3) В полі Sample rate (Hz) наберіть 10000.
4) Натисніть OK для закриття сторінки Data Processing.
- VisualDSP++ виконує швидке перетворення Фур’є (FFT) на вибраному
наборі даних та дозволяє переглянути графік частотної характеристики
фільтра (рис. 6).

Рис.6. Графік частотної характеристики фільтра.

Цей графік показує, що низькочастотний FIR фільтр обрізає усі частотні компоненти вище
4000 Гц. Коли застосовується низькочастотний фільтр до вхідного сигналу, то результуючий
сигнал не має виходу вище, ніж 4000 Гц.
Завантаження та профілювання FIR програми. Для завантаження FIR програми
виконайте наступні дії:
1. Закрийте усі відкриті вікна крім вікон Disassembly та Output.
2. З меню File оберіть Load Program або натисніть Load на панелі інструментів.
Відкриється діалогове вікно Open a Processor Program.
3. Оберіть FIR програму для завантаження наступним чином:
1. Відкрийте папку Analog Devices і оберіть:
VisualDSP 4.0\Blackfin\Examples\Tutorial\fir
2. Потім оберіть підпапку Debug.
3. Оберіть FIR.DXE для завантаження програми.
- Якщо VisualDSP++ не відкрив вікно редактора, то натисніть правою
кнопкою миші у вікні Disassembly і оберіть View Source.
Відкриття вікна Profiling. Для відкриття Linear Profiling Results виконайте наступні
дії:
1. З меню Tools оберіть Linear Profiling, а потім New Profile.
Вікно Linear Profiling Results відкривається без будь-яких даних.
2. Натисніть на область заголовка вікна профілювання і потім перетащіть вікно у
верхню частину головного вікна VisualDSP++.
Вікно Linear Profiling Results спочатку порожнє. Linear profiling виконується коли
запускається FIR програма. Після виконання програми і збору даних, це вікно
відображає результати сесії профілювання.
Збір та дослідження лінійного профілювання даних.
1. Натисніть F5 або кнопку Run на панелі інструментів для запуску програми.
- Коли програма зупиниться, результати лінійного профілювання з’являться у
вікні Linear Profiling Results.
2. Дослідження результатів сесії лінійного профілювання.
- Вікно Linear Profiling Results поділено на 2 частини по 3 колонки в кожній.
14
- Ліва частина вікна відображає результати профілювання даних. Можна
побачити проценти від повного використаного часу на виконання функції або
адреси.
- Подвійне натискання на рядку з функцією дозволяє відобразити вихідний файл,
який містить цю функцію. Наприклад, подвійне натискання на функції fir
відображає вихідний асемблеровський файл (fir.asm) в правій частині вікна
(рис. 7).

Рис.7. Linear Profiling Results, аналіз виконання програми FIR.

Значення полів в лівій частині вікна визначені наступним чином.


Histogram
Графічне представлення процента від часу, витраченого у частинному випадку у
виконуваному модулі. Цей процент базується на загальному часі, який програма
витрачає під час виконання, так що більші області позначають більшу кількість часу,
витраченого у частинному випадку у виконуваному модулі. Вікно Linear Profiling
Results завжди сортує модулі з даними з більшим потрібним часом виконання до гори.
%
Числовий процент від тих же самих даних знайдених в стовбці Histogram. Можна
розглядати це значення як конкретне число виборок, натиснувши правою кнопкою
миші у вікні Linear Profiling Results і вибравши View Sample Count.
Execution Unit
Місцерозташування програми, до якої належать виборки. Якщо команди містяться
всередині С функції або С++ методу, то виконуваний модуль – ім’я функції або
методу. Для команд, які не мають відповідних символічних імен, таких як
асемблерний код або вхідні файли, скомпільовані без налагоджувальної інформації, це
значення є адресою у вигляді PC[xxx], де xxx – адреса команди.
- Якщо команди є частиною асемблеровського файлу, то виконуваний модуль є або
асемблеровькою функцією, або асемблеровським файлом, супроводжуваним номером
рядка в круглих дужках.
На рис.7 ліва частина вікна показує, що fir функція бере понад 96% загального часу
виконання. Права частина вікна відображає процент часу, який витрачається на кожний
рядок fir функції.
15
Порядок виконання роботи
1. Для виконання лабораторної роботи повинна бути встановлена операційна система
Windows XP.
2. Перевірити наявність в зазначеній операційній системі встановленого програмного
забезпечення VisualDSP++.
3. Завантажити VisualDSP++ в режимі симуляції (ADSP-BF5xx Single Processor Simulator).
4. Скласти програму відповідно до варіанту завдання 1 та переконатися, що вона працює
без помилок в режимі симуляції.
5. Отримати у викладача плату EZ-KIT Lite (ADSP-BF533), перетворювач напруги, USB-
кабель та дотримуватися наступних правил використання:
- забороняється торкатися відкритих провідників;
- утримуючі плату за її ребра, підключити до плати USB-кабель та кабель живлення від
перетворювача напруги, після чого встановити плату на гумові ніжки на поверхню
лабораторного стола;
- підключити перетворювач напруги до мережі 220В; після цього на платі короткочасно
загорається червона лампочка, а потім – зелена та починають миготіти жовті
лампочки;
- підключити USB-кабель до комп’ютера (після цього комп’ютер може видати
запрошення на встановлення драйвера, в цьому випадку слід за пропозиціями
майстра встановити необхідний для роботи драйвер); після цього підключення на
платі загорається жовта лампочка біля USB-роз’єму, що позначає готовність плати
до роботи.
6. Далі за допомогою VisualDSP++ слід обрати сесію роботи з платою EZ-KIT Lite (ADSP-
BF533) та завантажити розроблену програму на виконання в сигнальному процесорі.
7. Розробити програми відповідно до завдань № 2-4 та переконатися в їх правильній роботі
в режимі симуляції.
8. Після цього завантажити зазначені програми у сигнальний процесор і виконати їх.
9. Завершити роботу VisualDSP++.
10. Після завершення роботи VisualDSP++ виконати наступні дії:
- відключити USB-кабель від комп’ютера;
- відключити перетворювач напруги від мережі 220В;
- відключити USB-кабель і кабель живлення від плати.
11. Повернути викладачу плату EZ-KIT Lite (ADSP-BF533), перетворювач напруги та USB-
кабель.
12. Скласти короткий звіт з отриманих результатів.

Практична частина
Завдання 1. В середовищі VisualDSP++ виконати розробку програми, яка виводить
привітальне повідомлення "Hello World" з указівкою поточного часу та прізвища розробника
цієї програми.
Завдання 2. В середовищі VisualDSP++ написати програму на мові С для обчислення
суми 1000 дійсних чисел, які йдуть від 0 з кроком 0.01, виконати її на базі процесора x86 та
на базі ADSP-BF533 EZ-KIT Lite і порівняти швидкості обчислень. Для порівняння
швидкості рекомендується обчислення виконати 1000 разів шляхом застосування
зовнішнього циклу.
Завдання 3. В середовищі VisualDSP++ написати програму на мові С, яка виконує
чотири основні арифметичні операції (додавання, віднімання, множення та ділення) над
операндами типу float. Виконати дослідження алгоритмів роботи підпрограм дійсної
арифметики сигнального процесора ADSP-BF533, поданих відповідними кодами на мові
Assembler, а саме: __float32_add, __float32_sub, __float32_mul, __float32_div.
16
Контрольні питання
1. Як відкрити та побудувати проект?
2. Як встановити сесію налагодження і змінити цільову платформу?
3. Скільки точок зупину встановлюється автоматично під час завантаження С-програми?
4. Як проглянути встановлені в програмі точки зупину, додати або видалити деякі з них?
5. Як виконати запуск програми на виконання?
6. Де відображаються результат компіляції, інформація про помилки та результати роботи
програми?
7. Як створити новий проект?
8. Як додати існуючі файли до проекту?
9. Які опції проекту дозволяє визначити діалогове вікно Project Options?
10. Для чого потрібен LDF-файл?
11. Як створити новий LDF-файл?
12. Як підключити нову секцію до проекту?
13. Як виконати завантаження програми?
14. Які поля необхідно заповнити при додаванні нового набору даних для побудови графіка?
15. Як відобразити графік даних в часовій області?
16. Як відобразити графік даних в частотній області?
17. Як відобразити частотну характеристику фільтра?
18. Як збільшити певну область на графіку або переглянути певне значення в поточному
наборі на графіку?
19. Для чого необхідно лінійне профілювання даних?
20. Як відкрити вікно результатів лінійного профілювання?
21. Що відображає кожний із стовбців вікна результатів лінійного профілювання?

Перелік рекомендованої літератури


1. Марков С. Цифровые сигнальные процессоры. Книга 1. М.: МИКРОАРТ, 1996. – 144 с.
2. Схемотехніка електронних систем. Кн. 3. Мікропроцесори та мікроконтролери:
Підручник / В. І. Бойко, А. М. Гуржій, В. Я. Жуйков та ін. – 2-ге вид., допов. і перероб. –
К.: Вища шк., 2004. – 399 с.
3. Справочное руководство по архитектуре процессора Blackfin ADSP-BF533 (ADSP-BF533
Blackfin Processor Hardware Reference) / русский перевод/ – Analog Devices, 2004.
4. VisualDSP++ User’s Guide for 16-Bit Processors – на сайте
www.analog.com/industry/dsp/tech_doc/gen_purpose.html.
5. VisualDSP++ C/C++ Compiler and Library Manual for Blackfin Processors.
6. VisualDSP++ Assembler and Preprocessor Manual for Blackfin Processors.
7. VisualDSP++ Linker and Utilities Manual for 16-Bit Processors.
8. VisualDSP++ Kernel (VDK) User’s Guide for 16-Bit Processor VisualDSP++ Component
Software Engineering User’s Guide for 16-Bit Processors.
9. ADSP-BF53x Blackfin Processor Instruction Set Reference.
10. Blackfin Processor. Instruction Set Reference. Revision 3.0, 2004, Analog Devices, inc., 518 p.
17
Лабораторна робота 2

Тема. Програмування BTC-каналу та оптимізація програмного забезпечення


сигнальних процесорів.
Мета. Освоєння та використання режиму оптимізації програмного забезпечення
Profile-guided optimization та BTC-каналу.

Використання режиму Profile-Guided Optimization


Profile-guided optimization (PGO) – це оптимізаційна методика, яка використовує
зібрану профілюючу інформацію для того, щоб керувати оптимізацією компілятора.
Традиційно кожна функція компілюється тільки один раз і потім згенерований код
виконується. При цьому приймається рішення як краще виконати генерацію коду. Можна
запропонувати такі можливості – компілювати для підвищення швидкості або компілювати
для зменшення розміру – але звичайно приймається задане за замовченням рішення.
З PGO компілятор приймає рішення, які базуються на даних, зібраних під час
попереднього виконання згенерованого коду. Цей процес складається з наступних кроків:
1. Компіляція програми для збору профілюючої інформації.
2. Запуск програми в сесії симулятора, використовуючи представлення наборів даних.
- Симулятор накопичує дані профілювання, які показують де програма витрачає
більше часу.
3. Перекомпіляція програми з використанням зібраних даних профілювання.
- Компілятор використовує зібрану інформацію скоріше, ніж задану за
замовченням поведінку програми, щоб прийняти рішення відносно важливості
частин програми.
Дані профілювання, зібрані при запуску симулятора, зберігаються у файлі з
розширенням .PGO. Можна обробляти множинні набори даних, для того щоб охватити
спектр потенційних даних і створити окремий .PGO файл для кожного набору даних. Стадія
перекомпіляції може приймати множину .PGO файлів, як вхід.

Завантаження проекту.
Відкрийте проект VisualDSP++. Для цього:
1. Запустіть VisualDSP++ та підключіть сесію ADSP-BF533 simulator.
2. Відкрийте проект PgoExample.dpj.
- Цей проект містить С файл PgoExample.c. Під час виконання програми дані
читаються з адреси та підраховуються кількості парних та непарних значень.
Цей підрахунок здійснюється в інструкції if...then...else. Якщо більшість
прочитаних значень є непарними, то програма буде витрачати більше часу в
переході then... Якщо більшість значень парна, то програма буде витрачати
більше часу в переході else... Звичайно, компілятор не має інформації, який
перехід буде виконуватись частіше. Але використовуючи PGO, компілятор
може визначати, який перехід виконується частіше, і оптимізувати наступну
побудову.
Примітка: цей проект також містить сценарії Visual Basic, які демонструють як
використовувати VisualDSP++ Automation API, щоб виконати PGO.
- Три файли даних використовуються як вихідні для С програми. Ці текстові
файли містять списки значень.
 Dataset_1.dat має 128 парних значень (50%) та 128 непарних значень
(50%).
 Dataset_2.dat має 192 парних значень (75%) та 64 непарних значень
(25%).
 Dataset_3.dat має 256 парних значень (100%) та 0 непарних значень
(0%).
18
- Для перегляду цих файлів, виберіть команду Open з меню File в VisualDSP++.
Два можливих значення в цих трьох файлах або 0x01, або 0x02. Кожний файл
містить 256 значень.
- Припускається, що ця програма буде використовуватись у реальних
обчисленнях і що можна очікувати подібний розподіл значень, як реальні вхідні
дані.
- Розглядаючи С код і потенціальні входи, легко можна помітити, що виконувана
програма буде витрачати більше часу в переході else..., ніж в переході then...Без
використання PGO компілятор не може зробити той самий висновок. За
замовченням, буде очікуватись, що then... перехід виконується частіше і код
буде скомпільований без оптимізації часу виконання.

Конфігурація набору даних


На першому кроці PGO процес повинен створити набір даних – колекцію типових
входів для програми, яка буде оптимізуватись. Набір даних подається на вхід виконуваної
програми і цей вхід заставляє програму виконуватись певними шляхами. Одні шляхи будуть
використовуватись частіше, ніж інші. Ця інформація записується симулятором і зберігається
в .PGO файлі для компіляції, та використовується пізніше для оптимізації. Частіше
використовувані шляхи будуть оптимізувати виконання швидше, а ріже використовувані
шляхи будуть виконуватись більш повільно.
Створіть перші три набори даних. Для цього:
1. З меню Tools оберіть PGO, а потім Manage Data Sets (рис. 2.1).

Рис. 2.1. Опція меню Manage Data Sets.

Відображається діалогове вікно Manage Data Sets (рис. 2.2).


19

Рис. 2.2. Діалогове вікно Manage Data Sets.

Це діалогове вікно де можна керувати наборами даних. Розглянемо плаваючий


бігунок Optimization level. Цей елемент дозволяє настроїти оптимізацію. Переміщення
бігунка в крайню ліву позицію дозволяє побудувати маленьку (наскільки можливо)
виконувану програму, але при цьому можна пожертвувати швидкістю виконання.
Переміщення бігунка в крайню праву позицію дозволяє побудувати найшвидшу виконувану
програму більшого розміру. Розташування бігунка між двома крайніми положеннями
забезпечує зміну відношення розміру до швидкості оптимізації. Перемістіть бігунок в
крайню праву позицію.
2. Натисніть кнопку New для відкриття діалогового вікна Edit Data Set (рис. 2.3).
20

Рис. 2.3. Діалогове вікно Edit Data Set.

3. Замініть значення за замовченням поля Data set name на ім’я, яке більше описує.
Оскільки перший файл даних містить рівну кількість парних та непарних значень, то
задайте ім’я типу 50% Even – 50% Odd.
4. Визначить ім’я вихідного файлу Output filename (де оптимізаційна інформація
утворена цим набором даних буде збережена). Оптимізаційна інформація зберігається
в файлі з розширенням .PGO.
- Задайте ім’я файлу dataset_1.pgo. Файл буде збережений в директорії проекту.
Для збереження файлу в іншому місці задайте повний шлях до файлу. Можна
використовувати Command line arguments для більшого контролю набора
даних.
- Для більшої інформації про аргументи командної строки див. VisualDSP++ 4.0
C/C++ Compiler and Library Manual for Blackfin Processors.
Приєднання вхідного потоку
На цьому кроці приєднується вхідний потік до набору даних.
1. Натисніть кнопку New для відкриття діалогового вікна Edit PGO Stream (рис. 2.4).
21

Рис. 2.4. Діалогове вікно Edit PGO Stream.

- Вхідний потік відображає файл даних приймального пристрою. Вхідні потоки


відображаються трьома файлами даних симулятора. Вхідний потік забезпечує
програму вхідними даними, які необхідні під час виконання.
- Для більшої інформації про потоки див. главу “Debugging” в VisualDSP++ 4.0
User’s Guide.
2. Заповніть групу Input Source File як зазначено в табл. 2.1.

Таблиця 2.1. Установки групи Input Source File


Поле/Контроль Дія/Значення
Визначте ім’я файлу натиснувши на кнопку огляду файлів і
Filename
вибравши вхідний файл dataset_1.dat з директорії pgo.
Дані в цьому файлі представлені в шістнадцятирічному форматі,
Format
тому залиште установлений формат як є.
Оберіть цю опцію. Коли виконується програма з вхідним потоком,
вона може або не може працювати з усіма даними в потоці. Якщо
Rewind on reset or програма зіштовхується з подіями reset або restart перед роботою
restart із-за повного потоку даних і ця опція вибрана, то наступне
виконання запускається на початку вхідного потоку. Інакше,
виконання продовжується з того місця, де воно залишено.
Оберіть цю опцію. Це дозволяє програмі читати з вхідного потоку
Circular
багато разів протягом одного виконання.

3. В групі Destination Device визначається, куди посилаються дані від вхідного потоку.
Заповніть цю групу як зазначено в табл. 2.2.

Таблиця 2.2. Установки групи Destination Device


22

Поле/Контроль Дія/Значення
Це поле дозволяє визначити периферійний пристрій в іншому
Processor процесорі як пристрій адресата. В даному випадку підключається
однопроцесорна сесія, тому це поле не активно.
Це поле дозволяє вибрати будь-який пристрій потоку, який
підтримується платформою симулятора як приймач. Пристрої
можуть включати адресу пам’яті або різні зовнішні пристрої.
Device Доступні пристрої залежать від процесора, який використовується.
Для докладної інформації див. апаратне керівництво по
відповідному процесору. Програма читає вхідні потоки з пам’яті,
тому залиште це поле таким як воно є.
Визначте, куди в пам’ять вхідні дані будуть відправлені. Оскільки
Address програма читає дані з адреси 0xFFD00000 (наведено в
PgoExample.c), то введіть це значення.

- Заповнене діалогове вікно повинно відповідати рис. 2.5.

Рис. 2.5. Сконфігурований PGO потік.

4. Натисніть OK для повернення в діалогове вікно Edit Data Set. Діалогове вікно з
конфігураційним набором даних повинно відповідати рис. 2.6.
23

Рис. 2.6. Сконфігурований набір даних.

5. Натисніть OK для збереження набору даних і закриття діалогового вікна.

Конфігурація додаткових наборів даних


Для створення двох інших наборів даних можна повторити кроки, які виконувались
для створення першого набору даних і замінити відповідні файли або використати кнопку
Copy.
Наступні кроки пояснять, як використовуючи кнопку Copy створити набір даних.
1. Підсвітіть набор даних 50% Even – 50% Odd і натисніть кнопку Copy.
- Відкриється діалогове вікно Edit Data Set з інформацією по набору даних 50%
Even – 50% Odd. Натискання клавіші OK робить копію набору даних 50% Even
– 50% Odd. При цьому можна виконати редагування набору даних.
2. В полі Data set name визначається відповідне ім’я для нового набору даних.
- Другий вхідний файл містить у три рази більше парних значень, ніж непарних,
тому використовується ім’я таке як 75% Even – 25% Odd.
3. В полі Output filename задайте ім’я dataset_2.pgo для збереження .PGO файлу в
директорії проекту.
- Для збереження файлу в іншому місті натисніть кнопку огляду файлів для
визначення повного шляху.
4. В полі Input streams підсвітіть вхідний файл dataset_1.dat і натисніть кнопку Edit.
5. Натисніть кнопку огляду файлів для зміни Input Source File з dataset_1.dat на
dataset_2.dat.
6. Натисніть кнопку OK для повернення до діалогового вікна Edit Data Set.
- Другий набір даних створений.
7. Натисніть кнопку OK для повернення до діалогового вікна Manage Data Sets.
24
8. Створить третій набір даних на пустому місці або змініть копію одного з існуючих
наборів даних.
- Переконайтесь, що використовуються файли dataset_3.pgo та dataset_3.dat.
Третій набір даних містить усі парні значення, тому дайте йому ім’я таке як
100% Even – 0% Odd.
Коли все буде завершено розкрийте три набори даних, перераховані у діалоговому
вікні Manage Data Sets, і порівняйте їх з наборами даних на рис. 2.7.

Рис. 2.7. Розгорнуті набори даних.

Якщо створені набори даних відповідають тим, які зображені на рис. 2.7, то набори
даних необхідні для оптимізації програми були створені.
9. Натисніть ОК для збереження наборів даних і закриття діалогового вікна.

Створення PGO файлів і оптимізація програми


Для оптимізації програми з меню Tools виберіть PGO і потім Execute Data Sets.
Декілька речей відбуваються під час виконання процесу. По-перше, проект будується
з перемикачем -pguide, який дозволяє збирати PGO дані, які потім використовуються при
компіляції. За замовченням компілятор робить припущення, що секції коду будуть звичайно
виконуватись. Потім, виконувана програма завантажується один раз з кожним набором
даних. Доки програма виконується, симулятор контролює шляхи виконання через програму і
кількість циклів, які відбуваються при виконанні. Як зазначено вище, ця інформація
зберігається в .PGO файлі, який був визначений при створенні кожного набору даних.
Програма виконується один раз для кожного набору даних і потім проект
перекомпілюється. При цьому компілятор використовує інформацію, знайдену в .PGO файлі,
щоб оптимізувати виконувану програму. Оптимізована програма потім запускається для
вхідних наборів даних, і знову симулятор контролює кожне виконання.

Порівняння часу виконання


Коли виконання завершується, XML звіт результатів PGO оптимізації генерується і
відображається у вікні браузера. Цей файл розташовується в директорії pgo\debug і має назву
PgoReport.дата і час.xml (наприклад, PgoReport.20031027145428.xml).
25
У верхній частині звіту розташовується заголовок, показаний на рис. 2.8.

Рис. 2.8. Результати PGO – заголовок звіту.

Заголовок містить основну інформацію, таку як ім’я проекту, розташування і коли звіт
був згенерований. Також вказується рівень оптимізації (який визначається бігунком у
діалоговому вікні Manage Data Sets, рис. 2.2) і середнім результатом. Average result – різниця
між загальними кількостями циклів до і після оптимізації на всьому процесі виконання.
Примітка: Average result може трохи відрізнятись від результату, показаного на рис.
2.8.
Заголовок супроводжується інформацією відносно кожного набору даних (рис. 2.9).

Рис. 2.9. Результати PGO – набори даних.

Файлова інформація, яка включає ім’я файлу Data Set, ім’я файлу Input stream і ім’я
файлу PGO output, перераховується спочатку. Потім відображаються результати оптимізації.
Кількість циклів, необхідних для виконання початкової побудови з цими наборами даних
(Before optimization) супроводжується кількістю циклів, необхідних для роботи з цим
набором даних при оптимізованій побудові (After optimization). Помітимо, що кількість
циклів може змінюватись на різних машинах.
Нарешті, перераховується різниця процентів між двома побудовами (Result). Додатній
процент показує, що оптимізована побудова виконалась швидше, ніж початкова побудова.
Розділ Execution Output відображається спочатку (рис. 2.10).
26

Рис. 2.10. Результати PGO – вихідна вибірка виконання.

Ця інформація є вихідною і з’являється у вкладці Console вікна Output під час


виконання PGO. Output містить основні події, які відбулися під час виконання.
Розділ Build Output з’являється наступним в нижній частині звіту. Цей розділ містить
побудований вихід для кожної побудови. Рис. 2.11 показує побудовану вихідну вибірку.

Рис. 2.11. Результати PGO – побудована вихідна вибірка.

Ця інформація є вихідною і відображається у вкладці Build вікна Output під час


виконання PGO.
Ця вихідна інформація показує, яким ефективним може бути використання PGO. Як
показано на рис. 2.8, оптимізоване виконання використовує приблизно на 18% менше циклів,
ніж початкове виконання. Прискорення в роботі є істотним.
27
Використання фонового каналу телеметрії
Background Telemetry Channel (BTC) дозволяє виконувати обмін даних між хостом і
цільовим додатком без зупинки процесора. Цей механізм забезпечує видимість в реальному
масштабі часу в виконуваній програмі. Використання BTC включає:
- Контроль стану програми без зупинки процесора
- Перегляд алгоритму виводу в реальному часі
- Введення даних до програми
- Занесення даних в файл в реальному часі (реєстрація даних)
- Забезпечення введення/виведення або стандартного або визначеного
користувачем

Додавання BTC до DSP додатку


Для додавання BTC до DSP додатку необхідно:
1. Додати файл btc.h до вихідного коду
- Файл btc.h містить макрос, необхідний для використання BTC в програмах,
включаючи макрос необхідний для визначення каналу.
2. Визначте один або більше каналів в вихідному DSP коді.
- Канали ідентифікують адресний інтервал для передачі даних. Кожний канал
складається з імені, стартової адреси і довжини. Всі канали визначені всередині
єдиного блоку карти BTC. Вибірка визначення каналу BTC показана нижче:

#include “btc.h”

short AudioData[12000] //audio capture array

BTC_MAP_BEGIN

BTC_MAP_ENTRY( “Audio Data Channel”, (long)&AudioData,

sizeof(AudioData))

BTC_MAP_END

3. Визначте цикл опитування BTC за допомогою команди btc_poll().


- Цикл опитування перевіряє команди, що приходять від головного комп’ютера.
Розташування циклу опитування визначається пріоритетом опитування, який
впливає на виконання додатку. Можна розташувати цикл опитування в високо
пріоритетному перериванні, низько-пріоритетному перериванні або в циклі
головної програми.
4. Ініціалізуйте BTC використовуючи команду btc_init().
5. Додайте BTC бібліотеку libbtc532.dlb або libbtc535.dlb в проект.
- BTC бібліотека містить функції, які передають дані до головного комп’ютера і
від нього.
Analog Devices строго рекомендує підключити плату ADSP-BF533 EZ-KIT Lite через
HPPCI-ICE або HPUSB-ICE, коли будуть запускатись наведені нижче приклади.
Низька швидкість передачі дозволяє запустити перший приклад використовуючи
інтерфейс EZ-KIT Lite USB. Другий приклад, однак, потребує більшої швидкості передачі
даних, ніж може забезпечити EZ-KIT Lite USB interface. Зверніться до керівництва,
включеного до HPPCI-ICE, HPUSB-ICE або EZ-KIT Lite, якщо необхідно встановити
підключення.
Примітка: в теперішній час BTC не підтримується платформами симулятора.
28

Виконання BTC Assembly Demo


BTC assembly demo призначена, щоб продемонструвати основні функціональні
можливості BTC. Програма визначає декілька BTC, щоб дозволити передачу даних по BTC
інтерфейсу доки процесор працює. Наприклад, один канал рахує кількість переривань, які
відбулися, і інший рахує кількість натискань кнопки. Дивіться заголовок Btc_AsmDemo.asm.
Для перегляду даних в кожному каналі буде використовуватись вікно BTC Memory в IDDE.
Рис. 2.12 забезпечує короткий огляд передачі даних по BTC інтерфейсу в BTC
assembly demo.

Рис. 2.12. Передача даних в Assembly Demo

Завантаження проекту BTC_AsmDemo


1. Запустіть VisualDSP++ і підключити ADSP-BF533 HPPCI-ICE, HPUSB-ICE або EZ-
KIT Lite USB emulator session.
2. Відкрийте проект Btc_AsmDemo.dpj під Analog Devices з:
VisualDSP 4.0\BlackFin\Examples\BTC Examples\BF533

Дослідження BTC команд


1. Відкрийте файл Btc_AsmDemo.asm подвійним натисканням на ньому у вікні Project.
2. Прокрутіть вниз до секції, поміченої коментарями як BTC Definitions (рис. 2.13).

Рис. 2.13. Визначення BTC каналу

3. Прокрутіть вниз до main program.


29
- На двадцять чотири рядки нижче мітки _main: є команда ініціалізації BTC, call
_btc_init; (рис. 2.14).

Рис. 2.14. Команда ініціалізації BTC

- В цьому прикладі, команда call _btc_poll; поміщена в EVT15_LOOP,


визначеному нижче main (рис. 2.15).

Рис. 2.15. Цикл BTC Polling

- Ця функція викликається коли запущено переривання evt15. Це переривання


має самий низький пріоритет на цьому процесорі.
BTC був добавлений до проекту. Зараз побудуємо проект.
4. На панелі інструментів натисніть Rebuild All або виберіть Rebuild All з меню Project.
- Ця команда будує проект і автоматично завантажує програму до присторою.

Установки вікна BTC Memory і перегляд даних


1. В меню View виберіть Debug Windows і потім BTC Memory.
- Відобразиться вікно BTC Memory (рис. 2.16).
30

Рис. 2.16. Вікно BTC Memory

- Вікно BTC Memory відображає BTC дані в реальному часі. Дані читаються з
платформи, коли IDDE видає запит читання, і записуються, коли значення
редагується у вікні BTC Memory. Можна коректувати швидкість, з якою IDDE
запитує дані, змінюючи частоту оновлення.
2. Натисніть правою кнопкою миші у вікні BTC Memory для відображення меню (рис.
2.17).

Рис. 2.17. Меню вікна BTC Memory

Кожна опція меню описується наступним чином:


- Edit – натисніть праву кнопку миші на значенні пам’яті у вікні BTC Memory і
оберіть Edit для змінення значення в цьому місці. Виконувати редагування
також можна натиснувши ліву кнопку миші на значенні пам’яті у вікні і
завдавши нове значення.
- Go To – дозволяє ввести адресу або перегляд для символу і відобразити
пам’ять, починаючи з адреси у вікні BTC Memory. Якщо введена адреса
31
розташована поза межами діапазону, визначеного BTC каналами, то
відображається повідомлення про помилку.
- Show Map – коли ця опція включена, відображається карта всіх визначених
каналів (рис. 2.18).

Рис. 2.18. Вікно BTC Memory з картою

Подвійне натискання на каналі відображає передачу пам’яті у вікні BTC


Memory.
Коли Show Map відключена, можна вибирати канал зі списку.
- Lock Columns – блокує кількість стовбців, що відображаються у вікні BTC
Memory.
Якщо ця опція відключена, VisualDSP++ відображає стільки стовбців, скільки
ширина вікна може розмістити.
Якщо ця опція включена, кількість стовбців не змінюється, незалежно від
ширини вікна. Наприклад, якщо відображаються чотири колонки і ця опція
включена, то чотири колонки будуть відображатись незалежно від ширини
вікна. Розгляньте рис. 2.19, рис. 2.20, рис. 2.21 для порівняння.
Рис. 2.19 показує початкове вікно.
32

Рис. 2.19. Початкова ширина вікна

Рис. 2.20 показує початкове вікно розширене з включеним блокуванням стовбців.

Рис. 2.20. Розширення вікна з включеним Lock Columns

Рис. 2.21 показує початкове вікно розширене з відключеним блокуванням стовбців.


33

Рис. 2.21. Розширення вікна з відключеним Lock Columns

- Select Format – дозволяє вибрати формат відображення пам’яті. Вибір 8-


розрядного, 16-розрядного і 32-розрядного.
- Refresh Rate – дозволяє визначити частоту, з якою вікно BTC Memory
оновлюється. IDDE видає запит читання, який ґрунтується на частоті, яка була
обрана. Виберіть одну з існуючих опцій (1, 5, 10 або 15 секунд) або виберіть
custom і задайте іншу частоту оновлення. При цьому частота задається в
мілісекундах.
- Auto Refresh – автоматичне оновлення вікна BTC Memory, ґрунтується на
частоті оновлення, яка була встановлена. Якщо ця опція відключена, вікно BTC
Memory не оновлюється доки програма не зупинеться.
- Channel Timeout – кількість часу, яке VisualDSP++ буде чекати запита пам’яті
до платформи. Після цього часу IDDE зупиняє опитування BTC для запобігання
зависання.
- Allow Docking – закріплення вікна BTC Memory до фіксованого
місцеположення (наприклад, права сторона робочого простору). Відключення
закріплення дозволяє переміщати вікно скрізь у робочому просторі, включаючи
верхню частину закріплених вікон.
- Close – закриває вікно BTC Memory.
- Float In Main Window – відключення закріплення і вирівнювання по центру
вікна BTC Memory в центр робочого простору. Можна перемістити його в будь-
яке місцеположення, але воно не буде закріплятись.
3. Виберіть канал Timer Interrupt Counter з випадаючого списку у вікні BTC Memory.
Встановіть Refresh Rate на 1 секунду і включіть Auto Refresh.
4. Запустіть програму. Зверніть увагу, як значення у вікні BTC Memory змінюються
кожну секунду.
5. Виберіть канал PF10 Counter. Цей канал обчислює кількість раз, коли кнопка PF10 на
ADSP-BF533 EZ-KIT Lite платі була нажата. Натисніть цю кнопку і подивіться, що
PF10 Counter інкрементується у вікні BTC Memory.
6. Зупиніть програму і закрийте проект Btc_AsmDemo.
34
Виконання BTC FFT Demo
BTC FFT demo демонструє передачу даних від Blackfin EZ-KIT Lite по фоновому
каналу телеметрії background telemetry channels. Програма генерує вхідну синусоїдальну
хвилю, яка збільшується в частоті через якийсь час і виконує швидке перетворення Фур’є
Fast Fourier Transform (FFT) для цього вхідного сигналу. Вхідні та вихідні дані передаються
до IDDE через BTC.
Рис. 2.22 надає короткий огляд передачі даних в BTC FFT demo.

Рис. 2.22. Передача даних в BTC FFT Demo

Примітка: переконайтесь, що використовується ADSP-BF533 emulator HPPCI або


HPUSB session.
Побудова FFT Demo
1. Відкрийте FFT demo, розташований в наступній директорії:
\Program Files\Analog Devices\VisualDSP 4.0\ Blackfin\Examples\BTC Examples\BF533\
BTC_fft
2. Побудуйте FFT проект натиснувши Rebuild All на панелі інструментів або вибравши
Rebuild All з меню Project.
Ця команда будує проект і автоматично завантажує програму до платформи.

Графік BTC даних


1. Відкрийте вікно BTC Memory, якщо воно ще не відкрито.
2. З меню View оберіть Debug Windows, потім Plot і потім Restore.
Команда Restore відкриває діалогове вікно Select Plot Settings File (рис. 2.23).

Рис. 2.23. Діалогове вікно Select Plot Settings File


35
Оберіть файл fft_in.vps і відкрийте його. З’явиться вікно графіка. Таким же чином
відкрийте файл fft_out.vps.
3. Натисніть правою кнопкою миші у вікні графіку FFT In і оберіть Auto Refresh Settings,
щоб відкрити діалогове вікно Auto Refresh Settings (рис. 2.24).

Рис. 2.24. Діалогове вікно Auto Refresh Settings.

Це діалогове вікно дозволяє конфігурувати інструменти побудови графіка, щоб


побудувати графік BTC даних в реальному часі.
4. Заповніть діалогове вікно наступним чином:
- В групі Options виберіть опцію Use BTC.
Опція Use run/halt method будує графік даних, але оновлюється вікно графіка
тільки коли програма зупиняється.
- Refresh rate дозволяє вибрати інтервал між оновленнями вікна графіка.
Використовуйте установку за замовченням 150 мілісекунд.
- Група BTC Modes включає два методи передачі даних до вікна графіка.
o Transfer an array of data (за замовченням) – цей метод використовує
btc_write_array функцію. Дані фіксуються у визначеній точці в додатку
DSP, копіюються в буфер передачі і підтримуються доки головний
комп’ютер читає дані.
o Sample a test point over time – цей метод використовує буфер даних в
DSP програмі і функцію btc_write_value. Вибране значення вхідних
даних копіюється до буфера передачі даних і читається відповідно
графічній частоті оновлення. Мінімальний розмір буфера передачі є
добутком частоти оновлення графіка і частоти дискретизації даних
(PRR * DSR).
Використовуйте метод за замовченням Transfer an array of data для передачі даних.
- В групі Data Log File кнопка Convert to ASCII дозволяє конвертувати log дані в
ASCII формат. Більш детально це буде описано далі.
5. Натисніть ОК для закриття діалогового вікна Auto Refresh Settings.
6. Оберіть опцію Use BTC у вікні графіка FFT Out, як було зроблено на кроці 4.
7. Натисніть праву кнопку миші в обох вікнах графіків і включіть Auto Refresh.
36
- Панель інструментів з’явиться в верхній частині кожного вікна графіка (рис. 2.25).
Ця панель інструментів дозволяє робити запис BTC даних в файл і програвати BTC
дані з файлу.

Рис. 2.25. Вікно графіка з панеллю інструментів

8. У вікні графіка FFT In введіть ім’я файлу таке як Sample.bin в текстовому полі.
9. Запустіть програму.
- Обидва графічні вікна повинні відобразити дані, які утворюють графік в реальному
масштабі часу.

Запис і аналіз BTC даних


1. На панелі інструментів вікна графіка FFT In натисніть Record. Усі дані в каналі
FFT_Input заносяться до файлу доки запис не буде зупинений.
2. У вікні BTC Memory виберіть канал FREQ STEP SIZE.
- Спочатку, натисніть праву кнопку миші і змініть формат на Hex32. Потім
змініть значення в пам’яті від 10 до 100 і зверніть увагу на цей ефект на
графіках. Якщо є бажання спробуйте використання інших значень.
3. На панелі інструментів вікна графіка FFT In натисніть Stop, щоб зупинити занесення
BTC даних.
4. Зупиніть програму.
5. На панелі інструментів вікна графіка FFT In натисніть Play.
- Вікно графіка відображає дані, що реєструються. Вікно повинно з’явитись,
начебто програма FFT все ще виконується.
6. Натисніть правою кнопкою миші у вікні графіка FFT In, відкрийте діалогове вікно
Auto Refresh Settings і натисніть кнопку Convert to ASCII. Відобразиться діалогове
вікно Convert Log File (рис. 2.26).
37

Рис. 2.26. Діалогове вікно Convert Log File

7. Заповніть діалогове вікно наступним чином:


- В текстовому полі Input file натисніть кнопку огляду, щоб вибрати Sample.bin.
- Sample.bin має тільки один набір даних, який вибирається коли вводиться ім’я
вхідного файлу Input file. Якщо Sample.bin містив би більше, ніж один набір
даних, можна було б вибрати серед них в списку Data set selection.
- Далі натисніть кнопку огляду файлів рядом з текстовим полем Output file.
Діалогове вікно Select Log Output File, яке з’явиться, вже повинно мати ім’я
файлу Sample.dat в текстовому полі File name. Натисніть Save.
- Якщо вікно відповідає рис. 2.27, натисніть ОК. Log файл конвертується з
бінарного в ASCII, який читається іншими програмами.

Рис. 2.27. Завершене діалогове вікно Convert Log File

8. Запустіть Microsoft Excel. Потім відкрийте файл Sample.dat і слідуйте інструкціям


Text Import Wizard.
- Файл .DAT є файлом з tab-розділітелями. Імпорт файлу в Excel або іншу
програму, таку як MATLAB, дозволяє аналізувати або змінювати log файл.
38
Порядок виконання роботи
1. Для виконання лабораторної роботи повинна бути встановлена
операційна система Windows XP та програмне забезпечення VisualDSP++.
2. Перейти до виконання завдання 1. Для цього завантажити середовище
VisualDSP++ в режимі симуляції (ADSP-BF5xx Single Processor Simulator).
3. Скласти програму відповідно до завдання 1 та переконатися, що вона
працює без помилок в режимі симуляції. Виконати аналіз отриманих результатів.
4. Перейти до виконання завдання 2. Для цього отримати у викладача
плату EZ-KIT Lite (ADSP-BF533), перетворювач напруги, USB-кабель та дотримуватися
наступних правил використання:
 забороняється торкатися відкритих провідників;
 утримуючі плату за її ребра, підключити до плати USB-кабель та
кабель живлення від перетворювача напруги, після чого встановити плату на гумові
ніжки на поверхню лабораторного стола;
 підключити перетворювач напруги до мережі 220В; після цього
на платі короткочасно загорається червона лампочка, а потім – зелена та починають
миготіти жовті лампочки;
 підключити USB-кабель до комп’ютера (після цього комп’ютер
може видати запрошення на встановлення драйвера, в цьому випадку слід за
пропозиціями майстра встановити необхідний для роботи драйвер); після цього
підключення на платі загорається жовта лампочка біля USB-роз’єму, що позначає
готовність плати до роботи.
5. Далі в середовищі VisualDSP++ обрати сесію роботи з платою EZ-KIT
Lite (ADSP-BF533) та завантажити проект Btc_AsmDemo.dpj на виконання (завдання 2).
6. Завершити роботу VisualDSP++.
7. Після завершення роботи VisualDSP++ виконати наступні дії:
8. відключити USB-кабель від комп’ютера;
9. відключити перетворювач напруги від мережі 220В;
10. відключити USB-кабель і кабель живлення від плати.
11. Повернути викладачу плату EZ-KIT Lite (ADSP-BF533), перетворювач напруги та USB-
кабель.
12. Скласти короткий звіт з отриманих результатів.

Практична частина
Завдання 1. В середовищі VisualDSP++ виконати розробку програми, яка обчислює
кількість парних та непарних добутків пар першого і останнього, другого і передостаннього і
т.д. елементів даних для файлів dataset_1.dat, dataset_2.dat, dataset_3.dat і виводить результати
обчислень. Після цього необхідно:
1) виконати оптимізацію програми за допомогою режиму Profile-Guided Optimization,
побудувавши найшвидшу програму;
2) виконати оптимізацію програми за допомогою режиму Profile-Guided Optimization,
побудувавши найменшу за розміром програму;
3) порівняти часи виконання та кількості циклів для п.п.1-2;
4) пояснити одержані в п.п.1-2 результати.
Для виконання завдання використати режим симуляції (ADSP-BF5xx Single Processor
Simulator) роботи сигнального процесора середовищем VisualDSP++.
Завдання 2. Ознаймитися з роботою фонового каналу телеметрії на основі наведених
вище прикладів шляхом завантаження проектів Btc_AsmDemo та BTC_fft.
39
Контрольні питання
1. Для чого потрібен режим Profile-Guided Optimization.
2. У файлі з яким розширенням зберігаються дані профілювання і де вказується ім’я
цього файлу.
3. Як змінити відношення швидкості роботи програми до її розміру і як створити
найшвидшу програму за рахунок її розміну або найменшу за розміром за рахунок її
швидкості.
4. Як створити новий набір даних.
5. Для чого необхідно приєднувати вхідний PGO потік при створенні набору даних.
6. Як приєднувати або редагувати вхідний PGO потік.
7. Як створити новий набір даних з вже існуючого.
8. Поясніть, для чого потрібне кожне з полів діалогового вікна Edit PGO Stream.
9. Як виконати оптимізацію програми для режиму Profile-Guided Optimization.
10. В якому форматі і де зберігається звіт результатів PGO оптимізації. Яка інформація
наводиться у звіті.
11. Де й яка інформація виводиться ще про результати PGO оптимізації.
12. Що дозволяє робити фоновий канал телеметрії.
13. Що необхідно зробити для додавання BTC до DSP додатку.
14. Де і як визначаються канали BTC в коді програми.
15. За допомогою яких команд ініціалізується BTC та виконується опитування BTC.
16. Де можна розташувати цикл опитування BTC і чим визначається його розташування в
програмі.
17. Що відображає вікно BTC Memory.
18. Що дозволяє робити діалогове вікно Auto Refresh Settings і для чого потрібна кожна
опція цього вікна.
19. Як виконати запис BTC даних каналу у файл і відобразити записані дані у вікні
графіка.
20. Як виконати конвертування записаних у файл BTC даних з бінарного формату в
ASCII формат.

Перелік рекомендованої літератури


1. Схемотехніка електронних систем. Кн. 3. Мікропроцесори та мікроконтролери:
Підручник / В. І. Бойко, А. М. Гуржій, В. Я. Жуйков та ін. – 2-ге вид., допов. і
перероб. – К.: Вища шк., 2004. – 399 с.
2. Справочное руководство по архитектуре процессора Blackfin ADSP-BF533 (ADSP-
BF533 Blackfin Processor Hardware Reference) / русский перевод/ – Analog Devices,
2004.
3. VisualDSP++ User’s Guide for 16-Bit Processors – на сайте
www.analog.com/industry/dsp/tech_doc/gen_purpose.html.
4. VisualDSP++ C/C++ Compiler and Library Manual for Blackfin Processors.
5. VisualDSP++ Assembler and Preprocessor Manual for Blackfin Processors.
6. VisualDSP++ Linker and Utilities Manual for 16-Bit Processors.
7. VisualDSP++ Kernel (VDK) User’s Guide for 16-Bit Processor VisualDSP++ Component
Software Engineering User’s Guide for 16-Bit Processors.
8. ADSP-BF53x Blackfin Processor Instruction Set Reference.
9. Blackfin Processor. Instruction Set Reference. Revision 3.0, 2004, Analog Devices, inc.,
518 p.
40
Лабораторна робота 3

Тема. Обробка потоків звукових даних.


Мета. Ознайомлення з архітектурою та концепцією роботи сигнального процесора
серії Blackfin в режимі обробки потоків звукових даних.

Основні відомості. Загальна архітектура процесора Blackfin наведена на рис. 1. Вона


складається з ядра та системи периферійних пристроїв. Периферійні пристрої системи
сигнального процесора серії Blackfin включають:
- паралельний периферійний інтерфейс (PPI);
- послідовні порти (SPORT);
- послідовний периферійний інтерфейс (SPI);
- таймери загального призначення;
- універсальний асинхронний приймач-передавач (UART);
- годинники реального часу (RTC);
- сторожовий таймер;
- порт введення/виведення загального призначення (програмувальні прапорці).
Зазначені периферійні пристрої з’єднані з ядром сигнального процесора декількома
шинами з високою пропускною здатністю (див. рис.1).

КОНТРОЛЕР
ТЕСТУВАННЯ СТОРОЖОВИЙ
І ЕМУЛЯЦІЯ JTAG ПОДІЙ /
ТАЙМЕР ЯДРА ТАЙМЕР

ГОДИННИК
СТАБІЛІЗАТОР РЕАЛЬНОГО ЧАСУ
НАПРУГИ

ПАМ’ЯТЬ MMU ПАМ’ЯТЬ


КОМАНД L1 ДАНИХ L1
ТАЙМЕР0, ТАЙМЕР1,
ТАЙМЕР2
ІНТЕРФЕЙС ШИН ЯДРА / СИСТЕМИ
PPI / GPIO

КОНТРОЛЕР
DMA
ПОСЛІДОВНІ
ПОРТИ (2)

ЗАВАНТАЖУ- ПОРТ SPI


ВАЛЬНЕ ПЗУ
ЗОВНІШНІЙ ПОРТ
КЕРУВАННЯ SDRAM/
ФЛЕШ ПАМ’ЯТТЮ

Рис. 1. Блок-схема процесора Blackfin

Всі периферійні пристрої, за винятком порту введення/виведенян загального


призначення, і таймерів, підтримуються гнучкою структурою прямого доступу до пам’яті
(DMA). Також в процесорі є два окремих канали DMA типу “пам’ять-пам’ять”, призначені
для здійснення передач даних між просторами пам’яті процесора, включаючи зовнішню
SDRAM-пам’ять та асинхронну пам’ять. Набір внутрішніх шин забезпечує пропускну
41
здатність, достатню для підтримки роботи ядра процесора, навіть якщо задіяні всі внутрішні
й зовнішні периферійні пристрої.
Загальна схема архітектури пам’яті процесора Blackfin наведена на рис.2.

Команда
Ядро Пам’ять L1
процесора Завантаження даних (внутрішня
Домен тактового пам’ять)
сигналу ядра (CCLK) Завантаження даних
Збереження даних

Домен тактового
сигналу системи (SCLK) Шина DMA
ядра (DCB)
Контролер Шина
DMA зовнішнього
доступу
Зовнішня (EAB)
шина DMA
(DEB)
Шина периферійного
доступу (PAB)
EBIU

Прапори, Сторо- Шина


RTC Таймери жовий UART SPORT PPI SPI
які прог- зовнішнього
рамуються таймер
порту (EPB)
Пристрої
зовнішньої
Шина доступу DMA пам’яті
(DAB)

Рис. 2. Архітектура пам’яті процесора.

Сигнальний процесор Blackfin з застосуванням відповідних периферійних пристроїв


дозволяє виконувати обробку різноманітних потоків цифрових даних. Зокрема, для обробки
відеопотоків використовується PPI-інтерфейс, а для обробки звукових потоків даних
використовуються послідовні порти SPORT0, SPORT1. Перед початком обробки даних ті
периферійні пристрої, які будуть використовуватися, повинні бути ініціалізовані та
налаштовані на відповідну роботу. Слід зауважити, що звичайно робота з обробки цифрових
даних виконується в режимі супервізора на рівні підпрограм обробки переривань, тоді як
головна програма виконує нескінченний цикл чекання.
Обробка звукових потоків даних за допомогою плати EZ-KIT Lite виконується з
застосуванням послідовного інтерфейсу на основі послідовного порту SPORT0 та з
використанням компандування. При цьому слід правильно встановити на платі перемикачі
для створення відповідних аналогових та цифрових каналів проходження звуку.
Контролери послідовних портів
У процесорі є два ідентичних послідовних порти SPORT0 та SPORT1. Ці порти
підтримують різноманітні протоколи послідовної передачі даних, а також можуть
забезпечувати пряме з’єднання процесорів у багатопроцесорній системі.
Звичайно послідовні порти SPORT0 й SPORT1 забезпечують інтерфейс
введення/виведення з різними послідовними периферійними пристроями в синхронному
режимі передачі/прийому даних; для асинхронної передачі даних використається порт UART
процесора, який працює за відомим стандартом RS-232. Кожен SPORT має власну групу
виходів (первинних виходів, вторинних даних, тактової й кадрової синхронізації) для
42
передачі й аналогічну групу виходів для прийому даних. Функції прийому й передачі
настроюються незалежно. Кожен послідовний порт є повнодуплексним пристроєм, здатним
виконувати одночасно передачу/прийом даних. Швидкість передачі, частота кадрової
синхронізації й розрядність слова послідовних портів може програмно задаватися за
допомогою запису в регістри, відображені в карті пам’яті.
Обидва послідовні порти мають однакові можливості, процедури їхнього
налаштування є ідентичними. Кожен SPORT має власний набір регістрів керування й
буферів даних.
Послідовні порти використовують імпульси кадрової синхронізації для виділення
початку кожного слова або пакета слів і сигнали тактової синхронізації для виділення
початку кожного біта. Можлива зовнішня генерація сигналів кадрової й тактової
синхронізації.
Частота сигналу тактової синхронізації послідовних портів може досягати SCLK/2
при зовнішній генерації або 1/2 тактової частоти системи при внутрішній генерації. Частота
зовнішнього сигналу тактової синхронізації завжди повинна бути нижче, ніж частота SCLK.
Використання незалежних сигналів тактової синхронізації при передачі й прийомі
забезпечують більшу гнучкість організації послідовної передачі даних.
Сигнали кадрової й тактової синхронізації послідовного порту можуть генеруватися
усередині процесора або надходити від зовнішнього джерела. Послідовні порти можуть
виконувати передачі даних, починаючи з MSB (старший значущий розряд) або LSB
(молодший значущий розряд); довжина слова може мати значення від 3 до 32 бітів.
Можливий вибір різних режимів прийому/передачі даних і компандування даних за A- або µ-
законами. Дані з послідовних портів можуть автоматично переміщатися між областями
внутрішньої й зовнішньої пам’яті в режимі блокових передач. Крім того, кожен послідовний
порт може працювати в багатоканальному TDM (з тимчасовим поділом каналів) режимі.
У табл. 1 перераховані виводи послідовних портів.

Таблиця 1. Виводи послідовного порту (SPORT)


Вивід1 Опис
DTxPRI Первинний вивід передачі даних
DTxSEC Вторинний вивід передачі даних
TSCLKx Тактова синхронізація передачі
TFSx Кадрова синхронізація передачі
DRxPRI Первинний вивід прийому даних
DRxSEC Вторинний вивід прийому даних
RSCLKx Тактова синхронізація прийому
RFSx Кадрова синхронізація прийому
Прописний символ ‘x’ в імені виводу може приймати значення 0 або 1 (SPORT0 або SPORT1).

SPORT приймає послідовно передані дані на входах DRxPRI й DRxSEC і послідовно


передає дані на виводах DTxPRI й DTxSEC. Працюючи в дуплексному режимі, він може
одночасно приймати й передавати дані. Біти даних передаються синхронно із сигналом
тактової синхронізації передачі (TSCLKx) і приймаються синхронно із сигналом тактової
синхронізації прийому (RSCLKx). Сигнал тактової синхронізації послідовного порту є
вихідним, якщо він генерується процесором, або вхідним, якщо він генерується зовнішнім
джерелом. Сигнали кадрової синхронізації RFSx й TFSx використовуються для виділення
початку послідовної передачі слова або блоку слів даних.
Передані дані записуються із внутрішнього регістра процесора в регістр SPORT_TX
порту по периферійній шині. Ці дані можуть (необов’язково) піддаватися апаратному стиску
й автоматично передаються в регістр передачі. У регістрі біти зсуваються на вихід
DTxPRI/DTxSEC послідовного порту, починаючи з MSB або з LSB, синхронно із сигналом
тактової синхронізації TSCLKx. У прийомній частини послідовного порту дані приймаються
43
з виходу DRxPRI/DRxSEC синхронно із сигналом тактової синхронізації RSCLKx. Після
прийому всього слова дані (необов’язково) розширюються й автоматично передаються в
регістр SPORTxRX, з якого вони надходять у прийомний буфер FIFO, де стають доступні
процесору.
Запис у регістр SPORTx_TX послідовного порту підготовляє його до передачі. Сигнал
TFS ініціює послідовну передачу даних. Після початку передачі кожне значення, записане в
регістр SPORTx_TX, передається через FIFO у внутрішній регістр передачі. Потім
виконується передача бітів, починаючи з молодшого або старшого розряду, залежно від
значення регістра SPORTx_TCR1. Зсув бітів на вихід відбувається за активним фронтом
TSCLKx. Активний фронт сигналу TSCLKx може вибиратися програмно. SPORT генерує
переривання передачі й запит DMA, поки FIFO передачі не заповнений.
Під час прийому бітів послідовним портом вони накопичуються у внутрішньому
прийомному регістрі. Після того, як слово є прийнятим повністю, воно записується до
регістру FIFO послідовного порту і генерується переривання прийому SPORT або
ініціюється операція DMA.

Розглянемо функцію Init_Sport0() модуля Initialize.cpp, у якій відбувається


ініціалізація послідовного порту SPORT0 для передачі / прийому даних до / з кодека
AD1836:

void Init_Sport0(void)
{
// Установка регістрів конфігурації прийому (SPORT0_RCR1, SPORT0_RCR2)
*pSPORT0_RCR1 = RFSR; //RFSR, Receive Frame Sync Required
(Вимога //кадрової синхронізації прийому): 1 –
кадрова //синхронізація прийому потрібна для
кожного //слова
*pSPORT0_RCR2 = SLEN_32; //Довжина слова послідовного порту –
//32 біти (SLEN_32 описів у файлі
//Talkthrough.h)

// Установка регістрів конфігурації передачі (SPORT0_TCR1, SPORT0_TCR2)


*pSPORT0_TCR1 = TFSR; //TFSR, Transmit Frame Sync Required
(Вимога //кадрової синхронізації передачі): 1 –
кадрова //синхронізація передачі потрібна для
кожного //слова
*pSPORT0_TCR2 = SLEN_32; //Довжина слова послідовного порту –
//32 біти (SLEN_32 описів у файлі
//Talkthrough.h)

//Кожен регістр вибору каналів (SPORTx_MRCSn (прийом), SPORTx_MTCSn


//(передача)) складається із чотирьох 32-розрядних регістрів, кожний з яких
//відповідає 32-м каналам. Установка біта в регістрі активізує відповідний канал, і
//слово даних цього каналу вибирається послідовним портом із блоку слів при
//прийомі або передачі. Слова даних з активізованих каналів приймаються й
//передаються, а слова з заблокованих каналів ігноруються.
*pSPORT0_MTCS0 = 0x000000FF; //Активізує 8 каналів для передачі даних
*pSPORT0_MRCS0 = 0x000000FF; //Активізує 8 каналів для прийому даних

//Установка регістрів конфігурації багатоканального режиму SPORTx


//(SPORTx_MCMCn)
*pSPORT0_MCMC1 = 0x0000;
44
*pSPORT0_MCMC2 = 0x101c;
}

Компандування
Компандування (companding, скорочення від COMpressing (стиск) і exPANDing
(розширення)) – це процес логарифмічного кодування й декодування з метою зменшення
числа біт переданих даних. Послідовні порти ADSP_2106x підтримують два найпоширеніші
алгоритми компандування: за µ-законом та A-законом. Процесор компандує дані відповідно
до специфікації MKKTT (CCITT) G.711. Тип компандування може обиратися незалежно для
кожного послідовного порту.
Коли компандування дозволено, дійсним значенням регістра SPORTx_RX є вирівняне
за правою границею, доповнене за знаком розширене значення восьми прийнятих молодших
бітів (LSB). Запис у регістр SPORTx_RX викликає стиск 16-розрядного значення до восьми
LSB (доповнених за знаком до розміру переданого слова) і запис у внутрішній регістр
передачі. Незважаючи на те, що максимальні довжини слів, підтримувані стандартами
компандування, становлять 13 (при компандуванні за A-законом) або 14 (при компандуванні
за µ-законом), можуть використовуватися слова довжиною до 16 бітів. Якщо модуль
величини слова перевищує припустиме максимальне значення, воно автоматично
стискається до максимального позитивного або негативного значення. При компандуванні не
підтримуються слова, довжина яких перевищує 16 бітів.

Прямий доступ до пам’яті


Процесор використовує прямий доступ до пам’яті (Direct Memory Access, DMA) для
передач даних між просторами пам’яті або між простором пам’яті й периферійним
пристроєм. Процесор може задати параметри операцій передачі даних і повернутися до
виконання основної програми, при цьому передача даних виконується (незалежно від роботи
процесора) повністю інтегрованим контролером DMA.
Контролер DMA може виконувати кілька типів передач даних:
- передачі між просторами пам’яті (MDMA);
- передачі між пам’яттю й послідовним периферійним інтерфейсом (SPI);
- передачі між пам’яттю й послідовним портом (SPORT);
- передачі між пам’яттю й портом UART;
- передачі між пам’яттю й паралельним периферійним інтерфейсом (PPI).
Система процесора Blackfin містить шість периферійних пристроїв, що підтримують
DMA, включаючи контролер DMA типу “пам’ять-пам’ять” (MDMA). Ці пристрої
підтримуються наступними дванадцятьма каналами DMA:
- контролер DMA прийому/передачі PPI;
- контролер DMA прийому SPORT0;
- контролер DMA передачі SPORT0;
- контролер DMA прийому SPORT1;
- контролер DMA передачі SPORT1;
- контролер DMA прийому/передачі SPI;
- контролер DMA прийому UART;
- контролер DMA передачі UART;
- канал передачі (приймач) потоку 1 MDMA;
- канал прийому (джерело) потоку 1 MDMA;
- канал передачі (приймач) потоку 0 MDMA;
- канал прийому (джерело) потоку 0 MDMA.
Передачі даних у режимі DMA можуть бути засновані на використанні дескрипторів
або на використанні регістрів. Для ініціації послідовності передач у режимі DMA з
використанням дескрипторів потрібна наявність набору параметрів, що зберігаються в
пам’яті. Цей тип передач дозволяє виконувати зв’язані ланцюжки передач DMA. В операціях
45
DMA з використанням дескрипторів канал DMA може бути запрограмований на автоматичне
настроювання й початок іншої передачі в режимі DMA по завершенні поточної передачі.
При виконанні операцій DMA з використанням регістрів процесор може прямо програмувати
регістри керування DMA для ініціації передач. При необхідності, по завершенні передачі
значення регістрів керування може автоматично обновлятися значеннями початкової
ініціалізації для забезпечення неперервності передач.

Розглянемо функцію Init_DMA() модуля Initialize.cpp, яка ініціалізує DMA1 й DMA2 в


автобуферному режимі для прийому й передачі відповідно:

void Init_DMA(void)
{
// Установка DMA1 для прийому
//Регістр PERIPHERAL_MAP визначає відповідність каналів DMA периферійним
//пристроям: визначає периферійний пристрій, пов’язаний з каналом DMA, і те, чи
є //канал каналом DMA периферійного пристрою або каналом DMA типу
“пам’ять-//пам’ять”.
*pDMA1_PERIPHERAL_MAP = 0x1000; //канал DMA1 периферійного
//пристрою, прийом Sport0

// Настроювання конфігурації DMA1


// WNR (напрямок DMA): 1- DMA використовується в операціях запису в пам’ять;
// WDSIZE (розмір слова): 32-бітні передачі;
// DI_EN (дозвіл переривання даних): 1- переривання по завершенню передач
блоку //даних дозволено;
//FLOW (наступна операція): FLOW_1 (файл Talkthrough.h) - режим автобуферизації:
*pDMA1_CONFIG = WNR | WDSIZE_32 | DI_EN | FLOW_1;

// Початковий адреса буфера даних


*pDMA1_START_ADDR = iRxBuffer1;
// Значення лічильника внутрішнього циклу
*pDMA1_X_COUNT = 8;
// Інкремент адреси внутрішнього циклу
*pDMA1_X_MODIFY = 4;

// Установка DMA2 для передачі


*pDMA2_PERIPHERAL_MAP = 0x2000; //канал DMA2 периферійного
//пристрою, передача Sport0

// Настроювання конфігурації DMA2


//WDSIZE (розмір слова): 32-бітні передачі; FLOW (наступна операція):
//FLOW_1 (файл Talkthrough.h) - режим автобуферизації:
*pDMA2_CONFIG = WDSIZE_32 | FLOW_1;
// Початковий адреса буфера даних
*pDMA2_START_ADDR = iTxBuffer1;
// Значення лічильника внутрішнього циклу
*pDMA2_X_COUNT = 8;
// Інкремент адреси внутрішнього циклу
*pDMA2_X_MODIFY = 4;
}
46
Розглянемо функцію Enable_DMA_Sport0() модуля Initialize.cpp, яка дозволяє DMA1,
DMA2, Sport0 TX й Sport0 RX:

void Enable_DMA_Sport0(void)
{
// Дозволяє DMAs
//DMA_EN, DMA Channel Enable (Дозвіл каналу DMA): 1 - дозволяє роботу
//каналу DMA
*pDMA2_CONFIG = (*pDMA2_CONFIG | DMAEN);
*pDMA1_CONFIG = (*pDMA1_CONFIG | DMAEN);

// Дозволяє Sport0 TX (передача) і Sport0 RX (прийом):


// TSPEN, Transmit Enable (Дозвіл передачі): 1 - передача дозволена
// RSPEN, Receive Enable (Дозвіл прийому): 1 - прийом дозволений
*pSPORT0_TCR1 = (*pSPORT0_TCR1 | TSPEN);
*pSPORT0_RCR1 = (*pSPORT0_RCR1 | RSPEN);
}

Контролери SPI-сумісного порту


Процесор має порт послідовного периферійного інтерфейсу (SPI, Serial Peripheral
Interface), що забезпечує інтерфейс вводу-виводу з різними SPI-сумісними периферійними
пристроями.
SPI є синхронним послідовним каналом промислового стандарту, що забезпечує
зв’язок з декількома SPI-сумісними пристроями. SPI-порт є синхронним чотирьохдротовим
інтерфейсом із двома виводами даних (MOSI й MISO), виводом вибору пристрою (SPISS) і
виводом сигналу синхронізації (SCK). Використання двох виводів даних дозволяє
організувати взаємодію з іншими SPI-сумісними пристроями в повнодуплексному режимі.
Також є можливість програмного завдання швидкостей передачі й фази/полярності сигналу
синхронізації.
SPI-порт може працювати в середовищі з декількома ведучими пристроями,
виконуючи роль ведучого або ведомого пристрою. Для запобігання конфліктів на шині даних
при роботі в середовищі з декількома ведучими SPI-інтерфейс використовує виводи з
відкритим стоком.
На рис. 3 наведена блок-схема SPI-інтерфейсу. Інтерфейс являє собою регістр, що
послідовно передає дані в інший SPI-пристрій або приймає дані з іншого SPI-пристрою (по
одному біту за такт SCK). Прийом і передача даних за допомогою цього регістра
здійснюються одночасно. При виконанні передач через SPI передані дані послідовно
зсуваються на вихід через регістр, а прийняті дані послідовно зсуваються на вхід на іншому
кінці того ж самого регістра. Сигнал SCK служить для синхронізації зсувів даних на двох
виводах даних.
47

ВНУТРІШНІЙ
ГЕНЕРАТОР
СИГНАЛУ
СИНХРОНІЗАЦІЇ
SPI
ЛОГІКА SPI-ІНТЕРФЕЙСУ

РЕГІСТР ЗСУВУ

РЕГІСТР ПРИЙОМУ РЕГІСТР ПЕРЕДАЧІ ЗАПИТ


SPI_RDBR SPI_TDBR ПЕРЕРИВАННЯ
АБО DMA SPI

ЧОТИРЬОХ ЕЛЕМЕНТНИЙ БУФЕР FIFO

Рис. 3. Блок-схема SPI

При передачах даних за SPI-інтерфейсом один з SPI-пристроїв працює в режимі


ведучого пристрою SPI-каналу. Він управляє потоком даних, генеруючи сигнал синхронізації
SPI і виставляючи сигнал вибору SPI-пристрою (SPISS). Інший SPI-пристрій працює в
режимі ведомого. Він приймає дані, що надходять від ведучого пристрою, у регістр і передає
запитувані дані з цього регістра на вивід передачі даних. Кілька процесорів Blackfin, а також
інших мікроконтролерів і мікропроцесорів, можуть по черзі ставати ведучими пристроями.
Один ведучий пристрій може одночасно передавати дані декільком ведомим
(широкомовний режим). Але в один момент часу тільки один з ведомих пристроїв може
передавати дані ведучому пристрою. Це повинне обов’язково виконуватися в
широкомовному режимі, коли для прийому даних від провідного пристрою може вибиратися
декілька ведомих, але в один момент часу тільки одному ведомому пристрою дозволено
передавати дані ведучому.
У системах з декількома ведучими пристроями, у яких кілька процесорів взаємодіють
через SPI-порти, які відповідають виводам MOSI, MISO, SCK різних процесорів з’єднуються
один з одним.
При роботі в системі з декількома ведомими пристроями процесор використовує сім
програмувальних прапорів PF1-PF7 як джерела сигналів вибору ведомих пристроїв SPI.
Після скидання SPI-порт настроюється у режим ведомого пристрою і його робота
заборонена.

Розглянемо функцію Init1836() модуля Initialize.cpp, яка встановлює SPI порт для
конфігурації AD1836 (Вміст масиву sCodec1836TxRegs відправлено на декодер):
48
void Init1836(void)
{
int i;
int j;
static unsigned char ucActive_LED = 0x01;

// Запис в Port A, щоб скинути AD1836


*pFlash_Port_Data = 0x00;

// Запис в Port A, щоб дозволити AD1836


*pFlash_Port_Data = ucActive_LED;

// Очікування після скидання


for (i=0; i<0xf000; i++) asm("nop;");

// Дозвіл PF4
*pSPI_FLG = FLS4;

//Установка регістра SPI_BAUD, який призначений для завдання бітової швидкості


//передачі ведучого пристрою. Частота сигналу синхронізації (SCK) =
//(тактова частота периферійних пристроїв) / (2*SPI_BAUD)
*pSPI_BAUD = 16; // SCK = 2MГц

//Встановлення регістру керування SPI_CTL: передачі починати при записі в


//SPI_TDBR, довжина слова – 16 біт, ведучий пристрій для SPI
*pSPI_CTL = TIMOD_DMA_TX | SIZE | MSTR; //TIMOD_DMA_TX описів в
файлі //Talkthrough.h

// Установка DMA5
//Регістр PERIPHERAL_MAP визначає відповідність каналів DMA периферійним
//пристроям: визначає периферійний пристрій, пов’язаний з каналом DMA, і те, чи
є //канал каналом DMA периферійного пристрою або каналом DMA типу
“пам’ять-//пам’ять”.
*pDMA5_PERIPHERAL_MAP = 0x5000; //канал DMA5 периферійного
//пристрою SPI
// 16-бітні передачі
*pDMA5_CONFIG = WDSIZE_16;
// Початковий адреса буфера даних
*pDMA5_START_ADDR = sCodec1836TxRegs;
// Значення лічильника внутрішнього циклу
*pDMA5_X_COUNT = CODEC_1836_REGS_LENGTH;
// Інкремент адреси внутрішнього циклу
*pDMA5_X_MODIFY = 2;

// Дозвіл роботи каналу DMA


*pDMA5_CONFIG = (*pDMA5_CONFIG | DMAEN);
// Дозвіл SPI-порту
*pSPI_CTL = (*pSPI_CTL | SPE);

// Очікування завершення передачі для SPI


for (j=0; j<0xaff0; j++) asm("nop;");
49
// блокування SPI-порту
*pSPI_CTL = 0x0000;
}

Інтерфейс зовнішньої шини


Інтерфейс зовнішньої шини (EBIU, External Bus Interface Unit) забезпечує інтерфейс із
пристроями зовнішньої пам’яті, не потребуючих додаткових компонентів. Процесор
підтримує синхронні DRAM (SDRAM) і сумісний зі стандартами SDRAM PC100 й PC133.
EBIU також підтримує асинхронні пристрої пам’яті, такі як SRAM, ROM, FIFO, флеш-
пам’ять і схеми на базі ASIC/FPGA.
EBIU обслуговує запити на звертання до зовнішньої пам’яті, що надходять від ядра
або каналу DMA. Пріоритет запитів визначається контролером зовнішньої шини. Залежно
від адреси запит обслуговується контролером SDRAM EBIU або контролером асинхронної
пам’яті EBIU.
EBIU керується тактовим сигналом системи (SCLK). Всі пристрої синхронної пам’яті,
що підключені до процесора, працюють із частотою SCLK. Відношення частоти ядра до
частоти SCLK задається програмно за допомогою регістрів схеми фазового
автопідстроювання частоти (PLL), відображених у карті пам’яті.
На рис. 4 показана концептуальна блок-схема EBIU і його інтерфейсів. Назви
сигналів, що мають активний низький рівень, супроводжуються рисою зверху.

ПРОЦЕСОРА
КОНТРОЛЕР ЗОВНІШНЬОЇ ШИНИ

КОНТАКТНІ ПЛОЩАДКИ
(EBC)

КОНТРОЛЕР
АСИНХРОННОЇ
ПАМ’ЯТІ
(AMC)

КОНТРОЛЕР
SDRAM
(SDC)

Рис. 4. Пристрій інтерфейсу зовнішньої шини (EBIU)

В один момент часу може виконуватися звертання тільки до одного зовнішнього


пристрою пам’яті, і тому керуючі, адресні виводи і виводи даних всіх пристроїв
мультиплексуються на виводах процесора. Арбітраж спільно використовуваних виводів
50
здійснюється контролером асинхронної пам’яті (AMC, Asynchronous Memory Controller) і
контролером SDRAM (SDC, SDRAM Controller).
EBIU функціонує як ведомий пристрій на трьох внутрішніх шинах процесора, а саме:
- на шині зовнішнього доступу (EAB), керованої пристроєм керування пам’яттю ядра за
допомогою запитів зовнішньої шини ядром;
- на зовнішній шині DMA (DEB), керованої контролером DMA за допомогою запитів
зовнішньої шини, що надходять від будь-якого каналу DMA;
- на шині периферійного доступу (PAB), керованої ядром за допомогою запитів доступу до
регістрів системи, відображених у карті пам’яті.

Інтерфейси із цими шинами, а також регістри EBIU і регістри введення/виведення, які


з’єднані з контактними площадками, є синхронними й працюють із частотою SCLK. Доступ
до асинхронної зовнішньої пам’яті і до зовнішньої синхронної DRAM забезпечується шиною
EAB. Залежно від внутрішньої адреси, використовуваного при доступі до EBIU, доступом до
зовнішньої пам’яті управляє або AMC, або SDC. Тому що AMC й SDC мають загальний
інтерфейс із зовнішніми виводами, доступ виконується послідовно. Арбітраж доступів
виконується на підставі запитів EAB.
Третя шина (PAB) використовується тільки для доступу до регістрів керування й
стану EBIU, відображеним у карті пам’яті. PAB має окремі з’єднання з AMC та SDC;
арбітраж або додавання циклів очікування при одночасних доступах до EBIU по шинах PAB
і EAB не потрібний.
Арбітраж запитів доступу до зовнішньої пам’яті, що надходять шинами EAB та DEB,
повинен здійснювати контролер зовнішньої шини (EBC, External Bus Controller). EBC
направляє запити читання і запису у відповідний контролер пам’яті залежно від адреси. AMC
і SDC конкурують за доступ до спільно використовуваних ресурсів логіки керування
контактними площадками. Розв’язок конфліктних ситуацій виконується за конвеєрним
принципом арбітром EBC. У більшості випадків транзакції, які ініціюються ядром, мають
пріоритет перед доступами в режимі DMA. Але якщо контролер DMA виявляє надмірність
транзакцій ядра, він може запросити тимчасове збільшення пріоритету в порівнянні з ядром.

Розглянемо функцію Init_EBIU() модуля Initialize.cpp, яка ініціалізує асинхронні


сегменти пам’яті в EBIU так, щоб можна було б звернутись до Flash A:

void Init_EBIU(void)
{
//Установка регістрів управління банками асинхронною пам’яттю
(EBIU_AMBCTL0, //EBIU_AMBCTL1)
*pEBIU_AMBCTL0 = 0x7bb07bb0;
*pEBIU_AMBCTL1 = 0x7bb07bb0;
//Установка регістра глобального керування асинхронною пам’яттю (EBIU_AMGCTL)
*pEBIU_AMGCTL = 0x000f;
}

Обробка подій
У процесорі реалізований дворівневий механізм керування подіями. Контролер подій
процесора складається із двох рівнів: контролера подій ядра (CEC, Core Event Controller) і
контролера переривань системи (SIC, System Interrupt Controller). Контролер переривань
системи (SIC) процесора разом з контролером подій ядра (CEC) призначає пріоритети й
управляє всіма перериваннями системи. SIC забезпечує відображення багатьох джерел
периферійних переривань на впорядковані за пріоритетами входи переривань загального
призначення ядра. Це відображення є програмованим; крім того, індивідуальні джерела
переривання можуть маскуватися в SIC.
51
Контролер переривань системи (SIC)
Контролер переривань системи забезпечує відображення подій багатьох периферійних
джерел переривань у входи переривань CEC загального призначення з упорядкованими
пріоритетами. Хоча в процесорі реалізоване відображення за замовчуванням, користувач
може змінювати відповідності між перериваннями ядра й системи й пріоритети переривань
записом відповідних значень у регістри призначення переривань (IAR, Interrupt Assignment
Registers).

Розглянемо функцію Init_Sport_Interrupts() модуля Initialize.cpp, яка ініціалізує


переривання для Sport0 RX (прийом Sport0):

void Init_Sport_Interrupts(void)
{
//Регістри призначення переривань системи (SIC_IARx) управляють відносним
//пріоритетом периферійних переривань, що може бути встановлений шляхом
//призначення периферійному перериванню відповідного рівня переривання ядра
//загального призначення.
// Установка пріоритету переривання DMA1 (прийом Sport0) рівня переривання
IVG9 //(значення 2 у регістрі SIC_IAR1)
*pSIC_IAR0 = 0xffffffff;
*pSIC_IAR1 = 0xffffff2f;
*pSIC_IAR2 = 0xffffffff;

// Прив’язування ISRs до векторів переривань: Sport0 RX ISR -> IVG 9


register_handler(ik_ivg9, Sport0_RX_ISR);

// Дозвіл переривання Sport0 RX


*pSIC_IMASK = 0x00000200;
ssync();
}

Функція Sport0_RX_ISR, описана в модулі ISR.cpp, виконується після того, як були


одержані всі вхідні дані. Нові вибірки зберігаються в iChannel0LeftIn, iChannel0RightIn,
iChannel1LeftIn та iChannel1RightIn відповідно. Потім викликається функція обробки
звукових даних Process_DataCPP(). Після цього оброблені значення копіюються із змінних
iChannel0LeftOut, iChannel0RightOut, iChannel1LeftOut та iChannel1RightOut до буфера
передачі DMA.

Порядок виконання роботи


1. Для виконання лабораторної роботи повинні бути встановлені операційна система
Windows XP, програмне забезпечення VisualDSP++ та підключені комп’ютерні колонки
гучномовців.
2. Отримати у викладача плату EZ-KIT Lite (ADSP-BF533), перетворювач напруги, USB-
кабель та спеціальні перехідні кабелі. Після цього виконати наступні дії:
 утримуючі плату за її ребра, підключити до плати USB-кабель та
кабель живлення від перетворювача напруги, після чого встановити плату на гумові
ніжки на поверхню лабораторного стола;
 підключити перетворювач напруги до мережі 220В; після цього
на платі короткочасно загорається червона лампочка, а потім – зелена та починають
миготіти жовті лампочки;
52
 підключити USB-кабель до комп’ютера; після цього на платі
загорається жовта лампочка біля USB-роз’єму.
3. Завантажити програму будь-якого програвача звукових файлів, відкрити певний
звуковий файл та пересвідчитись у його роботі.
4. Утримуючі плату за її ребра, підключити спеціальні перехідні кабелі через відповідні
роз’єми до плати, до комп’ютера та до гучномовців за наступною схемою.
 перший спеціальний кабель підключити до аудіо виходу
комп’ютера та до лівої пари аудіо входів плати (AUDIO IN – блок з 4 роз’ємів).
 другий спеціальний кабель підключити до правої пари аудіо
виходу плати (AUDIO OUT – блок з 6 роз’ємів) та до кабелю колонок гучномовців.
5. Завантажити VisualDSP++ в режимі роботи з платою EZ-KIT Lite (ADSP-BF533).
6. Відкрити проект «C_Talkthrough_TDM.dpj» та завантажити його до сигнального
процесора шляхом подання команди "Build Project"; після цього програма повинна
завантажитися до плати сигнального процесора автоматично.
7. Встановити перемикачі 5 та 6 на групі перемикачів SW9 в стан «OFF».
8. Виконати запуск програми шляхом подання команди «Run» з середовища VisualDSP+
+. Після цього з гучномовців повинен лунати звук.
9. Зупинити роботу програми шляхом подання команд «Halt» та «Reset».
10. Розробити програми відповідно до завдань 1-3 та послідовно завантажувати їх на
виконання в сигнальному процесорі.
11. Завершити роботу VisualDSP++.
12. Після завершення роботи VisualDSP++ виконати наступні дії:
 відключити спеціальні перехідні кабелі;
 відключити USB-кабель від комп’ютера;
 відключити перетворювач напруги від мережі 220В;
 відключити USB-кабель і кабель живлення від плати.
13. Повернути викладачу плату EZ-KIT Lite (ADSP-BF533), перетворювач напруги, USB-
кабель та спеціальні перехідні кабелі.
14. Скласти короткий звіт з отриманих результатів.

Практична частина
Завдання 1. На основі програми C_Talkthrough в середовищі VisualDSP++ виконати
розробку програми, яка здійснює підсилення амплітуди звукових даних у 2 рази.
Завдання 2. Розробити програму, яка виконує фільтрацію шумової компоненти для
заданого фрагменту звукових даних шляхом застосування відповідного цифрового фільтра
(структуру та параметри фільтра визначає викладач).
Завдання 3. Розробити програму, яка здійснює підсилення верхніх частот звукових
даних.

Контрольні питання
1. Дайте перелік периферійних пристроїв системи сигнального процесора серії Blackfin.
2. Який периферійний пристрій використовується для обробки відеопотоків даних?
3. Який периферійний пристрій використовується для обробки звукових потоків даних?
4. Для чого використовуються послідовні порти?
5. Як працює послідовні порти?
6. Якого значення може досягати частота сигналу тактової синхронізації послідовних
портів?
7. Чому дорівнює довжина слова при передачі даних послідовними портами?
8. Що таке компандування даних?
9. В чому полягає компандування за A-законом та за µ-законом?
10. Що дозволяє робити контролер DMA?
53
11. Які є типи передачі даних може виконувати контролер DMA?
12. Якими каналами DMA підтримуються периферійні пристрої?
13. Для чого призначений порт послідовного периферійного інтерфейсу?
14. Як організований SPI-інтерфейс?
15. Як взаємодіють ведучий і ведомий пристрої SPI-каналу?
16. Що забезпечує інтерфейс зовнішньої шини?
17. Чим керується інтерфейс зовнішньої шини?
18. На яких внутрішніх шинах процесора функціонує інтерфейс зовнішньої шини?
19. Як виконується обробка подій у сигнальному процесорі?
20. Для чого потрібен контролер переривань системи?

Перелік рекомендованої літератури


1. Справочное руководство по архитектуре процессора Blackfin ADSP-BF533 (ADSP-
BF533 Blackfin Processor Hardware Reference) / русский перевод/ – Analog Devices,
2004.
2. “Architecture Description Languages for Systems-on-Chip Design”. HiroyukiTomiyama,
Ashok Halambi, Peter Grun. Center for Embedded Computer Systems,Univertsity of
California.
3. “Retargetable Code Generation for Digital Signal Processors”. Rainer Leupers. Kluwer
Academic Publishers, 1997.
4. “Generation of software tools from processor descriptions forhardware/software codesign”,
Hartoog, Design Automation Conference, 1997
5. “ADSP-21000 Family DSP Microcomputers”, Analog Devices, доступный по адресу
http://www.analog.com
6. “Retargetable Compilers for Embedded Core Processors”. Clifford Liem,Pierre G. Paulin,
Ahmed A.Jerraya. Kluwer Academic Publishers, 1997.
7. ADSP-BF53x/BF56x Blackfin Processor Programming Reference, 2006, Analog Devices,
Inc.
8. ADSP-BF53x/BF56x Blackfin Processor Hadware Reference, 2006, Analog Devices, Inc.

You might also like