Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

pointer ne işe yarar???

Başlatan mech, 13 Haziran 2008, 00:09:28

z

Tabiki,

ASM kodları sayesinde pointer işlemleri yapabilen işlemcilerde C coşturulabilir.

8086 tabanlı işlemcilere örnek pointer

Mov al,[si+bx+2]
Mov al,[di+bx+2]
Mov al,[bp+bx+2]
lodsb

indexleme kaabiliyetini gorebiliyormusunuz?

En bastaki komut, SI registeri degerindeki ve  BX registerindeki  degeri topla buna da 2 ekle ve bu sonuc adresdeki byte cinsinden veriyi AL registerine ata demek.

lodsb, SI registerindeki degeri adres olarak kullan ve bu degerin gosterdigi adresdeki veriyi AL icine aktar, ardindan SI degerini artir (yada eksilt) komutunun pointer islemlerindeki avantajini bir dusunun.

Bunun aynisini 16F84 de yapmak icin

SI degiskenini 16 bit değil de 8 bit kabul edelim. (Ramimiz zaten cok az)

SI degerini w rege aktar, ardindan w regi Ind registerine yukle.
Ind adresindeki veriyi oku
SI adresindeki veriyi 1 artir

Sonucta pointer islemini her islemcide yapabiliyoruz. Kimisi bu isi siradan bir komutmus gibi bir iki clk da yaparken kimisi program parcacigiyla yapabiliyor.

Ornegin adresleriyle tanimlanan iki adet veriyi toplayip ortalamasini alan bir C fonksiyonu yazip bunu her defasinda cagirmak yerine  gerektikce;

iki degeri toplayip yarisini alan program parcacigini yinelemek size ciddi hiz kazandiracaktir.

Yada en azindan adresleri yerine dogrudan kendileri gonderilen iki veriyi toplayip yarisini alan C fonksiyonu F84 de daha hizli kosacaktir.

Demek istedigim bu, Cip tasarimcilarinin C ye uygun komut seti olan islemcileri gelistirmesinin sebebi de bu. Bu cipe ornek F84 olamaz.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

aliveli

global değişkenler kullanırsan pointer'lara gerek kalmaz.

XX_CİHAN_XX

16F serisi piclerde pointer kullanımı yerinde kullanılırsa çok iyi olmakla birlikte hız isteyen uygulamalarda yetersiz kalmaktadır. Sebebinide z hocam çok güzel izah etmiş. Bu seride pointerlarla ilgili genel olarak kanım şu şekilde; eğer programda optimum bellek tüketerek kod yazmak istiyorsak şu bir gerçek ki pointerlar bir nimet. Ama hız olmazsa olmaz bir durumdaysa pointer kullanmayı iki kere düşünmek gerekir. Bu konuda istisnai durumlar olabilir ama genel olarak bana göre pointer ların programa etkisi bu yönde olmakta 16F ve altı serilerde.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

hasangurlek

Assembly ile FSR ve INDF, direk kullanım, ne hız problemi nede kod fazlalığı :)
http://www.cyber-warrior.org, Although they like whiteness, sometimes twilight is required...  Hala evlilermi bilinmez ama kesinlikle artık uygun değiller !!!

OptimusPrime

anladığım kadarıyla 80xx ailesi pointer olayına daha yatkın, bir örnek daha vermek gerekirse sanırım M8C core u da pointer işlemlerini için yatkın görünüyor.
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

XX_CİHAN_XX

