Чтение онлайн

ЖАНРЫ

Разработка устройств на основе цифровых сигнальных процессоров фирмы Analog Devices с использованием Visual DSP++

Вальпа Олег Дмитриевич

Шрифт:

Рис. 10.3. Временная диаграмма цикла записи

Сигнальные цепи PF2 и PF0 используются ведущим процессором для активизации схемы защелки адреса в порт IDMA и для анализа состояния готовности порта IDMA ведомого процессора.

Ниже приведен исходный текст программы idmaidma.dsp для ведущего процессора данной схемы, позволяющей ему загрузить в память программ ведомого процессора массив данных, размещенных в файле idmaidma.dat, являющихся программой для ведомого процессора.

Текст программы

/*********************************************************************/

/*
Эта программа транслирует данные от ведущего процессора ADSP-2181 */

/* к ведомому процессору ADSP-2181 через IDMA порт */

/*********************************************************************/

.module/abs=0x0000 idma_transfer;

.include <def2181.h>; { Включить файл определений }

.const length=68; { Десятичное значение длины вектора }

.var/pm/ram x_input[length]; { Описание массива данных }

.init x_input: <idmaidma.dat>; { Файл передаваемых данных }

jump start; nop; nop; nop; { Таблица векторов прерываний }

RTI; NOP; NOP; NOP; { Прерывания не используются }

RTI; NOP; NOP; NOP;

RTI; NOP; NOP; NOP;

RTI; NOP; NOP; NOP;

RTI; NOP; NOP; NOP;

RTI; NOP; NOP; NOP;

RTI; NOP; NOP; NOP;

RTI; NOP; NOP; NOP;

RTI; NOP; NOP; NOP;

RTI; NOP; NOP; NOP;

/*** Начало программы ***/

start:

ax0=0x0000;

dm(System_Control_Reg)=ax0; { Такты ожидания PM отключить }

dm(PFTYPE)=ax0; { Все флаги PF назначить выходами }

dm(DM_Wait_Reg)=ax0; {Такты ожидания DM и портов ввода-вывода отключить}

l6=0; { Длина буфера данных }

i6=^x_input; { Адрес начала буфера транслируемых данных }

m6=1; { Приращение = 1 }

modify(i6,m6); { Модификация адреса }

/*** Защелкнуть адрес 0x0001 ***/

call check_ack; { Проверить готовность к приему }

ax0=0x0001; { Стартовый адрес для записи в ведомый процессор }

io(0x0001)=ах0; { Запись этого адреса с переключением линий -IS и IAL }

/*** Запись всех данных начиная с адреса 0x0001 ***/

cntr=length-1; { Установить счетчик транслируемых слов }

do loop1 until се; { Организовать цикл записи }

 call check_ack; { Проверить готовность к приему }

 call format; { Форматировать данные }

 io(0x0100)=ay0; { -IWR и IS записывают старшие 16 бит IAD 0-15 }

 call check_ack; {
Проверить готовность к приему }

 io(0x0100)=ay1; { -IWR и IS записывают младшие 8 бит IAD 0-15 }

loop1: nop;

/*** Защелкнуть адрес 0x0000 ***/

call check_ack; { Проверить готовность к приему }

ax0=0x0000; { Стартовый адрес для записи в ведомый процессор }

io(0x0001)=ax0; { Запись этого адреса с переключением линий -IS и IAL }

/*** Запись по адресу 0x0000 ***/

i6=^x_input; { Указатель на начало буфера данных }

call check_ack; { Проверить готовность к приему }

call format; { Форматировать данные }

io(0x0100)=ay0; { -IWR и IS записывают старшие 16 бит IAD 0-15 }

call check_ack; { Проверить готовность к приему }

io(0x0100)=ay1; { -IWR и IS записывают младшие 8 бит IAD 0-15 }

idle; { Режим ожидания }

/****************************************************************/

/* Подпрограмма переформатирования 24-бит слова памяти программ */

/****************************************************************/

format: ay0=pm(i6,m6); { 16 старших бит запомнить в регистре ay0 }

ay1=px; { 8 младших бит запомнить в регистре ay1 }

rts;

/***************************************************************************/

/* Подпрограмма ожидания перехода состояния линии -IACK в низкое состояние */

/***************************************************************************/

check_ack:

ax0=dm(0x3fе5); { Читать PF1, который подключен к -IACK }

ar=tstbit 1 of ax0; { Анализировать PF1 }

if ne jump check_ack; { Если процессор не готов вновь контролировать -IACK}

rts;

.endmod;

Многие директивы и команды данной программы уже знакомы читателям из описания предыдущей программы. Текст программы прокомментирован, что позволяет без труда понять алгоритм ее работы. Как видно из текста, в программе использован ряд подпрограмм, в которых сосредоточены часто используемые операции. Вызов данных подпрограмм осуществляется командой call, после которой записывается имя подпрограммы. Команда io(0x0001)=ax0 осуществляет запись содержимого регистра ax0 в порт ввода- вывода по адресу 0x0001. Команда ar=tstbit 1 of ax0 заносит в регистр ar результат тестирования первого разряда регистра ax0. Следующая за этой, команда if ne jump check_ack проверяет состояние флагов ALU и осуществляет переход на метку check_ack, если результат проверки предыдущей операции был отрицательным. Подробнее со всеми командами сигнального процессора ADSP-2181 мы познакомимся позже.

Поделиться с друзьями: