Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК МПСС.doc
Скачиваний:
38
Добавлен:
09.11.2019
Размер:
11 Mб
Скачать

3. Работа с dsp/bios для генерации звукового сигнала платой dsk5510

Введение в DSP/BIOS

DSP/BIOS представляет собой ядро реального времени, которое предоставляет разработчику следующие сервисы:

  1. гибкий планировщик задач с возможностью мультизадачной работы;

  2. уровень аппаратной абстракции для работы с периферийными устройствами процессора;

  3. устройство независимого ввода/вывода для передачи потоков данных в реальном времени;

  4. средства анализа поведения ЦОС-приложения и обмена с ним данными в реальном времени.

Практически, это оптимизированная для ЦОС-приложений мультизадачная операционная система реального времени.

В отличие от большинства существующих коммерческих ядер, DSP/BIOS поставляется бесплатно как составная часть среды разработчика Code Composer Studio, что весьма немаловажно, с учётом цен на продукты такого класса. При этом DSP/BIOS включает в свой состав оптимизированные для работы с конкретным ЦСП библиотеки и компоненты.

Рассматривая применение операционных систем в ЦОС-приложениях, необходимо помнить три очень важных момента. Первый - ограниченность ресурсов встроенной системы, которая заставляет очень жёстко подходить к дополнительным расходам, например, памяти. Второй момент - необходимость минимизации временных накладных расходов, поскольку мы работаем в реальном времени и желательно максимально использовать всю производительность ЦСП для решения основной задачи. Третий момент относится именно к системам ЦОС и заключается в следующем: чем сложнее операционная среда, тем сложнее предсказать её поведение, что никак не допустимо в алгоритмах ЦОС. Следовательно, надо иметь средства однозначного задания поведения системы и средства контроля её поведения.

Для реализации этих достаточно противоречивых требований при построении DSP/BIOS была выбрана следующая модель: DSP/BIOS является статически конфигурируемым ядром реального времени со статически определяемой приоритетной моделью исполнения процессов. Что же достигается такой моделью? Во-первых, минимизация дополнительных расходов памяти, поскольку в исполняемый код включаются только модули, необходимые при реализации данной задачи, а не вся операционная среда. Во-вторых, достигается оптимизация производительности процессора, поскольку большинство статических вызовов после компиляции упаковываются в несколько команд. Далее, поскольку время выполнения команд ЦСП известно, конфигурация системы задаётся статически и тоже известна, модель исполнения и система приоритетов также задаётся статически, то мы имеем полностью предсказуемое и однозначно определённое поведение системы.

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

Как уже говорилось, при построении любой операционной системы важным вопросом является дополнительный расход ресурсов на предоставляемые ей сервисы. В операционной системе реального времени, кроме расхода ресурсов процессора и памяти, добавляется ещё и фактор расхода времени. С учётом достаточно ограниченных ресурсов систем ЦОС, а также очень жёстких временных рамок, очень большое значение имеет правильный выбор операционной среды. С одной стороны, ОС должна предоставлять достаточно гибкий и удобный набор функциональных возможностей, а с другой - расходовать как можно меньше ресурсов. При построении DSP/BIOS была выбрана многоуровневая модель построения системных сервисов. Для каждой области имеются несколько типов вызовов, аналогичных по назначению, но различных по функциональным возможностям и, соответственно, по расходуемым ресурсам. Так, существует нить типа "прерывание" с базовыми возможностями и очень малым временем реакции и существует нить типа "задача" с гораздо большим набором предоставляемых сервисов, но и с другими временными параметрами переключения и отработки. Аналогично, существует статическое распределение памяти, которое вообще не потребляет ресурсов процессора, так как задаётся утилитами конфигурации. Кроме того, существует динамическое распределение памяти, использование которого требует включения в исполняемый код соответствующего модуля и работает через системные вызовы, но позволяет разным процессам использовать ОЗУ совместно. Такая модель, совместно с моделью конфигурирования самого ядра DSP/BIOS, когда в выходной код добавляются только используемые компоненты, позволяет сочетать быстрое время реакции и малый объём дополнительного кода с широкими функциональными возможностями операционной системы реального времени.

