также операции сложения, умножения, ввода-вывода, управления программируемыми флагами и др.
Часть II. Программирование
В этой части книги описывается создание первой рабочей программы для сигнального процессора и ее трансляции для получения исполняемого кода. Дается описание процедуры загрузки и портов, через которые возможна данная операция. Приводится описание разработанного автором устройства для загрузки программ, просмотра и редактирования памяти процессора с помощью компьютера. Описываются назначение и работа специальной программы менеджера памяти. Дается описание директив ассемблера, формата данных и система команд для сигнального процессора.
Глава 6. Первая программа
В этой главе говорится о создании программ для сигнального процессора, инструментальном программном обеспечении, отладке и способах загрузки программ в сигнальный процессор.
Начнем изучение программирования сигнального процессора с конкретного примера программы, приведенной ниже. Эта программа поможет нам в изучении структуры программы, системы команд процессора и средств разработки, а также позволит на практике освоить процедуру отладки и загрузки программы в память процессора.
Введите текст этой программы в компьютер с помощью любого текстового редактора и сохраните в файле с именем mem_clr.dsp или скопируйте с компакт-диска, прилагаемого к данной книге.
/***********************************************************/
/* Программа mem_clr загружается в память программ и после */
/* запуска заполняет память данных сигнального процессора */
/* с адреса 0x0000 по адрес 0x3fdf числовыми значениями */
/* */
/* Версия: 1.0 */
/* Автор: О.Д.Вальпа */
/***********************************************************/
.module/RAM/ABS=0 mem_clr; { Модуль памяти mem_clr с адреса 0 }
.include <def2181.h>; { Включить файл определений }
.var/dm/ram/circ buf_dm[0x3fdf]; { Циклический буфер в памяти данных }
jump BEGIN; nop; nop; nop; { Вектор прерывания сброса процессора }
rti; nop; nop; nop; { Вектор прерывания IRQ2 }
rti; nop; nop; nop; { Вектор прерывания IRQL1 }
rti; nop; nop; nop; { Вектор прерывания IRQL0 }
rti; nop; nop; nop; { Вектор прерывания SPORT0 TX }
rti; nop; nop; nop; { Вектор прерывания SPORT0 RX }
rti; nop; nop; nop; { Вектор прерывания IRQE }
rti; nop; nop; nop; { Вектор прерывания BDMA }
rti; nop; nop; nop; { Вектор прерывания SPORT1 TX (IRQ1) }
rti; nop; nop; nop; { Вектор прерывания SPORT1 RX (IRQ0) }
rti; nop; nop; nop; { Вектор прерывания TIMER }
rti; nop; nop, nop; { Вектор прерывания POWER DOWN }
/************** начало программы ************************************/
BEGIN: { Метка начала программы }
ax0 = b#0111111110000000; dm(pftype) = ax0; {Инициализация флагов PF}
{ │└┬┘││││76543210 }
{ │ │ ││││└+++++++ - PF0-PF7: 0-вход 1-выход }
{ │ │ │││└──────── - PM - выход -CMS }
{ │ │ ││└───────── - DM | 0- запрещен }
{ │ │ │└────────── - BM | 1- разрешен }
{ │ │ └─────────── - IOM-- }
{ │ └────────────& #9472; - От 0 до 7 циклов задержки BDMA }
{ └ He используется, всегда=0 }
ax0 = b#0000000010000000; dm(PFDATA) = ax0;{Управление светодиодом }
{ 76543210 }
{ │ └──┴ - Вход:Код клавиш }
{ └─────── - Выход:Светодиод }
i0 = ^buf_dm; { Индексный регистр i0=адресу начала буфера }
l0 = %buf_dm; { Регистр длины l0=длине буфера }
m0 = 1; { Регистр модификатора m0=1 }
ar = 0x1234; { Записать данные в рабочий регистр ar }
cntr=10; { Загрузить счетчик циклов }
do CLR_DM until се; { Выполнять до CLR_DM пока счетчик не обнулится }
dm(i0, m0) = ar; { Заполнение очередной ячейки памяти данных }
CLR_DM:nop; { Пустая команда }
toggle fl2; { Инвертировать вывод процессора FL2 }
dm(0) = ar; { Заполнение ячейки памяти данных с адресом 0 }
ar = ar + 1; { увеличивающимися значениями }
ax0 = dm(PFDATA); { Читать код клавиш }
dm(1) = ax0; { и записать в ячейку памяти данных по адресу 1}