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
- 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). Reset_Handlerçalışır:SystemInit(): Saat ayarları, FPU erişimini açma (CPACR), gerekiyorsaVTORayarı..databölümünün ilk değerlerini Flash'tan RAM'e kopyalama..bssbölümünü sıfırlama.__libc_init_array(): C++ global constructor'ları ve__attribute__((constructor))fonksiyonları.main()çağrılır;maindö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
.datakopyalanmazsa 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.
İ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.