.VAR/CIRC abuf[6];
Поскольку ближайшим числом больше шести и кратным двум является число 8, то базовый (стартовый) адрес буфера должен быть кратен 8. Три младших значимых разряда (МЗР) этого адреса будут равны нулю. В табл. 11.1 показано размещение этого буфера в памяти.
Таблица 11.1 Размещение одного циклического буфера в памяти сигнального процессора
Имя буфера |
Элемент буфера |
Двоичный адрес |
… |
abuf |
abuf[0] |
XXXXXXXXXX0000 |
abuf[1] |
XXXXXXXXXX0001 |
abuf[2] |
XXXXXXXXXX0010 |
abuf[3] |
XXXXXXXXXX0011 |
abuf[4] |
XXXXXXXXXX0100 |
abuf[5] |
XXXXXXXXXX0101 |
XXXXXXXXXX0110 |
… |
Если в одной строке объявлены несколько буферов с параметром CIRC, то будет создан один кольцевой буфер, вмещающий в себя все буферы. Первый из этих буферов будет кольцевым, а отдельные буферы будут простыми линейными буферами. Например, следующая директива создает один кольцевой буфер abuf и два линейных буфера с именами bbuf и cbuf.
.VAR/CIRC abuf[6], bbuf[3], cbuf[5];
Для размещения всех этих буферов в памяти процессора потребуется 6+3+5=14 ячеек памяти. Поскольку первым в директиве объявлен буфер abuf, то он будет кольцевым. Ближайшим числом больше 14 и кратным двум является число 16. Поэтому базовый адрес буфера abuf должен быть кратен 16 (четыре младших значащих разряда будут равны нулю). Базовый адрес буфера bbuf будет следовать сразу за адресом последнего элемента буфера abuf. Аналогично будет размещен и буфер cbuf. Размещение всех этих буферов в памяти процессора показано в табл. 11.2.
Таблица 11.2 Размещение трех буферов в памяти процессора
Имя буфера |
Элемент буфера |
Двоичный адрес |
… |
abuf |
abuf[0] |
XXXXXXXXXX0000 |
abuf[1] |
XXXXXXXXXX0001 |
abuf[2] |
XXXXXXXXXX0010 |
abuf[3] |
XXXXXXXXXX0011 |
abuf[4] |
XXXXXXXXXX0100 |
abuf[5] |
XXXXXXXXXX0101 |
bbuf |
bbuf[0] |
XXXXXXXXXX0110 |
bbuf[1] |
XXXXXXXXXX0111 |
bbuf[2] |
XXXXXXXXXX1000 |
cbuf |
cbuf[0] |
XXXXXXXXXX1001 |
cbuf[1] |
XXXXXXXXXX1010 |
cbuf[2] |
XXXXXXXXXX1011 |
cbuf[3] |
XXXXXXXXXX1100 |
XXXXXXXXXX1101 |
… |
Следующий пример показывает использование трех директив для объявления трех различных кольцевых буферов:
.VAR/CIRC abuf[6];
.VAR/CIRC bbuf[3];
.VAR/CIRC cbuf[5];
Поскольку буферы объявлены отдельно, все они будут кольцевыми и не будут объединены. Правила размещения для каждого из этих буферов такие же, как в рассмотренном выше примере для одиночного буфера abuf. Размещение этих буферов в памяти процессора показано в табл. 11.3.
Таблица 11.3 Размещение трех кольцевых буферов в памяти процессора
Имя буфера |
Элемент буфера |
Двоичный адрес |
… |
abuf |
abuf[0] |
XXXXXXXXX00000 |
abuf[1] |
XXXXXXXXX00001 |
abuf[2] |
XXXXXXXXX00010 |
abuf[3] |
XXXXXXXXX00011 |
abuf[4] |
XXXXXXXXX00100 |
abuf[5] |
XXXXXXXXX00101 |
… |
bbuf |
bbuf[0] |
XXXXXXXXX01000 |
bbuf[1] |
XXXXXXXXX01001 |
bbuf[2] |
XXXXXXXXX01010 |
… |
cbuf |
cbuf[0] |
XXXXXXXXX10000 |
cbuf[1] |
XXXXXXXXX10001 |
cbuf[2] |
XXXXXXXXX10010 |
cbuf[3] |
XXXXXXXXX10011 |
… |
Чтобы получить доступ к буферу abuf из программы, необходимо инициализировать индексные регистры DAG и регистры длины буфера следующими инструкциями:
I0 = ^abuf; {Присвоить индексному регистру I0 базовый адрес буфера abuf}
L0 = %abuf; {Присвоить L0 длину буфера abuf}
M0 = 1; {Присвоить модификатору M0 значение наращивания
указателя адреса буфера abuf}
Далее в программе можно читать данные из буфера с помощью инструкции AR=DM(I0, L0) или записывать данные в буфер инструкцией DM(I0, L0)=AR. Естественно, вместо регистра AR могут применяться и некоторые другие регистры процессора. При размещении этих инструкций в цикле каждое обращение к буферу будет автоматически увеличивать индексный регистр адреса I0 на величину M0. При достижении регистром I0 величины, равной L0, индексный регистр I0 вновь загрузится базовым адресом буфера. Таким образом, обращения к буферу будут кольцевыми. Для линейных буферов регистр длины буфера должен быть установлен в ноль.
Директивы PMSEG и DMSEG
Данные директивы предназначены для размещения программ и данных в сегментах памяти. Директива PMSEG указывает редактору связей на необходимость разместить все программы и данные модуля в определенном сегменте памяти программ. Директива DMSEG указывает редактору связей на необходимость разместить все структуры данных модуля в определенном сегменте памяти данных. Сегменты должны быть предварительно определены в файле описания архитектуры системного конфигуратора. Директивы PMSEG и DMSEG подобно параметру SEG директив MODULE и VAR имеют следующий формат:
Читать дальше