ASM'den C'ye geçmeye çalışırken takıldığım! noktalar

Başlatan camby, 03 Eylül 2011, 23:39:59

camby

ASM'den C'ye geçmeye çalışıyorum. ( Yazmış ve bundan sonra yazacak olduğum ASM rutinlerimin hepsini makro haline getirmeye üşendiğim için atıldım bu işe diyebilirim )
Tabi ilk iş olarak yazdığım kodların , assembly karşılıklarına bakıyorum , Ancak bazı takıldığım yerler var.

Hi-Tech 9.82 , Ortam MPLAB , pic : 16f877a

Gecikme rutini için fx kodu yazmış :

while (1)		 				// Sonsuz döngüye giriliyor
		{
		RB0=1; 						// Led yanacak
		__delay_ms(250);
		__delay_ms(250); 			// Yarım saniye beklenecek
		RB0=0; 						// Led sönecek
		__delay_ms(250);
		__delay_ms(250); 			// Yarım saniye beklenecek
		}



Gayet basit ve kullanımı kolay, ben ne yazıyordum assembly ile önceden :


ANA		bsf		PORTB,0
		CALL		BEKLE		; 500ms
		bcf		PORTB,0
		CALL		BEKLE		; 500ms
		GOTO		ANA



C'deki koduma Disassembly Listing diyorum hemen  :


19:                		RB0=1; 						// Led yanacak
  07C5    1283     BCF STATUS, 0x5
  07C6    1303     BCF STATUS, 0x6
  07C8    1406     BSF PORTB, 0
20:                		__delay_ms(250);
 13 komutluk gecikme döngüsü....
21:                		__delay_ms(250); 			// Yarım saniye beklenecek
 13 komutluk gecikme döngüsü....
22:                		RB0=0; 						// Led sönecek
  07E2    1283     BCF STATUS, 0x5
  07E3    1303     BCF STATUS, 0x6
  07E5    1006     BCF PORTB, 0
23:                		__delay_ms(250);
  13 komutluk gecikme döngüsü....
24:                		__delay_ms(250); 			// Yarım saniye beklenecek
 13 komutluk gecikme döngüsü....
25:                		}
26:                }


Gecikme rutini klasik , ancak PORTB'deki bir bit değiştirilmeye çalışıldığında her seferinde o register'ın bulunduğu BANK'a gidiliyor.

Zaten bank 0 ' dayız neden tekrardan bank0 komutu yazılıyor anlamış değilim aynı banktaki her register için bu yazılacaksa eğer , kesme içindeki değerli mikrosaniyelerimiz bu şekilde harcanmasın ? Burda programcının mı eksikliği var yoksa yapayzekanın mı ?


2. Nokta ise :

Disassembly Listing içinde görünmeyen kodlar var , bunları da Program Memory kısmından görüyorum :

Line    Address   Label                Disassembly              

     1    0000            BCF PCLATH, 0x4                        
     2    0001            BCF PCLATH, 0x3                        
     3    0002            GOTO 0x7bd                             
                                                           
  1982    07BD            CLRF STATUS                            
  1983    07BE            BCF PCLATH, 0x4                        
  1984    07BF            BCF PCLATH, 0x3    
                    
  1985    07C0            GOTO main                              
  1986    07C1    main    BSF STATUS, 0x5                        
  1987    07C2            CLRF PORTB       ; burası TRISB                      
  1988    07C3            BCF STATUS, 0x5                        
  1989    07C4            CLRF PORTB                             
  1990    07C5            BCF STATUS, 0x5                        
  1991    07C6            BCF STATUS, 0x6                        
  1992    07C7            MOVLW 0x7                              
  1993    07C8            BSF PORTB, 0 
...............


Program kodlarını 0x005 adresinden itibaren yazıyorduk , Burada ise 0x000 adresinden başlanmış ( nasıl oluyor bu adresler içinde asm kodu ? < 0x000 : 0x004 > ) ve direk Page0'ın sonuna gidilmiş . Yani programın son satırı o page'in son adresine yerleşmiş ( 0x7FF) . Bunun nedeni nedir anlamış değilim , elbet bi nedeni vardır diyorum geçiyorum .

TRISB'ye işlem yapmak için tek bit değiştirme ile bsf STATUS,5 gidilmişken altında yine PORTB'ye program bank0'da olduğu halde 2 adet kod yazdıktan sonra değer yazmış.. Programın her yerinde PORTB'ye hantal bir şekilde gidiliyorken TRISB'ye bu kadar klass : ) gidilmesine de şaşırdım doğrusu.

C'de yeniyim ancak led yakıp söndürdüm o da isiste , o yüzden sorduklarım gereksiz/anlamsız ve ben bunu daha farketmemiş olabilirim , yada bunlar başka bir başlıkta tartışılmış da olabilir eğer öle ise affola.

