45098

Знакомство с основами работы с Visual DSP++. Изучение программно-логической модели ADSP-2181

Лабораторная работа

Информатика, кибернетика и программирование

Сигнальный процессор взаимодействует с внешней средой путём использования адресной шины (ADDR), шины данных параллельного обмена (DATA), мультиплексированной шины адреса/данных (IAD)...

Русский

2013-11-15

3.15 MB

9 чел.

Федеральное агентство образования РФ

РГРТУ

Кафедра РТС

Отчет о лабораторной работе №1

Знакомство с основами работы с Visual DSP++.

Изучение программно-логической модели ADSP-2181

                                                                                                                    Выполнил:

студент 514 группы

Андреев Р.Н.

Проверил:

Сальников Н.И.

Рязань 2008

Цель работы

         Изучение регистровой модели и функционирования процессора ADSP-2181 в среде проектирования Visual DSP++ в режиме симулятора при выполнении программы копирования буфера.

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

/*___________________________________________________________________

LR2.ASM         ADSP-2181 Копирование буфера

                        Программа выполняет копирование содержимого

           одного заданного буфера в другой заданный буфер

___________________________________________________________________*/

// Определение символических констант - размеров буферов

#define N0 64

#define N1 8

#define N2 64

#define N3 32

#define N4 64

.section/data data1;                            // Начало секции  данных в DM,

                                                                     // data1 - раздел, который

                                                                     // содержит данные          

    

// Организация буферов в DM, присвоение символиче-

// ских имён, задание размеров буферов, загрузка

// в буферы файлов инициализации                 

        

.VAR dm_buf0[N0]="test_std1.dat";

.VAR dm_buf1[N4]="sine64_00.dat";       

.VAR dm_buf2[N2]="cos64_00.dat";      

.VAR dm_buf3[N3];

.VAR dm_buf4[N4];

.VAR dm_buf5[N0];

.VAR dm_buf6[N0];

.VAR dm_buf7[N0];      

                  

.section/pm pm_da;                             // Начало секции  данных в PM,

                                                                      // pm_da - раздел, который

                                                                      // содержит данные                

// Организация буферов в PM, присвоение символиче-

// ских имён, задание размеров буферов, загрузка

// в буферы файлов инициализации                 

  

.VAR pm_buf0[N4];   

.VAR pm_buf1[N4];

.VAR pm_buf2[N2];

.VAR pm_buf3[N3];  

                            

.section/pm interrupts;                             // PM, начало секции  для хранения

                 // векторов прерываний             

__reset:JUMP start; rti; rti; rti;                      // 0x0000: reset                     

              rti; rti; rti; rti;                                  // 0x0004: IRQ2,                

              rti; rti; rti; rti;                                  // 0x0008: IRQL1,            

              rti; rti; rti; rti;                                  // 0x000c: IRQL0,               

              rti; rti; rti; rti;                                  // 0x0010: SPORT0 tx,           

              rti; rti; rti; rti;                                  // 0x0014: SPORT1 rx,           

              rti; rti; rti; rti;                                  // 0x0018: IRQE,                

              rti; rti; rti; rti;                                  // 0x001c: BDMA,                

              rti; rti; rti; rti;                                  // 0x0020: SPORT1 tx or IRQ1,   

              rti; rti; rti; rti;                                  // 0x0024: SPORT1 rx or IRQ0,   

              rti; rti; rti; rti;                                  // 0x0028: timer,               

              rti; rti; rti; rti;                                  // 0x002c: power down,          

.section/pm seg_code;                // PM, начало секции программного кода

start: I0=dm_buf0;   M0=1;   L0=0;

       I1=dm_buf1;   M1=2;   L1=64;

       I2=dm_buf2;   M2=1;   L2=0;

       I3=dm_buf3;   M3=1;   L3=0;

       I4=pm_buf0;   M4=1;   L4=0;

       I5=pm_buf1;   M5=1;   L5=0;

       I6=pm_buf2;   M6=1;   L6=0;

       I7=pm_buf3;   M7=1;   L7=0;    

          

