İşletim Sistemi ve MCU İnterrupt

Başlatan mr.engineer, 28 Ekim 2020, 17:05:11

mr.engineer

MCU'daki interrupt handler ile işletim sistemindeki interrupt handler arasındaki fark nedir? Biri sadece yazılımsal diğeri donanımsal mı?
Mesela normal kullandığımız PC'ler deki işlemciler de bir interrupt handler'a sahip mi? Ya da bilgisayarda interrupt sadece işletim sistemi ile mi ilgili?

Bir FreeRTOS projesinde MCU'nun kendi interruptlarını kullanıyor musunuz? RTOS'a ait tasklar ve işlemcinin interrupt fonksiyonları arasında karmaşıklık olma ihtimali yüksek değil mi?  RTOS kullanırkern MCU'nun interrupt işlemlerinden uzak durmamız mı gerekir?

mufitsozen

#1
Alıntı yapılan: mr.engineer - 28 Ekim 2020, 17:05:11MCU'daki interrupt handler ile işletim sistemindeki interrupt handler arasındaki fark nedir? Biri sadece yazılımsal diğeri donanımsal mı?
Mesela normal kullandığımız PC'ler deki işlemciler de bir interrupt handler'a sahip mi? Ya da bilgisayarda interrupt sadece işletim sistemi ile mi ilgili?

Bir FreeRTOS projesinde MCU'nun kendi interruptlarını kullanıyor musunuz? RTOS'a ait tasklar ve işlemcinin interrupt fonksiyonları arasında karmaşıklık olma ihtimali yüksek değil mi?  RTOS kullanırkern MCU'nun interrupt işlemlerinden uzak durmamız mı gerekir?

Biraz kafa karisikligi olmus zannimca.
MCU daki int.handler ile isletim sistemi int.handler derken bunlarin
nasil calistigini dusunuyordunuz?
kavramsal olarak bir cizimle vb aciklayabilirmisiniz? 
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

Tagli

İşlemci içindeki donanımsal kesmelerin de kullanılması gerekir çoğu projede. Ben donanımsal kesmeleri de bir çeşit task olarak görüyorum. Ama FreeRTOS için konuşacak olursak (belki diğerlerinde de mantık aynıdır), donanımsal kesmelerin önceliği tüm RTOS task'lerinden daha yüksektir.

Genelde tavsiye edilen şey, donanımsal kesme içinde pek oyalanmayıp, o işi halledecek bir RTOS taskına sinyal gönderip hemen kesmeyi terk etmek. Bu sinyal mesaj, semaphore veya direct task notification ile gönderilebilir. Hatta çok düşük öncelikli bir iş ise, sanırım idle task altında çalışması için bir fonksiyon pointer'ı da sıraya eklenebiliyordu.

Benim bazen bu kuralı ihlal edip tüm işi donanımsal kesmede yapıp çıktığım oluyor. Aslında kesin bir kural yok, seçeneklerin farkında olmak ve duruma göre uygun olanını seçmek gerekli.
Gökçe Tağlıoğlu

mr.engineer

Alıntı yapılan: Tagli - 29 Ekim 2020, 10:12:47İşlemci içindeki donanımsal kesmelerin de kullanılması gerekir çoğu projede. Ben donanımsal kesmeleri de bir çeşit task olarak görüyorum. Ama FreeRTOS için konuşacak olursak (belki diğerlerinde de mantık aynıdır), donanımsal kesmelerin önceliği tüm RTOS task'lerinden daha yüksektir.

Genelde tavsiye edilen şey, donanımsal kesme içinde pek oyalanmayıp, o işi halledecek bir RTOS taskına sinyal gönderip hemen kesmeyi terk etmek. Bu sinyal mesaj, semaphore veya direct task notification ile gönderilebilir. Hatta çok düşük öncelikli bir iş ise, sanırım idle task altında çalışması için bir fonksiyon pointer'ı da sıraya eklenebiliyordu.

Benim bazen bu kuralı ihlal edip tüm işi donanımsal kesmede yapıp çıktığım oluyor. Aslında kesin bir kural yok, seçeneklerin farkında olmak ve duruma göre uygun olanını seçmek gerekli.

Teşekkür ederim, kesme öncelikleri (priority) kısmında kafam karışmıştı ama anladım şimdi.

Tagli

#4
Bu arada belirtmekte fayda var: FreeRTOS ve ARM'ın kesme numaralandırma mantığı birbirlerine ters ve bu durum kafa karışıklığına sebep olabiliyor. Unutulmaması gereken birkaç nokta var.

1) FreeRTOS'ta task'ler için en düşük öncelik 0, en yüksek öncelik (configMAX_PRIORITIES - 1), ki bu değer FreeRTOSConfig.h içinde tanımlanıyor.

2) ARM Cortex M'lerin bakış açılarına göre en yüksek öncelik 0. En düşük öncelik işlemciye göre değişiyor. STM32F0'larda 3 olabilirken STM32F4'lerde 15 olabilir. Yani donanımın kesme öncelikleri için kaç bit kullandığı ile ilgili.

3) Tüm donanımsal kesmeler, tüm RTOS task'lerinden daha yüksek öncelikli.

4) Öncelik numaralarını FreeRTOS task'leri ve donanımsal kesmeler için ayrı düşünmek lazım. Yani iki ayrı grup var, numaralar grup içindeki sıralamayı belirliyor. Grup dışında 3. madde geçerli.

5) Donanımsal kesmelerin FreeRTOS fonksiyonlarını çağırabilmeleri için sahip olabilecekleri maksimum öncelik FreeRTOSConfig.h içinde configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY ile tanımlanmış. Mesela bu değer 5 ise, ben NVIC_SetPriority() ile 5 veya daha büyük bir değer (5, 6, 7 vs.) ayarlamam lazım ki ISR içinde FreeRTOS fonksiyonlarını kullanabileyim. Eğer daha yüksek öncelik verirsem (0, 1, 2, 3, 4) o zaman kesme kodunun içinde FreeRTOS fonksiyonlarını çağıramam.

6) Yukarıdaki örnek üzerinden gidersek, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY değerinden daha düşük öncelikli ISR'ler (5, 6, 7 vs.) FreeRTOS kernel'i tarafından kesilebilir. Ama daha önce de dediğim gibi, araya task falan giremez.
Gökçe Tağlıoğlu