Cortex M3 Assembly sorulariniz

Başlatan bunalmis, 06 Ocak 2011, 12:42:26

z

Cortex M3 assembly konusunda bir hayli yol katettigimi dusunuyorum. Assembly konusundaki sorularinizi dogrudan forma yazarsaniz cevaplandirmaya calisirim.

Notlar.

Sorular multi tasking islemlere ve cipe ozel peripheral setinglere yonelik olmasin.

Cipe yonelik peripheral settings sorulariniz olacaksa sadece TI Stellaris ailesi icin belli bir seviyeye kadar yardimci olabilirim.

Interruptlari simdi fakat Exception handling konusunu ilerleyen donemde ele alabiliriz.

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

Netbeans

Bu başlığa benim kadar sevinen başka biri yoktur sanırım.
Bu işe yeni girdim ve Assembly ile Cortex M3 te kod yazmayı öğrenmem lazım.
Yeni başladığım için ilk sorum Assembly seviyesinde kod yazmam için hangi editörü kurmam gerekiyor ?

İyi günler.

z

Cortex M3 işlemcilere assembly yazmak çok hoşuma gitmedi. Bunun en büyük sebebi, LDR ve STR tipi komutları saymazsak, ALU ünitesine Ram'dan verilerin hiç bir şekildem gelmeyişi yada bir başka deyişle doğrudan adresleme yeteneğinin olmayışı.

Bu konuda çalışanlar varsa konuyu tartışmak isterim.

A ve B iki değişken olsun ve A=A+B işlemine bakalım.

Memory den adresleme yapabilen işlemcilerde bu işlem için;

A değişkeni Acc içine çekilir.  ACC=ACC+ [B adresi] işlemi ardından  [B adresi] ne ACC yazılır.

Sonuçta bu işlem 3 satırlık bir koddur.

Hayali bir işlemci için kodu yazarsak

Load A
Add   B
Store B

ARM işlemcide bu son derece uzun bir işlem. Register isimlerini keyfi seçip yazalım.
Öncelikle A ve B adresleri ROM'a kayıt edilir. C derleyici bunu otomatik olarak yaparken ASM yazımda bunu elle yazmak gerekiyor.
A adresindeki veriyi R0 içine oku.
B adresindeki veriyi R1 içine oku.
R0=R0+R1 işlemini yap.
R0 değerini B adresine yaz.

Bunları kod olarak yazarsak

LDR  R2,[PC+A ve B nin adreslerinin saklandığı adres havuzunun adresi]
LDR  R0,[R2+A adresinin adres havuzundaki relatif adresi]
LDR  R1,[R2+B adresinin adres havuzundaki relatif adresi]
ADD R0,R1
STR  R0,[R2+B adresinin adres havuzundaki relatif adresi]

Adres Havuzu:
.
.
.
.
A Adresi
.
.
B Adresi

Böyle bir yapı işleri inanılmaz uzatıyor, adreslerin havuza yerleştirilmesi, havuzdan adresin konumunun tespiti asm yazım için işkence haline geliyor ve bunun bir programın yapması nerede ise şart oluyor. (C derleyici bunu sizin adınıza yapıyor)

Neden böyle bir mimari seçilmiş anlamıyorum.
RAM daki bir veri üzerinde hiç bir lojik yada aritmetik işlem yapılamıyor olması çok garip. İllaki veriyi önce registere çekip öyle işlem yapmak gerekiyor.

Bu da kodların uzamasına neden oluyor.

Üstelik kodların da yavaşlamasına neden oluyor.

ARM 7 de ARM modunda doğrudan adresleme komutları varmı bilmiyorum.

Saf ASM yazımla C den daha optimize kod yazıp kodları hızlandırmak için çok ama çok fazla gayret gerekiyor. Atılan taşla ürkütülen kurbağalara değmeyecek gibi görünüyor.

20Mhz lik DSP de yapabildiğim işlemleri, 60Mhz hatta 80Mhz ARM Cortex M3 de yapabilirmiyim ciddi kuşkularım başladı.

ARM işlemcileri bu açıdan ele alıp inceledinizmi?

ARM mimarisini oluşturanların bu yapıyı seçmelerindeki nedenler vs hakkında yayınlanmış kaynak varmı?







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

CoşkuN

#3
Hocam http://en.wikipedia.org/wiki/Reduced_instruction_set_computing da bahsedildiği gibi bu RISC işlemcilerin bir özelliği değil mi?

