Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

МПУЭВС. Лекции. Задания / pdf_ПрилПЦиПУ / Приложение_О_ ПрограмОбрабДанных

.pdf
Скачиваний:
22
Добавлен:
11.05.2015
Размер:
235.58 Кб
Скачать

1

Приложение О О. Программирование задач обработки данных

О.1 Ввод-вывод данных по прерываниям

Ввод цифровых отсчетов аналогового сигнала Х(t) из АЦП и вывод дан-

ных в ЦАП программа должна выполнять циклически с периодом дискретиза-

ции TS. Для этого в процессорах обычно используется механизм векторного прерывания. Источниками прерываний являются сигналы, которые поступают на вход контроллера прерываний и временно приостанавливают выполнение основной программы. Процессор, получив сигнал на входе контроллера, закан-

чивает выполнение текущей команды в произвольной точке основной програм-

мы и переходит к одной из подпрограмм обработки прерывания. В приведен-

ном на рисунке О.1 примере прерывание вызвал импульсный сигнал,

формируемый периодически с интервалом TS на входе контроллера,

встроенного в микропроцессор ADSP-2189M.

Внешний сигнал поступил на вход микросхемы в тот момент времени,

когда процессор выполнял команду n, расположенную в ячейке памяти программ РМ с адресом 0x0210. Прерывание изменяет линейный порядок выполнения программы.

После завершения текущей команды n процессор автоматически заносит в стек информацию о состоянии программы в данный момент времени, рас-

положенную в системных регистрах, для ее дальнейшего восстановления по окончании обработки прерывания. Содержимое программного счетчика сохра-

нится в стеке PC, регистры секвенсора ASTAT, MSTAT, IMASK запоминаются в блоке STATUS STACK. Затем вместо следующего адреса 0x0211, на единицу больше текущего, процессор запишет в программный счетчик адрес начала подпрограммы обработки, который определяется таблицей векторов преры-

ваний (таблице О.1).

2

Рисунок О.1 - Вызов подпрограмм контроллером прерываний ADSP-2189M

Таблица О.1 - Источники и векторы прерываний ADSP-2189M

Источник прерывания

 

Адрес вектора прерывания

 

 

Сброс (Reset)

0x0000 (наивысший приоритет)

 

 

 

Снижение энергопотребления

0x

002С

 

 

 

IRQ2

0x

0004

 

 

 

IRQL1

0x

0008

 

 

 

IRQL0

0x

000C

 

 

 

Передатчик порта SPORT0

0x

0010

 

 

 

Приемник порта SPORT0

0x

0014

 

 

 

3

IRQE

0x

0018

 

 

 

Байтовый обмен ПДП (DMA)

0x

001C

 

 

 

Передатчик порта SPORT1 или сигнал

0x

0020

IRQ1

 

 

Приемник порта SPORT1 или сигнал

0x

0024

IRQ0

 

 

Таймер (timer)

0x

0028 (самый низкий

 

приоритет)

Примечание: IRQ2, IRQL1, IRQL0, IRQE, IRQ1, IRQ0 – внешние сигналы,

поступающие на входы процессора. Адреса векторов записаны в16-ричной системе счисления.

Последовательность выполняемых при этом переходов: сигнал на входе контроллера → вектор на выходе контроллера → таблица → адрес начала под-

программы. Для каждого сигнала контроллера в таблице зарезервировано 4

ячейки памяти и определен вектор. Вектор – это число, соответствующее по-

рядковому номеру сигнала и передаваемое контроллером процессору по внут-

ренней шине с той целью, чтобы процессор смог определить источник преры-

вания. Прерывания могут вызываться как внешними устройствами по отноше-

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

Если, например, периодические прерывания вызывает сигнал внутренне-

го таймера, то контроллер передает процессору вектор 0х000А. Умножением на четыре процессор рассчитывает первый адрес 0х0028 четырех ячеек памяти и записывает его в программный счетчик. Поскольку разместить реальную под-

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

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

соответствующей вектору 0х000А. Выполнив подпрограмму обработки

4

прерывания, процессор после команды завершения RTI автоматически восстанавливает системные регистры, читая их содержимое из стека,

записывает в программный счетчик адрес команды n+1 и продолжает выполнение основной программы с той точки, в которой произошел выход на подпрограмму. Поэтому приведенная в листинге 0 программа расчета выходного сигнала КИХ-фильтра должна находиться не в основной программе,

а в подпрограмме обработки прерывания таймера или последовательного порта,

к которому подключены АЦП и ЦАП. Регистр маскирования IMASK разрешает или запрещает прерывания индивидуально по каждому внешнему сигналу или встроенному устройству (табл. О.2). Если обнулить бит 0 регистра IMASK, то процессор прекратит выполнять подпрограмму, определенную вектором таймера 0х000А.

Таблица О.2 - Регистр маскирования прерываний IMASK

Биты

9

8

7

6

5

4

3

2

1

0

 

 

 

 

 

 

 

 

 

 

 

Устройство

IRQ2

