16178 eklentisine bak
@Gokrtl senin hafızayı dolduran başka birşey var.
Bunların hepsini ekleyerek derledim.
1. de hafıza 9730'du
1 ve 2de 9800 oldu
1-2 ve 3'de 9812 oldu
1-2-3 ve 4 de 9826 oldu
1-2-3-4 ve 5'de 9838 oldu
Ekran kodlarının tamamını kapattım.
Bu durumda diğer kodlar 32% yer tutuyor. Buda 9886 byte yapıyor.
Sadece çerçeveleri açtığımda 33% e çıkıyor ve 10296 byte yapıyor.
10296 - 9886 = 410 byte. Sadece çerçevelerin kapladığı alan.
Şimdi sırayla verileri ekrana yazdırdığım kodları açacağım.
ilk önce Voltaj değerini açıyorum. Bunu açınca hafıza 47% ye çıkıyor. 14592 yeni bytle değeri. 14592 - 10296 = 4296 byte yer kaplıyor.
Şimdi Akım değerini açıyorum. Bunu açınca hafıza 48% ye çıkıyor. 14820 yeni byte değeri. 14820 - 14592 = 228 byte yer kaplıyor.
Burada görünüşe göre Voltaj değeri çok fazla yer kaplıyor. Akım değeri onunla aynı kodlara sahip olmasına rağmen sadece 228 byte yer kaplıyor.
Şimdi Voltaj değerini kapatıp akım değerini açık bırakacağım. Bunu yapmamdaki amaç, akım değeri hala 228byte mı kullanacak görmek istiyorum. Çünkü eğer Voltaj değerini kapattıktan sonra 4296 byte yer tutmaya devam ederse anlayacağım ki kod biloğu ilk çalıştığında bu değeri alıyor, sonraki aynı kodlarda çok cüzi byte larda yer tutuyor.
Evet tam tahmin ettiğim gibi. Aşağıdaki fonksiyonu ilk kullandığımda 4296 byte yer tutuyor.
Sonraki kullanımların her birinde ise 200 byte civarı yer tutuyor.
//// EKRANA DEĞERLERİ BASMA FONKSİYONU //////
void drawPrnt(int font1, int font2, int drw1, int drw2, int drwstc1, int drwstc2, int drwstc3, int drw3, float prnt, int sec ) {
if (sec == 1) {
u8g2.setFont(font1);
u8g2.drawStr(drw1, drw2, drw3);
u8g2.setFont(font2);
u8g2.setCursor(drwstc1, drwstc2);
u8g2.print(prnt);
} else if (sec == 2) {
u8g2.setFont(font1);
u8g2.drawStr(drw1, drw2, drw3);
u8g2.setFont(font2);
u8g2.drawStr(drwstc1, drwstc2, drwstc3);
}
}
////////////////////////////////////////////
//// Voltaj değerini ekrana yazdırma /////
drawPrnt(u8g2_font_8x13B_mr, u8g2_font_VCR_OSD_tr, 72, 20, 15, 21, "0", "V", vIN, 1);
/////////////////////////////////////////
//// Amper değerini ekrana yazdırma //////
double valueI = (I < 0) ? 0.00 : I;
drawPrnt(u8g2_font_8x13B_mr, u8g2_font_VCR_OSD_tr, 72, 46, 15, 47, "0", "A", valueI, 1);
/////////////////////////////////////////
Şimdi adım adım gitmeye devam.
Aynı fonksiyonu 2 kere kullandım ve 48% , 14820 byte yer kaplıyor.
Aynı fonksiyonu 3 kere kullanıyorum 85% , 26406 byte yer kullanıyor.
Haydaa durduk yere değer iki katına çıktı.
Üçüncü kez aynı fonksiyonu açtığımda tek başına 37% , 11586 byte kullanıyor.
Bu hiç adil değil.
Bunun sebebini şöyle açıklayabilirim;
Kullandığım fonksiyonda "if - else if" yapısı var.
Akım ve Voltaj değerlerini yazdırmak için fonksiyonun içindeki "if" bloğunu kullanıyorum.
Üçüncü verim olan kademe değerini ekrana yazdırmak için ise "else if" içindeki bloğu kullanıyorum.
Dolayısıyla kullandığım kod yapısı farklı olduğu için hafıza da ilk defa yazılıyormuş gibi yer tutuyor.
Ama yinede voltaj - akım bölümü ilk çalıştırıldığında 4296 byte yer tutarken, kademe bölümü ilk çalıştığında 11586 byte yer tuttu.
İki kod bloğu arasında gördüğüm tek fark, birinde u8g2.print kullanırken diğerinde u8g2.drawStr kullanmışım.
Buradaki 11586 byte lık farkı yaratan "drawStr" fonksiyonu gibi görünüyor. Bunu "print"'e çevirmeye çalışacağım.
Kodları "printe" çevirdim. Hiç bir fark olmadı. Hatta "else if" bloğunu komple kaldırdım yine değişmedi.
Bu durumda en son çare "font" lara bakmaktı ve baktım.
Eureka!!! Buldum!!!
Burada kullanılan fontlar program hafızasını etkiliyormuş. Font ları değiştirdiğim de hafızanın 48%'ini kullanmaya devam etti.
85% ye filan fırlamadı.
Bu font işide sıkıcı biraz. Onlarca font arasında çalışan var, çalışmayan var, bir ton testten sonra bulmuştum. Şimdi tekrar arama yapacağım sanırım.