.teks
Segmen .text berisi kode aktual, dan diprogram dalam memori Flash untuk mikrokontroler. Mungkin ada lebih dari satu segmen teks ketika ada beberapa blok, memori Flash yang tidak bersebelahan; misalnya vektor awal dan vektor interupsi yang terletak di bagian atas memori, dan kode mulai dari 0; atau bagian terpisah untuk bootstrap dan program utama.
.bs dan .data
Ada tiga jenis data yang dapat dialokasikan di luar fungsi atau prosedur; yang pertama adalah data yang tidak diinisialisasi (secara historis disebut .bss, yang juga mencakup 0 data yang diinisialisasi), dan yang kedua diinisialisasi (non-bss), atau .data. Nama "bss" secara historis berasal dari "Block Started by Symbol", yang digunakan dalam assembler sekitar 60 tahun yang lalu. Kedua area ini terletak di RAM.
Ketika sebuah program dikompilasi, variabel akan dialokasikan ke salah satu dari dua area umum ini. Selama tahap penautan, semua item data akan dikumpulkan bersama. Semua variabel yang perlu diinisialisasi akan memiliki sebagian memori program yang disisihkan untuk menampung nilai awal, dan tepat sebelum main () dipanggil, variabel akan diinisialisasi, biasanya oleh modul yang disebut crt0. Bagian bss diinisialisasi ke semua nol dengan kode startup yang sama.
Dengan beberapa mikrokontroler, ada instruksi yang lebih pendek yang memungkinkan akses ke halaman pertama (256 lokasi pertama, kadang-kadang disebut halaman 0) RAM. Kompiler untuk prosesor ini dapat memesan kata kunci seperti near
untuk menunjuk variabel yang akan ditempatkan di sana. Demikian pula, ada juga mikrokontroler yang hanya dapat mereferensikan area tertentu melalui register pointer (membutuhkan instruksi tambahan), dan variabel-variabel tersebut ditunjuk far
. Akhirnya, beberapa prosesor dapat menangani bagian memori sedikit demi sedikit dan kompiler akan memiliki cara untuk menentukan itu (seperti kata kunci bit
).
Jadi mungkin ada segmen tambahan seperti .nearbss dan .neardata, dll., Di mana variabel-variabel ini dikumpulkan.
.rodata
Jenis ketiga data eksternal untuk suatu fungsi atau prosedur adalah seperti variabel yang diinisialisasi, kecuali itu hanya baca dan tidak dapat dimodifikasi oleh program. Dalam bahasa C, variabel-variabel ini dilambangkan dengan menggunakan const
kata kunci. Mereka biasanya disimpan sebagai bagian dari memori flash program. Kadang-kadang mereka diidentifikasi sebagai bagian dari segmen .rodata (data hanya baca). Pada mikrokontroler yang menggunakan arsitektur Harvard , kompiler harus menggunakan instruksi khusus untuk mengakses variabel-variabel ini.
tumpukan dan tumpukan
Tumpukan dan tumpukan keduanya ditempatkan dalam RAM. Bergantung pada arsitektur prosesor, tumpukan dapat tumbuh, atau tumbuh. Jika itu tumbuh, itu akan ditempatkan di bagian bawah RAM. Jika itu tumbuh ke bawah, itu akan ditempatkan di akhir RAM. Heap akan menggunakan sisa RAM yang tidak dialokasikan untuk variabel, dan menumbuhkan arah yang berlawanan dari stack. Ukuran maksimum tumpukan dan tumpukan biasanya dapat ditentukan sebagai parameter tautan.
Variabel yang ditempatkan pada tumpukan adalah variabel apa pun yang ditentukan dalam fungsi atau prosedur tanpa kata kunci static
. Mereka pernah disebut variabel otomatis ( auto
kata kunci), tetapi kata kunci itu tidak diperlukan. Secara historis, auto
ada karena itu adalah bagian dari bahasa B yang mendahului C, dan di sana diperlukan. Parameter fungsi juga ditempatkan di tumpukan.
Berikut adalah tata letak khas untuk RAM (dengan asumsi tidak ada bagian halaman 0 khusus):
EEPROM, ROM, dan NVRAM
Sebelum memori Flash muncul, EEPROM (memori hanya-baca yang dapat diprogram yang dapat dihapus secara listrik) digunakan untuk menyimpan program dan data const (segmen .text dan .rodata). Sekarang hanya ada sejumlah kecil (mis. 2KB hingga 8KB byte) dari EEPROM yang tersedia, jika ada, dan biasanya digunakan untuk menyimpan data konfigurasi atau sejumlah kecil data yang perlu dipertahankan melalui power-down power up siklus. Ini tidak dinyatakan sebagai variabel dalam program, tetapi ditulis untuk menggunakan register khusus dalam mikrokontroler. EEPROM juga dapat diimplementasikan dalam chip terpisah dan diakses melalui bus SPI atau I²C.
ROM pada dasarnya sama dengan Flash, kecuali diprogram di pabrik (tidak dapat diprogram oleh pengguna). Ini hanya digunakan untuk perangkat volume yang sangat tinggi.
NVRAM (RAM non-volatile) adalah alternatif untuk EEPROM, dan biasanya diimplementasikan sebagai IC eksternal. RAM reguler dapat dianggap non-volatile jika didukung oleh baterai; dalam hal ini tidak diperlukan metode akses khusus.
Meskipun data dapat disimpan ke Flash, memori Flash memiliki siklus penghapusan / program yang terbatas (1000 hingga 10.000) sehingga tidak benar-benar dirancang untuk itu. Ini juga membutuhkan blok memori untuk dihapus sekaligus, jadi tidak nyaman untuk memperbarui hanya beberapa byte. Ini dimaksudkan untuk variabel kode dan hanya-baca.
EEPROM memiliki batasan yang jauh lebih tinggi pada siklus penghapusan / program (100.000 hingga 1.000.000) sehingga jauh lebih baik untuk tujuan ini. Jika ada EEPROM tersedia di mikrokontroler dan itu cukup besar, itu adalah tempat Anda ingin menyimpan data yang tidak mudah menguap. Namun Anda juga harus menghapus dalam blok terlebih dahulu (biasanya 4KB) sebelum menulis.
Jika tidak ada EEPROM atau terlalu kecil, maka diperlukan chip eksternal. EEPROM 32KB hanya 66 ¢ dan dapat dihapus / ditulis hingga 1.000.000 kali. NVRAM dengan jumlah yang sama dengan operasi penghapus / program jauh lebih mahal (x10) NVRAM biasanya lebih cepat untuk membaca daripada EEPROM, tetapi lebih lambat untuk menulis. Mereka dapat ditulis ke satu byte pada suatu waktu, atau dalam blok.
Alternatif yang lebih baik untuk keduanya adalah FRAM (RAM feroelektrik), yang pada dasarnya memiliki siklus tulis yang tak terbatas (100 triliun) dan tidak ada penundaan penulisan. Ini tentang harga yang sama dengan NVRAM, sekitar $ 5 untuk 32KB.