Одной из задач, решаемых DSP/BIOS, является предоставление разработчику уровня аппаратной абстракции, то есть единого логического интерфейса работы с аппаратной частью системы ЦОС, при этом учёт особенностей работы аппаратных узлов того или иного ЦСП возлагается на инструментальные средства. При этом имеется как интерфейс к программированию узлов ядра процессора, таким как таймер и контроллер ПДП, так и стандартный интерфейс для организации каналов ввода/вывода, включающий в себя драйверы периферийных устройств, драйверы портов, к которым они подключаются, например McBSP, и средства организации стандартных потоков ввода/вывода.

При правильном использовании средств DSP/BIOS вполне достижим уровень аппаратной абстракции, при котором получается полная междуплатформенная переносимость приложения. Фактически, сбывается очень давняя мечта разработчиков - если на конечной стадии разработки выяснится, что ресурсов выбранного ЦСП не хватает или, что ещё более болезненно, законченная и с таким трудом упакованная задача требует расширения, то можно просто перейти на более мощный ЦСП, при этом можно даже поменять платформу, ничего не меняя в написанном, проверенном и отлаженном коде. Ещё одно преимущество переносимости - обратный процесс оптимизации. Можно взять мощный ЦСП, спокойно написать и отладить задачу, имея запас производительности для сервиса и отладки, на обкатку вариантов реализации и на оптимизацию участков кода, а затем, отладив и оптимизировав задачу, перенести её на оптимальный по параметрам и цене ЦСП для серийного выпуска устройства. С учётом наличия ЦСП различной мощности и объёма памяти в совместимых корпусах, возможности практически безболезненного переноса позволяют производить как функционально-стоимостную оптимизацию, так и модернизацию устройства без дорогостоящих затрат на модернизацию аппаратных составляющих устройства, например, на переразводку печатных плат. Как пример аппаратной совместимости, приведём ЦСП семейства С5000, где в одном корпусе и совместимыми по выводам выпускаются ЦСП от ‘VC5401 (50 MIPS, 8 Кслов ОЗУ, цена менее $6) до ‘VC5416 (160 MIPS, 128 Кслов ОЗУ), причём параллельно с ЦСП выпускается и совместимая по выводам номенклатура компонентов поддержки, таких как микросхемы источников и супервизоров питания.

Использование библиотек поддержки микросхем (Chip Support Library), абстрагирующих аппаратный уровень основных функций, библиотек ЦОС-функций (DSP Library), предоставляющих оптимизированные для каждой платформы основные ЦОС-алгоритмы с единым интерфейсом, интерфейсов DSP/BIOS для управления выполнением приложения, а также оптимизирующих компиляторов с языка С для написания алгоритмов позволяет создать реально абстрагированное, "отвязанное" от конкретной платформы ЦОС-приложение. Причём это приложение не будет являться лабораторным экспериментом, а будет реальной "боевой" разработкой с достаточным для практического применения уровнем оптимальности исполнения.

Наличие операционной среды, кроме удобства разработки, даёт ещё один плюс - все компоненты работы с аппаратным обеспечением уже отлажены и работают - не надо тратить время на их отладку.

Ещё одной важной особенностью DSP/BIOS является наличие визуальных средств контроля и протоколирования порядка и последовательности исполнения нитей, а также средств отслеживания критических мест, что позволяет легко оценить ход исполнения приложения и быстро отследить и устранить критические участки.

Компоненты DSP/BIOS

Основные компоненты DSP/BIOS в среде разработчика Code Composer Studio, показанные на рисунке 3.1.

На хост-компьютере пишутся исходные файлы проекта (на С, С++ или ассемблере), использующие интерфейсы DSP/BIOS API. Затем с помощью утилиты конфигурирования определяются те компоненты, которые будут использоваться в проекте, и их параметры. Исходные тексты, библиотека DSP/BIOS и файлы конфигурации образуют проект, из которого средствами генерации кода получается исполняемый файл, загружаемый в ЦСП. Встроенные средства анализа Code Composer Studio позволяют производить мониторинг исполнения программы.