move:  CNTR=N0; DO outm UNTIL CE;  // Цикл копирования буфера      

    

    MX1=DM(I1,M1);  

outm:   PM(I6,M6)= MX1;

end:    IDLE;                                                   // Перевод в состояние ожидания

                                                                       // прерывания, в режим с малым

                                                                       // потреблением       

Общая структура вычислительной системы

         Структурная схема микропроцессорной системы приведена на  рис. 1. Сигнальный процессор взаимодействует с внешней средой путём использования адресной шины (ADDR), шины данных параллельного  обмена (DATA),  мультиплексированной  шины  адреса/данных (IAD),  линий последовательного  обмена (DT0, DR0, DT1, DR1) и использования  информационных,  управляющих,  служебных  сигналов, сигналов прерывания на выводах ADSP-2181.

Внутренняя структура ADSP-2181

         Внутренняя структура ADSP-2181 приведена на рис.2. В процессоре ADSP-2181 используется модифицированная Гарвардская  архитектура, для которой характерно, что во внутренней памяти данных DM (ОЗУ, RAM) хранятся данные, а во внутренней памяти программ PM (ОЗУ, RAM) -  команды  и  данные.  Для  начальной  загрузки  программы  во  внутреннюю  память  при  перезапуске  процессора ADSP-2181 предусмотрена внешняя память с байтовой организацией (BYTE MEMORY). Прямой побайтовый доступ к BYTE MEMORY обеспечивает  порт  прямого  побайтового  доступа  к  памяти (BDMA). Этот  порт также  позволяет  программисту  задавать  ячейки  памяти,  содержимое которых будет передаваться во внутреннюю память или из внутренней памяти без отрыва процессора от выполнения основной задачи.  

         Внешняя  оверлейная  память (OVERLAY MEMORY)  организована в виде сегментов по 8К слов, которые могут переключаться, используясь как старшие 8К слов внутренней памяти программ PM либо как младшие 8К слов памяти данных DM и подгружаются при необходимости во время выполнения задачи.

         Через  внутренний  порт  прямого  доступа  к  памяти (IDMA) можно выполнять начальную загрузку из хост-процессора (микроконтроллер,  компьютер)  через  системный  интерфейс  и  её  обращения  к процессору в ходе выполнения программы. Характеристики этого порта позволяют передавать  данные  в или  из  внутренней памяти без  отрыва процессора от выполнения основной задачи.

         В процессоре ADSP-2181 порты  ввода/вывода(I/O SPACE) не отображены в карте памяти. Порты ввода/вывода отображены в специальной области памяти ввода/вывода. Эта область состоит из 2048 адресуемых объектов.

         Обращения  к  внешним  устройствам  расширения  памяти  не могут происходить одновременно, поскольку для  этого используются общие шины  адреса  и  данных. При  передачах  через  порт BDMA  источником данных или местом назначения передачи должна быть только  внутренняя  память PM  или DM.  Обращения  к  другим  областям внешней  памяти (оверлейной  памяти  программ,  оверлейной  памяти данных, области памяти ввода/вывода) имеют более высокий приоритет  по  сравнению  с  обращениями  к  памяти  с  байтовой  организацией через порт BDMA.

         Карта  памяти  процессора  определяет  одинаковый  диапазон изменения адресов для PM и DM: от 0х0000 до 0х3FFF. В зависимости от  настройки  режима  использования  памяти  указанный  диапазон  изменения  адресов  распределяется между  внутренней  и  внешней  памятью.  Если  внешний  вывод MMAP  процессора  соединён  с  землёй  и внутренние  регистры  выбора  внутренней  или  внешней  памяти (PMOVLAY  и DMOVLAY)  после  сброса  или  перезапуска  остаются обнулёнными,  то  используется  внутренняя  память PM  и DM.  Весь диапазон изменения адресов 0х0000 - 0х3FFF относится к внутренней памяти PM или DM.

Регистровая модель арифметико-логического устройства ALU

         АЛУ  обеспечивает  выполнение  стандартного  набора  арифметических  и  логических  операций:  сложение,  вычитание,  изменение знака, инкремент,  декремент,  нахождение модуля  числа,  деление,  логическое И (AND), ИЛИ (OR), исключающее ИЛИ (XOR), НЕ (NOT).

