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İçerikNerede dururÇalışırken nerede
.isr_vectorKesme vektör tablosuFlash başıFlash (gerekirse RAM'e taşınır)
.textKodFlashFlash
.rodataconst veriler, string sabitleriFlashFlash
.dataİlk değeri olan global/static değişkenlerFlash (ilk değerler)RAM
.bssİlk değeri olmayan veya 0 olan global/static değişkenlerYer kaplamazRAM (sıfırlanır)
heap / stackDinamik 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> FLASH olarak 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 ORIGIN değerini bootloader'dan sonraya kaydırmak ve SCB->VTOR ayarlamak.
  • KEEP(), --gc-sections ile 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
  1. Kesme (interrupt) nedir? ISR yazarken nelere dikkat edilir?OrtaMikrodenetleyicilerEmbedded
  2. Watchdog timer nedir, ne işe yarar?KolayMikrodenetleyicilerEmbedded
  3. Bir bootloader nasıl çalışır? Uygulamaya atlama ve güvenli firmware güncellemesi nasıl tasarlanır?ZorMikrodenetleyicilerEmbedded
  4. Mekanik bir butonun debounce işlemi neden gereklidir ve yazılımda nasıl yapılır?KolayMikrodenetleyicilerEmbedded
  5. DMA nedir, ne zaman kullanılır? DMA kullanırken cache coherency ve double buffering gibi konularda nelere dikkat edilmelidir?ZorMikrodenetleyicilerEmbedded
  6. ADC çözünürlüğü, referans voltajı ve örnekleme hızı nedir? ADC okumasında doğruluğu etkileyen faktörler nelerdir?OrtaMikrodenetleyicilerEmbedded

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle