Çağrılmayan bir işlev(fonk.) nasıl çalışan yazılımı bozar

Başlatan riggs, 25 Ağustos 2012, 11:03:52

riggs

Merhaba,
İşlevi tanımlıyorum fakat çağırmıyorum. Hafıza sınırlaması konusunda sıkıntım yok. Kontrol ettim. Yığını(stack)  taşıracak miktarda yerel değişkenim de yok.
Ne önerirsiniz. Bazı işlevlerde sıkıntı olmadı, daha kısa kod içerenlerde. Nedeni ne olabilir. İşlemci olarak ARM9 ve GNUARM Derleyicisi kullanıyorum.

bymrz

C51 de kullanılmayan fonksiyonlar(içlerinde tanımlanan değişkenlerden dolayı), gereksiz yere ram kullanıyorlar... Belki optimizasyon ayarlarında bir şeyler yapılabilir... Sizdeki sorun da buna benzer bir şey olmasın. Warning ler var mı?

riggs

Hata mesajı yok, muhtemelen hafıza organizasyonu ile ilgili birşey, çözemedim daha....

arm-beginner

Alıntı yapılan: gerbay - 27 Ağustos 2012, 09:27:54
o fonksiyonu görebilirmiyiz?
Fonksiyonu çağırmiyorum diyorsa, bence o fonksiyonu görmemizde bir fayda yok. Sorun bence link aşamasında.
@riggs: yanlış MCU'yu seçmiş olabilirmisin?


Burak B

      Program kodunu debug etme imkanın yok mu? Kullanmadığın fonksiyonun normal şartlarda derleyici tarafından elimine edilmesi gerekir. Direktif verilmemiş ise ve elimine edilmiyorsa Heap Size' ı artırmayı bir dene. Zira kod göremediği için kimse sorununa düzgün cevap veremiyor ki buda gayet normal.
   
      Debug edebiliyorsan programı kilitlendiği noktayı bul veya MCU hata üretip kilitleniyormu diye bak. Gerekirse adım adım kodunu koşturup bunu gözle.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

riggs

Eklenen fonksiyonun önemi yok herhangi bir kod hafıza bölgesini taşırıyor. .text bölümü şişiyor. Eğer çağırmadığımız fonksiyon programın text bölümünü şişirebiliyorsa, kütüphanede tanımlanan fakat çağırılmayan yüzlerce fonksiyonun niye bir etkisi olmuyor yazılıma...

Burak B

Alıntı yapılan: riggs - 31 Ağustos 2012, 15:08:00
Eklenen fonksiyonun önemi yok herhangi bir kod hafıza bölgesini taşırıyor. .text bölümü şişiyor. Eğer çağırmadığımız fonksiyon programın text bölümünü şişirebiliyorsa, kütüphanede tanımlanan fakat çağırılmayan yüzlerce fonksiyonun niye bir etkisi olmuyor yazılıma...

Kütüphanelerin kullanım maksat ve şeklini iyi anladığını düşünmüyorum. Kütüphane kullanımında sadece kütüphaneden talep edilen fonksiyon program içerisine yerleştirilir. Talep edilmeyenlerle programın vede derleyicinin bir işi olmaz. Yani bu ilk sorduğun konu ile aynı durum değil.  Ancak MCU' nun bir sebeple kilitlendiği belli. İmkanın varsa debug etmeni veya heap stack miktarını artırmanı tavsiye etmiştim. Ancak ne bu konuda nede kodu gösterme hususunda bir söylemde bulunmaya yanaşmadın.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

riggs

Heap stack miktarını startup kodu belirlediğinden ve ARM9 işlemciye assembly ile kod yazma deneyimim bulunmadığından bu isteğinizi nasıl yapıcağım konusunda bir fikrim yok. Benim bildiğime göre zaten startup kodu çalıştırılabilir dosyayı RAM'e yükledikten sonra bss data ve text bölümleri yerleştirdikten sonra kalan kısımı heap ve stack olarak kullanır. Heap ve stack ten herhangi biri taşana kadar kullanılır. Kalan bölümün tamamı heap ve stack arasında bölüşülür.

Aslında yazdığım şeyler ilk sorumla ilintili çünkü çağrılmayan yüzlerce kütüphane fonksiyonun linker açısından herhangi bir ayrıcalığı olmaması lazım. Yani ben fonksiyonu kütüphaneyi güncelleyerek yazarsam koda eklenmez fakat ayrı bir modül olarak projeye eklersem kod bölümünde yer alır gibi bir anlam çıkıyor. Ek olarak standart fonksiyonların standartlara göre diğer fonksiyonlardan herhangi bir ayrıcalığı da yoktur.

Hata ayıklamayı şundan dolayı kullanmıyorum;
Fonksiyon eklediğim kod bootloader kodu ve sadece benim değil herkesin kullandığı bir kod. Sorun hafıza bölgesinde

Yazılımın çökme sebebi hafıza bölgesinin yetersiz olmasından kaynaklanıyor. Farklı bir hafıza bölgesini kullandığını sonradan fark ettim. Çözüm olarak kullanmadığım kodları eleyerek yer açma şeklinde  bir yol izlemeyi düşünüyorum.

fatih6761

Derlenmiş dosyayı incelediğinizde ( readelf veya objdump tarzı bir programla ) segmentlerin durumunu öğrenebilirsiniz. Kütüphanelerde sadece kullanılan fonksiyonlar bağlama(link) aşamasında seçilip ekleniyor. Kütüphanelerin durumu bundan farklı. Kod çağrılarınızı analiz edin. Belkide yanlış bir adrese atlama vardır. Kodun disassembly halinden de bu gibi durumlar anlaşılabilir.