Операндами – источниками данных для ALU по входу Х могут быть:

АХ0, АХ1  – входные регистры;

AR    – регистр результатов;

MR0, MR1, MR2 – регистры результатов MAC;

SR0, SR1   – регистры результатов устройства сдвига.

Операндами – источниками данных для ALU по входу Y могут быть:

АY0, АY1  – входные регистры;

AF    – регистр обратной связи.

Регистры – приёмники данных с выхода ALU:

AR    – регистр результатов;

AF    – регистр обратной связи.

         Признаки  результата,  получаемого  с  выхода АЛУ  хранятся  в арифметическом регистре состояний ASTAT.  

Биты-признаки, входящие в состав регистра состояний ASTAT:  

AZ - признак нулевого результата (AZ=1);

AN - знаковый бит результата;

AV - признак переполнения разрядной сетки (AV=1);

AC - перенос из старшего разряда;

AS - знаковый бит операнда по входу Х;

AQ - знаковый бит частного при делении.

Регистровая модель умножителя-накопителя MAC

         МАС выполняет умножение, умножение и сложение с накопленной  суммой,  умножение  и  вычитание  из  накопленной  разности,  выполняет функции насыщения и сброса в ноль. Возможно  любое  сочетание  знаковых (S)  и  беззнаковых (U) перемножаемых операндов: (SS), (US), (SU), (UU).

Операндами – источниками данных для MAC по входу Х могут быть:

МХ0, МХ1  – входные регистры;

AR    – регистр результатов ALU;

MR0, MR1, MR2 – регистры результатов;

SR0, SR1   – регистры результатов устройства сдвига.

 

Операндами – источниками данных для MAC по входу Y могут быть:

MY0, MY1   – входные регистры MAC;

MF    – регистр обратной связи.

Регистры – приёмники данных с выхода MAC:

MR (MR2, MR1, MR0)   – регистр результатов;

MF      – регистр обратной связи.

 

         Признаки результата, получаемого  с  выхода МАС хранятся в арифметическом регистре состояний ASTAT:  

MV – переполнение 32-разрядной сетки (MR2/MR1);

и в регистре состояний MSTAT:

MSTAT.4 – бит-признак формата числа в регистре результата   10

MR (MSTAT.4=0/1 – формат дробного/целого числа).

         Исходное  состояние  регистров  в  результате  сброса  или перезапуска процессора

АSTAT = 0х00; MSTAT = 0х00.

Регистровая модель устройства сдвига SHIFTER

         Устройство  сдвига  выполняет  набор функций  сдвига  для 16-разрядных  входных  чисел,  в  результате  на  выходе,  в  общем  случае,  получается 32-разрядное число.

         Функции устройства сдвига: арифметический сдвиг (ASHIFT),  логический  сдвиг (LSHIFT),  нормализация (NORM),  определение  порядка (EXP),  определение  порядка  самого  большого  по  абсолютной величине числа (блочного порядка) в массиве чисел (EXPANDJ). Эти базовые функции могут комбинироваться для  эффективного преобразования форматов  чисел,  включая  представление  чисел  с  плавающей точкой.

Операнды – источники ввода данных в устройстве сдвига:

SI    – регистр ввода устройства сдвига;

AR    – регистр результатов АЛУ;

MR0, MR1, MR2 – регистры результатов MAC;

SR0, SR1   – регистры вывода устройства сдвига.

 

         Регистр SE (порядок  устройства  сдвига), 8-разрядный,  содержит  значение  порядка  при  проведении  операций  нормализации  и  денормализации.

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

