KEIL C51 Kesme İçerisine Kod Yerleştirme

Başlatan bymrz, 07 Şubat 2013, 14:16:51

bymrz

Merhaba arkadaşlar,

Şöyle bir durumum var. Keil C51 derleyici ile 8051 tabanlı bir işlemci için kod yazıyorum. Aynı zamanda kütüphane(lib) dosyaları da kullanıyorum. Kaynak kodu açık olmayan bu kütüphaneler bazı kesmeleri kullanıyor ve ben de bunları göremiyorum.
Fakat o kesmelerin içerisinde benim de bir kaç satır kod yazmam gerekiyor... Bunun için nasıl bir yol izlenebilir. Microchip in C18 inde bu işe yarayan bazı compiler direktifleri vardı. Bu direktifler arasına yazdığın kod, ilgili kesme rutininin başına ekleniyor ve o şekilde compile ediliyordu..

mufitsozen

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.

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

bymrz

@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...)