Yazılım kesmesi ve fonksiyon


10

MCU'larla yaklaşık 3 yıl çalıştıktan sonra hala Yazılım kesintilerinin kullanımının ne olduğunu bilmiyorum? STM32 ile birkaç iş yaptım ve yazılım kesintilerini hiç kullanmadım. Aslında bu benim için büyük bir soru:

Neden bir işi yapmak için basit bir işlevi kullanabileceğimizde, bir yazılım kesintisi kullanmalıyız? Yazılım kesmesi ile işlev arasındaki farklar nelerdir?

Ne zaman isterseniz, bir işleve (işiniz için yazdığınız) çağırabilirsiniz. Basit bir işlev yerine bir yazılım kesmenin kullanılmasının bazı yararları olmalıdır. Emin değilim ama yazılım kesintileri için bir fayda olduğunu düşünüyorum: bir yazılım kesintisi için bir öncelik atayabilirsiniz, o zaman donanım kesintisinin görevinizi bozmasını önlemek için yazılım kesintisine daha yüksek bir öncelik verebilirsiniz.


1
Kesintileri kullanmanın temel amacı, başka bir şeyin olmasını beklerken ve zamanlamalar her zaman sabit olmayacağı zaman diğer önemli görevleri yapmaya devam edebilmenizdir. Ayrıca, çoğu durumda yoklamadan biraz daha hızlı olduğunu düşünüyorum.
MrPhooky

1
@MrPhooky İşte bahsettiğiniz donanım kesintileri. OP Yazılım kesintilerinden bahsediyor.
brhans

Yanıtlar:


19

Bir işlev ve bir yazılım kesmesi arasındaki temel fark, bağlam olarak bilinen şeydir .

  • Bir işlev, ana programınızın bağlamında çalışır.
  • Bir kesme, kesme işleyicisi bağlamında çalışır.

Basit bir sistemde bu gerçek bir fark olmayabilir ve yazılım kesintileri, ROM'da sabit kodlanmış kütüphane rutinlerini sağlamanın uygun bir yolu olarak kullanılabilir - her rutinin adresini, sadece kimlik kodunu ve ana giriş noktası. Bu, kodunuzu daha taşınabilir hale getirir.

Ancak, daha karmaşık sistemlerde yazılım kesintisi çekirdek bağlamı olarak bilinen tamamen farklı bir ortamda çalışabilir . Normalde uygulamanız kaynaklara sınırlı erişimi olan korumalı bir kullanıcı bağlamında çalışır . Yalnızca çekirdek bağlamında çalışırken, daha karmaşık görevleri gerçekleştirebilirsiniz - aslında bazı sistemler hangi talimatların yürütülebileceğini sınırlar, böylece çekirdek bağlamında kodu tetiklemek için bir mekanizmaya ihtiyacınız vardır - ve bunun için bir kesme kullanılır.


1
Ayrıca, kesintiler bir programın ilerlemesini keyfi olarak durdurabilir, böylece sistem başka bir şey yapabilir (örn. Donanım kesintileri). Programlarınızın bunu hesaba katmasına gerek yoktur, çünkü programınızın bakış açısından, kesilme gerçekleştiğinde işlevin durumu değişmez. Daha eski sistemlerde, TSR (Sonlandır / Bekletmeyi Durdur) programları zamanlayıcı / saat kesintisini engelleyerek çoklu görevi simüle eder. IOPL seviyeleri olmadan bile, örneğin, sistem saatini güncel tutmanın bir yararı vardı.
phyrfox

4
Belki de bu "yazılım kesintilerine" de "eşzamanlı kesintiler" olarak atıfta bulunulduğunu unutmayın, çünkü uygulama kodu, "eşzamansız kesintiler" yerine bu tür bir kesintinin tam olarak ne zaman ve neden oluştuğunu bilir. uygulama, temelde herhangi bir zamanda istenmeyen bir şekilde olur.
JimmyB

@HannoBinder: Bence OP Cortex-M3 vektör kesme denetleyicisine kesme istekleri gönderme hakkında konuşuyor; yüksek öncelikli bir kesmenin kodu daha düşük öncelikli bir kod gönderirse, istek tüm yüksek öncelikli kesmelerin bittiği daha sonraki bir zamana kadar ertelenir.
supercat

12

Bir kesme görevini daha düşük bir öncelikle bitirmek için yazılım kesintileri kullanılabilir. Çok fazla gecikmeyi önlemek için zamanlama kritik koduna genellikle yüksek bir kesme önceliği verilir. Zamanlama kritik kısmı bittiğinde, ana döngü için çok zamanlama kritik olabilecek, ancak diğer yüksek öncelikli kesintileri tutmak için çok kritik olmayan ek görevler olabilir. Daha düşük öncelikli bir yazılım kesintisini tetiklemek bunu başarabilir.