Выполнение работы

         1. Окно программы имеет вид:

         В верхних меню программы располагаются органы управления работой проекта: трансляция кода (построение проекта), добавление файлов к проекту, пошаговое выполнение программы, просмотр и изменение содержимого регистров и  т.д. Внизу программы находится информационное и диагностическое окно Output Window, где отображается ход работы компилятора, сообщения компилятора и в случае ошибок системы места этих ошибок. Слева находится список, отражающий содержание проекта. Файл подсоединяются к проекту с помощью команды Add to Project в меню Project. В данный проект входит: файл программы (Source Files, LR2.asm), файл линкера (Linker Files, ADSP-2181.ldf), файлы данных (Data Files). Файл программы содержит код программы на выбранном языке; файл линкера описывает карту памяти процессора (этот файл требуется для нормальной работы проекта и индивидуален для каждого процессора); описание файлов данных необходимо для правильной работы программы, так как эти файлы используются в коде программы. В правой части программы отображаются текст программы, содержимое вызываемых регистров, графики и др.        

         2. Текст программы приведен написан на Ассемблере. Различия между программой, приведенной в методических указаниях и LR2.asm заключается в другом символе размерности буфера-приемника pm_buf2 (при этом по умолчанию размерности равны) и числа счетчиков циклов N4 вместо N0 (по умолчанию и там и там 64).   

         Программа состоит из следующих секций:

  1.  область определения размеров буферов – количество регистров, в которых будут храниться данные; определяются константами N0, N1, N2, N3, N4. По умолчанию они соответственно равны 64, 8, 64, 32, 64. Команды объявления размеров являются командами препроцессора и начинаются с префикса #.
  2.  директива ассемблера .section/data data1 задает секцию системной памяти в данном случае tipe=data, следовательно, в области DM, data1 – название раздела
  3.  организация буферов в DM, присвоение символических имен, размеров буферов, загрузка в буферы файлов инициализации; здесь создаются 8 буферов-источников (dm_buf[0,7]) различной размерности в области DM, причем в начале действующими являются 3 буфера - dm_buf0, dm_buf1, dm_buf2. Организация происходит с помощью директивы .VAR    
  4.  директива ассемблера .section/pm pm_da задает секцию системной памяти в данном случае tipe= pm, следовательно, в области PM, pm_da – название раздела
  5.  организация буферов в PM, присвоение символических имен, размеров буферов, загрузка в буферы файлов инициализации

Создаются 4 буфера-приемника данных заданных размерностей. Организация происходит с помощью директивы .VAR 

  1.  директива .section/pm interrupts задает секцию в области pm для хранения векторов прерывания
  2.  организация векторов прерываний в PM 
  3.  директива .section/pm seg_code организует в PM область программного кода
  4.  секция программного кода в PM

         Сама процедура копирования буфера содержит 3 строки:

- организация цикла: CNTR=N4; DO outm UNTIL CE – выполнения метки outm в течении числа циклов CNTR пока не выполнится условие CE

- перемещение во временный буфер: MX1=DM(I1,M1) - MX1 (регистр MAC), DM(I1,M1) – обращение к буферу dm_buf1

- перемещение в буфер-приемник: PM(I6,M6)= MX1 – PM(I6,M6) – обращение к буферу pm_buf2 (буфер-приемник)

         3. Ошибок в программе не обнаружено, выдаётся сообщение Load Complete.

         4. После трансляции текста программа переходит на метку _reset, после которой размещается команда JUMP – переход на метку start, по которой в свою очередь размещается программный код. После обработки прерывания происходит возврат в главную программу с помощью команды rti. Всего в процессоре предусмотрено 12 источников прерываний. Высший приоритет у прерывания Reset (запуск после сброса или выхода из малого энергопотребления), низший у Timer (внутреннее прерывание от таймера). Адреса векторов прерываний размещаются с интервалом в 4 ячейки.     

         

         Адреса и содержимое секций программы в PM, буферов и меток:

Буферы в PM:

pm_buf0: адреса 003000-00303F, то есть размер буфера 64, что соответствует заданной константе N4; по всем адресам записаны нули (буферы пусты)

pm_buf1: адреса 003040-00307E, то есть размер буфера 64, что соответствует заданной константе N4; по всем адресам записаны нули (буферы пусты)

pm_buf2: адреса 003080-0030BE, то есть размер буфера 64, что соответствует заданной константе N4; по всем адресам записаны нули (буферы пусты)