IRQL1

IRQL0

SPORT0

SPORT0

IRQE

BDMA

SPORT1

SPORT1

Таймер

или сигнал

 

 

 

TX0

RX0

 

 

TX1

RX1

 

 

 

 

 

 

 

 

 

(IRQ1)

(IRQ0)

 

Программа пользователя может разрешить обработку отдельного преры-

вания, если соответствующий бит установить (записать в него единицу), или запретить - при сброшенном бите. Допускается менять содержимое регистра в процессе выполнения программы. При включении питания или сбросе процес-

сора регистр IMASK автоматически обнуляется, т.е. все маскируемые прерыва-

ния запрещены. Запись в регистр двоичного числа 0000000001 разрешит пре-

рывания только от таймера. Чтобы разрешить прерывания от приемника последовательного порта SPORT0 (RX0) и от внешнего сигнала IRQ2

необходимо записать в регистр число 1000100000 с установленными битами в разрядах 9 и 5. Прерывания передатчика порта SPORT0 (TX0) будут запрещены.

5

Поступающие сигналы на контроллер не вызовут выполнения процессором подпрограммы обработки прерывания передатчика порта SPORT0.

Встроенным контроллером прерываний обрабатывается десять маски-

руемых и два немаскируемых прерывания. Немаскируемые прерывания, вызы-

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

программы поступил запрос от устройства с более высоким приоритетом. Под-

программу обработки прерывания таймера, имеющего самый низкий приори-

тет, может приостановить любой другой сигнал, одновременно поступивший на вход контроллера и разрешенный регистром IMASK и регистром ICNTL. Регистр управления ICNTL содержит 5 разрядов. Бит 4 ICNTL разрешает или запрещает вложенные прерывания, т.е. одновременное выполнение нескольких подпрограмм прерываний с временной приостановкой тех, которые имеют более низкий приоритет (рисунок О.2).

Рисунок О.2 – Временные диаграммы процесса обработки вложенных прерываний контроллером

6

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

Подпрограмма 1 будет продолжена только после того, как полностью завер-

шится подпрограмма 2. Сигнал запроса 1 не может прервать подпрограмму 2.

Если бит 4 в регистре ICNTL установлен, то вложенные прерывания раз-

решены, при сброшенном бите – запрещены. Разряд 3 в регистре не используется. Биты 0,1,2 ICNTL определяют реакцию контроллера на форму внешних сигналов IRQ0, IRQ1 и IRQ2 соответственно. При установленном бите контроллер реагирует на фронт импульса, при сброшенном бите – на уровень сигнала. Регистр управления ICNTL не обладает чувствительностью к форме сигналов встроенных устройств, подключенных к контроллеру.

Задержка между предоставлением прерывания и выполнением первой ко-

манды подпрограммы составляет 3 командных цикла и равна 40 нс для таймера,

сигналов IRQx и последовательного порта SPORT. После сброса процессора прерывания разрешены по умолчанию. Команда DIS INTS запрещает все пре-

рывания, независимо от содержимого регистра маскирования IMASK. Проти-

воположная по действию команда ENA INTS разрешает процессору выполнять все прерывания, определенные в IMASK.

Таблица векторов прерываний занимает в памяти программ РМ фиксиро-

ванную область адресов от 0х0000 до 0х002F. Программы и подпрограммы пользователя являются перемещаемыми. Начальные адреса подпрограмм в примере на рисунке О.1 могут изменяться на этапах трансляции и компоновки.

Значения 0x0050, 0x0500 и 0х0710 приведены только для наглядности и не служат правилом для определения начальных адресов. Распределение адресов памяти программ и памяти данных процессора приведено в таблице О.3.

Распределение начальных адресов в памяти программ и памяти данных выполняет автоматически операционная система на этапе трансляции и компо-

7

новки. Программисту необходимо учитывать максимальный размер каждой об-

ласти памяти, которая используется в программе пользователя.

Таблица О.3 - Области памяти программ РМ и памяти данных DM ADSP-2189

 

Начальный

Конечный

Длина слова

 

адрес

адрес

(биты)

 

 

 

 

Сегмент прерываний РМ

0х00000

0х0002F

24

 

 

 

 

Сегмент кода РМ

0х00030

0х01840

24

 

 

 

 

Сегмент кода2 РМ

0х02000

0х02600

24

 

 

 

 

Сегмент данных DM

0х00000

0х036AF

16

 

 

 

 

Сегмент инициализации DM

0х036B0

0х036BF

16

 

 

 

 

Сегмент страниц DM

0х036C0

0х036CF

16

 

 

 

 

Сегмент данных DM

0х036D0

0х03C00

16

 

 

 

 

О.2 Организация циклического буфера

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

X(t) из АЦП могут поступать на вход циклического буфера процессора, если в программе пользователя указаны параметры буфера и порт, к которому под-

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

При поступлении нового отсчета в буфере изменяется содержимое одной 16-

разрядной ячейки памяти и сохраняется N-1 предыдущих значений.

