Stack over/under flow interrupt ın STRPTR.STKFUL biti temizlenmeyince oluşmaması

Başlatan elt42at, 18 Aralık 2015, 10:57:59

elt42at

Merhaba arkadaşlar.

Uzun bir süre sonra tekrar PIC18F :)

Kullandığım işlemci PIC18F87K22 olup, derleyici kerata C18 dir. STVREN özelliğimiz CONFIG den açıktır.

Daha önceleri hiç dikkat etmediğim bir husustur ki, STKPTR içindeki over ve under flow bitlerini temizlemediğim tespit edilmiştir. İlk seferinde stack 0x1F i aşınca gayet güzel resetlenmektedir. Sonraları reset oluşmamaktadır.

Bazı yerlerde GOTO kullandığımdan ötürü de :D stack geri dönüşü olmayan (return yemeyeceği için) yolda artarak devam etmiş.

Neyse, bu durum reset ile düzeldiğini sanıyomuşım ki bitleri açılışta temizlemeden CONFIG de açık olan STVREN özelliğine rağmen tekrar reset yeme imkanı yok.

Son durum, bu olayı çözüme uşaltı. Stack over/under reset olayı oluşursa açılışta flag ları temizlemeliyiz ki tekrar reset atabilme özelliği daim olsun.

Bu durumu çözmeden önce DEBUGGER ile şu sorunda döndüm dolaştım.

Microchip Application Lib de yer alan "Tick.C" içinde:

static void GetTickCopy(void)
{
 // Perform an Interrupt safe and synchronized read of the 48-bit 
 // tick value
#if defined(__18CXX)
 do
 {
  INTCONbits.TMR0IE = 1; // Enable interrupt
  Nop();
  INTCONbits.TMR0IE = 0; // Disable interrupt
  vTickReading[0] = TMR0L;
  vTickReading[1] = TMR0H;
  *((DWORD*)&vTickReading[2]) = dwInternalTicks;
 } while(INTCONbits.TMR0IF);
 INTCONbits.TMR0IE = 1; // Enable interrupt
#else if ....
...
#endif
}


fonksiyonu var.

Sistem normal çalıştığı müddetçe hiç bir zaman "while(INTCONbits.TMR0IF);" döngüsünde takılmadı.

Recursive bir fonksiyon yazarak stack i şişirip, bitleri temizlemeden açılışı takip ettim. Malum kod while dan çıkmıyor.

Sebebi nedir? ne olabilir? Timer mı açılmıyor. Overflow bitlerine bağımlı donanımsal engeller mi var?

Şimdiden ilgilenen herkese teşekkürler :D

elt42at

Microchip forumda da sorduğum bu soruya "SUSAN" kardeşin cevabı "Stack overflow dan reset yemiş, sen ne demeye FLAG temizlemeden kod çalıştırıyosun" neticesinde, flagları clear edip işime devam ediyorum.