pm_buf3: адреса 0030C0-0030DE, то есть размер буфера 32, что соответствует заданной константе N3; по всем адресам записаны нули (буферы пусты)

 

         Таким образом, видно, что все буферы в области PM, являющейся буферами-приемниками пусты до начала копирования в них данных.  

Метки:

В программе содержится 5 меток: _reset - секция перехода к основной программе (к метке start) после обработки прерывания , start – секция программного кода, move – цикл копирования буфера. Цикл копирования буфера организован с использованием счетчика циклов CNTR и команды DO outm UNTIL CE, которая выполняет метку outm, пока не выполнится условие CE (counter empty - счетчик пуст).      

 

start, move, outm, end                                       

        

reset

         Содержимое меток – слева указывается адреса команд, которые при выполнении программы появляются в программном счетчике.

         Адреса и содержимое буферов в DM:

   В данной программе в DM находится буфер-источник данных, причем данные загружаются в первые три созданных буфера – dm_buf0, dm_buf1, dm_buf2. Источниками данных являются 3 файла, присоединенные к проекту и находящиеся в папке проекта test_std1.dat, sine64_00.dat, cos64_00.dat    

      

Все остальные буферы в DM пусты:

dm_buf3: [0000C0]-[0000DE] – размером 32

dm_buf4: [0000E0]-[00011C] – размером 64

dm_buf5: [000120]-[00015C] – размером 64

dm_buf6: [000160]-[00019C] – размером 64

dm_buf7: [0001A0]-[0001DF] – размером 64

         Состояние управляющих регистров генератора адреса DAG1 и DAG2:

         Первые четыре тройки регистров относятся к DAG1 (I0,M0,L0 – I3,M3,L3) и обеспечивают доступ только к памяти DM. Остальные ячейки относятся к DAG2 и обеспечивают доступ и к DM и к PM.  

         Перед началом работы эти регистры находятся в неопределенном состоянии.

         Состояние регистров фиксации состояния программы:

         Перед началом работы регистры состояния имеют следующие значения:

программный счетчик PC, содержащий адрес исполняемой команды, обнулен; счетчик циклов CNTR в неопределенном состоянии; число циклов CYCLES, пройденного процессором, нулевое; адрес последней команды PM_ADDR в PM неопределенное; адрес последней команды DM_ADDR в DM неопределенное; PMOVLAY и DMOVLAY – внутренние регистры выбора внутренней или внешней памяти, т.к. они обнулены, то используется внутренняя память PM и DM.  

         Значение условия состояния «Счетчик пуст»:

         Определение условия завершения цикла DO UNTIL; счетчик находится в неопределенном состоянии.

        

         5. При первом нажатии F11 (поступило прерывание) происходит безусловный переход на метку start, значение программного счетчика РС равно 0030, количество циклов CYCLES= 00000001. Затем происходит выполнение секции программного кода, в результате которой регистры DAG заполняются в соответствии c присвоенными значениями – происходит копирование данных путем непосредственной загрузки регистров DAG:

 