Alıntı yapılan: "hasangurlek"Assembly ile FSR ve INDF, direk kullanım, ne hız problemi nede kod fazlalığı :)
Hocam zaten C de arka planda bunları kullanıyor. Bu nedenle asm - C farketmez bu konuda.
Fizikteki tabirle, yoldan (bellekten) kazanç sağlarken hızdan kayıp var.
Basit bir örnekle açıklayım hemde asm üzerinden vereyim ki kimsenin bir itirazı olmasın :)
BCF	STATUS,C	
;96 adet registeri kaydır toplam 96 satır
;bu işlemler 4mhz xt için toplam 96uS sürer
RLF	0x20,F
RLF	0x21,F
RLF	0x22,F
RLF	0x23,F
RLF	0x24,F
RLF	0x25,F
RLF	0x26,F
RLF	0x27,F
RLF	0x28,F
RLF	0x29,F
RLF	0x2A,F
RLF	0x2B,F
RLF	0x2C,F
RLF	0x2D,F
RLF	0x2E,F
RLF	0x2F,F
.
.
.
.
.
.
RLF	0x7C,F
RLF	0x7D,F
RLF	0x7E,F
RLF	0x7F,F



;96 adet registeri kaydır toplam 9 satır
;bu işlemler 4mhz xt için toplam 675uS sürer

MOVLW	0x20
MOVWF	FSR
BCF	STATUS,C
LOOP
RLF	INDF,F
INCF	FSR,F
MOVLW	0x80
XORWF	FSR,W
BTFSS	STATUS,Z
GOTO	LOOP


Görüldüğü gibi pointer mantığı ile çok az bir kod döngüsü ile bir çok satır yazmaktan kurtulduk ama bu bize ciddi miktarda gecikme olarak geri döndü!
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

OptimusPrime

peki şöyle bir örnek vermek mümkünmü;
pointer kullanılarak hem işlem zamanı kısaltılacak hemde daha az bellek kullanılacak.

olabilir mi böyle bir şey?
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

XX_CİHAN_XX

16 serisi için böyle bir örnek vermek sanırım mümkün değil. Ancak bazı durumlar vardır ki pointer lar gerçekten hız kazandırabilir. Buda bahsettiğim istisnai durumlara giriyor. Misal sürekli farklı banklardaki registerlerle yoğun işlemler yapıyoruz. Ve çok sayıda farklı banklardaki registerlerla işlem yaptığımızı düşünürsek; pointer kullanmadığımızda sürekli BANKSEL gibi makrolar kullanmamız yani STATUS un bank select bitleri ile oynamamız gerekmektedir. Ama pointer kullanarak direk adresleme yapar ve gerçek anlamda az kod ve hızlı kod yazmış oluruz.
Gerçek anlamdadan kastım her az kod hızlı kod değildir(bakınız bir mesaj yukarıya)
Hayırlı cumalar...
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

XX_CİHAN_XX

Ek olarak bu yazdıklarım 16 ve altı serisi picler içindir. Diğer pic yada işlemcilerin yapıları hakkında yeterli derecede bilgi sahibi olmadığım için onlar hakkında bir yorum yapamam.
Ama bu seride asm yada c yada ne olursa olsun pointer kullanımı genelde bu tarz sonuçlar doğrumaktadır. Bu nedenle bilinçli kullanmak gerekir.
Çok ciddi hız gereken durumlarda dediğim gibi ince hesap yapmak gerekebilirken böyle bir sorunun olmadığı durumlarda kullanmak görüldüğü gibi son derece faydalı ve kaliteli kod yazmamızı sağlamaktadır.
Kolay gelsin.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

z

Forumda örnekleri verilen yada çalışmadığı için yardım talep edilen program yada program parçacıklarında şöyle satırlar dikkati çekiyor.

(Komut satırlarını, dile özgü komutlarla değil de taşıdıkları anlamlarla yazıyorum)

PortA nın 1 numaralını bitini oku A ya ata
1 mili saniye bekle
LCD de bilmem ne mesajı yazdır
10 mili saniye bekle.
Motoru sağa döndür 100 mili saniye bekle.

.....
.....

Bekle oğlu bekle.

Eğer böyle program yazıyorsanız pointer kullanmaktan kaçınmayın.
Size hiç bir olumsuz etkisi olmaz.

