ASM ile PIC32 programlayan var mı? Yada örnek var mı?

Başlatan RaMu, 10 Kasım 2012, 04:14:36

z

MIPS32 işlemcileri hiç bilmiyorum. Örnek kod konusunda sıkıntılardan bahsetmişsiniz.

ARM işlemciler için hazırda kaynak bulabilirsiniz. Arm mimarisi ve arm asm konusunda satın alabileceğiniz kitaplar var.

Verdiğim linki ARM MIPS konusunda mukayese açısından bizlere de ileride lazım olur diye forma ekledim.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

hasankara

     tartışma konusu c mi yoksa asm mi olunca bende bu konudaki , lise son zamanlarında edindiğim en mühim bir tecrübemi paylaşmak isterim. Çünkü bende ; pic16f876a için , asm de  yaklaşık 3200 kodluk, hobby amaçlı proje geliştiren birisi olarak bazı noktalara değinmek istedim.

   kullandığım denetleyicinin program hafızasına ; 4 sayfalık 2 şer doubleworld lük, yani her bir sayfa için 2000, 16f876a için ise toplamda 8000 asm kod sığdırılabilmekte.
   Yazdığım programın 3200 kodluk olduğunu belirtmemin asıl sebebi ise ; 8000 lik hafıza yapısının tamamını kullanabilmek için , tıpkı bank seçimi gibi page seçimi yapmak gerektiğini vurgulamaktı. 2000 kodu geçmem dersen böyle bi sıkıntıyla karşılaşmazsın ama 2001 tane kod oldumu işin rengi değişmekte ve ciddi derecede kod yazma sıkıntıları çıkmakta malesef.
   her ne kadar asm de page seçimi problemine çözüm geliştirsemde ; artık oluşturduğum her fonksiyonun , dönüş kısmlarına ve o fonksiyonları her çağırdığım yere , rutinsel olarak kodlar eklemem gerekti. hatta o fonksiyonlardan bir tanesini eklemek için gereken kodlarıda burada paylaşayım.

   Fonksiyonu HER çağırmak için gereken kod:
   ;;;;------------------------; ---MEVCUT PCLATH İ ENCODER İÇİN KOPYALAR<<<K
   BANKSEL   RPCL_ENC         ;
   MOVF   PCLATH,W         ;
   MOVWF   RPCL_ENC         ; --->>>K
   ;;;;                  ;
   PAGESEL   I2C_ENCODER         ; ENCODER İÇİN SAYFA SEÇ
   CALL           I2C_ENCODER         ; BİLGİ ENCODELEMEK İÇİN ÇAĞIR
   ;;;;------------------------;
   Fonksiyon dönüş kısmına eklemek gereken kod:
   ;;;;------------------------; ---I2C_ENCODER DEN DÖNMEK İÇİN PCLATH AYARLA<<<D
   BANKSEL   RPCL_ENC         ;
   MOVF   RPCL_ENC,W         ;
   MOVWF   PCLATH            ; --->>>D
   ;;;;                  ;      
   RETURN                  ; ÇAĞRILAN YERE DÖN
   ;;;;------------------------;
   bu kodları bütün fonksiyonlar için yazmak zorunda değilsin tabi ama bir fonksiyonu tüm pagelerden çağırma ihtimalin olabilecek ise eğer bu şekilde bir yöntem geliştirmen gerekecektir.
   c de henüz 2000 lik kısmı dolduracak kadar kod yazmış değilim o yüzden c derleyicilerinin , özellikle hi-tech ve ccs bu problemi nasıl çözdüğünü incelemiş değilim. ama tahminim en iyi şekilde çözmüş olacağıdır.
   çünkü derleyicilerin asm olarak yaptıkları işleri incelediğimde ; problem çözmede , genelde benim kullandığım yöntemlerden çok daha anlamlı teknikleri kullandığını farketmişimdir.
   Derleyicilerde performans olarak olarak kullanılabilinecek en iyi tekniklerin hepsinin düşünüldüğüne inanmaktayım.

   benim fark ettiğim noktalardan bazılarına değinecek olursam ; 1)sadece gerekli yerde bank ve page seçimi yapıyor. Halbuki asm de gerekli tek bir bank seçimini yerleştirmezsek mantıksal hata ortaya çıkar ve ben bu sebeple neredeyse her yere banksel koyardım. 2)yazdığınız fonksiyonu bir kere kullanacaksanız , direk kullandığınız yere sıkıştırıyor , birden fazla yerde kullanınca fonksiyon (call_return)  şeklinde kaydediyor. Sonuç olarak çok ciddi gereksiz hafıza sarfiyatından kurtarıyor.
   anlattıklarımın yanı sıra syntax olarak tekrar kodları incelerken çok büyük rahatlık sağladığını belirtmemde gerek yok sanırsam , farkettiğim kadarıyla herkez de olayın rahatlık kısmına deyinmiş.