Kadir Can(16F84)

İlk soruda işini garantiye alıyor.
BANK konusunda ben de zorlanmıştım.
BANK bir olursa TRIS, sıfır olursa PORT diye hatırlıyorum.
Şimdi sen bir yaparsan ve sıfıra çevirmezsen led yanmaz.Sadece giriş çıkış ile oyalanırsın.
Bunu önlemek için garantiye alıyor.
Optimizasyonlar kapalıysa açmayı denemelisin.

fatihinanc

Alıntı yapılan: gerbay - 03 Eylül 2011, 23:50:20
hocam senin "gecikme" rutinlerinin başka bankta olabilme ihtimaline karşı tekrardan status registerından bank seçiyor..

optimizasyon ayarları ne durumda, kapalı mı?

Eskiden bende de acayip bir şekilde vardı bu alışkanlık. PIC16 kullanırken (hi-tech) çıkışları gözlemliyordum.
@camby hocamın bashettiği sorunla önceden karşılaşmıştım. Normalde optimizasyon kapalı ya da low durumda oluyor.
bunu orta seviylere çektiğimde bu sefer böyle durumlarla karşılaşmadığımı hatırlıyorum.
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

LukeSkywalker


camby

Alıntı yapılan: gerbay - 03 Eylül 2011, 23:50:20
hocam senin "gecikme" rutinlerinin başka bankta olabilme ihtimaline karşı tekrardan status registerından bank seçiyor..

optimizasyon ayarları ne durumda, kapalı mı?
@Gerbay
Gecikme rutininin nereye koyulacağını da zaten derleyici kendisi seçiyor , bilinmemesi gibi bir durum olmaması gerekir.


Alıntı yapılan: Kadir Can(16F84) - 03 Eylül 2011, 23:52:44
İlk soruda işini garantiye alıyor
.....
Bunu önlemek için garantiye alıyor.
Optimizasyonlar kapalıysa açmayı denemelisin.
@Kadir Can
Değindiğim konuyu tam olarak anlamadın sanırım , istenilen register'a ulaşılmak için o register'ın bulunduğu bank'a gitmek gerekiyor , bu konuda sıkıntı yok. Ben trisx ile giriş çıkışı belirleyip , portx ile işimi yapıyorum , gerisine de karışmıyorum , C'ye geçmemin amacı bu zaten arka plan ile uğraşmamak. Şimdi arka plandaki işlemleri zaten derleyici kendisi yapıyor , o zaman neyi garantiye alıyor..

@Gerbay,Kadir Can,fatihinanc

Optimizasyonu sizden duydum şimdi. Rica etsem Hi-Tech'in optimizasyonun basit genel tanımını ve nasıl aktif edildiğini söyleyebilir misiniz ?

@fatihinanc

Bu alışkanlıktan kurtulmak için de C'ye başladım diyebilirim : )

fatihinanc

Hocam MPLAB IDE ise;
Project -> Build Options -> Project
[IMG]http://img4.imageshack.us/img4/4971/optw.png[/img]
PIC ten sonra MSP430 ile IAR a geçtim. Onda derleyici ve mikrodenetleyici mimarisinin daha sağlam olmasından dolayı kodlar baya optimize çıkıyor hocam ;)
Selamlar...
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

Kadir Can(16F84)

Aslında demek istediğini anladım.
Şimdi sen trisx dediğinde bank bire geçilir.portx dediğinde de bank sıfıra geçilir.Yani derleyici değil, yine sen ayarlıyorsun.
Optimizasyon dediğimiz olay, kodu en iyi hale getirmektir.Yani en kısa ve hızlı koda ulaşılmaya çalışılır.Optimizasyonların kapalı olması durumunda derleyici uzun ve yavaş bir kod sunacaktır.Yani kod üzerinde kendini yormaz.Hangi bankta kalmışım, bank geçişi gerekli mi diye bakmaz.Optimizasyonları açtıkça kendini daha iyi bir kod oluşturmak için zorlar.Bank geçişleri için kontrol uygular.
https://www.picproje.org/index.php/topic,31195.msg232787.html#msg232787
Bu mesaja bakarsan, optimizasyonlar kapalı iken kodda değişiklik yok.Optimizasyonları biraz açınca toplamanın birazını kendi yaptı ve hazır kodu çevirdi.Optimizasyonları tamamen açınca işlemin tamamını yaptı ve tertemiz bir kod oluşturdu.

camby

Örnekte anladım şimdi Optimizasyon konusunu.

Mplab için max 9 heralde optimizasyon , azalttım , arttırdım ve speed tikini işaretledim birşey değişmedi , değişecek birşeyler bulurum yakında. Teşekkürler.