Kesmeyi etkinleştir ama ISR yok


10

Bir Kesme etkinleştirilmişse ne olacağını bilmek istiyorum (örn: NXP'nin LPC1778'in CAN modülünde Tahkim Kaybı Kesmesi), ancak kesinti için hiçbir ISR tanımlanmamıştır.

Böyle bir kesinti meydana geldiğinde, ilgili kesinti bayrağının ayarlanacağını biliyorum, ancak herhangi bir ISR tanımlamadığım için, böyle bir kesinti için kontrol transferi için saklanan herhangi bir kesinti vektör ofset adresi olmayacak ve bu yüzden kontrol geri dönecek ana rutin için, ve ben kesme bayrağı ana rutin içinde yoklayarak sıfırlayabilirsiniz (bu im düşünce budur) CPU atlamak için hiçbir ISR olduğunu anlamaya zaman herhangi bir gecikme olacak mı?

Ne olabileceğine dair herhangi bir çözüm gerçekten bana yardımcı olabilir.

Teşekkürler.

Güncelleme:

Kullanıcı arayüzümde CAN Interrupt'ı etkinleştirdim, ancak bir ISR tanımlamamıştım. Dahili bir geri döngü testi yaptığımda, kod sonsuz bir döngüye girdi. İşte LPC1778'de yürütülen sonsuz döngünün sökme kodu:

B       .
ENDP

Kesinti kullanıyorsanız, ISR'yi kullanın.


3
Ana fonksiyonunuzdaki bayraklar için kesme işleminin etkinleştirilebilmesi gerekmez. Bayrağı ayarlayan koşul oluşursa, ilgili kesmeyi etkinleştirip etkinleştirmediğinize göre bu işaret ayarlanır.
brhans

Eğer "Bus Arbitration on interrupt kesildi" etkin olmasa bile bir Bus Arbitration Lost interrupt bayrağının ayarlanacağını söyleyerek (Interrupt durum kaydı dışında kaybedilen Bus Arbitration'ı gösterebilecek bir durum kaydı olmasa da)?
AlphaGoku

Evet. Çalıştığım her MCU'da, kesme bayrakları, onları ayarlaması gereken koşul oluştuğunda ayarlanır. Kesmenin etkinleştirilmesi, ilişkili bayrak ayarlandığında MCU'nun işleyiciye vektörlenmesine neden olur ve kesmenin devre dışı bırakılması , işaret ayarlı olsa bile işleyiciye vektör yapılmamasına ve işleyiciye vektör yapılmamasına neden olur . Kesmenin devre dışı bırakılması / devre dışı bırakılması, bayrak ayarı davranışını değil, yalnızca kesme-kesme-işleyici davranışını etkiler.
brhans

Vay be bu bilmediğim bir şey. Çok teşekkürler. Bu nedenle, her sürücü kesinti durum kayıtlarını periyodik olarak kontrol etmeli ve kesintiler etkinleştirilmemiş olsa bile sıfırlamalıdır :)
AlphaGoku

@AkshayImmanuelD sadece önemliyse. Kesme her zaman devre dışı bırakılırsa ve bayrağa başka hiçbir şey umursamazsa, ayarlanmış veya temizlenmiş olması önemsizdir.
hobbs

Yanıtlar:


17

Tanımlanmış bir ISR yoksa, kesme vektöründeki atlama talimatının konumu boş olacaktır, bir istisna rutine atlayabilir, programın başlangıcına atlayabilir veya "dönüş kesme "(örn.) komutu.

Burada, bir ATMega 16 işlemcisi için, bu tür durumları (sadece sonsuz bir döngüye girebilir) işleyen bir rutin için vektörlenmiş üç kullanılmamış kesinti ve bir meşru vektör gösteren bir kesme tablosunun sökülmesi bulunmaktadır.

  28:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  2c:   0c 94 5c 00     jmp 0xb8    ; 0xb8 <__vector_11>   // <-- ISR
  30:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  34:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>

Daha önce eksik bir ISR'yi işlemek için açıklanan yöntemlerden hangisi hem mikro denetleyicinin mimarisine hem de derleyiciye bağlı olacaktır. RTI veya eşdeğer bir talimat olması durumunda, derhal uygulamaya geri dönecektir. Ancak kesme kenar tetiklemesinden ziyade seviye tetiklemeli ise, bu muhtemelen kesmenin tekrar tetiklenmesine neden olur, böylece sonsuz bir döngüye girersiniz.

İç kesintilerin (örneğin bir UART tarafından alınan bir karakter) seviye tetikli veya kenar tetikli olarak kabul edilmesinin çip mimarisine bağlı olabileceğini düşünüyorum. Harici kesmeler genellikle biri veya diğeri olarak yapılandırılabilir.

Başka bir durum daha vardır, bazen birkaç kesinti birlikte gruplanır ve aynı vektörü kullanır. Bu özellikle sadece birkaç kesinti geçirmiş olabilecek eski işlemciler için geçerliydi. Bu durumda, kesme nedeni, önerdiğiniz gibi bir şekilde kesme kayıtlarının durumu sorgulanarak belirlendi.

Ancak her durumda bir sistemde kesintiler olması ve hiçbir ISR tanımlanmamış olması kötü bir uygulamadır. Yapma.


2
.... veya tanımsız olabilir.
Wouter van Ooijen

@WoutervanOoijen, kesinti vektörünün boş olması ile kastediyorum.
tcrosley

1
Durum kayıtları yukarıda bahsettiğim gibi birkaç hatayı gösteremez. Ancak bu tür hataların bir kesintisi vardır. Bu nedenle sadece hatayı tanımlamak ve herhangi bir ISR kullanmak için kesme etkinleştirmeyi düşündüm. Keil kullanarak LPC1778 simüle ederken, herhangi bir istisna alamadım, bu yüzden uC, u belirtildiği gibi RTI kullanıyor olmalı
AlphaGoku

1
Dikkat edilmesi gereken bir şey - bir kesmeyi etkinleştirirseniz, ancak işleyiciniz bayrağı temizlemezse (veya işleyici yoktur ve varsayılan davranış basit bir dönüştür), büyük olasılıkla MCU'nuzun sonsuza kadar sona ereceğini göreceksiniz bir kesme döngüsünde sıkışmış.
brhans

1
ATSAM3X8E üzerindeki PIO kesintileri kenar tetiklemeli olabilir, ancak kesinti işleyicisindeki ISR'yi (kesinti durumu kaydı) okuyana kadar kesinti koşulu ayarlanana kadar silinmez - sonuçta belirtilen döngü @brhans ile sonuçlanır.
Simon Wright

1

MCU'nuza, derleyicinize ve kodun geri kalanına bağlıdır.

Deneyimlerimden:

  1. AVR - varsayılan olarak bir ISR belirtmezseniz, flaştaki kesinti vektörü 0x0000 olur, yani bu kesinti gerçekleştiğinde uygulamanız sıfırlanır.

    Kesmeye gerçekten ihtiyacınız varsa, ancak işleyiciye ihtiyacınız yoksa (örn. ADC düşük gürültülü güç kapatma modunu kullanın ve kesmeyi yalnızca MCU'yu uyandırmak için kullanın) EMPTY_INTERRUPT makrosunu kullanmalısınız.

  2. NXP Kinetis (ARM) - tüm vektörler varsayılan olarak bir kesme noktası olan varsayılan bir işleyiciyi gösterir, CPU sadece durur ve hata ayıklayıcınıza söyler.

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.