IAR 4

Тут наведено переклад документаціїIAR 4.0 "ARM® IAR C/C++ Compiler Reference Guide", розділ Part 1. Using the compiler -> Placing code and data -> Controlling data and function placement in memory -> Data placement at an absolute location.

[Розміщення даних у заданому місці пам'яті ]

Для додаткової інформації про декларування об'єктів volatile, див. розділ "Protecting simultaneously accessed variables".

[Приклади ]

У наступному прикладі значення не ініціалізується компілятором; значення має бути встановлене якимось іншим способом. Зазвичай така конфігурація використовується, коли значення завантажуються в ROM окремо або для регістрів SFR (special function register, регістри спеціального призначення), які доступні тільки для читання (read-only). Щоб забезпечити читання значення компілятором, декларуйте їх як volatile:

У наступному прикладі показано некоректне використання:

[Розміщення даних та функцій у сегментах ]

Наступні методи можуть бути використані для розміщення даних або функцій у іменованих сегментах, відмінних від сегментів за замовчуванням:

• Оператор @ та альтернативно директива #pragma location можуть використовуватися для розміщення окремих змінних або окремих функцій у іменованих сегментах. Іменований сегмент може бути або заздалегідь заданим сегментом (predefined segment), або сегментом, який визначає користувач (user-defined segment). Змінні мають бути визначені через __no_init, або через const. Якщо декларування використовує const, воно може мати ініціалізатори.

• Опція --segment може використовуватися для розміщення змінних та функцій, які є частинами цілого процесу компіляції, в іменованихсегменти.

Якщо Ви використовуєте власні сегменти на додаток до визначених сегментів, ці сегменти повинні бути також визначені у файлі команд для лінкера з використанням директив управління сегментами-Z або-P.

Увага: будьте обережні, коли явно розміщуєте змінну або функцію у визначеному сегменті, якщо він не сегмент за промовчанням. Це корисно в деяких ситуаціях, однак неправильне розміщення може призвести або до деяких помилок при компіляції та лінкування, або до непрацездатності програми. Ретельно розгляньте всі обставини; тут мають бути суворі вимоги під час декларування та використання такої функції або змінної.

Додаткову інформацію про сегменти можна отримати у розділі "Placing code and data".

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

У наступному прикладі показано некоректне використання:

Приклади розміщення функцій у названих сегментах:

[Результуюча лінківка коду та розміщення даних ]

Лінкер має кілька можливостей, які допоможуть Вам керувати розміщенням коду та даних. Наприклад, це повідомлення часу лінківки та файл картки пам'яті лінкера (linker map file). Можуть діагностуватися проблеми з сегментами – помилки перевищення розміру сегмента (segment too long error) та помилки розміщення (range error).

Додаткову інформацію про ці типи помилок дивіться у документації на лінкер "IAR Linker and Library Tools Reference Guide".

[Карта пам'яті програми (Linker map file) ]

XLINK може згенерувати докладний перелік перехресних посилань (cross-reference listing), який опціонально можемістити таку інформацію:

Щоб отримати листинг лінкера, використовуйте опцію Generate linker listing у властивостях проекту IAR Embedded Workbench, або задайте опцію -X у командному рядку лінкера, та одну з їхніх підопцій.

Зазвичай XLINK не генеруватиме вихідний файл (двійковий код програми), якщо відбулася будь-яка помилка при лінківці, на кшталт range error. Використовуйте опцію Range checks disabled у властивостях проекту IAR Embedded Workbench, або опцію -R у командному рядку, щоб згенерувати вихідний файл навіть у разі, якщо зустрілася помилка діапазону (range error).

Для отримання додаткових відомостей про опції листингу та лістингу лінкеру див. документацію, "IAR Linker and Library Tools Reference Guide" та "ARM® IAR Embedded Workbench® IDE User Guide".