ARM Cortex-M NVIC'de kesme öncelikleri nasıl çalışır? Preemption priority, subpriority, BASEPRI ve PRIMASK kavramlarını açıklayın.
Cevap
Cortex-M'de sayısal olarak küçük öncelik değeri daha yüksek önceliktir (0 en acil). Reset (-3), NMI (-2) ve HardFault (-1) sabit, negatif önceliklere sahiptir. Diğer tüm kesmeler yapılandırılabilir.
Öncelik bitleri
Her kesmenin 8-bit öncelik alanı vardır ama üretici sadece üst bitleri uygular. STM32'de 4 bit kullanılır, yani 16 seviye vardır. Bu yüzden ham register'a 5 << 4 yazılır. CMSIS'teki NVIC_SetPriority(IRQn, 5) fonksiyonu kaydırmayı kendisi yapar. Bu ayrım FreeRTOS yapılandırmasında sık hata kaynağıdır.
Priority grouping
Öncelik bitleri ikiye bölünebilir:
- Preemption (group) priority: Bir kesmenin çalışan başka bir kesmeyi kesip kesemeyeceğini belirler.
- Subpriority: Sadece aynı preemption önceliğindeki birden çok kesme aynı anda beklerken hangisinin önce çalışacağını belirler; kesme yaptırmaz.
NVIC_SetPriorityGrouping(3); /* STM32: 4 bit preemption, 0 bit sub */
NVIC_SetPriority(USART1_IRQn, NVIC_EncodePriority(3, 6, 0));
NVIC_SetPriority(TIM2_IRQn, NVIC_EncodePriority(3, 2, 0));
NVIC_EnableIRQ(USART1_IRQn);
/* TIM2 (2), USART1 (6) ISR'ını kesebilir; tersi olmaz */Maskeleme register'ları
- PRIMASK: 1 yapılınca NMI ve HardFault dışındaki tüm kesmeleri engeller (
__disable_irq()). - BASEPRI: Belirtilen değere eşit veya daha düşük öncelikteki (sayısal olarak büyük) kesmeleri engeller, daha acil olanlara izin verir. Cortex-M0/M0+'da yoktur.
- FAULTMASK: HardFault dahil hemen her şeyi engeller.
uint32_t old = __get_BASEPRI();
__set_BASEPRI(5 << (8 - __NVIC_PRIO_BITS)); /* 5 ve altını maskele */
/* kritik bölge: öncelik 0-4 olan kesmeler hâlâ çalışır */
__set_BASEPRI(old);RTOS bağlantısı
FreeRTOS kritik bölgeleri BASEPRI ile configMAX_SYSCALL_INTERRUPT_PRIORITY seviyesine kadar maskeler. Bu yüzden ...FromISR() API'si çağıran ISR'ların önceliği bu değerden sayısal olarak büyük veya eşit olmalıdır. Aksi halde kernel veri yapıları bozulur; configASSERT bunu yakalar. STM32 + FreeRTOS için NVIC_PRIORITYGROUP_4 (subpriority yok) önerilir.
Donanım optimizasyonları
- Tail-chaining: Bir ISR biterken bekleyen başka bir kesme varsa context geri yüklenmeden doğrudan ona geçilir.
- Late arrival: Daha yüksek öncelikli bir kesme stacking sırasında gelirse önce o çalışı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.