.текст
Сегмент .text містить фактичний код і запрограмований у флеш-пам'ять для мікроконтролерів. При наявності декількох безперервних блоків Flash-пам’яті може бути більше одного сегмента тексту; наприклад, вектор запуску і перериваючі вектори, розташовані у верхній частині пам'яті, і код, починаючи з 0; або окремі розділи для завантажувальної програми та основної програми.
.bss та .data
Існує три типи даних, які можуть бути виділені зовнішньо до функції чи процедури; перший - неініціалізовані дані (історично називається .bss, який також включає 0 ініціалізованих даних), а другий - ініціалізований (non-bss), або .data. Назва "bss" історично походить від "Блоку, розпочатого символом", використовуваного в асемблері близько 60 років тому. Обидві ці області розташовані в оперативній пам'яті.
По мірі складання програми змінні будуть розподілятися на одну з цих двох загальних областей. Під час етапу зв’язування всі елементи даних будуть збиратися разом. Усі змінні, які потрібно ініціалізувати, матимуть частину пам'яті програми, відведену для зберігання початкових значень, і безпосередньо перед викликом main () змінні будуть ініціалізовані, як правило, модулем під назвою crt0. Розділ bss ініціалізується на всі нулі одним і тим же кодом запуску.
З кількома мікроконтролерами є короткі інструкції, які дозволяють отримати доступ до першої сторінки (перші 256 місць, колись називається сторінка 0) оперативної пам'яті. Компілятор для цих процесорів може зарезервувати ключове слово, як, наприклад, near
призначити змінні для розміщення там. Аналогічно, є також мікроконтролери, які можуть посилатися на певні області лише через регістр вказівника (вимагаючи додаткових інструкцій), і такі змінні позначаються far
. Нарешті, деякі процесори можуть адресувати розділ пам'яті по бітах, і компілятор матиме змогу вказати це (наприклад, ключове слово bit
).
Таким чином, можуть бути додаткові сегменти, такі як .nearbss і .neardata тощо, де ці змінні зібрані.
.rodata
Третій тип даних, що є зовнішньою функцією або процедурою, схожий на ініціалізовані змінні, за винятком того, що він є лише для читання і не може бути змінений програмою. У мові С ці змінні позначаються за допомогою const
ключового слова. Зазвичай вони зберігаються як частина флеш-пам'яті програми. Іноді вони ідентифікуються як частина сегменту .rodata (лише для читання). Для мікроконтролерів, що використовують архітектуру Гарварду , компілятор повинен використовувати спеціальні інструкції для доступу до цих змінних.
стек і купа
Стек і купа обидва розміщуються в оперативній пам'яті. Залежно від архітектури процесора, стек може зростати чи наростати. Якщо вона виросте, вона буде розміщена внизу ОЗУ. Якщо він зростає вниз, він буде розміщений в кінці оперативної пам'яті. Купа використовує решту оперативної пам’яті, не виділену змінним, і зростатиме протилежний напрямок стека. Максимальний розмір стека та купи зазвичай можна вказати як параметри лінкера.
Змінні, розміщені в стеці, - це будь-які змінні, визначені у функції чи процедурі без ключового слова static
. Колись їх називали автоматичними змінними ( auto
ключовими словами), але це ключове слово не потрібно. Історично auto
існує, оскільки вона була частиною мови B, яка передувала мові C, і там вона була потрібна. Параметри функції також розміщуються на стеку.
Ось типовий макет оперативної пам’яті (якщо немає спеціального розділу 0 розділу):
EEPROM, ROM та NVRAM
Перед тим, як з'явилася флеш-пам'ять, EEPROM (програмована пам'ять, доступна лише для читання з електричним стиранням) використовувалася для зберігання програми та даних const (сегменти .text та .rodata). Зараз є лише невелика кількість (наприклад, від 2 КБ до 8 КБ байт) EEPROM, якщо вона взагалі є, і вона зазвичай використовується для зберігання даних конфігурації або інших невеликих обсягів даних, які потрібно зберегти під час вимкнення живлення цикл. Вони не декларуються як змінні в програмі, а натомість записуються до використання спеціальних регістрів мікроконтролера. EEPROM також може бути реалізований в окремій мікросхемі та доступ до неї через шину SPI або I²C.
ПЗУ по суті такий же, як Flash, за винятком того, що він запрограмований на заводі (не програмується користувачем). Він використовується лише для пристроїв дуже великого обсягу.
NVRAM (енергонезалежна оперативна пам'ять) є альтернативою EEPROM і зазвичай реалізується як зовнішня ІС. Регулярна оперативна пам’ять може вважатися енергонезалежним, якщо вона резервна; у цьому випадку не потрібні спеціальні методи доступу.
Хоча дані можуть бути збережені у Flash, флеш-пам’ять має обмежену кількість циклів стирання / програмування (від 1000 до 10000), тому вона насправді не призначена для цього. Він також вимагає одразу стерти блоки пам'яті, тому оновлювати лише кілька байтів незручно. Він призначений для змінних коду та лише для читання.
EEPROM має набагато більш високі межі циклів стирання / програмування (100 000 до 1 000 000), тому це набагато краще для цієї мети. Якщо на мікроконтролері є EEPROM і він досить великий, саме там ви хочете зберегти енергонезалежні дані. Однак перед тим, як записати, вам доведеться спочатку стерти блоки (зазвичай 4 КБ).
Якщо немає EEPROM або він занадто малий, тоді потрібна зовнішня мікросхема. 32 КБ EEPROM - це лише 66 ¢ і може бути стертий / записаний до 1 000 000 разів. NVRAM з однаковою кількістю операцій стирання / програмування значно дорожчий (x10) NVRAM, як правило, швидше для читання, ніж EEPROM, але повільніше для запису. Вони можуть записуватися по одному байту або по блоках.
Кращою альтернативою обом є FRAM (сегнетоелектрична оперативна пам'ять), яка по суті має нескінченний цикл запису (100 трлн) і не має затримок запису. Це приблизно така ж ціна, що і NVRAM, близько 5 доларів за 32 КБ.