18F4620 Stack overflow resetleme sorunu

Başlatan Tatala, 06 Mayıs 2016, 11:57:28

Tatala

Merhabalar, Pic 18f4620 işlemci ve pic basic ile çalışıyorum. Yoğun uart haberleşmesi yapıyorum. baud38400, kristal 20Mhz. haberleşmenin hızlı ve yoğun olduğu yerlerde STKPTR taşıyor. ticker içerisinde STKFUL ve STKUNF bitlerini 0 yaptım ama işe yaramadı. geri kalan "Stack Pointer Location bits" bölümünü sıfırlayamıyorum. zaten datasheet'te de söylemiş o kısım yazılımsal olarak direk temizlenemiyor. peki taşma olduğunda pic'i reset attırmadan nasıl normal haline getirip işleme devam ettireceğim? _STVREN_ON_4L config ayarını OFF yaptığımda reset atmıyor, ama düzgün de çalışmıyor.! Kasılıp alakasız şeyler yapıyor, değişik karakterler filan gönderiyor. sonuç olarak; STKPTR register'ini nasıl temizleyeceğim?

ete

Stack denilen ara hafıza gidiş geliş adreslerinin kayıt edildiği bir hafızadır. Direk ulaşılmaz işlemci programa uygun şekilde kendisi kontrol eder bu hafızayı. Dolayısıyla Taşma olması normal bir olay değil.
Çünki son giren ilk çıkar mantığı uygulanır. GOSUB xxx dediniz ayrılış adresini hemen stack a yazılır. Tekrar Gosubxxxx dediniz o adreste yazılır. Sonra program bir RETURN görür ise hemen en son yazılmış adresi stack dan alır ve o adrese geri döner. Bu anda stack pointer bir artmış olur. Tekrar bir RETURN görmesi gerekir ve görünce onuda stackdan alır ve o adrese geri döner. Böylece stack tekrar eski seviyesine gelmiş olur. Ama sürekli GOSUB gösterirseniz bir yerde taşma meydana gelir.

Programınızı çok iyi kontrol etmek gerekir. Muhtemel taşma sebepleri arasında;
- Gosub ile bir etikete gidip oradan GOTO ile dönmüş olmanız kuvvetle ihtimal
- Çok fazla peş peşe Gosub xxxx kullanmanız halinde de stack taşması gereçekleşir. Her işlemcinin kaç tane stack adresi olduğu muhtemelen data sheet de belirtilmiştir. Ona bakımiç içe kaç GOSUB kullanabileceğinizi kestirebilirsiniz.

Sonuç olarak Stack resetleme yerine stack taşması yaratan sebepleri ortadan kaldırmaya bakın derim.

Ete

Tatala

Çok teşekkür ederim hocam kontrol edip buraya yazacagım:)

Tatala

Alıntı yapılan: ete - 06 Mayıs 2016, 13:17:31
Stack denilen ara hafıza gidiş geliş adreslerinin kayıt edildiği bir hafızadır. Direk ulaşılmaz işlemci programa uygun şekilde kendisi kontrol eder bu hafızayı. Dolayısıyla Taşma olması normal bir olay değil.
Çünki son giren ilk çıkar mantığı uygulanır. GOSUB xxx dediniz ayrılış adresini hemen stack a yazılır. Tekrar Gosubxxxx dediniz o adreste yazılır. Sonra program bir RETURN görür ise hemen en son yazılmış adresi stack dan alır ve o adrese geri döner. Bu anda stack pointer bir artmış olur. Tekrar bir RETURN görmesi gerekir ve görünce onuda stackdan alır ve o adrese geri döner. Böylece stack tekrar eski seviyesine gelmiş olur. Ama sürekli GOSUB gösterirseniz bir yerde taşma meydana gelir.

Programınızı çok iyi kontrol etmek gerekir. Muhtemel taşma sebepleri arasında;
- Gosub ile bir etikete gidip oradan GOTO ile dönmüş olmanız kuvvetle ihtimal
- Çok fazla peş peşe Gosub xxxx kullanmanız halinde de stack taşması gereçekleşir. Her işlemcinin kaç tane stack adresi olduğu muhtemelen data sheet de belirtilmiştir. Ona bakımiç içe kaç GOSUB kullanabileceğinizi kestirebilirsiniz.

Sonuç olarak Stack resetleme yerine stack taşması yaratan sebepleri ortadan kaldırmaya bakın derim.

Ete

Merhabalar tekrar hocam. söylediğiniz şeyleri kontrol ettim. Haklıymışsınız. gosub ile gidilen yerlerin geri dönmeden sonlandırma fonksiyonuna gittiğini gördüm. düzenlemeleri yaptım, ve henüz resetleme ile karşılaşmadım. sorun çözüldü, Çok teşekkür ederim.

ete

Sorunu anlayıp çözdüğüne sevindim.
Ete

Powered by EzPortal