Bu Hatayı Çözemedim

Başlatan muhittin_kaplan, 27 Nisan 2008, 01:07:40

muhittin_kaplan


Yukarıda Simulatörde verilen hataı bir türlü çözemedim
programda bir RB0 kesmesi kullanıyorum. Bu kesmeyi aktif yaptığım da bazen bu hatayı alıyor bazen almıyorum (almaya başladığında devamlı alıor)
garip olan taraf ben 16F877 kullanıyorum sanırım 8 bitlik bir Mcu ama hatanın yanında pic16core gibi bişey yazıyor. bu hatalardan ötürü bir müddet sonra CPU Usege %100 oluyor. Tabi Bunların Hepsi simulatorde oluyor.
Programda Call ve Return hatlarından süphelendim. GoSub return yaptım yine aynı problemi yaşıyorum.

pro73

kesmeyi  taşması olmuş program kullandıgın rb0 kesme alt progdan
çıkamamış

ete

Sorunun kaynağı,

return ve Gosub komutları. Programı görmediğim için ancak yorum yapabiliyorum. Bir programda bir birinin içine geçniş çok fazla gosub return kullanırsanız sonunda stack taşması meydana gelir. Çünki her gosub komutunda program return ile yanı yere döneceği için gittiği adresi bir yerde saklamak ve sonra o adresi hatırlamak zorundadır. İşte saklanılan yer stack dır. Stack'ın da bir limiti var tabiiki. Çok fazla bilgiyi depolayamaz. Bu nedenle Şimdi düşünün;
- 1. Gosub da adres saklandı
- gosub ile gidlen yerden başka bir gosub daha verdiniz 2 adres de saklandı,
- sonra bir daha gosub verdiniz oda saklandı.
Zincir bu şekilde devam ederse sonunda stack bir yerde şişer (dolar) ve önceki dönüş adreslerini hatırlayamaz hale gelir ve program sonunda kitlenir.
Sende oluşan hatanın bir sebibi bu olabilir.

2. muhtemel hata ise Goto ile gidilen bir adresten return ile dönülmeye çalışılması yada tam tersi gosub ile gidilen bir adresten goto ile dönülmesi de aynı probleme sebep olur. Özellikle bu ikinci alternatif bu işte çok etkilidir. Zİra gosub ile gidilen bir adreste adres kayıt edilir ama gotoile döndüğünüz için dönüş aresi stack dan silinmez. Aynı satıra yeniden gelirseniz orada yeniden stack a bilgi yazılır ve sonunda stack şişer.

Bu açıklamalara göre hatanı bulursun artık diye düşünüyorum.
Kolay Gelsin.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

muhittin_kaplan

ETE Hocam (Forumdaki Genel Hitab Böyle sanırım)
dün geç saatlere kadar çalışmamın ve step step kodları analiz etmemin sonucu olarak benim GUI programlamadan gelen alışkanlıkla devamlı alt program kullanmam ve bu call ile gitmesi gereken yere gitmediğini ve gitsede dönerken bu hatayı aldığını gördüm.
Bu Alt Programları Azaltarak çalışmaya devam edeyim.
ayrıca
On interrupt Goto Menu ---İnterrup RB0 kullanılıyor
basla:
        program...
        program...
        Gosub Kaydet:
        GoSub HIZ:
        program...
        program...
        goto Basla:
kaydet:
        program...
        program...
        Gosub AYAR_MENU
        program...
        program...
        return
HIZ:
        program...
        program...
        program...
        Return

AYAR_MENU:
        program...
        program...
        program...
        Return

MENU
       int. giriş gerekli kodlar
       int. giriş gerekli kodlar
       Program...
       int. Çıkış gerekli kodlar
       int. Çıkıs gerekli kodlar
       GOTO BASLA
END

gibi bir yapı var bu yapıda dikkat ettiyseniz bir alt programdan diğer bir alt program çağırıyorum. stack taşması burada oluşabilirmi.
birde int. (MENU) rutininde RESUME ile döndüğümde istediğim sonucu alamıyorum. Bundan dolayı STACK silinmiyor Bu da bu hatayı verir mi ?.
Saygıarımla
İyi Çalışmalar.

muhittin_kaplan

Alt Programları Kaldırdım Tek kalemde girip Çıkıyorum Programa Sadece int rutini kaldı böyle çalıştırdım.
İnşallah İlerleyen vakitlerde geliştirme ihtiyacı duymam :(