Буферы могут быть размещены как в памяти программ PM, так и в памяти данных DM, по умолчанию. Тип памяти по умолчанию устанавливается в RAM для памяти DM и PM.
Параметр ABS размещает буфер с указанного стартового адреса, делая его неперемещаемым.
Параметр SEG размещает буфер в указанном сегменте памяти, который был объявлен в файле системного конфигуратора.
Параметр CIRC определяет кольцевой буфер. Буфер будет организован как линейный, если не применен атрибут CIRC.
Параметр STATIC предотвращает перезапись буфера, когда загружается страница начальной загрузки.
Пример объявления буфера:
.VAR/PM/RAM/SEG=segdata buffer[10];
Здесь линейный буфер объявлен в памяти программ RAM, который перемещаем в пределах сегмента с именем segdata. Буфер с именем buffer состоит из 10 ячеек в памяти программ. Длина буфера указывается в квадратных скобках.
Для объявления одномерных буферов, т.е. простых переменных, применяется директива VAR без указания длины буфера. Например:
.VAR/DM/RAM/ABS=0x000C xdata;
Данная директива объявляет однословную переменную с именем xdata в памяти данных RAM по шестнадцатеричному адресу 0x000C.
Ниже приведен пример объявления автоматически перемещаемого кольцевого буфера с именем buffer_c, длина которого определяется величиной константы size, объявленной директивой CONST.
.CONST size = 15;
.VAR/DM/CIRC buffer_c[size];
Ниже приведены примеры, позволяющие понять, как можно размещать циклические буферы в памяти. Следующий оператор объявляет кольцевой буфер с именем abuf из шести ячеек памяти:
.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] |