Затем происходит вход в цикл копирования (метка move): CNTR присваивается значение 004016=6410=N0 (видно в Program Control). Далее происходит выполнение цикла: копирование из DM(I1,M1) во входной регистр MAC MX1 и  вывод в PM(I6,M6) из MX1, т.е. копирование из буфера dm_buf1 в буфер pm_buf2. Во время выполнения команды DO адрес последней команды цикла помещается в стек цикла PC STACK вместе с условием прекращения цикла, а текущее значение программного счетчика плюс единица помещается в стек программного счетчика LOOP STACK. Поэтому при первом выполнении команды DO в PC STACK записывается состояние программного счетчика PC, содержащего адрес первой команды в цикле – 004А16. Затем при выполнении циклов PC меняет попеременно свое состояние с 004А до 004В. Состояние ячеек PM_ADDR и DM_ADDR меняется – инкрементируется при каждом цикле, так как на шину адреса и данных постоянно выставляется следующая команда цикла. Просмотрим содержание буфера pm_buf2 и сопоставим его с dm_buf1 на некотором цикле копирования:

         Из содержания буферов видно, что при копировании из буфера-источника dm_buf1 в pm_buf2 происходит копирование через одну ячейку.

   Так происходит до тех пор, пока не произойдет условие выхода из цикла – выполнение условия CE (Счетчик пуст) - CE станет равно 1. При этом состояние регистра CNTR постоянно убавляется на 1 (декрементируется). Это происходит в течение 64 циклов копирования, при этом число циклов в регистре CYCLES изменяется о 1A16=2610 до 9A16=15410, то есть 154-26=128 с учетом, что копирование состоит из 2 команд, то 128\2=64 циклов, т.е. численно равно размерности копируемых буферов. В момент, когда значение счетчика достигает 1, устанавливается, что счетчик пуст, т.е. происходит выполнение условия CE (counter empty). Это является признаком того, что следующая выполняемая команда является последней в цикле, а цикл выполнен все N-раз. Затем – переход в режим пониженной мощности IDLE.

         6. График данных в буфере-передатчике представляет собой отрезок синусоиды одного периода:  

         График данных в буфере-приемнике представляет нулевые отсчеты, т.к. туда еще ничего не записано:

         7-8. Последней командой, выполняемой процессором является команда IDLE – переход на пониженное энергопотребление (сбрасывается, например, при поступлении прерывания).

         Проанализируем содержание начального и конечного буферов: во-первых, в буфере-приемнике заполнены 64 ячейки памяти, т.е. скопированы все ячейки из источника; во-вторых, в приемнике содержатся нечетные отчеты буфера-источника. Все остальные буферы-приемники  пусты, т.к. в них ничего не записывалось.

                                                            

          Регистры DAG остались такими же, как после выполнения метки start.

          Регистры раздела Program Control содержат последние адреса: PC – адрес последней команды 004С16; CYCLES=009B16; PM_ADDR=0030BF16; DM_ADDR=00007E16

          Выполнилось условие выхода из цикла копирования CE=1

          Подсчитаем время выполнения программы и ее объем. Согласно тех. описанию ADSP-2181 при частоте внешнего кварцевого резонатора 50МГц и напряжении питания 5В время выполнения одного цикла команд составляет 25нс. Так как CYCLES=009B16=15510, то время выполнения программы равно tпр=25нс*155=3,875 мкс. Объем программы оценим по количеству команд, содержащихся в промежутке от метки start до метки end (информационное окно Disassembly). Объем программы равен 28 командам.

          Графики подтверждают сделанное выше заключение о том, что копируются четные отсчеты источника копирования, т.е. происходит прореживание. В результате, если на один период синусоиды из буфера–источника приходилось 64 отсчета, то теперь на один период синусоиды в приемнике приходится 32 отсчета при сохранении тех же 64 отсчетов на весь сигнал, следовательно, произошло «увеличение частоты» в 2 раза (уменьшение периода в 2 раза).

         9. В данной работе возможна модификация программы. Приведем пример и посмотрим, какие изменения произошли.

Сделаем следующие изменения:

а) изменим буфер-источник с dm_buf1 на dm_buf0;

б) изменим буфер-приемник с pm_buf2 на pm_buf3 (новый приёмник имеет другую размерность); в) изменим регистр длины M0 – берется каждый отсчет из буфера-источника (М0=1)

     В результате получим следующий текст модифицированной программы (жирным подчеркнуты измененные места):

/*___________________________________________________________________

LR2.ASM         ADSP-2181 Копирование буфера

 Программа выполняет копирование содержимого

 одного заданного буфера в другой заданный буфер

___________________________________________________________________*/

// Определение символических констант – размеров буферов

#define N0 64

#define N1 8

#define N2 64

#define N3 32

#define N4 64

.section/data data1;      // Начало секции  данных в DM,

                                              // data1 – раздел, который

                                              // содержит данные          

    

                                              // Организация буферов в DM, присвоение символиче-

                                              // ских имён, задание размеров буферов, загрузка

                                              // в буферы файлов инициализации                 

        

.VAR dm_buf0[N0]=»test_std1.dat»;

.VAR dm_buf1[N4]=”sine64_00.dat”;       