Рисунок 3.1 – Компоненты DSP/BIOS.

DSP/BIOS - достаточно сложная статически конфигурируемая система, для задания конфигурации которой используется специальная графическая утилита, интегрированная в Code Composer Studio (рисунок 3.2). Утилита конфигурации - это специализированный визуальный редактор, который позволяет выбирать, какие модули DSP/BIOS будут включены в систему, а какие нет, а также задавать их параметры. Все параметры задаются статически до компиляции. При этом утилита конфигурации позволяет оценить объём требуемой под служебные нужды памяти, а также проверить соответствие заданных параметров, что позволяет избежать ошибок уже на начальном этапе конфигурации системы и сэкономить время на старте. Ещё одной функцией утилиты конфигурации является привязка проекта к конкретной аппаратной платформе. Именно в утилите конфигурации задаются параметры карты памяти, распределения прерываний и привязки тактовой частоты процессора к системным часам реального времени. При этом для различных ЦСП существуют уже готовые начальные схемы конфигурации DSP/BIOS.

Рисунок 3.2 – Утилита конфигурации.

Все модули ядра реального времени DSP/BIOS могут быть разбиты на 6 групп, каждая их которых предоставляет свой интерфейс (API) пользовательским приложениям:

  1. группа функций анализа реального времени и обмена данными;

  2. функции аппаратной абстракции;

  3. функции ввода/вывода, независимые от аппаратных устройств;

  4. функции управления выполнением нитей;

  5. функции взаимодействия и синхронизации нитей;

  6. прочие функции.

Графический пользовательский интерфейс (Graphical User Interface – GUI) упрощает разработку системы:

  1. Автоматически подключает необходимые библиотеки

  2. Автоматически обрабатывает вектора прерываний и перезапуск

  3. Определяет конфигурацию системной памяти (создает CMD-файл)

  4. Когда CDB-файл сохранен, инструмент конфигурирования создает 5 дополнительных файлов

Таблица 3.1

Имя_файла.cdb

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

Имя_файлаcfg_c.c

Си-код, создаваемый инструментом конфигурирования

Имя_файлаcfg.s55

ASM-код, создаваемый инструментом конфигурирования

Имя_файлаcfg.cmd

Командный файл компоновщика

Имя_файлаcfg.h

Заголовочный файл для *cfg_c.c

Имя_файлаcfg.h55

Заголовочный файл для *cfg.s28

Когда CDB-файл добавляется в проект, ИСР CCS автоматически добавляет сгенерированные файлы в директорию проекта (таблица 3.1).

Практическая реализация проекта с помощью DSP/BIOS

Необходимо запустить ИСР CCS в режиме симуляции. Создать новый проект под именем «exp_3» в папке «laba_2».

Теперь нужно создать и добавить к проекту исходный код программы, который находится в файле «main.c» (листинг 3.1). Суть исходного кода: плата DSK5510 конфигурируется таким образом, чтобы воспроизвести звуковой сигнал на частотах 1, 2, 3, 4, 5 КГц, который генерирует функция «sinewave()». Для этого в программе настраивается кодек AIC23 – на плате он отвечает за АЦП сигналов, которые поступают на линейный вход, и ЦАП сигнала подаваемого на линейные выходы. На плате кодек AIC23 представляет собой небольшую микросхему (AIC23BI), к которой подключены линейные входы/выходы, в память которой записаны все функции для работы. Чтобы можно было работать с этими функциями, необходимо подключить заголовочный файл «dsk5510_aic23.h». Но прежде чем начинать работу с кодеком нужно произвести инициализацию плата, для этого подключается заголовочный файл «dsk5510.h», в котором объявлена функция инициализации платы: «DSK5510_init()».

Листинг 3.1.

#include <math.h>

#include "dsk5510.h"

#include "dsk5510_aic23.h"

#include "dsp_bioscfg.h"

#define two_pi 6.28

/* Codec configuration settings */

