C programın yazılış şeklinin performansa etkisi

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
24,139
emWin grafik kütüphanesi ile bir TFT ekranı kontrol etmek için, ekrana yazma, ekrandan okuma fonksiyonlarının kullanıcı tarafından tanımlanıp kütüphaneye de bildirilmesi lazım. Benim tanımladığım fonksiyon şu şekilde idi:

C:
static inline void write(uint16_t data)
{
    *pbus = data;
}

static void lcd_write_data_multiple(uint16_t* buffer, int count)
{
    select_data();
    for (int i = 0; i < count; ++i)
    {
        write(buffer[i]);
    }
}

Ekranın üzerinde çalıştığım bölgeyi doldurduğum zaman toplam 16 ms süre tutuyor. Oldukça uzun bir süre.
 
Kodu biraz daha farklı şekilde yazıyorum

C:
static inline void write(uint16_t data)
{
    *pbus = data;
}

static void lcd_write_data_multiple(uint16_t* buffer, int count)
{
    select_data();
    while (count--)
    {
        write(*buffer++);
    }
}

Bu şekilde yapınca çalıştığım bölgeyi doldurma 9.5 ms ye iniyor. Hala çok uzun.
 
Kodu assembly ile yazıyorum

C:
static void lcd_write_data_multiple(uint16_t* buffer, int count)
{
    select_data();
    __asm volatile(
            "mov r0, %[in_buffer]\n\t"
            "mov r1, %[in_pbus]\n\t"
            "mov r2, %[in_count]\n\t"
            "loop:\n\t"
            "ldrh r3, [r0], #2\n\t"
            "strh r3, [r1]\n\t"
            "subs r2, r2, #1\n\t"
            "bgt loop\n\t"
            :
            : [in_buffer] "r" (buffer), [in_pbus] "r" (pbus), [in_count] "r" (count)
            : "r0", "r1", "r2", "r3"
    );
}

Bu şekilde yapınca çalıştığım bölgeyi doldurma 2 ms ye iniyor.

Animasyonlu grafik işleri ile uğraşınca işlemcinin performansını en son kırıntısına kadar kullanmak gerekiyor. 2 ms de yeterli değil, TFT ekranın bus erişim timing üzerinde de biraz oynama yapıp bunu 1 ms altına indirmem lazım.
 
select_data(); fonksiyonuna el atmak gerekiyor.

O fonksiyon her neyse ilk giriste zaman aliyor gorunuyor.

Count degeri ne ki data tasima islemi bu kadar zaman aliyor?

Hedef adrese yazma isi islemciye wait state mi attiriyor?
 
select_data(); fonksiyonuna el atmak gerekiyor.

O fonksiyon her neyse ilk giriste zaman aliyor gorunuyor.

Count degeri ne ki data tasima islemi bu kadar zaman aliyor?

Hedef adrese yazma isi islemciye wait state mi attiriyor?

select_data sadece bir GPIO pini set ediyor, kayda değer bir süre tutmuyor. Döngü adedi 220 x 155 yani TFT ekrana 34100 yazma. Her bir yazma kabaca 50 ns sürüyor.

Wait stateler minimum. Orada belki birkaç takla daha atarım ama kayda değer bir fark çıkmaz orada. Kütüphanenin kaynak kodu yok, olsa ona göre de birşeyler yapabilirdim.
 
Bu konuyla direkt alakalı değil ama :
Mesela Arduino ya kod yazılırken işlemlerin kaç nano saniye sürdüğüne dair bilgi de alınabiliyormu?
"Ben biraz daha şu kısmı hızlandırayım" gibi bir alternatif olabiliyormu?
(Kasdettiğim tabiki bekleme sürelerinin dışındaki komutlarda)
 
Bir kod parçasının ne kadar sürede çalıştığını ölçmek için bir GPIO pini kullanabilirsin. Kodun girişinde pini set edersin çıkışında reset edersin.
 
Eğer zahmet olmassa basit bir kod örneğinde gösterebiirmisin ?
Sanırım sonuc seri monitördede bu süre gösterilebilir
 
Şu anda Arduino kurulu değil ama çalıştığım koddan örnek vereyim. Mesela bir çizginin çizilmesinin ne kadar sürdüğüne baktığımızda, 4 ms gibi sürdüğünü görüyoruz.

C:
R_BSP_PinWrite(IR_DATA, 1);
GUI_AA_DrawLine(meter->dial_xc, meter->dial_yc, dial_x, dial_y);
R_BSP_PinWrite(IR_DATA, 0);

1667763214561.png
 
Burada bir LEDİ yakıp söndürmek gibi bir IR LED e aç/kapa komutları gönderiyorsun sanırım .
Sonrada 1 den sıfıra kaç ms de yerine getirdiğine bakıyorsun doğrumu?
(C bilmediğimden soruyorum)
 
Son düzenleme:
Olay bir GPIO pinin set ve reset edilmesi, yoksa LED ile bir alakası yok.
 
hocam sadece bir veya birkaç komutun yürütülmesi sırasında geçen süreyi hesaplamak için kronometre gibi kullanmış bu pinleri. Kod yürütülmeden önce bir pin high yapılır, süresi incelenecek kod yürütülür, kodun bitiminde o pin tekrar low yapılır. Lojik analizörden veya bu işi yapabilen bir osiloskoptan o pinin high-low durumu incelenir, aradaki süre ölçülür. Bu sayede çalışma süresi incelenecek kodun ne kadar zamanda işini bitirdiği kontrol edilir.
 

Çevrimiçi personel

Forum istatistikleri

Konular
6,953
Mesajlar
118,765
Üyeler
2,824
Son üye
selocan32

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top