AVR SEI talimatı


13

AVR SEI talimatı ( http://www.atmel.com/webdoc/avrassembler/avrassembler.wb_SEI.html ) kesintileri etkinleştirmeden önce bir sonraki talimatın bitmesini bekler.

SREG'de I bayrağını ayarlamak için başka bir talimat kullanırsam, bu da 1 talimat bekleyecek mi?

Başka bir deyişle: Bekleme, SEI talimatının veya durum kaydının bir özelliği midir?

SEI talimatının bir özelliğiyse, bayrak SEI'yi yürüten döngüde veya bir sonraki talimatla gerçekte hangi noktada ayarlanır?


Bu harika bir soru, ancak test etmek ve emin olmak çok zor olmamalı.
Vorac

1
@Vorac Bunun nasıl test edilebileceğine dair bir örnek verebilir misiniz? Bu kesinlikle kabul edilen cevabım olurdu.
jayjay

1
AVR mimarisinin bir uygulamasının ve kesintilerin ele alınabileceği bir özellik olabilir. AVR mimarisi IIRC'de 3 aşamalı bir boru hattı kullanıldı. Dolayısıyla, I bayrağı değişikliği kesintileri kontrol etmek için kullanılabilmeden önce bir sonraki talimat zaten uçuşta olabilir (yani boru hattı aşaması bir veya daha fazla). Uzun zamandır bakmadım, ancak AVR mimarisinin tasarımcılarının kendilerini aşırı kısıtlayacağını sanmıyorum. Bu nedenle, bir sonraki talimattan önce (aşama 2'de) değil , boru hattının 1. aşamasında bir talimat için kesmenin test edilmesi, onlara biraz esneklik sağlar.
gbulmer

Yanıtlar:


8

Ampirik sonuçlar!

Diğer cevaplar düşünceli ve iyi gerekçeli olmakla birlikte, hepsi eksik veya sadece varsayımdır. Belgelerin belirsiz olduğu durumlarda, denemeliyiz ve her vakayı test etmeliyiz.

Bu soru kesin bir cevabı hak ediyor, bu yüzden bir AVR çıkaralım ve bazı bitler ayarlamaya başlayalım!

prosedür

Test etmek için küçük bir Arduino (ATMEGA328P) programı yaptım ...

  1. asla döndürmeyecek bir ISR ayarlayın ( while (1))
  2. ISR'yi yazılımda tetikleyebileceğim bir kaynağa atadı ( INT0azalıyor)
  3. engelli kesintileri
  4. etkinleştirildi ve kesilmeyi tetikledi, böylece beklemede olacak

Kesmeler etkinleştirildikten sonra tek talimatta bir LED'i açacak bir test yatağı kullandım. Test yatağında kesintileri etkinleştirmenin ve LED'leri kontrol etmenin farklı yollarını deneyerek, etkinleştirme talimatından sonra talimatın yürütülüp yürütülmediğini söyleyebilirim.

LED yanmazsa, ISR'nin kesintiler etkinleştirildikten hemen sonra yürütüldüğünü (ve kilitlendiğini) biliyorum.

LED yanmışsa, ISR çağrılmadan önce bir sonraki talimatın yürütülmesine izin verildiğini biliyorum.

Sonuçlar

SEI talimat (temel durum)

Kod:

sei

Sonuç: LED yanıyor. Aşağıdaki talimat yürütüldü.

OUT talimat

Kod:

in  r16,0x3f   // Get SREG
ori r16,128    // Set I bit 
out 0x3f,r16   // Save back to SREG

Sonuç:

LED yanıyor. Aşağıdaki talimat yürütüldü.

ST talimat

Kod:

   clr r29        // Clear Y high byte
   ldi r28,0x5f   // Set Y low byte to point to SREG
   ld r16, Y      // Get SREG
   ori r16,128    // Set I bit 
   st Y,r16       // Put SREG

Sonuç:

LED yanıyor. Aşağıdaki talimat yürütüldü.

Sonuç!

S: Bekleme, SEI talimatının veya durum kaydının bir özelliği mi?

C: Değişen anlaşılmaktadır Iiçinde biraz SREGbir mesafede olan 0bir karşı 1bakılmaksızın talimat biti ayarlamak için kullanılır ne, bekleyen bir kesme olsa bile şu talimat sonraki yürütmek için izin verecektir.

notlar

Bu aslında birçok komplikasyonla çok ilginç bir soruya dönüştü. Eğer detayları ile ilgileniyorsanız, bir göz atın ...

http://wp.josh.com/2016/01/05/different-ways-to-set-i-bit-in-avr-sreg-besides-sei/


2
Spesifikasyon belirsiz olduğunda, "Ampirik sonuçlar" ile ilgili bir sorun vardır. Test ettiğiniz donanımın belirli bir şekilde çalıştığı için, diğer parçaların bu şekilde çalışacağı anlamına gelmez. Atmel, şartnameyi değiştirmemesi koşuluyla uygulamayı değiştirme konusunda özgürdür. Yani, "Belgelerin belirsiz olduğu yerde ..." tam olarak, deney ve testten sonra hala belirsiz.
gbulmer

