
МПУЭВС. Лекции. Задания / pdf_ПрилПЦиПУ / Приложение_О_ ПрограмОбрабДанных
.pdf1
Приложение О О. Программирование задач обработки данных
О.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 и заполняют первым