Örneğin, her biri kendi zamanlayıcısına sahip birden fazla step motorunuz olduğunu varsayalım. Kademeli kesintileri en aza indirmek için zamanlayıcı kesmelerine yüksek öncelik verilir. Zamanlama açısından en kritik görev, bir adım darbesini ayarlamak veya temizlemek veya faz çıkışlarını ilerletmek kadar basit olabilir. Hızlanma rampalarının hesaplanması, sensör işleme, vb. Gibi ek işlevler gerekebilir. Bunun her adımda işlenmesi gerektiğinden, ana döngü zamanlaması çok uzun olabileceğinden bunu main () 'den işlemek uygun olmayabilir. Bu ek görevler, diğer yüksek öncelikli adım kanallarının gecikmesini arttırmamak için daha düşük öncelikli bir yazılım kesmesi ile işlenebilir.

Yazılım kesmesi ile işlev arasındaki fark nedir?

Bir işlev çağrıldığı yerden hemen çağrılır ve bir kesinti denirse geçerli kesinti öncelik düzeyini değiştirmez. Yazılım kesintisi, öncelik geldiğinde kesmenin çağrılmasına neden olacak bir kesme tetikleyicisidir. Yüksek öncelikli bir kesmenin sonuna bir işlev çağrısı eklenirse, işlev bu yüksek öncelikli alanda yer alır. Düşük öncelikli yazılım kesintisini tetikleyerek ve ardından yüksek öncelikli kesintiden dönerek işlevsellik yeni (düşük) öncelikte çağrılır.


2
Bir başka yaygın model, zamanlama açısından kritik olan şeyleri işlemek için 100KHz'lik bir kesmeye sahip olmak ve ayrıca 1kHz'lik bir zamanlayıcı işaretine ihtiyaç duymak olabilir, ancak iki ayrı zamanlayıcıya sahip olmayabilir. 100kHz kesinti rutini için fazla yükü almaz if ((timer_count--) & 0x80000000) SET_TICK_INTERRUPT_FLAG(); else timer_count = temp-1; . Diğer kesinti daha sonra kendi işini yapabilir ve kısa süreli devre dışı bırakmalarla timer_count'a 100 ekleyin; 1kHz rutin yürütmek için 10us'u geçse bile 100kHz olana müdahale etmez.
supercat

Benzer şekilde, donanım gereksinimlerinin ISR'ler tarafından ele alındığı, sahte sistemlerde zamanlayıcı olarak basit sistemlerde (tam RTOS olmadan) yazılım kesintilerini kullandım, ancak geri dönüş işlevleri ve değişikliklere yanıt olarak gerçekleştirilen diğer uzun görevler donanım durumu yazılım kesintisine devredilir.
Evil Dog Pie

Temel olarak "alt yarısı" nın bir varyasyonunu tanımladınız. Bunun için "yazılım kesmesi" olarak da adlandırılan referansınız var mı? Majenko'nun cevabından oldukça farklı bir anlam var ve soru ARM olarak etiketlendi - mimarinin aslında SWI (yazılım kesintisi) talimatı var.
domen

3
@domen Ne tür bir referansa ihtiyacınız olduğundan emin değilim. Buna "yazılım kesintisi" denir, çünkü bunu başarmak için kullanılır. ARM bağlamında, OP özellikle STM32'ye referansta bulundu ve RM0008 referans kılavuzuna bir bağlantı sağladı. Bu bir ARM çekirdek referans kılavuzu değildir. RM0008'de kapsanan tek "yazılım kesmesi", gerçek donanım pinlerinin kesmeler için kullanılıp kullanılmadığından bağımsız olarak yazılım kesintileri üretmek için kullanılabilen EXTI_SWIER (yazılım kesme olay kaydı) 'dır. Kişisel olarak SWI (SWC) talimatını kullanmadım.
Tut

Teşekkürler! Hangi "yazılım kesintisi" olduğunu açıklığa kavuşturmak için bu bilgilerin bir kısmını cevaba eklemek iyi olabilir.
domen

7

Majenko'nun cevabını biraz genişletmek için, işletim sistemlerini, özellikle sistem çağrı arabirimini uygulamak için yazılım kesintileri kullanılır. Bu, işlev çağrıları yapmak için uygulamaların işletim sistemine bağlanması gerekmediği anlamına gelir ve bağlam anahtarı, işletim sisteminin donanıma erişimi sınırlamasına ve korumalı bellek gibi şeylerden yararlanmasına izin verir.

Bir işletim sistemi kullanmıyorsanız ve MCU'daki tüm kodu kontrol ediyorsanız, muhtemelen yazılım kesintilerini kullanmanıza gerek yoktur. (Tut'un belirttiği gibi, başka kullanımları da olabilir.)

Linux ve MS-DOS x86 kullanım yazılım kesmesi üzerine sistem çağrı arayüzleri, ben bir örnek olarak bu bağlantı vereyim böylece.


1
Ve işletim sisteminin yumuşak kesintiler kullandığı birçok durumda, hayatı kolaylaştırmak için işlevlere sarılırlar.
hildred

1
Hala DOS için bir şeyler programlıyorum (yepyeni) ve int 21 işleyicilerine çok aşinayım. I / O akıllıca gereken hemen hemen her şey DOS ISR ile ele alınır.
R Drast

Linux için alıntı yapılan sayfanın 1993-1996 yıllarına ait olduğunu unutmayın.
CVn

Bağlantıyı daha güncel bir bağlantıyla değiştirdim.
Adam Haun
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.