KEIL'de iki komut arasında geçen süreyi bulmak

Başlatan kimlenbu, 17 Haziran 2014, 14:39:07

kimlenbu

Selamlar,

Timerla uğraşmadan debug modunda atıyorum 2 tane long int tipinde sayiyi toplamak kaç mikrosaniye alıyor bulabilir miyim ? Sensörden gelen veriye göre toplama, çıkarma işlemi yapılıyor (birden fazla), sensör verisi kesme ile güncellendiğinden yeni kesme gelmeden hesaplamalarım bitiyor mu bunu kontrol etmem lazım. işlemci stm32f407vg (168Mhz'de çalışıyor)

uint32_t a=0x12345678;
uint32_t b=0x12345678;
uint32_t c=0;

int main(void)
{

while(1)
{
c=a+b;
}

}

muhittin_kaplan

#1
Hocam DWT i kullanabilirsiniz. (bende epey uğraşmıştım linkini bulayım.)

mesaj birleştirme:: 17 Haziran 2014, 14:47:36

olatile unsigned int *DWT_CYCCNT = (unsigned int *)0xE0001004;
            volatile unsigned int *DWT_CONTROL = (unsigned int *)0xE0001000;
            volatile unsigned int *SCB_DEMCR = (unsigned int *)0xE000EDFC;
 
            *SCB_DEMCR = *SCB_DEMCR | 0x01000000;
            *DWT_CYCCNT = 0;
            *DWT_CONTROL = *DWT_CONTROL | 1 ; 
 
 
     volatile int count = 0;
 
     *DWT_CYCCNT=0;
 
     __asm("nop");
     __asm("nop");
 
 
     count = *DWT_CYCCNT; // bu işlem 3 cycle yapıyor. Hesaba Katılması Gerek.
 
         *DWT_CYCCNT=0; /Register sıfırlanıyor.
     __asm("nop");
     __asm("nop");
     __asm("nop");
     __asm("nop");
     __asm("nop");
     __asm("nop");
     __asm("nop");
     __asm("nop");
     count = *DWT_CYCCNT;
    }
}


mesaj birleştirme:: 17 Haziran 2014, 14:49:57

https://www.picproje.org/index.php/topic,48532.msg362820.html#msg362820

X-Fi

Yazılımı işlemciye yükleyip Debug moduna girin sağ alt köşede pencerenin altında T1,T2 zaman saatleri göreceksiniz. Ölçmek istediğimiz kodun önünde işlemciyi durdurun ölçümün biteceği yere breakpoint koyun sayacı sıfırlayın ve işlemciyi koşturun durduğunda zaman değerini sağ alt köşeden okursunuz.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

kimlenbu

@X-Fi hocam teşekkür ederim, tam da aradığım şeydi :) merak eden olursa 32 bit toplama işlemi 5 mikro saniye tutuyor.

@muhittin_kaplan hocam DWT counterından haberim yoktu, size de teşekkür ederim, bir şey daha öğrenmiş oldum :)

AsHeS

Alıntı yapılan: kimlenbu - 17 Haziran 2014, 15:03:56
@X-Fi hocam teşekkür ederim, tam da aradığım şeydi :) merak eden olursa 32 bit toplama işlemi 5 mikro saniye tutuyor.

@muhittin_kaplan hocam DWT counterından haberim yoktu, size de teşekkür ederim, bir şey daha öğrenmiş oldum :)

5 us çok absürt bir değer 168 MHz 'de çalışan bir işlemci için neredeyse 1000 cycle harcıyor demek bir terslik var.

f_machine

Alıntı yapılan: kimlenbu - 17 Haziran 2014, 15:03:56
@X-Fi hocam teşekkür ederim, tam da aradığım şeydi :) merak eden olursa 32 bit toplama işlemi 5 mikro saniye tutuyor.

@muhittin_kaplan hocam DWT counterından haberim yoktu, size de teşekkür ederim, bir şey daha öğrenmiş oldum :)

Arkadaş üsttede söylemiş ama , benim bildiğim Cortex M4 çekirdeği 32 bit toplamayı tek cycle da yapabiliyor. Yani 1/168MHZ den 6ns gibi bir sürede yapması lazım :)

kimlenbu

Ben de bunu araştırıyordum ondan geç cevap yazdım, şu siteden tek cycle'da toplama işlemi yapabildiğini buldum :

http://list.dprg.org/archive/2012-August/035999.html

daha sonra tekrar denedim ana döngüde, iki break point ekledim, ilkine gelince t1,t2 saatlerini sıfırlayıp run dedim, sonuç şu :



bu sefer de 0.1us görünüyor, 100ns gibi değer :/ HSE çalışmıyor mu yoksa ??

kimlenbu

rica etsem keil ve stm32f4 discovery kullanan birisi 32 bit toplama süresini debug modunda test edebilir mi ? hesaplarıma göre benim işlemci 10MHz'de çalışıyor gibi görünüyor.

1/(X*10^6)=100*(10^(-9)) --> X=10