float değişkeni fonksiyona gönderirken hata

Başlatan magnetron, 01 Mayıs 2021, 22:09:04

magnetron

merhaba forum,

resimdeki kodda bir fonksiyona float bir değer gönderiyorum
ama fonksiyona anlamsız bir değer olarak gidiyor
resim breakpointte durduğu anda alınmış

FRQ isimli değişken neden benim gönderdiğim değeri almıyor

teşekkür


volkanunal

Emin olmamakla birlikte siz bir fonksiyon argümanını canlı bir şekilde izlemek istiyorsunuz ancak derleyici optimizasyon yaparak bu içeriği herhangi bir memory registerı özelinde tutmayabilir sadece cpu registerlarında bunu tutabilir. Bu yüzden siz stack'den bir değer görüyor olabilirsiniz. Fonksiyon içerisinde herhangi bir değişken üzerinden izlemeyi deneyebilirsiniz yine aynı şekilde mi davranıyor bunu gözlemleyebilirsiniz. Buna ek olarak belki volatile bir değişken üzerinden yaparsanız da gözlemleyebilirsiniz.

mr.engineer

#2
MCU'da yazarken bu benim de başıma geliyordu. (ARM işlemcide) Otomatik değişkenler, baktığınız expression kısmında görülmüyor. Global veya static değişkenleri sadece görebiliyorum.
Otomatik değişkenler general purpose register ( yanlış hatırlamıyorsam r1, r2, r3... diye gidiyor) içerisinde tutuluyor olabilir.  @volkanunal'ın bahsettiği cpu register da mı bu mu bilmiyorum.

Bu registerlara da bakmak mümkün. İnternette aratırsanız bulabilirsiniz.

Yani benim hatırladığım her otomatik değişken stack de tutulmuyor.

Tagli

Akış return'e ulaştığında stack üzerindeki değişken işi bittiği için yok olmuş olabilir. Breakpoint'i bir satır yukarıya, AD9833_SetWaveData() fonksiyonuna koyarak, o fonksiyona girmeden değişkenin değerini kontrol etmeyi dene.
Gökçe Tağlıoğlu

mr.engineer

Alıntı yapılan: Tagli - 01 Mayıs 2021, 23:29:10Akış return'e ulaştığında stack üzerindeki değişken işi bittiği için yok olmuş olabilir. Breakpoint'i bir satır yukarıya, AD9833_SetWaveData() fonksiyonuna koyarak, o fonksiyona girmeden değişkenin değerini kontrol etmeyi dene.

Hocam return'e ulaştığında biteceğini sanmıyorum. Return'e breakpoint koyulmuş. Benim bildiğim breakpoint koyulan yer henüz işlenmemiş oluyor yani burada return işlemi henüz yapılmamıştır diye düşünüyorum.

volkanunal

Alıntı yapılan: mr.engineer - 02 Mayıs 2021, 00:19:00Hocam return'e ulaştığında biteceğini sanmıyorum. Return'e breakpoint koyulmuş. Benim bildiğim breakpoint koyulan yer henüz işlenmemiş oluyor yani burada return işlemi henüz yapılmamıştır diye düşünüyorum.

Orada return'e ulaşması ile bahsettiği şey bence return ifadesinin işletildiği değil de ilgili değişkenin kullanıldığı fonksiyonun artık işlenmiş olması. O yüzden artık o değişkeni stack üzerinde tutulmayacağını anlatmak istemiş sanırım.

Tagli

Değeri SetWaveData() fonksiyonuna ilettikten sonra FRQ değişkeninin görevi bitiyor. SetWaveData() fonksiyonu içinde, daha önce FRQ değişkeninin kullandığı stack bölgesini derleyici başka bir amaçla kullanmış olabilir.
Gökçe Tağlıoğlu

mr.engineer

Alıntı yapılan: Tagli - 02 Mayıs 2021, 08:01:02Değeri SetWaveData() fonksiyonuna ilettikten sonra FRQ değişkeninin görevi bitiyor. SetWaveData() fonksiyonu içinde, daha önce FRQ değişkeninin kullandığı stack bölgesini derleyici başka bir amaçla kullanmış olabilir.

Bunu anlamadım ben. Normalde İnit fonksiyonuna girilirken FRQ değeri push, scope sonunda da pop edilmiyor mu? (Stack memory için )

Başka bir fonksiyona parametre olarak verilmesi neyi değiştirir?
Ama derleyici optimizasyonuyla ilgili bir şey ise onu bilmiyorum.

Tagli

Derleyici optimizasyonları benim de uzmanı olduğum konular değil, sadece tahmin yürüttüm. Normalde elbetteki ki stack'in sadece tepesinde işlem yapılabilir. Ancak FRQ değişkeninin nerede olduğunu bilmiyoruz. Ancak SetWaveData() fonksiyonu sadece iki float değere bağlı, ve bu fonksiyon bittikten sonra da hiçbir şeyin stack üzerinde saklanmasına gerek kalmayacak. Bu sebeple SetWaveData(), içinde bulunduğu _Init() fonksiyonunun stack alanından kullanıyor olabilir.

Ama bunlar hep varsayımlar tabi ki. Oturup düşünmektense, breakpoint'i bir satır yukarı kaydırıp canlı olarak denemek çok daha kolay. İstersen _Init()'e girdikten sonra satır satır kodu işletip her duraksamada FRQ değerini kontrol edebilirsin. Ben olsam öyle yapardım.

Eğer bir sonuca ulaşamazsan, o zaman SetWaveData() içini araştırman ve belki de kodu adım adım orada çalıştırman gerekecek.
Gökçe Tağlıoğlu

magnetron



magnetron

evet hocam breakpointi bir satır yukarı aldım
bu kod interrupt içinde değil


RaMu

main while daki ad98..init içinde
20000.0F yerine
(float)20000 veya
(float)20000.0F
yazarak deneyebilir misin.

Veya float bir değişken tanımlayıp
bu değişkeni mainde init fonksiyonuna verip denenebilir.

Birde global float bir değişken tanımlayıp,
şuan debug ettiğin satırın bir üstüne
fdegisken = FRQ;
diye ekleyip bu fdegisken i debugda kontrol edip denenebilir.
Yani sadece fonksiyona doğru değer gidiyor mu diye bakmak için.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html