DSK5510_AIC23_Config config = {

0x0017, // 0 DSK5510_AIC23_LEFTINVOL Left line input channel volume

0x0017, // 1 DSK5510_AIC23_RIGHTINVOL Right line input channel volume

0x00d8, // 2 DSK5510_AIC23_LEFTHPVOL Left channel headphone volume

0x00d8, // 3 DSK5510_AIC23_RIGHTHPVOL Right channel headphone volume

0x0011, // 4 DSK5510_AIC23_ANAPATH Analog audio path control

0x0000, // 5 DSK5510_AIC23_DIGPATH Digital audio path control

0x0000, // 6 DSK5510_AIC23_POWERDOWN Power down control

0x0043, // 7 DSK5510_AIC23_DIGIF Digital audio interface format

0x0081, // 8 DSK5510_AIC23_SAMPLERATE Sample rate control

0x0001 // 9 DSK5510_AIC23_DIGACT Digital interface activation

};

/*a prototype of function is a generating sound*/

short sinewave(float n);

void main()

{

DSK5510_AIC23_CodecHandle hCodec;

short sec, msec, sample;

float x;

short frq=1;

int gen_wav;

/* Initialize the board support library, must be called first */

DSK5510_init();

/* Start the codec */

hCodec = DSK5510_AIC23_openCodec(0, &config);

/* Generate sine wave for 5 seconds */

for (sec = 0; sec < 5; sec++)

{

x=0;

for(msec = 0; msec < 1000; msec++)

{

for (sample = 0; sample < 48; sample++)

{

gen_wav=sinewave(frq*x);

/* Send a sample to the left channel */

while (!DSK5510_AIC23_write16(hCodec, gen_wav));

/* Send a sample to the right channel */

while (!DSK5510_AIC23_write16(hCodec, gen_wav));

/* Step of function */

x+=two_pi/48;

}

}

frq++;

}

/* Close the codec */

DSK5510_AIC23_closeCodec(hCodec);

}

short sinewave(float n)

{

return((short)(sin(n)*16484));

}

Теперь из папки «С:\CCStudio_v3.1\C5500\dsk5510\include\» в папку с проектом копируется «dsk5510_aic23.h» и «dsk5510.h».

Следующим шагом необходимо создать файл конфигурации DSP/BIOS, вследствие того, что объем настроек достаточно большой, а на данном этапе стоит задача ознакомления с основами работы DSP/BIOS, то основа конфигурации DSP/BIOS будет взята из готового конфигурационного файла примера, который поставляется с пакетом ИСР CCS. Итак, нужно из папки «С:\CCStudio_v3.1\examples\dsk5510\bsl\tone\» открыть файл конфигурации (File → Open…) «tone.cdb», после чего сохранить его в папке с проектом под именем «dsp_bios.cdb». После этого его нужно добавить его к проекту.

Последним шагом в формировании пакета программы станет подключение библиотеки «dsk5510bslx.lib», которая находится: «c:\CCStudio_v3.1\C5500\dsk5510\lib\». Данная библиотека работает с моделью памяти: «Large», поэтому необходимо настроить опции компиляции.

Для настройки опций компиляции проекта необходимо:

  1. Выбрать раздел Project → Build Options… и на вкладке «Compiler» выбрать раздел «Advanced», далее необходимо установить модель памяти «Large», рисунок 3.3.

Рисунок 3.3 – Опции компиляции.

  1. Указать компилятору тип ЦСП, для этого в разделе «Preprocessor» в поле «Pre-Define Symbol» указать «CHIP_5510PG2_2», рисунок 3.4.

Рисунок 3.4 – Опции компиляции для процессора.

По окончании всех действий проект можно запускать на компиляцию и сборку. Однако ИСР CCS выдаст ошибку при попытке загрузить выходной файл в симулятор, рисунок 3.5.

Рисунок 3.5 - Ошибка загрузки проекта в симулятор.

