Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Konuyu başlatan: kimlenbu - 17 Haziran 2014, 14:39:07

Başlık: KEIL'de iki komut arasında geçen süreyi bulmak
Gönderen: kimlenbu - 17 Haziran 2014, 14:39:07
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;
}

}
Başlık: Ynt: KEIL'de iki komut arasında geçen süreyi bulmak
Gönderen: muhittin_kaplan - 17 Haziran 2014, 14:43:11
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 (https://www.picproje.org/index.php/topic,48532.msg362820.html#msg362820)
Başlık: Ynt: KEIL'de iki komut arasında geçen süreyi bulmak
Gönderen: X-Fi - 17 Haziran 2014, 14:53:56
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.
Başlık: Ynt: KEIL'de iki komut arasında geçen süreyi bulmak
Gönderen: 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 :)
Başlık: Ynt: KEIL'de iki komut arasında geçen süreyi bulmak
Gönderen: AsHeS - 17 Haziran 2014, 15:06:53
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.
Başlık: Ynt: KEIL'de iki komut arasında geçen süreyi bulmak
Gönderen: f_machine - 17 Haziran 2014, 15:23:33
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 :)
Başlık: Ynt: KEIL'de iki komut arasında geçen süreyi bulmak
Gönderen: kimlenbu - 17 Haziran 2014, 15:33:55
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 (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 :

(http://i59.tinypic.com/t9gzmo.png)

bu sefer de 0.1us görünüyor, 100ns gibi değer :/ HSE çalışmıyor mu yoksa ??
Başlık: Ynt: KEIL'de iki komut arasında geçen süreyi bulmak
Gönderen: kimlenbu - 17 Haziran 2014, 16:12:43
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