Kullandığınız DSP'lerin mimarisi ne idi acaba?

Bir de şunu buldum: http://www-cs-faculty.stanford.edu/~eroberts/courses/soco/projects/2000-01/risc/risccisc/
"At first, this may seem like a much less efficient way of completing the operation. Because there are more lines of code, more RAM is needed to store the assembly level instructions. The compiler must also perform more work to convert a high-level language statement into code of this form.
However, the RISC strategy also brings some very important advantages. Because each instruction requires only one clock cycle to execute, the entire program will execute in approximately the same amount of time as the multi-cycle "MULT" command. These RISC "reduced instructions" require less transistors of hardware space than the complex instructions, leaving more room for general purpose registers. Because all of the instructions execute in a uniform amount of time (i.e. one clock), pipelining is possible."

z

Kullandığım DSP ler Enhanced Harvard mimarisine sahip.

RISC sınıfında direk adresleme olmayacak diye şart yok. Örneğin PIC ailesi W reg ile ramdaki veriyi işleme tabii tutabiliyor. Fakat CM3 de böyle bir şey yok. İllaki Reg Reg işlemi gerekiyor.

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

CoşkuN

PIC'lerdeki durum da aynı değil mi peki? Direk adresleme yapmıyoruz da veriyi W register'ına almamız gerekiyor. PIC'teki fark ARM'daki gibi birden fazla kaydedicinin olmaması gibi geldi bana.

z

PIC de değişkenlerden en az birisi ACC içine alınmak  zorunda. (16 serisi)

Atmelde bildiğim kadarıyla Mem3 = Mem1 + Mem2  de yapılabiliyor.

CM3 de  operandlar Mem olamıyor illaki Reg olacak.

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

CoşkuN

ARM'ın sitesinde Cortex-m3 sayfasında verilen grafikte genellikle PIC18/24, AVR8, MSP430 gibi işlemcilerle karşılaştırma yapılmış. Anladığım kadarıyla M3 serisi bu kategorideki işlemcilere rakip olarak çıkarılmış. http://www.arm.com/products/processors/cortex-m/cortex-m3.php
DSP uygulamaları için M4 serisi daha uygun olabilir belki, içerisinde DSP yapısında birimler var: http://www.arm.com/products/processors/cortex-m/cortex-m4-processor.php

z

CM3, 32 bit işlemci olduğu için 32 bit aritmetik işlemlerde kafadan öne geçiyor. Fakat yazdığımız programlarda bir sürü ıvır zıvır işler 16 hatta 8 bit değişkenler üzerinden yürüyor. Her defasında bu değişkenleri rege çek işlem yap geri rama yaz hem vakit kaybı hem de rom kodunda şişme demek.

Hız değil de ucuzluk ve güç tüketimi denirse anlarım fakat CM3 de ne yalan söyleyeyim ne Intel 80X86 nede DSP tadı bulamadım. 

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

dumansiz

Alıntı yapılan: bunalmis - 28 Nisan 2011, 13:47:37

Saf ASM yazımla C den daha optimize kod yazıp kodları hızlandırmak için çok ama çok fazla gayret gerekiyor. Atılan taşla ürkütülen kurbağalara değmeyecek gibi görünüyor.

Ben şu an STM nin Cortex-M3 işlemcisine C(GCC) ile kod yazıyorum. Asm yi de öğrenmek istiyordum ama bu cümleni görünce tereddüt ettim. Çünkü GCC derleyicisinde özellikle "optimizasyon" yapılmak istendiğinde sıkıntılar yaşanıyor. Yerel değişkenlerin "volatile" tanımlanması gerekiyor vs. Merak ettiğim yazdığınız kodları C ve ASM olarak yazıp karşılaştırdınız mı? Yaptıysanız hangi C derleyicisini kullandınız?

z

Keil kullanıyorum keil C çıktısı ile yazdığım kodları karşılaştırıyorum.

Asm kodlama yaparak C ye fark atmak için gerçekten hummalı çalışma yapmak gerekiyor. Çünkü kodların yapısı gereği çok farklı kodlama yapmanız zor. Asıl fark, adres havuzunu elle doldurup havuzdan verileri 32 byte ofset dahilinde çekip kodları 16 bit yazmakla oluyor.
Bu durumda belirgin şekilde kodunuz kısalıyor fakat o havuzu oluşturmak tam bir işkence. Keil burada yapılabilecek optimizasyonu düşünmüyor. (Hız optmizasyonu değilde kod size optmizasyonu yap desek belki buna da dikkat eder (ben denemedim), fakat hem hız hem uzunluk optmizasyonu yapmak istiyorsan sanırım kendi başının çaresine bakacaksın)

