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
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 позволяет увеличить объем памяти, к которой производится обращение с использованием расширенной адресации.
Z_RAM=READ_WRITE0x0060TO0x007F;
RAM=READ_WRITE0x0080TO0x025F;
2. Можно создать область для хранения констант. Для этого уменьшим размер сегмента ПЗУ.
//0xE000идо0xE0FFнебудетзаписыватьсякодпрограммы)
ROM=READ_ONLY0xE100TO0xFFAD;
Размер стека также может изменяться, чтобы удовлетворять требованиям ПО (для простой программы 80 байт достаточно, но для сложных программ, размер стека может быть увеличен).
Команда VECTOR, которую можно видеть в последней строке Примера 3.2, записывает адрес перехода в ячейки памяти определенного вектора прерывания. Адрес перехода может быть представлен в символьном или абсолютном коде. Так, команда VECTOR 0 _Startup означает следующее: по прерыванию 0 (прерывание RESET) будет выполняться код _Startup.
С помощью команды VECTOR можно также устанавливать абсолютные адреса ссылок:
или
Электронные компоненты Freescale >>>
Подробнее о компании Freescale >>>