özetle:
   asm bilenin ve bilmeyenin c de yazdığı ; kodlar , kullandığı teknikler ve yaptığı kod performans hesapları aynı olamayacağına ve asm bilenin bu konularda önde olacağına inanmaktayım. Assembly insanı çok daha fazla zorlar. eğer kişi hedefine ulaşmada ısrarlı olursada bunun sonucunda beyninin sınırlarına ulaştığını farkeder ve sayısal zekası dahada ilerler. amerikaları baştan keşfedebilir (Benim asm de programını yazdığım ve adını daha sonradan öğrendiğim multitask tekniği gibi). Hatta belkide keşfedilmemiş amerikalar keşfedebilir.
   Ancak asm de kod yazan birisinin veya birilerinin , bir hitech gibi veya ccs gibi derleyicilerinin kullandığı iyi tekniklerin hepsini bir arada kullanamayacağını düşünerekten , c de kod yazanın her zaman gerisinde kalacağına , Ayrıca bilgisayar kadar iyi OPTİMİZE yapamayacağına  ;) inanmaktayım.   

Şimdi bana sorsalar , kesinlikle asm ye dönmem. çünkü c nin rahatlığına ulaşan ve asm de yapabildiklerini c de yapabilen birisi geriye zor döner diye düşünüyorum. bu yüzden yeni başlayanlara önerim hiç c e bakmadan tamamen asm e başlamaları olurdu. iş ciddiye binincede yüksek yapılı dillere yönelimler illaki olur tahminimce.

Erhan YILMAZ

Relocatable'den kasıt nedir merak ettim. Örnekler silinmiş.

RaMu

;RELOCATABLE KOD PARÇASI YAZMA DENEME 2
;TOPLA_RELO, SAYI1 İLE SAYI2 YI TOPLAYIP TOPLAM A YAZAN RELOCATABLE KOD PARÇASI
;CIKAR_RELO, SAYI2-SAYI1 İ TOPLAM DEĞİŞKENİNE YAZAN RELOCATABLE KOD PARÇASI

;KULLANILACAK PIC TANIMLANIR
#INCLUDE	P16F877A.INC

;KULLANILACAK DEĞİŞKENKERİ TANIMLAMA
;GLOBAL İLE TANIMLANAN DEĞİŞKENLER HEM RELOCATABLE KODDA (YANİ BURADA)
;HEMDE RELOCATABLE KODU KULLANAN ANA PROGRAMDA (YANİ ABSOLUTE KODDA) KULLANILABİLİR
;RELOCATABLE KODDA DEĞİŞKENLER AŞAĞIDAKİ GİBİ RES 1 ŞEKLİNDE TANIMLANIR
;BURADA SAYI1 DEĞİŞKENİ 16F877 DE 20H ADREİNE ATANIR... TOPLAM 23H A ATANIR
;ABSOLUTE KODDA 20H-23H A BAŞKA DEĞİŞKEN ATANMAMALIDIR
;-----------------------------------------------------------
GLOBAL		SAYI1,SAYI2,SONUC,TOPLAM,TOPLA_RELO,CIKAR_RELO

