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.
  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