Compiler bunu senin icin yapamaz, ama sen programla yapabilirsin.
bunun icin kabaca main'de programin ilk olarak initialize edildiginde, asagidakilere benzer bir dizi islem yapacaksin:
- interruplari disable et
- degistirmek istedigin interrupt vektorundeki adresi oku, ve bir yere sakla.
- interrupt gelince islemesini istedigin subroutine'nin adresini interrupt vektorune yaz
- interruptlari enable et.
kendi yazdigin ISR subroutine'ninde ise kabaca sunlari yapacaksin. (bu subroutine bir ISr yada normal bir subroutine olarak yazilabilir. ozaman yapilacak islerde biraz degisiklik olur. bunlarida detayli olarak burada aciklamak zor. benim tlf sende var, arayabilirsin.)
- Yapmak istedigin isleri yapacaksin
- Daha once sakladigin orijinal ISR adresine jmp edeceksin (eger oradan IRET yapacaksan) yok eger yazdigin subroutine'den IRET yapacaksan o zaman stackdeki bilgiyi hazirlayip gideceksin, burasi biraz daha degisik burada anlatmak zor olur.
ben prensip olarak ilk adimda olarak kendi yazacagin ISR subroutine'de hicbir sey yapmadan dener ve herseyin calistigindan emin olurdum.
Bilahare yapacagim degisiklikleri ekler birde oyle denerdim.
ISR yazmak, yada interruptlarla hasir nesir olmaz zor konulardir. dikkatli olmak lazim, bazen ozel cihaz yada debug teknikleri lazim. Herseyden once hem MCU'un mimarisini, komutlarini vb hemde compilerin linker ve locator'un ne yaptigini cok iyi bilmen lazim. Yoksa basin cok agrir, neden oldugunu bilemedigin hatalar ile karsilasirsin.
Compiler sana motomot, otomatik bir sekilde yardim edemez. Sadece bazi cok standard isleri yaparken isleri daha basit yapmani saglar.
@mufit abi çok teşekkür ederim ilgin için...
Alıntı YapDaha once sakladigin orijinal ISR adresine jmp edeceksin (eger oradan IRET yapacaksan) yok eger yazdigin subroutine'den IRET yapacaksan o zaman stackdeki bilgiyi hazirlayip gideceksin, burasi biraz daha degisik burada anlatmak zor olur.
Burada bahsettiğin ilk olay bana yeterli gibi. Benim fonksiyondan IRET yapmasına gerek yok. Yalnız bu bahsettiğiniz disable vs işlemleri komut olarak değil de "#......" direktifler şekilde yapacağız sanırım. Keil'in help dökümanındaki bilgiler yeterli olur sanırım... Yine de işin içinden çıkamazsam, rahatsız ederim abi seni :)
(Bu arada sağlığınız sıhhatiniz de yerindedir umarım...)