Bir Cortex-M projesinde linker script ne işe yarar? .text, .data, .bss bölümleri Flash ve RAM'e nasıl yerleşir? LMA ve VMA farkı nedir?
Cevap
Linker script, derlenmiş nesne dosyalarındaki bölümlerin (section) hedefin bellek haritasında nereye yerleşeceğini ve başlangıç kodunun kullanacağı sembolleri tanımlar.
| Bölüm | İçerik | Nerede durur | Çalışırken nerede |
|---|---|---|---|
.isr_vector | Kesme vektör tablosu | Flash başı | Flash (gerekirse RAM'e taşınır) |
.text | Kod | Flash | Flash |
.rodata | const veriler, string sabitleri | Flash | Flash |
.data | İlk değeri olan global/static değişkenler | Flash (ilk değerler) | RAM |
.bss | İlk değeri olmayan veya 0 olan global/static değişkenler | Yer kaplamaz | RAM (sıfırlanır) |
| heap / stack | Dinamik bellek ve yığın | - | RAM |
LMA ve VMA
- VMA (Virtual Memory Address): Değişkenin çalışma anında kullanılan adresi (RAM).
- LMA (Load Memory Address): Değerin imajda saklandığı adres (Flash).
.data bölümünün VMA'sı RAM, LMA'sı Flash'tır. Startup kodu ilk değerleri LMA'dan VMA'ya kopyalar.
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 128K
}
_estack = ORIGIN(RAM) + LENGTH(RAM);
SECTIONS
{
.isr_vector : { KEEP(*(.isr_vector)) } > FLASH
.text : { *(.text*) *(.rodata*) . = ALIGN(4); _etext = .; } > FLASH
_sidata = LOADADDR(.data);
.data : { _sdata = .; *(.data*) . = ALIGN(4); _edata = .; } > RAM AT> FLASH
.bss : { _sbss = .; *(.bss*) *(COMMON) . = ALIGN(4); _ebss = .; } > RAM
}Pratik kullanım alanları
- Fonksiyonu RAM'de çalıştırmak (Flash silme/yazma sırasında veya hız için):
__attribute__((section(".ramfunc")))ve bu bölümü> RAM AT> FLASHolarak tanımlamak. - noinit bölümü: Reset sonrası korunması gereken veriler (hata kaydı, reset sayacı) için sıfırlanmayan bir RAM bölümü.
- Bootloader + uygulama: Uygulamanın
FLASH ORIGINdeğerini bootloader'dan sonraya kaydırmak veSCB->VTORayarlamak. KEEP(),--gc-sectionsile kullanılmayan kodun silinmesi sırasında vektör tablosunun korunmasını sağlar.
Bellek kullanımını görmek
arm-none-eabi-size firmware.elf
# text data bss dec
# 24816 412 6020 31248
# Flash = text + data, RAM = data + bss (+ stack/heap)
arm-none-eabi-gcc ... -Wl,-Map=firmware.map -Wl,--print-memory-usageİlgili Mikrodenetleyiciler soruları
- Kesme (interrupt) nedir? ISR yazarken nelere dikkat edilir?
- Watchdog timer nedir, ne işe yarar?
- Bir bootloader nasıl çalışır? Uygulamaya atlama ve güvenli firmware güncellemesi nasıl tasarlanır?
- Mekanik bir butonun debounce işlemi neden gereklidir ve yazılımda nasıl yapılır?
- DMA nedir, ne zaman kullanılır? DMA kullanırken cache coherency ve double buffering gibi konularda nelere dikkat edilmelidir?
- ADC çözünürlüğü, referans voltajı ve örnekleme hızı nedir? ADC okumasında doğruluğu etkileyen faktörler nelerdir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.