Fonksiyon içinden global değişkeni değiştirme sorunu

Başlatan t2, 02 Ocak 2014, 22:00:00

Ateş Erim

@elektronart,
http://www.circuitstoday.com/pic-16f877-architecture-and-memory-organization linkindeki dökümanın "program memory" kısmında şöyle bir şey diyor:

The PIC16F87XA family has an 8-level deep x 13-bit wide hardware stack. The stack space is not a part of either program or data space and the stack pointers are not readable or writable. In the PIC microcontrollers, this is a special block of RAM memory used only for this purpose.

Baştan söyliyeyim, ben çok çaylağım daha. Ama burada yazanı ben şöyle yorumluyorum: ne stack alanına, stack yazmaçlarından başka kimse bişey yazabilir; ne de stack yazmaçları kendi alanlarından başka bir yere tecavüz edebilir.  Stack yazmaçları kendi alanlarında mutlu mesut yaşarlar. Sığamadılar mı da (16F87X için misal 9. Seviye stack çağrılmaya kalkışıldığında) stack overflow hatası oluşur.
Yanılıyor muyum? Yanılıyorsam neyi atlıyorum ?

Kolay gelsin
Bu mektup icin hic agac kesmedim. Sadece elektronlari durtukledim.

elektronart

sadece xc8 yapsa iyi, işletim sistemi olmadığı sürece tüm mikroişlemciler yapar bunu. Bunu için kodun ne kadar stack kullandığını analiz eden uygulamalar var, küçük bir ihtimalle kullandığın geliştirme ortamı içinde böyle bir araç olabilir.
Açık Elektronik

muhittin_kaplan


Tagli

Ortalık epey karışmış...

elektronart, XC8'de zaten dinamik alan ayırma diye birşey yok. Ayrıca, bildğim kadarıyla recursion da desteklenmiyor. Bu durumda stack alanının gidip de bir başka değişken alanını basması söz konusu olamaz. Dinamik alan ayırma olmadığından, yazılımsal stack derleme anında kesin olarak belli oluyor. Bir sorun olsaydı derleme anında hata vermeliydi. XC16'da işler nasıl bilmiyorum çünkü onda dinamik hafıza olayı vardı. Ama yine de, bildiğim kadarıyla heap'in sınırları da zaten derleme anında çiziliyor. Stack'ın bu bölgeye derleme sırasında girmesine derleyici izin vermez bence.

ta2cye, o stack bu stack değil :) .  Doğrudur, fonksiyon geri dönüş adreslerini saklayan donanımsal stack'a erişim mümkün değil (PIC18'de bir miktar maymunluk ile yapılabiliyor bu). Ama bizim bahsettiğimiz stack, derleyicinin fonksiyon yerel değişkenleri ve diğer işlemler için oluşturduğu yazılımsal stack. Bu arada, 8 bitlik PIC mimarileri için konuşuyoruz. 16 bitliklerde olay farklı.

Dediğim gibi, kodu satır satır işletip değişkenin nerede saçmaladığını bulmak lazım. Yoksa yorum yapmak mümkün değil. t2, hatalı çalışan bir örnek kod verebilirsen kurcalayalım.
Gökçe Tağlıoğlu

korcenk

ben aşağıdaki gibi yapıyorum

unsigned char sayi;
main
{
}

fonksiyon
{
extern unsigned char sayi;
}


Tagli

extern'in header dosyaları dışında kullanıldığını görmemiştim. Ama bence işi karıştırmaya gerek yok. Fonksiyon içinden global değişkene zaten doğrudan erişilebilir. Senin yazım biraz Python'u andırmış.
Gökçe Tağlıoğlu

Ateş Erim

Alıntı yapılan: Tagli - 03 Ocak 2014, 19:09:00

ta2cye, o stack bu stack değil :) .  Doğrudur, fonksiyon geri dönüş adreslerini saklayan donanımsal stack'a erişim mümkün değil (PIC18'de bir miktar maymunluk ile yapılabiliyor bu). Ama bizim bahsettiğimiz stack, derleyicinin fonksiyon yerel değişkenleri ve diğer işlemler için oluşturduğu yazılımsal stack. Bu arada, 8 bitlik PIC mimarileri için konuşuyoruz. 16 bitliklerde olay farklı.


Hımm açıklama için teşekkür ederim. Soft stack diye birşey duymuştum (henüz ne olduğunu bilmiyorum. İlk fırsatta araştıracağım) Bu bahsettiğiniz stack, sanırım soft stack. Doğru mudur?
Bu mektup icin hic agac kesmedim. Sadece elektronlari durtukledim.

Tagli

Evet öyle. İşlemci mimarisi tarafından doğrudan desteklenmiyor, yani stack'lara has push ve pop komutları donanımsal olarak yok. Tamamen derleyici tarafından oluşturuluyor. Yani asm'de kod yazarken mesela böyle birşey oluşmaz (sen özellikle tasarlayıp eklemediğin sürece). Bu arada, özellikle PIC18'lerde, derleyicinin kendi stack'i üzerinde daha rahat çalışabilmesi için FSR register'ları 16 serisindekilere göre biraz geliştirilmiş. Derleyici dokümantasyonuna bakarsan, bu register'ların (pointer gibi çalışırlar zaten) yazılım stack'i ile ilgili özel görevleri olduğunu görebilirsin.
Gökçe Tağlıoğlu

Ateş Erim

Ya kolaycılık yaptığımın farkındayım ama, araştırmadan önce son bir soru sormak istiyorum. Aceleciliğimi mazur görün lütfen.
Asm haricinde bir derleyiciyle program yazarken, "işlemcinin desteklediği stack sınırına dikkat edersem, derleyici ayrıca soft stack yapmaz" önermesi doğru mudur? Yoksa bu da derleyiciden derleyiciye değişen bir durummudur ?
Teşekkürler/iyi çalışmalar
Ateş
Bu mektup icin hic agac kesmedim. Sadece elektronlari durtukledim.

yamak

Doğrudur.Zaten gelişmiş işlemcilerde stack ve heap boyutunu kendimiz belirleyebiliyoruz.

Ateş Erim

Bu mektup icin hic agac kesmedim. Sadece elektronlari durtukledim.

elektronart

XC8lerle ilgili yorumum için özür diliyorum. Aşağıdaki dokümana göre söylemiştim. XC8lerde heap olmaması durumu değiştiriyor tabi. (Bilgilendirme için teşekkürler Tagli)
http://www.iar.com/Global/Resources/Developers_Toolbox/Building_and_debugging/Mastering_stack_and_heap_for_system_reliability.pdf
Açık Elektronik