UDATA
SAYI1		RES	1
SAYI2		RES	1
SONUC		RES	1
TOPLAM		RES	1
;-----------------------------------------------------------


;ABSOLUTE KODUN ÇAĞIRACAĞI RELOCATABLE KOD AŞAĞIDAKİ GİBİ "ETIKET  CODE"
;ŞEKLİNDE TANIMLANIR BİR ALT SATIRINA YINE "ETIKET" YAZILIR
;BURADA YAZILAN KOD PARÇASI ABSOLUTE KOD TARAFINDAN ÇAĞRILDIĞINDA AYNI BİR
;ALTPROGRAM ÇAĞRILMIŞ GİBİ ÇALIŞIR, RETURN İLE DÖNÜLÜR
;call ortak DANDA GÖRÜLDÜĞÜ GİBİ KOD İÇERİSİNDE DİĞER ALTPROGRAMLARDADA OLDUĞU GİBİ
;BİR ALT PROGRAM DAHA ÇAĞRILABİLİR, TABİKİ ALTPROGRAM İÇİNDE ALTPROGRAMDA ÇAĞRILABİLİR
;----------------------------------------------
TOPLA_RELO	CODE
TOPLA_RELO

MOVF	SAYI1,W
ADDWF	SAYI2,W
MOVWF	TOPLAM

call  ortak

RETURN
;------------------------------------------------



;BİRBAŞKA RELOCATABLE KOD DAHA LAZIMSA YİNE AYNI ŞEKİLDE TANIMLANIP KULLANILABİLİR
;ASLINDA CIKAR RELOCATABLE KODU KENDİ BAŞINADA HAZIRLANIP KULLANILABİLİRDİ
;------------------------------------------------
CODE
CIKAR_RELO

MOVF	SAYI1,W
SUBWF	SAYI2,W
MOVWF	SONUC

call  ortak

RETURN
;-------------------------------------------------

;-------------------------------------------------
ortak nop
;BURADA TOPLA VE CIKAR DA ORTAK KULLANILAN BİR ALT PROGRAM OLABİLİR
return
;-------------------------------------------------
EN




BURAYA KADAR RELOCATABLE KISMI, BU PROGRAMI YAZIP RELOCATABLE OLARAK DERLİYORUZ




BURADAN AŞAĞISIDA AYRI BİR PROGRAM OLARAK YAZILIP DERLENİYOR VE YUKARIDAKİ RELOCATABLE KODU KULLANIYOR


;RELOCATABLE KODU KULLANAN ABSOLUTE KOD ÖRNEĞİ
	

;KULLANILACAK PİC TANITILIR
	list        p=16f877a   ; list directive to define processor
    #include    <p16f877a.inc>  ; processor specific variable definitions
;KONFİGURASYON AYARLARI UAPILIR    
    __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _RC_OSC & _WRT_OFF & _LVP_ON & _CPD_OFF




;RELOCATABLE KODDA GLOBAL İLE TANIMLANMIŞ VE ABSOLUTE (YANİ BURADA) KODDA KULLANILACAK
;DEĞİŞKENLER EXTERN İLE ABSOLUTE KODA DAHİL EDİLİR
EXTERN		SAYI1,SAYI2,TOPLAM,TOPLA_RELO,SONUC,CIKAR_RELO


;ABSOLUTE KODDA İLK BASAMAK Reset CODE TANIMLAMAKTIR AŞAĞIDAKİ SATIRDA OLDUĞU GİBİ TANIMLANIR
Reset 		CODE	00H


