Iar 4

Містить таблицю векторів програмних переривань (software interrupt vector table).

Сегменти розміщуються в пам'яті при використанні директив линкера для управління розміщення сегментів -Z і -P, які призначені відповідно для послідовного і пакетного розміщення. Деякі сегменти не можуть використовувати пакетне розміщення, тому що їх вміст повинен бути безперервним. У кожному описі тип пам'яті сегмента - CODE, CONST або DATA - показує, чи повинен сегмент бути поміщений в ROM або RAM.

CODE Для виконуваного коду.
CONST Для даних, які містяться в ROM.
DATA Для даних, які містяться в RAM.

Детальніше про директиви -Z і -P можна дізнатися в даташіте "IAR Linker and Library Tools Reference Guide". Щоб дізнатися, як поставити сегменти в файлі команд линкера (linker command file), див. Розділ «Управління лінкером за допомогою файлу команд". Додаткову інформацію по спеціальному розширеному синтаксису IAR (extended keywords), див. "Extended keywords".

CODE. Цей сегмент містить код програми, за винятком коду ініціалізації системи і коду функцій, які визначені з атрибутом __ramfunc. Цей код виконується з ROM (зазвичай це пам'ять FLASH).
Тип пам'яті сегмента: CODE
Розміщення в пам'яті: цей сегмент може бути розміщений в будь-якому місці пам'яті.
Тип доступу: тільки для читання.

CODE_I. Цей сегмент містить код функцій, які визначені з атрибутом __ramfunc. Цей код виконується з RAM (зазвичай цей тип пам'яті дає додатковий приріст швидкості виконання). Код копіюється в RAM з сегмента CODE_ID в процесі ініціалізації.
Тип пам'яті сегмента: CODE
Розміщення в пам'яті: Цей сегмент може бути розміщений в будь-якому місці пам'яті.
Тип доступу: читання і запис.

CODE_ID. У цьому сегменті розташоване сховище коду, який визначений з атрибутом __ramfunc. Цей код виконується з RAM після того, як буде скопійований в сегмент CODE_I.
Тип пам'яті сегмента: CODE
Розміщення в пам'яті: цей сегмент може бути розміщений в будь-якому місці пам'яті.
Тип доступу: тільки для читання.

CSTACK. Містить внутрішні дані стека.
Тип пам'яті сегмента: DATA
Розміщення в пам'яті: цей сегмент може бути розміщений в будь-якому місці пам'яті.
Тип доступу: читання і запис.

За замовчуванням на початку файлу настройки линкера встановлюється константа, яка визначає розмір стека:

Далі в файлі настройки линкера дійсні сегменти визначаються відповідно до галузі пам'яті, виділеної під стек:

DATA_AC. Містить дані ініціалізіруемих констант.

DATA_AN. Містить дані, які визначені з атрибутом __no_init. Все, що сказано для located-даних в описі сегмента DATA_AC, відноситься і до сегменту DATA_AN.

DATA_C. Містить дані констант (об'єкти, визначені з ключовим словом const).
Тип пам'яті сегмента: CONST
Розміщення в пам'яті: цей сегмент може бути розміщений в будь-якому місці пам'яті.
Тип доступу: тільки для читання.

DATA_I. Містить статичні і глобальні ініціалізіруемих змінні, які не започатковано шляхом копіювання з сегмента DATA_ID при старті програми (startup). Цей сегмент не може бути розміщений в пам'яті директивою -P пакетного розміщення, тому що вміст сегмента має бути безперервним. Замість цього потрібно використовувати директиву -Z, коли Ви ставите це сегмент в настроювальному файлі команд линкера.
Тип пам'яті сегмента: DATA
Розміщення в пам'яті: цей сегмент може бути розміщений в будь-якому місці пам'яті.
Тип доступу: читання і запис.

DATA_ID. Сховище значень для статичних і глобальних змінних сегмента DATA_I. Ці значення копіюються з DATA_ID в DATA_I при старті програми (startup). Цей сегмент не може бути розміщений в пам'яті директивою -P пакетного розміщення, тому що вміст сегмента має бути безперервним. Замість цього потрібно використовувати директиву -Z, коли Ви ставите це сегмент в настроювальному файлі команд линкера.
Тип пам'яті сегмента: CONST
Розміщення в пам'яті: цей сегмент може бути розміщений в будь-якому місці пам'яті.
Тип доступу: тільки для читання.

DATA_N. Містить статичні і глобальні змінні, які визначені з атрибутом __no_init.
Тип пам'яті сегмента: DATA
Розміщення в пам'яті: цей сегмент може бути розміщений в будь-якому місці пам'яті.
Тип доступу: читання і запис.

DATA_Z. Містить статичні і глобальні змінні, ініціалізіруемих нулем. Цей сегмент не може бути розміщений в пам'яті директивою -P пакетного розміщення, тому що вміст сегмента має бути безперервним. Замість цього потрібно використовувати директиву -Z, коли Ви ставите це сегмент в настроювальному файлі команд линкера.
Тип пам'яті сегмента: DATA
Розміщення в пам'яті: цей сегмент може бути розміщений в будь-якому місці пам'яті.
Тип доступу: читання і запис.

DIFUNCT. Містить вектор динамічної ініціалізації, використовуваний C ++.
Тип пам'яті сегмента: CODE
Розміщення в пам'яті: цей сегмент може бути розміщений в будь-якому місці пам'яті.
Тип доступу: тільки для читання.

HEAP. Має досить велику кількість, яка використовується для динамічно виділяються даних, іншими словами для даних, що виділяються викликами malloc і free, а також в C ++, new і delete.
Тип пам'яті сегмента: DATA
Розміщення в пам'яті: цей сегмент може бути розміщений в будь-якому місці пам'яті.
Тип доступу: читання і запис.

Сегмент купи буде використовуватися в додатку тільки тоді, коли дійсно використовується динамічне виділення пам'яті. Розмір купи і її розміщення в пам'яті визначаються файлом команд линкера - точно так само, як і при визначенні сегмента стека. приклад:

ICODE. Містить спеціальний код запуску (startup); ці функції повинні бути в межах доступності інструкцій розгалуження з сегмента INTVEC.
Тип пам'яті сегмента: CODE
Розміщення в пам'яті: цей сегмент може бути розміщений в будь-якому місці молодшої 32-мегабайтной області пам'яті, так щоб асемблерні інструкції розгалуження з сегмента INTVEC могли передати управління в ICODE.
Тип доступу: тільки для читання.

IRQ_STACK. Містить стек, який використовується при обробці виключень IRQ. Інші стеки можуть бути додані, якщо це потрібно для обробки інших типів виключень FOQ, SVC, ABT і UND. Файл коду запуску cstartup.s79 повинен бути модифікований, щоб ініціалізувати використовувані покажчики стека виключень.
Тип пам'яті сегмента: DATA
Розміщення в пам'яті: цей сегмент може бути розміщений в будь-якому місці пам'яті.
Тип доступу: читання і запис.

Архітектура ARM підтримує 5 режимів виключення, в які входить процесор при різних подіях виключення (exception). Кожен режим виключення має свій власний стек для того, щоб уникнути псування стека режиму користувача / системи. У таблиці показані пропоновані імена для різних стеків виключення, але можуть використовуватися і будь-які інші імена.

Рекомендоване ім'я сегмента стека

Стек обробників переривань при події некоректну вибірку інструкції і неприпустимого доступу до даних.

Для кожного режиму процесора, якому потрібен стек, в коді завантаження (startup code) слід буде почати окремий покажчик стека, і в файлі команд линкера має бути задано розміщення сегмента. У поставляються файлах cstartup.s79 і lnkarm.xcl попередньо налаштовується тільки стек IRQ, але можна легко додати інші стеки винятків.

SWITAB. Містить таблицю векторів програмних переривань.
Тип пам'яті сегмента: CODE
Розміщення в пам'яті: цей сегмент може бути розміщений в будь-якому місці пам'яті.
Тип доступу: тільки для читання.

[Управління лінкером за допомогою файлу команд]

Файл налаштувань линкера потрібно змінювати в тому випадку, коли потрібно налаштувати цільову карту пам'яті програмованої системи (target system memory map). Припустимо, цільова система повинна використовувати таку карту пам'яті:

0x000000-0x00003F ROM або RAM
0x008000-0x0FFFFF ROM (FLASH) або інша незалежна пам'ять
0x100000-0x7FFFFF RAM або інша пам'ять, доступна на читання і запис

ROM може використовуватися для збереження сегментів пам'яті, яка має тип CONST і CODE. Пам'ять RAM може містити сегменти типу DATA. Основне призначення зміни файлу команд линкера - перевірити, що код і дані Вашої програми не перетинають кордони областей пам'яті (області пам'яті технологічно обмежені в залежності від типу процесора) - невиконання цієї умови призведе до відмови в роботі програми.

Крім усього іншого, командний файл линкера містить три різних типи параметрів командного рядка XLINK:

• Тип використовуваного CPU (-carm), задає тип цільового ядра.
• Визначення констант, які буду використовуватися в файлі далі. Константи задаються опцією -D.
• Директиви розміщення (це найбільша частина файлу команд линкера). Сегменти можуть бути розміщені з використань опцій -Z і -P. Опція -Z (послідовне розміщення) помістить частини сегмента в порядку їх появи, а опція -P (пакетне розміщення) призведе до того, що линкер спробує перебудувати частини так, щоб краще використовувати пам'ять. Однак -P корисно застосовувати тільки тоді, коли не потрібно забезпечити безперервність розміщення частин сегмента. Детальніше див. Даташит "IAR Linker and Library Tools Reference Guide".

Використання команди -Z для послідовного розміщення. Використовуйте команду -Z, коли Вам потрібно забезпечити весь сегмент як безперервний шматок пам'яті, коли потрібно зберегти порядок частин у сегменті, або, що використовується рідше, щоб розмістити сегменти в певному порядку.

Два сегмента різного типу можна розмістити в тій же самій області пам'яті, але для цього не потрібно вказувати діапазон другого сегмента. У наступному прикладі сегмент MYSEGMENTA буде розміщений в пам'яті першим. Тоді інша пам'ять буде використовуватися MYCODE.

Два діапазону пам'яті можуть перекривати один одного. Це дозволяє сегментам з різними вимогами до розміщення використовувати їх поділяє спільний простір пам'яті, приклад:

Незважаючи на те, немає строгих рекомендацій на вказівку кінця кожного діапазону пам'яті, все одно рекомендується це робити. Коли Ви вкажете кінець діапазону пам'яті, то лінковщік IAR XLINK Linker попередить Вас, якщо Ваші сегменти не поміщаються в пам'яті.

Використання команди -P для пакетного розміщення. Команда -P відрізняється від -Z тим, що при використанні -P не потрібно розміщувати сегменти (або частини сегмента) послідовно. З використанням -P стає можливим розміщувати частини сегмента в "дірки", залишені від попередніх розміщень інших сегментів.

Наступний приклад показує, як можна застосувати опцію XLINK -P, щоб використовувати пам'ять ефективніше. Команда розмістить сегмент даних MYDATA в пам'яті DATA (т. Е. RAM) у фіктивному діапазоні пам'яті:

Якщо ваша заявка має додаткову область RAM в діапазоні пам'яті 0x10F000-0x10F7FF, то просто додайте до оригінального визначення: