Директивы компоновщика

mikroPascal PRO для ARM использует внутренний алгоритм для распределения объектов в памяти. Если вам нужно иметь переменную, константу или подпрограмму на определенном предопределенном адресе, используйте директивы компоновщика absolute и org.

При использовании этих директив обязательно используйте их в соответствующих сегментах памяти, т. е. для функций это KSEG0, а для переменных - KSEG1. Директивы Linker используются с виртуальными адресами.

Директива absolute

Директива absolute определяет начальный адрес в ОЗУ для переменной. Если переменная является многобайтовой, более высокие байты будут храниться в последовательных местах.

Директива absolute добавляется к объявлению переменной:

// Переменная x будет занимать 1 слово (16 бит) по адресу 0x20000000
var x : word; absolute 0x20000000;

// Переменная y будет занимать 2 слова по адресам 0x20000000 и 0x20000002
var y : longint; absolute 0x20000000;

Будьте осторожны при использовании директивы absolute, так как вы можете случайно наложить две переменные. Например:

// Переменная i будет занимать 1 слово по адресу 0x20000002;
var  i : word; absolute 0x20000002;

// Переменная будет занимать 2 слова в 0x20000000 и 0x20000002; Таким образом,
// изменение i изменяет jj в одно и то же время и наоборот
var jj : longint; absolute 0x20000000;

Директива org

Директива org определяет начальный адрес константы или подпрограммы в ПЗУ. Он добавляется к константной или рутинной декларации.

Чтобы поместить постоянный массив во флэш-память, напишите следующее:

// Постоянный массив MONTHS будет размещен начиная с адреса 0x70000
const MONTHS : array[1..12] of byte = (31,28,31,30,31,30,31,31,30,31,30,31); org 0x70000;

Если вы хотите поместить постоянную константу во флэш-память, вместо следующего объявления:

const SimpleConstant : byte = 0x2A; org 0x70000;

используйте массив, состоящий из одного элемента:

const SimpleConstant : array[1] of byte = (0xAA); org 0x70000;

В первом случае компилятор распознает вашу попытку, но для того, чтобы сохранить флэш-пространство и повысить производительность, он автоматически заменит все экземпляры этой константы в коде буквенным значением.
Во втором случае ваша константа будет помещена во Flash в указанном точном месте.

Чтобы разместить рутину по определенному адресу во флэш-памяти, вы должны написать следующее:

procedure proc(par : byte); org 0x70000;
begin
// Процедура начинается с адреса 0x70000;
...
end;

orgдиректива также может использоваться с основной программой. Например:

	
program Led_Blinking; 

begin org 0x70000;             // основная процедура начинается с 0x70000
...
end.

Директива orgall

Используйте директиву orgallчтобы указать адрес, над которым будут помещены все подпрограммы и константы. Пример:

begin
  orgall(0x70000); // Все подпрограммы, константы в основной программе будут выше адреса 0x70000
  ...
end.