tam sayının basmaklarını bulmak?

Başlatan picmanya, 20 Eylül 2011, 21:10:58

z

Bu sorunun cevabı adamına göre değişir.

Adamın komut kümesi önemli.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

iyildirim

Komut kümesine ek olarak derleyici de oldukça önemli.

Optimizasyon kapalı iken üretilen kod ile optimizasyonlar açık iken üretilen kod arasında dağlar kadar fark var. 

C30 için konuşursam picmanyanın benim yöntemim dediği yöntem yani bölme ve sonucu çarpıp çıkarma şeklinde olan yöntem üst seviye optmizasyonlar açıkken genellilkle benim verdiğim koda benzer bir kod oluşturuyor.  Optimizasyon seviyesine göre oluşturulan kodların biri sadece bir bölme işlemi için yüzlerce clock harcarken diğeri 18 clock da işi bitirebiliyor.

tyildizak

#17
Alıntı yapılan: bunalmis - 21 Eylül 2011, 12:31:37
Simülasyon fikir verir, asm kodlar da fikir verir fakat her ikisi de uğraştırıcı olur.

Debuggerla senkronize çalışan ve rutinlerin ne kadar zaman aldığını söyleyen yazılımlar var. Fakat en kolayı rutinin girişinde port pinlerinden birini high yapıp, rutinden çıkıldığında bu port pinini low yapacak kısa kod eklentisi sayesinde scopla bu pini gözlemlemen.

Bu rutini test amaçlı olarak sonsuz döngüde sürekli olarak çağırıp pinde oluşan sinyalin süresine bakmak daha da doğru sonuç verir.
,

Üzerinde display bulunan bir devre kurulur, işlemden önce timer sıfırlanır, işlem sonrası timer değeri okunur ve lcd'ye basılır. Eldeki sayı ile işlemin kaç komut saykılında tamamlandığı, osilatör frekansı, pre/postscaler vb değerler gözönüne alınarak kolayca bulunur. Ben genellikle böyle yapıyorum.
Söylediğiniz gibi skopla görüntülemek süre olarak çok yakın bir değer verecektir ama tarif ettiğim şekilde timer kullanılırsa komut saykılı cinsinden kesin sonuç alınır.

Erhan YILMAZ

C nin meşhur kütüphane fonksiyonlarından itoa fonksiyonunun içeriğini incele işini görür. En mantıklısı bu gibi görünüyor.
http://en.wikipedia.org/wiki/Itoa

/* itoa:  convert n to characters in s */
 void itoa(int n, char s[])
 {
     int i, sign;
 
     if ((sign = n) < 0)  /* record sign */
         n = -n;          /* make n positive */
     i = 0;
     do {       /* generate digits in reverse order */
         s[i++] = n % 10 + '0';   /* get next digit */
     } while ((n /= 10) > 0);     /* delete it */
     if (sign < 0)
         s[i++] = '-';
     s[i] = '\0';
     reverse(s);
 }


#include <string.h>
 
 /* reverse:  reverse string s in place */
 void reverse(char s[])
 {
     int i, j;
     char c;
 
     for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
         c = s[i];
         s[i] = s[j];
         s[j] = c;
     }
 }

Erol YILMAZ

itoa fonksiyonu bu işi yapıyor tek başına...

char buf[5];
itoa(buf, value, 10);


Hi-tech PICC 9.65 PL1 ile 4207 cycle da tamamlıyor.  yani en uzun süren bu !