Дело в том, что симулятор не поддерживает тех библиотек, с которыми собран проект, поэтому необходимо выполнять тестирования данной программы на аппаратном уровне, т. е. непосредственно на плате DSK5510. Однако ИСР CCS не выявило ошибок, поэтому для аппаратной реализации достаточно перенастроить ИСР CCS, снова открыть проект и заново выполнить компиляцию.

Перед тем как запустить программу на выполнение на плате DSK5510 необходимо подключить к линейному выходу наушники или колонки. Чтобы определить, куда именно вставлять разъем следует прочитать надписи на плате возле линейных входов/выходов.

Следует отметить, что звук, который воспроизводит DSK5510, не совпадает с теми частотами, которые задаются программно, также присутствует характерный шум. Это связано с тем, что время работы функции «sinewave()» превышает временной интервал между отсчетами на частоте дискретизации в 48 КГц (это частота задается по умолчанию). Поэтому функция «DSK5510_AIC23_write16» вынуждена ожидать, пока функция «sinewave()» рассчитает текущий отсчет. Именно это и вносит искажение в выходной сигнал. Однако, этот момент не принципиален, т. к. предложенный генератор звуковой частоты находит свое применение при тестировании цифровых фильтров.

Список функции кодека AIC23

  1. DSK5510_AIC23_rset(DSK5510_AIC23_CodecHandle hCodec, Uint16 regnum, Uint16 regval) - процедура при помощи которой можно установить значение необходимого регистра, задав его название и значение целым шестнадцати битным числом;

  2. Функция - Uint16 DSK5510_AIC23_rget(DSK5510_AIC23_CodecHandle hCodec, Uint16 regnum) возвращает значение регистра по его названию;

  3. Функция - DSK5510_AIC23_openCodec(int id, DSK5510_AIC23_Config *Config)типа DSK5510_AIC23_CodecHandle обозначает открытие кодека с номером и возвращает указатель открытия;

  4. void DSK5510_AIC23_closeCodec(DSK5510_AIC23_CodecHandle hCodec)- процедура закрытия кодека по указателю;

  5. void DSK5510_AIC23_config(DSK5510_AIC23_CodecHandle hCodec, DSK5510_AIC23_Config *Config) – процедура применения настроек регистров обязательных для корректной работы кодека;

  6. CSLBool DSK5510_AIC23_write16(DSK5510_AIC23_CodecHandle hCodec, Int16 val) – функция записи в регистр вывода шестнадцати битной величины, возвращает булевское значение (true - false );

  7. CSLBool DSK5510_AIC23_write32(DSK5510_AIC23_CodecHandle hCodec, Int32 val)- функция записи в регистр вывода тридцати двух битной величины, возвращает булевское значение (true - false);

  8. CSLBool DSK5510_AIC23_read16(DSK5510_AIC23_CodecHandle hCodec, Int16 *val)- читает из регистра ввода информацию в шестнадцати разрядную величину , возвращает булевское значение (true - false);

  9. CSLBool DSK5510_AIC23_read32(DSK5510_AIC23_CodecHandle hCodec, Int32 *val)- читает из регистра ввода информацию в тридцати двух разрядную величину , возвращает булевское значение (true - false);

  10. void DSK5510_AIC23_outGain(DSK5510_AIC23_CodecHandle hCodec, Uint16 outGain) – процедура устанавливающая увеличение значение выходных величин (усиление);

  11. void DSK5510_AIC23_loopback(DSK5510_AIC23_CodecHandle hCodec, CSLBool mode) – устанавливает состояние перемычки;

  12. void DSK5510_AIC23_mute(DSK5510_AIC23_CodecHandle hCodec, CSLBool mode)- отключает или включает звук;

  13. void DSK5510_AIC23_powerDown(DSK5510_AIC23_CodecHandle hCodec, Uint16 sect) – включает или отключает аттенюатор аналого-цифрового и цифро-аналогового преобразователя;

  14. void DSK5510_AIC23_setFreq(DSK5510_AIC23_CodecHandle hCodec, Uint32 freq)- устанавливает величину частоты дискретизации.

Индивидуальные задания студентам выдаются во время лабораторной работы преподавателем.