Bu konuda yeniyim çok fazla birikimim yok ve yazdıklarım Arm asm öğrenecekleri kesinlikle etkilemesin.

Arm CM3 için asm program yazmak keyifli, bahsettiğim sıkıntılar ARM işlemciye DSP uygulaması yaptırmak istememden kaynaklanıyor.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#11
Burdaki olay C mi kullansam asm mi kullansam sorunu değil.  Birazcik komut setinin yada mimarinin elestirisi gibi.

Eger farkli degiskenler uzerinde ardisil lojik yada matematiksel islemler yapilacaksa degiskeni registere cek ardindan diger regle isleme tut sonucu degiskene yaz islemlerinde zaten
asm nin tadi kaciyor. Hatta optimize sansin da gidiyor.

Bir degiskenin icerigini 1 artirip yerine yazmak nerden bakarsan bak en iyimser durumda 4 cycle (5 bile olabiliyor). 
Bu yuzden CM3 mimarisini sevemedim. Bu yuzden C de yazsam asm de yazsam degisen bir sey olmayacak.

Zaten islemcinin komut seti bas bas bagiriyor ben C dili icin gelistirildim diyor bunun farkindayim. (Komut seti sistematik yazim icin gelistirilmis bu kabak gibi ortada)

Hiz hiz hiz!!!.  Lojik devrelerle paralel yurutulecek islemleri islemcide yapmak isterseniz hiz hiz dememi anlayacaksiniz. 
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

rree

Ramdeki iki sayıyı toplayalım
  MovF Ram1            W <---Ram1   .......1
  AddWF Ram2,0      W=W+Ram2  .......1
  MovWf  Ram3         W---->Ram3  .......1
                    Toplam        3   Saykıl

Cortex M3 demişsiniz
???    LDR  R2,[PC+A ve B nin adreslerinin saklandığı adres havuzunun adresi]
LDR  R0,[R2+A adresinin adres havuzundaki relatif adresi]     1
LDR  R1,[R2+B adresinin adres havuzundaki relatif adresi]     1
ADD R0,R1                                                                               1
STR  R0,[R2+B adresinin adres havuzundaki relatif adresi]     1
                                                      Tolam 4 Saykıl

Burada hız kaybı olduğu doğru. Avantaja geçildiği nokta bence  birbirine bağlı  birden fazla hesaplamalarda
Ram belleğe gitmeden index registerlerde hesaplanması. Diyelim bir fonksiyon   a= x+y , c=a+z   istenilen fonksiyon c olsun bunu asm ile yazalım kotlarda kısalma oluyormu bakalım.
   R0  <------ X
   R1  <------ Y
   R2  <------Z
   R3 = R0+R1
   R4 =R3+R2
   R4  ------>C
                           6 saykıl

MovF,0   X
AddWF   Y
Addwf   Z
MovWf  c
                      4 Saykıl
            Pic daha as saykıl harcadı ???    Başka  fonksiyonlarmı denesek. Bence avantajlı olduğu durum olması lazım.                   















z

En basitinden 32 bit işlemlerde PIC kafadan kaybeder.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Hocam ARM cortex M3 işlemciyi sırf DSP deki page adreslemeden kurtulurum, ayrıca USB donanımı kullanmama gerek kalmaz, ram ve rom yayla gibi geniş diye seçtim.
Gerçekten de öyle oldu. Fakat hız konusunda daha şimdiden korkmaya başladım.

Bitmiş vaziyetteki 40 Mips (40Mhz) 16 Bit TI DSP de asm ile kodladığım projeyi  biraz daha geliştirip 50MHZ  Arm cortex M3'e C+Asm olarak aktarmaya çalışıyorum. Sözkonusu çip aslında 80Mhz ama bir Bug'ı yüzünden şimdilik 80Mhz de çalıştırmıyorum.

Kodlamayı aynı kişi yapacağı için normal şartlarda bu savaş, 32 Bit 80Mhz çipin 16 bit 40Mhz çiple savaşı olacak.

CM3 bu işi başarırsa zaten bir daha DSP'ye dönmeyeceğim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com