;RESET DURUMUNDA YAPMASINI İSTEDİĞİMİZ ŞEY ESAS KODU İŞLEMESİDİR
;BİZDE ANA KODUMUZU SEÇİP İŞLEMESİNİ SÖYLÜYORUZ,
;
PAGESEL		MAIN_CODE
GOTO		MAIN_CODE
;ANA KODA GİTMESİNİ İSTEDİK

;ANA KOD AŞAĞIDAKİ GİBİ TANIMLANIR
CODE
MAIN_CODE
;ANA KOD ÇAĞRILDIĞINDA BURASI İŞLENİR
;BURAYA KODUMUZU YAZARIZ, GEREKİRSE RELOCATABLE KODLARI ÇAĞIRABİLİRİZ


TEKRAR		NOP

;BANKSEL		TOPLAM
CLRF		TOPLAM

MOVLW		02H
MOVWF		SAYI1

MOVLW		03H
MOVWF		SAYI2


;BURADA RELOCATABLE KODUN NASIL ÇAĞRILDIĞI GÖRÜLÜYOR
;SAYI1 VE SAYI2 DEĞİŞKENLERİNE DEĞER YÜKLEDİK VE BUNLARI TOPLAMASI İÇİN RELOCATABLE KODU
;ÇAĞIRIYORUZ, RELOCATABLE KODDA DÖNÜLDÜĞÜNDE SONUC TOPLAM  DEĞİŞKENİNDE OLACAK
PAGESEL		TOPLA_RELO
CALL		TOPLA_RELO

;GOTO	TEKRAR

MOVLW		04H
MOVWF		SAYI1

MOVLW		05H
MOVWF		SAYI2

;AYNI ŞEKİLDE BAŞKA BİR YERDE TOPLAMA İŞLEMİ YAPTIRILABİLİR
PAGESEL		TOPLA_RELO
CALL		TOPLA_RELO

;---------------
MOVLW		07H
MOVWF		SAYI1

MOVLW		09H
MOVWF		SAYI2

;İSTENEN YERDE CIKARMA İŞLEMİ YAPTIRILABİLİR
PAGESEL		CIKAR_RELO
CALL		CIKAR_RELO

GOTO 	TEKRAR

END




NE İŞE YARAR asm de yazdığınız mesela lcd programını her projeniz için kopyala yapıştır yapıp kodun içerisine eklemek yerine böyle relocatable hale getiriyorsunuz ve ihtiyacınız olduğunda kütüphane koduymuş gibi yeni projelerinizde kullanıyorsunuz, ayrıca kodu okuma ve kullanma kolaylığı sağlıyor.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

enolaguy

Bence asm hiç bilinmeden iyi programci zaten olunmaz ama işin sunum olarak iyice büyüdüğü işlemcilerin komut ve data kapasitelerinin büyüdüğü yerlerde asm ile bir yere kadar uğraşılabilir. Zaten büyük kapasiteli ve gelişkin işlemciler büyük hafıza ve hızlara sahip olduğu için çoğu zaman asm in avantajları olan hız ve programın kapladigi hafıza avantajının neredeyse hicbir anlami kalmaz. Evet gönül isterki hersey asm ile ideal olarak yapilabilsin ama zaten bu yapılamamış oldugu icin bugun C vardır ve sadece C degil, işlemciye daha uzak olup ama daha kolay dillerinde ortaya çıkmasının zaten nedeni budur.
Dolayısıyla asm her zaman için ilk öğrenilmek zorunda olan sey olmaya devam etsede bir yerden sonra C ye ve yine bir yerden sonra dahada geliştirilmiş olan daha kolay programlama yapilabilen baska bir dile gecme zorunluluğu vardır
Bunun ana zorunluluğu ortaya çıkarılan üründeki zaman sorunudur. Ayrıca isletim sistemleri dahi bugun asm ile degil C ile ve hatta daha yüksek seviyeli bir dil yazılmaktadirlar.
O yüzden ben olsam arkadaşın yerinde asm i zorlamaz C ye geçiş yapardım