.VAR dm_buf2[N2]=”cos64_00.dat”;      

.VAR dm_buf3[N3];

.VAR dm_buf4[N4];

.VAR dm_buf5[N0];

.VAR dm_buf6[N0];

.VAR dm_buf7[N0];      

                  

.section/pm pm_da;         // Начало секции  данных в PM,

                                                 // pm_da – раздел, который

                                                 // содержит данные                 

// Организация буферов в PM, присвоение символиче-

// ских имён, задание размеров буферов, загрузка

// в буферы файлов инициализации                 

  

.VAR pm_buf0[N4];   

.VAR pm_buf1[N4];

.VAR pm_buf2[N2];

.VAR pm_buf3[N3];  

                            

.section/pm interrupts;    // PM, начало секции  для хранения

     // векторов прерываний             

__reset:JUMP start; rti; rti; rti;  // 0x0000:                      

           rti; rti; rti; rti;  // 0x0004: IRQ2,                

           rti; rti; rti; rti;  // 0x0008: IRQL1,            

              rti; rti; rti; rti;  // 0x000c: IRQL0,               

              rti; rti; rti; rti;  // 0x0010: SPORT0 tx,           

              rti; rti; rti; rti;  // 0x0014: SPORT1 rx,           

              rti; rti; rti; rti;  // 0x0018: IRQE,                

              rti; rti; rti; rti;  // 0x001c: BDMA,                

              rti; rti; rti; rti;  // 0x0020: SPORT1 tx or IRQ1,   

              rti; rti; rti; rti;  // 0x0024: SPORT1 rx or IRQ0,   

              rti; rti; rti; rti;  // 0x0028: timer,               

              rti; rti; rti; rti;  // 0x002c: power down,          

.section/pm seg_code;       // PM, начало секции программного кода

start:    I0=dm_buf0;   M0=1;   L0=64;

           I1=dm_buf1;   M1=1;   L1=0;

           I2=dm_buf2;   M2=1;   L2=0;

           I3=dm_buf3;   M3=1;   L3=0;

           I4=pm_buf0;   M4=1;   L4=0;

           I5=pm_buf1;   M5=1;   L5=0;

           I6=pm_buf2;   M6=1;   L6=0;

           I7=pm_buf3;   M7=1;   L7=0;    

          

move:  CNTR=N3; DO outm UNTIL CE;  // Цикл копирования буфера      

    

    MX1=DM(I0,M0);  

outm:   PM(I7,M7)= MX1;

end:    IDLE;                       // Перевод в состояние ожидания

                                           // прерывания, в режим с малым

                                           // потреблением                 

         В результате работы изменённой программы регистр DAG заполняются в соответствии с текстом метки start:

         Буфер-источник и приемник dm_buf0 и pm_buf3 после выполнения команды IDLE:  

     

         Видно, что в результате выполнения цикла копирования скопировались не все 64 ячейки источника, а лишь 32 ячейки (CNTR=N3=32). Посмотрим это на графиках.

Как видно, источником является пилообразный сигнал. Это можно наблюдать на первом графике (dm_buf0). Приемник содержит 32 отсчёта источника, при этом длительность каждого периода сохранилась той же (M0=1). Результат мы можем пронаблюдать на втором графике (буфер-приёмник pm_buf3).


 

А также другие работы, которые могут Вас заинтересовать

20618. Восходящий синтаксический метод 180.5 KB
  Значения атрибутов вычисляются согласно семантическим правилам которые связаны с продукциями грамматики. В этом обобщении с каждым грамматическим символом связываются множество атрибутов. Синтезируемые атрибуты Наследуемые атрибуты каждому символу грамматики можно поставить ряд атрибутов Синтезируемые атрибуты – значение вычисляется по значению атрибутов в дочерних по отношению к данному узлу узлах. Наследуемые атрибуты – значение определяется значением атрибутов соседних узлов и родительского узла.
