Bir Cortex-M mikrodenetleyicide reset'ten main() fonksiyonuna kadar ne olur? Startup kodu neler yapar?

Cevap

Reset sonrası işlemci vektör tablosunun ilk iki word'ünü okur: 0. word başlangıç stack pointer'ı (MSP), 1. word ise Reset_Handler adresidir. main()'den önce çalışan startup kodu, C ortamının beklediği koşulları hazırlar.

Adımlar

  1. Donanım MSP = vector[0], PC = vector[1] yükler (vektör tablosu varsayılan olarak 0x00000000 adresindedir; STM32'de bu adres Flash'a, 0x08000000'e eşlenir).
  2. Reset_Handler çalışır:
  3. SystemInit(): Saat ayarları, FPU erişimini açma (CPACR), gerekiyorsa VTOR ayarı.
  4. .data bölümünün ilk değerlerini Flash'tan RAM'e kopyalama.
  5. .bss bölümünü sıfırlama.
  6. __libc_init_array(): C++ global constructor'ları ve __attribute__((constructor)) fonksiyonları.
  7. main() çağrılır; main dönerse sonsuz döngüye girilir.
extern uint32_t _sidata, _sdata, _edata, _sbss, _ebss, _estack;
extern int main(void);
void SystemInit(void);

void Reset_Handler(void)
{
    uint32_t *src = &_sidata;
    uint32_t *dst = &_sdata;

    SystemInit();

    while (dst < &_edata)          /* .data kopyala */
        *dst++ = *src++;

    for (dst = &_sbss; dst < &_ebss; )   /* .bss sıfırla */
        *dst++ = 0;

    __libc_init_array();
    main();
    for (;;) { }
}

__attribute__((section(".isr_vector"), used))
const void *vector_table[] = {
    &_estack,
    Reset_Handler,
    NMI_Handler,
    HardFault_Handler,
    /* ... */
};

Sık karşılaşılan hatalar

  • .data kopyalanmazsa global değişkenler ilk değerlerini kaybeder ("debugger ile çalışıyor ama güç kesip açınca çalışmıyor" belirtisi).
  • FPU açılmadan float talimatı çalıştırılırsa UsageFault/HardFault oluşur.
  • Startup kodu stack'i kullanan bir C fonksiyonu çağırırken kopyalanmamış veriye erişirse tutarsız davranış görülür.

Startup dosyası genelde üretici tarafından assembly (startup_stm32xxx.s) veya C olarak verilir. Yine de içeriğini anlamak debug için şarttır.

  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