Директивы компоновщика
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.