3.2.2. Файл настройки компоновщика

(Руководство разработчика по микроконтроллерам семейства HCS08)

Файл с именем *.prm содержит в себе информацию для программы компоновщика, в соответствие с которой компоновщик располагает в памяти МК код программы и данные. Файл *.prm состоит из трех частей.

1. SEGMENTS

В этой части указываются границы адресов каждого типа памяти МК:

Z_RAMпамять ОЗУ, расположенная на нулевой странице. Доступ к ячейкам этого сегмента будет производиться с помощью прямого способа адресации;
RAMпамять ОЗУ, расположенная вне нулевой страницы. Доступ к ячейкам этого сегмента будет производиться с помощью прямой расширенной адресации;
ROMобласть ПЗУ (флэш-память);
ROM1область ПЗУ (флэш-память), расположенная перед областью векторов сброса и прерываний.

При описании перечисленных областей памяти используются 4 спецификатора:

READ_ONLYразделы памяти с данным спецификатором доступны только для чтения. Подобные разделы инициализируются, если код программы записывается во флэш-память;
READ_WRITEразделы памяти с данным спецификатором доступны как для чтения, так и для записи;
NO_INITэти разделы доступны и для чтения, и для записи, но не инициализируются кодом запуска;
PAGEDразделы доступны и для записи, и для чтения и находятся в памяти с страничной организацией.

2. PLACEMENT

В этой части указывается, в какие области памяти микроконтроллера должны быть размещены сегменты программного кода:

DEFAULT_RAMсегмент памяти для переменных, обычно располагается в ОЗУ;
DEFAULT_RОMсегмент памяти для программного кода, обычно располагается в ПЗУ;
_PRESTARTсегмент памяти для точки входа в прикладную программу, обычно располагается в ПЗУ;
STARTUPсегмент памяти для кода запуска, обычно располагается в ПЗУ;
COPYсегмент для начальных значений переменных, эти значения записываются в процессе инициализации в ОЗУ под управлением кода запуска, обычно располагается в ПЗУ;
ROM_VARсегмент для размещения константных переменных, обычно это область ПЗУ (флэш-память);
STRINGSв данном сегменте хранятся строковые переменные.

3. STACK

Определяет область памяти для размещения стека. Область памяти стека начинается с конечного адреса ОЗУ и имеет размер, указанный в параметре STACKSIZE.

Пример 3.2. Листинг показывает содержимое файла *.prm для МК модели MC9S08QG8

NAMESEND/*CodeWarriorwillpassalltheneededfilestothelinkerbycommandline.Buthereyoumayaddyourownfilestoo.*/
SEGMENTS/*HereallRAM/ROMareasofthedevicearelisted.UsedinPLACEMENTbelow.*/
Z_RAM=READ_WRITE0x0060TO0x00FF;
RAM=READ_WRITE0x0100TO0x025F;
ROM=READ_ONLY0xE000TO0xFFAD;
ROM1=READ_ONLY0xFFC0TO0xFFCF;
INTVECTS=READ_ONLY0xFFD0TO0xFFFF;/*ReservedforInterrupt
Vectors*/
END
PLACEMENT/*HereallpredefinedandusersegmentsareplacedintotheSEGMENTSdefinedabove*/
DEFAULT_RAM/*non-zeropagevariables*/
INTORAM;
(поместитьсегментDEFAULT_RAMвОЗУ)
_PRESTART,/*startupcode*/
STARTUP,/*startupdatastructures*/
ROM_VAR,/*constantvariables*/
STRINGS,/*stringliterals*/
VIRTUAL_TABLE_SEGMENT,/*C++virtualtablesegment*/
DEFAULT_ROM,
COPY/*copydowninformation:howtoinitialize
variables*/
INTOROM;/*,ROM1:Touse"ROM1"aswell,passthe
option-OnB=btothecompiler*/
(поместитьсегменты_PRESTART,STARTUP.....COPYвПЗУ)
_DATA_ZEROPAGE,/*zeropagevariables*/
MY_ZEROPAGEINTOZ_RAM;
(поместитьсегментMY_ZEROPAGEвнулевуюстраницуОЗУ)
END
STACKSIZE0x50
(установитьразмерстекаравным0x50или80байт)
VECTOR0_Startup/*Resetvector:thisisthedefaultentrypointforanapplication*/
(начатьисполнениепрограммыс_Startup)

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

Области памяти, описанные в разделе segments, могут быть изменены пользователем в следующих ситуациях:

1. При применении модели памяти small изменение областей Z_RAM и RAM позволяет увеличить объем памяти, к которой производится обращение с использованием расширенной адресации.

//Зарезервируем20байтпамятидляобращенияпрямымспособомадресации
Z_RAM=READ_WRITE0x0060TO0x007F;
RAM=READ_WRITE0x0080TO0x025F;

2. Можно создать область для хранения констант. Для этого уменьшим размер сегмента ПЗУ.

//Зарезервируемпервые256байтпамятидляданных(вобластьпамятиначинаясадреса
//0xE000идо0xE0FFнебудетзаписыватьсякодпрограммы)
ROM=READ_ONLY0xE100TO0xFFAD;

Размер стека также может изменяться, чтобы удовлетворять требованиям ПО (для простой программы 80 байт достаточно, но для сложных программ, размер стека может быть увеличен).

Команда VECTOR, которую можно видеть в последней строке Примера 3.2, записывает адрес перехода в ячейки памяти определенного вектора прерывания. Адрес перехода может быть представлен в символьном или абсолютном коде. Так, команда VECTOR 0 _Startup означает следующее: по прерыванию 0 (прерывание RESET) будет выполняться код _Startup.

С помощью команды VECTOR можно также устанавливать абсолютные адреса ссылок:

VECTOR0xFFFE_Startup//ВекторпрерыванияRESETуказываетнаадрес_Startup

или

VECTOR0xFFFE0xF123//ВекторпрерыванияRESETуказываетнаадрес0xF123

Электронные компоненты Freescale >>>
Подробнее о компании Freescale >>>