Рисунок О.3 - Заполнение циклического буфера длиной N = 4

8

Рассмотрим применение циклического буфера для программной реализа-

ции фильтра с конечной импульсной характеристикой (КИХ) четвертого по-

рядка. После заполнения буфера первыми четырьмя числами Х1, Х2, Х3, Х4

рассчитывается свертка

Y = k1·X1 + k2·X2 + k3·X3 +k4·X4,

где k1, k2, k3, k4 – постоянные коэффициенты фильтра.

Чтобы выполнить свертку из четырех произведений и трех сумм в про-

грамме на языке ассемблера необходимо указать с помощью косвенной адреса-

ции номера ячеек буфера, в которых хранятся числа Х

Y = k1·x(0) + k2·x(1) + k3·x(2) + k4· x(3).

При чтении из памяти индексы массива x для расчета Y меняются в сле-

дующем порядке: 0, 1, 2, 3. Генератор адреса DAG при следующем обращении к массиву x автоматически повторит цикл перебора индексов, независимо от того,

какая будет выполняться команда в программе – чтение или запись. Сле-

дующая команда алгоритма – запись числа Х5 в ячейку памяти буфера. По-

скольку следующим индексом цикла адреса является 0, то Х5 запишется в бу-

ферный элемент массива х(0). Затем следует новый цикл расчета выходного сигнала фильтра с продолжением перебора индекса при чтении переменных из памяти

Y = k2·x(1) + k3·x(2) + k4· x(3) + k1·x(0),

т.е.

Y = k2·X2 + k3·X3 +k4·X4 + k1·Х5.

Самый старый отсчет Х1 из буфера удален, три значения Х2, Х3 и Х4 со-

хранились без изменения. Порядок перебора индексов 1, 2, 3, 0 при расчете Y

отличается от того, который был ранее. После записи Х6 в ячейку х(1) расчет выходного сигнала выполняется с перебором индексов 2, 3, 0, 1

9

Y = k3·x(2) + k4· x(3) + k1·x(0) + k2·x(1) = k3·X3+k4·X4 + k1·Х5 + k2·X6.

Этот способ применяется при любом числе звеньев фильтра. При такойадресации ячеек памяти генератор адреса должен выдавать лишь последовательные значения адресов, вне зависимости от того, какая операция с памятью – чтение или запись – осуществляется в настоящий момент. Буфер такого типа называется циклическим, потому что когда при записи или чтении достигается последняя ячейка, указатель памяти автоматически устанавливается на начало буфера.

Выборка коэффициентов из памяти осуществляется одновременно с вы-

боркой данных. При рассмотренной схеме адресации самые старые отсчеты из-

влекаются из памяти первыми. Поэтому порядок выборки коэффициентов должен соответствовать очередности выбираемых данных. Для расчета фильтра в программе необходимо организовать два циклических буфера – один для дан-

ных Х, другой – для коэффициентов k.

Одновременная выборка двух операндов k и Х в сигнальном процессоре осуществляется по двум независимым шинам: шине данных памяти программ и шине данных памяти данных. Кроме того, имеются отдельные шина адреса па-

мяти программ и шина адреса памяти данных. Таким образом, МАС может по-

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

L0 – L7, указателя адреса – регистры I0 – I7, шага изменения адреса – реги-

стры М0 – М7.

В листинге 6 приведен фрагмент программы вычисления одного значе-

ния выходного сигнала КИХ-фильтра N-го порядка по следующему алгоритму:

-выборка коэффициента из циклического буфера коэффициентов;

-обновление указателя адреса буфера коэффициентов;

-выборка отсчета из циклического буфера входного сигнала;

-обновление указателя адреса буфера входного сигнала;

10

-умножение коэффициента на отсчет;

-добавление нового слагаемого к промежуточному результату;

-переход в начало цикла программы, если просуммированы не все произ-

ведения.

Листинг 5

Расчет фильтра с циклической буферизацией

ADSP – 21xx Пример ассемблерного кода:

М1, М5 = 1 ;

L0, L4 = N ;

MR = 0, MX0 = DM (I0, M1), MY0 = PM (I4, M5) ;

CNTR = N – 1 ;

DO convolution UNTIL CE ;

Convolution :

MR = MR + MX0 * MY0 (SS), MX0 = DM (I0, M1), MY0 = PM (I4, M5) ;

MR = MR + MX0 * MY0 (RND) ;

IF MV SAT MR ;

Буфер коэффициентов использует память программ (РМ), буфер входного сигнала – память данных (DM). Перед выполнением программы коэффициенты и отсчеты входного сигнала должны находиться в ячейках РМ и DM

соответственно. Указателем адреса памяти циклического буфера коэффициентов является регистр I4, циклического буфера входного сигнала –

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

Модификаторы адреса М1 и М5 равны единице (шаг изменения адреса). В

регистрах L0, L4 задается длина буфера, равная порядку фильтра (L0 =N, L4 = N). Команды четвертой строки очищают регистр MR и заполняют первым