20619. Синтаксическое дерево 93.5 KB
  Синтаксическое дерево. Синтаксическое дерево представляет собой дерево синтаксического разбора сжатом виде и может быть построено на основе синтаксически управляемых определений. Грамматическое правило Семантическое правило Синтаксическое дерево узлы которого могут иметь одного родителя называется направленным ациклическим графом выражений DAG. Для ускорения поиска используется ХЭШ – функция по сигнатуре op l r Пример: Построить дерево синтаксического разбора синтаксическое дерево и DAG для выражения.
20620. Семантический анализ 144.5 KB
  Генерация промежуточного кода Основные формы промежуточного кода6 Для примитивных трансляторов используется синтаксическое дерево или DAG Постфиксная запись Трехадресный код: x:=y op z Пример: синтаксическое дерево t1=c t2=bt1 t4=c t5=bt4 t3=t5t2 a=t3 DAG t1=c t2=bt1 t3=t2t2 a=t3 постфиксная запись Трехадресный код – представляет собой выражение типа Типы трехадресных конструкций инструкции присвоения где op – арифметическая или логическая операция где op – унарная операция инструкции копирования инструкции...
20621. Этап генерация кода исполняемой машины 58 KB
  1 a:=bc d:=ac mov R0 b add R0 c → mov a R0 mov R0 b add R0 c mov d R0 2 t:=ab t:=tc t:=t d mov R0 a add R0 b mov R1 c mul R0 R1 mov R1 d div R0 R1 mov t R0 не помещая переменные в регистры Характеристики описывающие целевую машину: набор инструкций вида op destination source способы адресации прямая регистровая абсолютная косвенная Адресация Обозначение Адрес Добавочная стоимость абсолютная регистровая индексированная косвеннорегистровая косвенноиндексированная константа в команде M R CR R CR C M...
20622. Базовые блоки 111.5 KB
  Говорят что трехадресная инструкция вида определяет x и использует y и z. Выход: список базовых блоков такой что каждая трех адресная инструкция принадлежит только одному блоку. Правила: первая инструкция является лидером. любая инструкция являющаяся целевой инструкцией условного или безусловного переходов является лидером.
20623. Многообразие и единство мира 92 KB
  Элементарные частицы фундаментальные частицы и частицы – переносчики фундаментальных взаимодействий3. В соответствии с этими представлениями выделяются следующие уровни: Уровни Условные границы Размер м Масса кг Микромир r =108 m = 1010 Макромир r 108 107 m 1010 – 1020 Мегамир r 107 m 1020 Понятие микромир охватывает фундаментальные и элементарные частицы ядра атомы и молекулы. Элементарные частицы фундаментальные частицы и частицы – переносчики фундаментальных взаимодействий Элементарные частицы – это частицы входящие в состав...
20624. Мегамир, основные космологические и космогонические представления 115 KB
  – среднее расстояние от Земли до Солнца равное 15×1011м. Все планеты – остывшие тела светящиеся отраженным от Солнца светом. Солнечная система Девять планет вращающиеся вокруг Солнца принято делить на две группы: планеты Земной группы Меркурий Венера Земля Марс и планетыгиганты Юпитер Сатурн Уран Нептун Плутон. Считается что диаметр Солнечной системы равен приблизительно 6×1016 м: на этом расстоянии планеты удерживаются силой тяготения Солнца.
20625. Мегамир. Основные космогонические представления 81.5 KB
  Звезды их характеристики источники энергии2. Звезды их характеристики источники энергии Более 90 видимого вещества Вселенной сосредоточено в звездах. Именно звезды и планеты были первыми объектами астрономических исследований. Пожалуй лишь диск нашего солнца позволяет реально наблюдать процессы происходящие на поверхности звезды.
20626. Мегамир, основные космогонические представления 107 KB
  Имеются многочисленные данные подтверждающие предположение что звезды образуются при конденсации облаков межзвездной пыли и газа. Глобула становится зародышем будущей звезды протозвездой и начинает светиться так как энергия движения частиц переходит в тепло. Дальнейшее сжатие протозвезды приводит к такому повышению температуры и давления что становятся возможными термоядерные реакции синтеза гелия из водорода. При этом силы тяготения стремящиеся сжать вещество звезды уравновешиваются силами внутреннего давления.