.section/data data1;
.VAR x_input[n] = "xin.dat";
Второй массив данных y_input[n] будет храниться в памяти программ процессора после загрузки из файла «yin.dat», что определяется строками программы:
.section/pm pm_da;
.VAR y_input[n] = "yin.dat";
Далее в программе размещаются векторы прерываний. Тело основной программы состоит из строк:
.section/pm program;
start: I2=x_input; /*pointer to x input buffer*/
L2=0; /*noncircular buffer*/
I6=y_input; /*pointer to y input buffer*/
L6=0;
M0=1; L0=0;
M5=1; L5=0;
CNTR=n-1;
AX0=DM(I2,M0), AY0=PM(I6,M5); /*Get first data*/
DO add_loop UNTIL CE;
AR=AX0+AY0, AX0=DM(I2,M0), AY0=PM(I6,M5);
add_loop: io(z_out)=AR; /*Write output*/
AR=AX0+AY0;
io(z_out)=AR;
IDLE;
Выполним данную программу в пошаговом режиме. Для этого вначале произведем компиляцию программы, нажав на клавиатуре клавишу F7. В результате программа будет скомпилирована, и отобразится окно, приведенное на рис. 23.8.
Рис. 23.8
Этот же результат можно получить, выполнив команду главного меню Project→Build project или нажав соответствующую ей кнопку на панели инструментов. Из рисунка видно, что стрелка, показывающая очередную выполняемую программу, располагается напротив строки с меткой «reset». Кроме того, справа автоматически открывается окно дизассемблированных команд программы. Выполнять программу в пошаговом режиме можно, нажимая клавишу F11, выполнив команду Debug→Step Into или нажав соответствующую ей кнопку на панели инструментов.
При каждом таком действии будет выполняться очередная строка команд. Результат работы программы можно наблюдать по изменению содержимого памяти и регистров процессора. Окна, отображающие память процессора, вызываются с помощью главного меню «Memory». Для отображения окон с содержимым регистров процессора используется кнопка главного меню «Register». Для отображения регистров удобно воспользоваться командой Register→Custom, которая позволяет выбрать только те регистры, которые необходимо видеть пользователю. При выполнении этой команды откроется окно, изображенное на рис. 23.9.
Рис. 23.9
Выделяя в этом окне с помощью мышки необходимые для контроля регистры и щелкая по кнопке «Add», можно создать набор регистров для отображения на дисплее в одном окне. Кроме того, в строке «Title of window» можно задать название отображаемого окна. Таким образом, можно создать несколько окон для отображения различных групп регистров для контроля их состояния. Создав такое окно, можно продолжать выполнение программы по шагам. При этом в окне регистром будет видно изменение содержимого регистров, которые участвовали в выполнении очередной строки команд программы. Текущие изменения будут выделяться красным цветом. Выполнение программы завершается оператором IDLE, который переводит процессор в режим энергосбережения. Для повторного запуска программы необходимо вновь выполнить команду Project→Build. Перед повторной компиляцией проекта в программу можно вносить собственные изменения с целью получения практики программирования. Можно, например, изменить программу таким образом, чтобы результат сложения массивов записывался не по адресу ввода-вывода, а в память данных. Закрытие проекта производится командой Project→Close.
В этой главе рассматриваются очередные примеры программ, способы настройки симулятора и получение загрузочного файла в среде разработки VisualDSP++.
Рассмотрим еще один пример программы, который демонстрирует работу с последовательным портом и предназначен для освоения работы с симулятором и потоками ввода-вывода.
Откройте в установленном пакете Visual DSP++ каталог с примером проекта программы «Example2», выделите в нем файл проекта «Example2» и нажмите кнопку «Открыть». После этого найдите в открывшемся проекте файл с названием «Sport.asm» и щелкните по нему дважды левой кнопкой мыши. В центре экрана откроется новое окно, позволяющее просматривать и редактировать выбранный файл. Разверните это окно, щелкнув кнопку развертывания окна.
В этой программе выполняется инициализация последовательных портов SPORT0 и SPORT1 с последующей передачей данных, используя процедуру прерываний.
В обработчике прерываний процессор вначале считывает данные из последовательного порта SPORT1, а затем передает их в этот же порт. Данный обработчик прерываний состоит из следующих строк:
sample: AX0=RX1; /*принять данные в AX0*/
TX1=АХ0; /*передать данные из AX0*/
RTI;
В рассматриваемой программе организован бесконечный цикл за счет того, что процессор находится в состоянии ожидания до тех пор, пока не будет сгенерировано прерывание от приемника SPORT1. Входные и выходные потоки данных могут моделироваться с помощью файлов. Перед запуском этой программы необходимо настроить потоки ввода-вывода.