@gbulmer% 100 katılıyorum. Üretimde belgesiz özellikler kullanan kişi üzgün olmak zorundadır. Hala ilginç bir ampirik soru (ve cevap) ve muhtemelen bir kerelik kişisel bir projeye bağımlı olmak için ok.
bigjosh

Evet, büyüleyici bir soruşturma yaptınız.
gbulmer

4

Bu performans o belgelerinden benim anlayış seitalimat doğrudan SREG I bit bir 1 yazmaya farkı yoktur. Talimatın avantajı 1<<I, SREG'yi değiştirmek için önce bir çalışma kaydına bir değer yüklemenize gerek olmamasıdır, böylece zaman kazandırır.

Ayrıntılı olarak, şunu kullanarak sei:

sei ; One cycle

Kullanarak bitin ayarlanması sbi(yalnızca SREG, kayıt haritasının alt 32 baytında olsaydı işe yarar, ancak çoğu olmasa da çoğu gibi görünmüyor.)

sbi SREG,7 ; Two cycles

Doğrudan SREG'de yazıyorum:

in  r24,SREG ;
ori r24,0x80 ;
out SREG,r24 ; Three cycles

IBiraz kısa zamanda SREG ayarlanmış olmalıdır seitalimat (veya sbiveya out) tamamlamalar. Ancak, beklemedeki herhangi bir kesinti bir sonraki talimat tamamlanıncaya kadar ele alınmaz - bit ayarlanır, ancak kesintilerin etkinleştirilmesi için fazladan bir döngü gerekir. Bir kesinti orta komutla işlenemediğinden ve bazı talimatların yürütülmesi birden fazla döngü gerektirdiğinden, tek bir komut olarak etkinleştirilmesi için geçen süreyi belirtir. Bu, kodun tüm sürümleri için geçerli olmalıdır - yani yukarıdakilerin her biri bir talimatın gecikmesine neden olacaktır.


Biraz arama yaptıktan sonra , Arduino forumunda, davranışı doğrulamak için birkaç farklı testin yapıldığı bu konuyu buldum . Yukarıda söylediğim şeye katılıyor gibi görünüyor.

Ayrıca, bu iş parçacığına göre, eğer Ibayrak önceden ayarlanmışsa, gecikmiş yanıtın seitalimatın kendisinden değil, Ibayrak tarafından kontrol edilen dahili donanımdan kaynaklandığını ima eden bir kesintinin gecikmiş yanıtı yoktur - yani SREG'de bayrağını değiştiren herhangi bir işlem olsun seiya outda olmasın tam olarak aynı davranışa stssahip olacaktır .


Yani aşağıdaki talimatın tamamlanmasına izin veren, SEI'ye özgü fakat OUT'a değil, çalışmayı geciktirmenin bir yönü yoktur?
Brian Drummond

İkinci örneğinizde, bekleyen bir kesinti ne zaman ele alınır? İlkinde olduğu gibi bir döngü gecikmesi var mı?
jayjay

@jayjay güncellememi gör.
Tom Carpenter

1
Not SBIayarlamak için kullanılamaz Ide biraz SREGbile monte olmaz çünkü bu büyük olasılıkla gerçek hayatta test edilmediğini yapar herhangi bir kod böylece. SBIsadece alt 32 kayıtta çalışabilir ve SREG 63
numaralı yuvadadır.

@bigjosh SBI örneği daha sonra düşündüğüm bir örnekti - outorijinal olarak kullandığım örnekti . Ben alt 32 kayıtta SREG olan bir AVR (ATTiny olabilir) rastlamak düşündüm, ama hayal ediyorum.
Tom Carpenter

1

IMHO hala SREG'e yazma geciktirme 1 talimatı şu şekilde test edilebilir (sözde kod):

ISR() { PORTA = 0; while(1); }
main() 
{
    cli();
    DDRA = 0xff;
    configure_isr_for_level_interrupt_that_will_trigger_immediately();
    SREG = 0xff;
    cli();
    PORTA = 0xff;
    while(1);
}

Ne yazık ki bunu yapmak için zamanım yok :(


0

Söylediği şey bu değil. Belgeler diyor

SEI'yi izleyen talimatlar beklemede olan herhangi bir kesinti yapılmadan önce yürütülecektir.

bir sonraki talimatı beklediğinden değil. Bayrak hemen ayarlandığından bunu okudum, ancak etkin olsa da, bir sonraki talimat yürütülene kadar hiçbir kesinti yapılmayacak.


Hepsi doğru, ama sorum şu: Bu davranış SEI'ye özgü mü?
jayjay

@jayjay Bunun boru hattı uzunluğundan kaynaklandığından şüpheleniyorum
crasic
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.