KEIL stack size problemi ??

Başlatan Elektroemre, 28 Ağustos 2011, 14:37:56

Elektroemre

Merhbalar,

Bu aralar KEIL'le uğraşıyorum (daha doğrusu o benle uğraşıyor.) LPC1343.
Yazdığım program büyüyünce ilginç bir şekilde çalışmamaya başladı gerçek devrede.
Daha sonra DEBUG ile işlemcinin HardFault_Handler'e dallandığını farkettim, işlemci orada çakılıp kalıyor.

Daha sonra tesadüfen Stack_Size'a daha büyük bir değer atamayıp değiştirdim ve program çalışmaya başladı.
Ekleme yapınca işlemci yine çakıldı bende daha çok artırdım yine çalıştı!   :)
Şuan;
Stack_Size      EQU     0x00001000

4096 byte'lık kısım ayırdım.

Bu alan bir alt fonka dallandığında bir önceki adres bilgisi ve diğer bilgileri tuttuğu alan değil mi?
BU kadar büyük alana gerçekten ihtiyaç duyuluyor mu?
Ve şurada ilginç bir şey gördüm, lokal değişkenler Stack alanında mı tutuluyor?
http://www.keil.com/forum/19311/


Kadir Can(16F84)

İç içe çok fazla fonksiyon çağrısı yapıyor musunuz?
Mod değişimlerinde yığın kullanılıyormuş galiba.Çok fazla mod değişimi olabilir.
Lokal değişkenler için yığında yer ayrılıyormuş.
https://www.picproje.org/index.php/topic,31195.msg232794.html#msg232794

Elektroemre

Bu güzel bilgiler için teşekkür ederim hocam.
Kısacası çözüm büyük değişkenleri global yada static tanımlamak :)
Böylece bu değişkenlerin yeri yurdu belli kardeşim deyip, dallanırken bunlar stack'ı şişirmesini engelleyeceğiz doğru mudur hocam?

fatihinanc

Selamlar,

https://www.picproje.org/index.php/topic,34346.0.html

Bu başlıkta bu konu hakkında biraz konuşmuştuk, belki faydası dokunur ;)
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

fatihinanc

Alıntı yapılan: Elektroemre - 28 Ağustos 2011, 15:37:49
Bu güzel bilgiler için teşekkür ederim hocam.
Kısacası çözüm büyük değişkenleri global yada static tanımlamak :)
Böylece bu değişkenlerin yeri yurdu belli kardeşim deyip, dallanırken bunlar stack'ı şişirmesini engelleyeceğiz doğru mudur hocam?

Evet doğru ama bu sefer de değişkenler için ayrılan alan RAM'de programın başından sonuna kadar sadece o değişkenler için kullanılabilir olacak. Aslında static tanımlamak da bir nebze global gibi iş görüyor...
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

Elektroemre

Evet, global daha mantıklı.

Benim mainde 2K'lık bir dizi değişkenim var, alt fonksiyona dallandığında 2K'lık stack işgal edecek.
Yani o 2KB her türlü gözden çıkarılıyor. Global olarak tanımlayıp, hem stackle vs uğraşmamız oluruz.
Hemde başka fonksiyonlarda gerektikçe o değikeni başka amaçlarda kullanabiliriz. Burada iş yükü kod yazana kalıyor.

Birde heap alanı var, bu alan malloc free gibi fonksiyonlarla gerektiğinde değişkenler için tahsis yapılabilecek bir alan galiba.
Tabi MCU'da işletim sistemi yok ama KEIL destekliyor galiba, kullanan var mı daha önce?

Elektroemre

@gerbay hocam,

Sayenizde mantığı daha iyi anladım. Sorun KEIL'de değil, sorun C'ye yeteri kadar hakim olamamakta. Şuan daha iyi anladım, sorunun çözümü için birden fazla yol belirdi zihnimde.