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

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
21,729
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 üyeler

Forum istatistikleri

Konular
5,789
Mesajlar
99,024
Üyeler
2,464
Son üye
s4met

Son kaynaklar

Son profil mesajları

cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Kesici/Spindle hızı hesaplamak için SpreadSheet UDF'leri kullanın, hesap makinesi çok eski kalan bir yöntem :)
Dr. Bülent Başaran,
Elektrik ve Elektronik Mühendisi
Yonga Tasarım Özdevinimcisi
Üç güzel "çocuk" babası
Ortahisar/Ürgüp/Konya/Ankara/Pittsburgh/San Francisco/Atlanta/Alaçatı/Taşucu...

Back
Top