Cotex M3 interrupt mechanism

Başlatan bunalmis, 02 Ocak 2011, 15:35:06

z

Cortex M3 ozellikle de Stellaris serisinde interrupt mekanizmasi nasil isliyoru anlatan dokuman goremedim.

Onereceginiz dokuman varmi?

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Cortex M3 serisinde interrupt fonskiyonlarina, ozel compiler directive leri getirmek gerekmiyor. Fakat ARM7 de gerekiyor diye hatirliyorum.

Bunun sebebi nedir?

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Interrupt kabul edildiginde donanimsal olarak R0..R3 ile R12, LR,PC, PSR staga atiliyor burasi tamam fakat interrupt fonksiyonundan cikarken bunlari kim pop edecek anlamadim.

Eger yazilimci pop edecekse disasm ettigim rutinlerde boyle bir sey goremedim. Eger donanim yapacaksa IRET, RETI tarzi komut da goremedim.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Interrup rutininden cikarken NVIC registerlerinde her hangi bir alani set yada reset etmek gerekiyormu?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

CLR

Alıntı yapılan: bunalmis - 03 Ocak 2011, 12:52:23
Interrup rutininden cikarken NVIC registerlerinde her hangi bir alani set yada reset etmek gerekiyormu?

Merhaba,

Arm cortex m3'te interruptan çıkmak için bazı  flagler set ve reset yapılması gerekiyor. Aşağıya örnekler ekledim.

// mesela Exti13 için 
void
EXTI15_10_IRQHandler(void){
    if(exti_pr.bits.PR13){               // exti13 oluşmuş mu?
        exti_pr.bits.PR13=1;            // 1 yüklenerek flag clear edilir

}

// timer 2 interrupt için
if(tim2_sr.bits.UIF) {
        tim2_sr.bits.UIF=0;     // burada flag siliniyor
}

// can Rx interrupt için
void 
USB_LP_CAN_RX0_IRQHandler(void) {
        if(can_rf0r.bits.FMP0) {         // data gelmiş beklemede mi?
               CanMsgRead();              // data okunarak flag clear edilir
        }
}

// tx interrupt
void 
USB_HP_CAN_TX_IRQHandler(void) {
    if(can_tsr.bits.RQCP0){
        can_tsr.bits.RQCP0=1;       // 1 yapılarak clear edilir
    }
}

Knowledge and Experience are Power

z

Interrupt programinizda peripherallere ait registerlere mudahale edilmis.

Benim merak ettigim konu, NVICe mudahale gerekiyormu?

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

CLR

Alıntı yapılan: bunalmis - 03 Ocak 2011, 17:44:05
Interrupt programinizda peripherallere ait registerlere mudahale edilmis.

Benim merak ettigim konu, NVICe mudahale gerekiyormu?

Merhaba,

Böyle geniş sorular sorarsan kimse cvp yazmaz, Mantık olarak kısaca anlatayım.
Interrupt'ı set ederken nvic içinden ilgili interrupt vektoru için priority'yi ayarlayabiliyorsun ve vectoru set ediyorsun. İşlemci, interrupt şartları sağlandığında ilgili vectore gidiyor, yazdığım örneklerdeki gibi, flagleri siliyorsun ve çıkıyorsun. Nvicte işlem yapmıyorsun yani.  Interruptı kapatacaksan veya priority'yi değiştireceksen nvic'te işlem yapıyorsun, Tümü bu.
 

 
Knowledge and Experience are Power

z

#7
OK bu kismi anladim. Peki sistem ana programa ne zaman donecegini nasil anliyor da otomatik olarak push ettigi registerleri pop ediyor?

Interrupt rutinindeyken bir baska programi call edebilirim. Ondan geri donus ile interruptdan geri donusu nasil ayirt ediliyor?

Sorularim genis değil. Bir CPU ile low level calisma yapmak icin gerekli en temel bilgiler bunlar.

NVIC'e mudahale gerekip gerekmedigini sormamin sebebi, bu konuda net bir kaynak bulamadim. Ote yandan 8086 tabanli sistemlerde interrup rutinin den cikarken hem cevre biriminin int flagini sifirliyor hemde interrupt controller registerlerinden birine int la isimiz tamam anlamina gelen veri yaziyorduk. O yuzden kafam karisik.






Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#9
Bu sorular bosuna kafama takilmamis. Gercekten de Cortex M3 ciplerde interrupt mekanizmasi cok ilginc. Ozellikle de geri donusteki olaylar.

Interrupt rutinine girildigi anda R0..R3, R12 ve LR (return adres) stack alanina atilmis oluyor ve LR icine EXC_RETURN degeri yukleniyor.

EXC_RETURN degeri soldaki 28 bit 1 olan en dusuk 4 bit de ozel anlam tasiyan return degeri.

BX  LR yada benzeri bir komutla interrupt rutinini terketmeye kalktiginizda geri donus adresinin EXP_RETURN degeri oldugu sip diye anlasiliyor. Cunku 0xFFFFFFF? gibi alan program alani değil.

Burdan sistem siradan bir fonksiyondan değil de exeption yada interrupt fonksiyonundan geri donulecegini anliyor ve stack a atilmis registerleri geri cekiyor.
Bu esnada return adresi de LR icine girmis oluyor.

Gercekten siradisi mekanizma.

Yukarida guzel oldugunu soyledigim pdf den (kitapdan) bu sonuclari elde ettim. EXC_RETURN keywordunu kendi islemcimin dokumanlarinda da arayinca orda da anlatildigini gordum.
TI a haksizlik etmisim. Fakat iki dokuman arasinda cok fark var. TI,  dokumanini cipini kullanmak isteyenler icin duzenlemis.

http://v3.netyxia.net/~mobyfab/Misc/Arm-Cortex-M3.pdf dokumani ise su an bende oldugu gibi kafasi bulanmislara olaylari anlatmaya calismis.

Keil de interrupt rutini iceren bir programi derleyin cipe yukleyin ve int rutinine breakpoint koyun. Sonra programin bu noktada takilmasini bekleyin. LR degerine gozatin.

Gercekten ilginc.....


Daha once asagidaki satirda sordugum sorunun cevabini da tahmin ettiniz değilmi?

Cortex M3 serisinde interrupt fonskiyonlarina, ozel compiler directive leri getirmek gerekmiyor. Fakat ARM7 de gerekiyor diye hatirliyorum.
Bunun sebebi nedir?

☻B☻

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

malpaslan1979

#10
bunalmış hocam şunu merak ediyorum: konu ile doğrudan alakalı mıdır bilmiyorum ama. yani bir çok işlemci var dspic microchip pic atmel arm vs yani yapılar özellikler farklı bunu biliyorum. fakat bir uygulama yapacaksınız diyelim neye göre programlanabilir ürün seçiyorsunuz fiyat ana ölçü müdür veya dil veya iç donanım? birde şu süreç bana ilginç geliyor sürekli bir öğrenme halindesiniz yani yeni işlemciler diller vs. belkide teşbihte hata olmaz olaylara doktorlar gibi bakıyorsunuz yeni ilaçlar yeni yaklaşımlar yeni cihazlar sürekli gelişim takibi yani bu kadar öğrenme faaliyetine nasıl zaman ayırabiliyorsunuz. yani nickiniz anlayabiliyorum bunalmış. sürekli öğrenme yenilikleri takip ama hepsini akılda tutmak... yok yok bu iş hakikaten özveri ve çalışma isteyen bir alan yani gerçekten oldum demek imkansız... bunu çalıştığım fabrikada da görüyordum elektrik atelyesindeki teknisyen arkadaşlar evlerinde ders çalışırlardı...