Bizim hızdan kasdettiğimiz, CPU yu sürekli ciddi işlerle meşgul eden yazılımlardaki hız. Bu yazılımlarda CPU yapılması gereken işleri yapar bitirir, bir sonraki iş gelinceye kadar aylaklaşır.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

M_B

Bizim hızdan kasdettiğimiz, CPU yu sürekli ciddi işlerle meşgul eden yazılımlardaki hız. Bu yazılımlarda CPU yapılması gereken işleri yapar bitirir, bir sonraki iş gelinceye kadar aylaklaşır.

@Z Hocam şu an aklıma işlemciyi devamlı meşgul edecek bir uygulama ismi gelmedi. Bir örnek verebilirmisiniz.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

OptimusPrime

z

lcd dediniz aklıma geldi.
lcd ye bir karakter katarı yazmak için kullanılan fonksiyonların prototipi genelde writeLCD(const char *String) dir.
peki bunu writeLCD(const char String[]) şeklinde yazmamalarının nedeni pointer işleminin rahatlığı mıdır yoksa başka bir nedeni mi vardır?
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

z

Programınızdaki tüm Delay komutlarını kaldırıp programı delay komutsuz çalışır hale getirdiğinizde o program benim gözümde ciddi iş yapar.

Aksi halde ciddiyetsiz iş yapılır cünkü  işlemciyi delay komutuna soktuğunuzda dünyada pek çok olay olmaktadır ve CPU bunlardan habersizdir.

CPU nun bunlardan haberi olsun diye gerekli tertibatı alırsanız, CPU Delay komutu işlerken de olup bitenleri izleyebilir fakat bu kez de zamanlamalarınız ciddiyetsizleşmeye başlar.

Delay komutunun şart olduğu bazı durumlar elbette var. Bunlar için sözüm yok. Fakat burada sözkonusu delaylar 1 mikrosaniye civarındaki geçikmelerdir ve genellikle bir kaç NOP ile geçiştirilebilir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Alıntı yapılan: "OptimusPrime"z

lcd dediniz aklıma geldi.
lcd ye bir karakter katarı yazmak için kullanılan fonksiyonların prototipi genelde writeLCD(const char *String) dir.
peki bunu writeLCD(const char String[]) şeklinde yazmamalarının nedeni pointer işleminin rahatlığı mıdır yoksa başka bir nedeni mi vardır?

Uzun veriler üzerinde işlem yapılacaksa, işlemcinin de indexleme kaabiliyeti yoksa, ramınız da sınırlı uzunluktaysa işi kotaracak yol iyi olması gereken yoldur.

Stack üzerinden veri aktarmak için verilerin stağa taşınması ilave bir yüktür. Dolayısı ile bir fonskiyona string aktarımı için stack'ı kuıllanmak iyi bir yöntem olamaz.

Hele hele string daha kodlama aşamasında roma kazınacaksa, bunu romdan rama çekmenin hiç bir mantığı olamaz. Eğer bu string sık sık kullanılacaksa yeterli ramınız varsa o zaman olabilir. (PIC 16 serisi de romdaki veriyi ne kadar hızlı okur iyi bilirsiniz)

Öte yandan verileri gobal alanda tanımlamak hız açısından önemli bir avantajdır. Fakat zaten kısıtlı Ramı hoyratca kullanamayız.

İşin içine C girdimi pointer kullanımı, veri aktarımını ve ara işlemleri stack üzerinde yapmak çok avantajlıdır.

Memory kullanımı ve Hız ters orantılıdır.

C nin tadına varmak için ya çok çok hızlı işlemcilerle yada ARM, 68000, 80x86 vb  işlemcilerle çalışmak lazım.

Bu arada uygulama çok önemli.

Uygulamalarım sinyal işleme ağırlıklı olduğu için hız takıntım var. Eğer amaç bir ledi yakıp söndürmekse yada benzeri işler ise pointer hızlı mı çalışırmış yavaşmı çalışırmış kafa yormaya gerek yok.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com