Académique Documents
Professionnel Documents
Culture Documents
Kartn genel olarak kullanm ile ilgili detayl bilgileri internet zerinden bulabilirsiniz. Bende sizlere yeni rendiim bilgileri proje dosyas olarak sunmak istiyorum. Gnmzde ARM gittike yaygnlaan bir mikrodenetleyicidir. Bu tip boardlar ile projelerimizin ierisinede girmeyi baarmtr.
ARM zellikleri ARM tam olarak olmasa da RISC snf bir ilemcidir. (Reduced Instruction Set Computer) yani komut seti azaltlm bir ilemcidir. Neden tam olarak RISC ilemci olmadn aklayalm. ncelikle R1 den R16ya kadar 32 bitlik registerlara sahiptir ayrca btn komut setlerini conditional yani durumsal olarak kontrol edebiliriz ve son olarak 32bitlik barrel shiftera sahiptir bu da bilindii zere combinational bir devredir yani saat sinyalinden bamsz olarak bir saat darbesinde birka ilem yapmaya olanak salar. Saydmz tm bu zellikler ARM ilemcileri tam olarak RISC snf bir mikroilemci yapmaz. ARM toplamda 6 tane ilem moduna sahiptir ve 37 tane register yani yazmadan olumaktadr. Bu yazclarda 31 tanesi 32bitlik genel amal yazmalar, 6 tanesi durum yazmalar ve R0dan R14e kadar 15 adet programc tarafndan programlanabilen yazmalara sahiptir. Genel olarak little endian sisteme sahip olmakla birlikte istenirse big endian olarak da ayarlanabilir. Burada Little Endian ve Big Endiannn tam olarak trkelerini bilemediimden dolay trkelerini yazmyorum J. Litlle endian gsterim format bildiiniz zere en dk adresli konumda yazma iindeki en dk deerli (least significant bit) bit tutulur.
ARM 1
lk yazmzn ardndan, ikinci yazmz ile ARMa devam ediyoruz. Bu yazmzda ARM mimarisine daha ayrntl bir ekilde deineceiz. lk olarak ARM mimarisinin ok basit bir gsterimini yapalm.
Yukardaki ekilden de grlebilecei zere register file olarak adlandrlan yazmalardan alnan deerler ALU yardmyla ileme tutularak sonu tekrar yazmalara yazlr. Burada dikkat edilmesi gereken ikinci operandn barrel shifter vastasyla ALUya alnddr. Yine MAC yani multiply accumulate trke sylemek gerkirse arpma ve toplama nitesi 32 bitlik yazmalardan verileri alr ve sonucu registera yazar. Load / Store komutlar ise adresi oluturmak iin ALUyu kullanrlar. Bylece temel olarak ekirdein ok basit bir ekilde ne yaptn renmi olduk imdi register yani yazmalara giri yapalm. REGISTER Registerlar ilk yazmzda da deindiimiz gibi 32 bit uzunluundadr. Registern ksaltmas olan R harfi ile adlandrlrlar R0 dan R14e kadar kullancnn kullanabildii yazma vardr. Bunlara aktif yazma ad verilir. Aadaki ekilde yazmalar gsterilmitir. Toplamda durum yazmalarnn eklenmesi ile 18 aktif yazma bulunmaktadr.
Yukarda ekilden de anlalaca zere r13,r14 ve r15 yazmalarnn zel grevleri bulunmaktadr. Bunlar; R13 : Stack Pointer olarak grev yapar. Verinin stack iine alnmas ile stackin current processor modunda ban tutar. R14 : Link Registerdr. Altprogram arldnda dn adresini tutar. R15 : Program Counter. lemci tarafndan fetch edilecek bir sonraki komutun adresini tutar. R13 ve r14 istenildii takdirde genel kullanm amac ile kullanlabilir ancak bu pek tavsiye edilen bir ilem deildir nk genelde iletim sistemleri nceden belirtilen grevleri yapmak zere ilemcinin bu blmlerini kullanmaktadr. Yukarda aklanan yazmalara ilave olarak durum deikenlerini tutan iki tane yazma bulunmaktadr. Bunlar ; Current Program Status Register Saved Program Status Register
Adnda anlalabilecei gibi bu yazmalar registerlar zerinde yaplan ilemlerden sonra sonuca gre deien bitleri barndrmaktadr. Durum register bitleri aada gzkmektedir.
Burada N,Z,C,V,Q gibi bitler yaplan ilemlerde sonra sonucun zero yani sfr, negatif olup olmamasna elde bitinin varlna overflow yani tama olup olmadna veya saturation olup olmadna gre deiirler. Bata yer alan I,Fve mode bitleri ise IRQ ve FIQ kesmelerini maskelemek iin kullanlr. Mode blm ise birazdan deineceimiz ilemci modunu belirler. T biti ise THUMB komut setini aktifletirmek iin kullanlr. Yani 16 bitlik Thumb komut setini kullanmak istiyorsal bu biti 1 yapmalyz. Eer 32 bitlik komut setini kullanmak istiyorsak bu bit 0 olmaldr.
lemci Modlar Bir nceki yazmzda da belirttiimiz zere toplamda 37 yazmacmz vardr ve bunlar ekil 1 de gsterilmiti. Programc bunlarn 17 tanesi ile iletiim kurabiliyordu. Geri kalan 20 yazma ise ilemci modlarna gre otomatik olarak kullanlr ve kullanc bunlara direkt olarak eriemez. Bunlara Bank Register ad verilir. Bu modlar ( User, FIQ, IRQ,SCV and Undef ) arasnda deiim interreptlar srasnda donanmsal olarak olabilecei gibi CPSR yazmacna program tarafndan ilgili blme kodlar girilerek de yaplabilir.(Bunu gerekletrmek iin Privilegedi evet olan bir modda olmak gerekir) lemcinin modlar ve gei yaplabilecei bit durumlar aadaki ekilde ayrntl olarak gsterilmitir.
Komutlarmzn hangi srmlerde geerli olduunu rendikten sonra komut setlerinin temel yapsna deinelim. ncelik komutlar prefix ve postfix ekler alrlar. rnek olarak Hafzann bir blmne ulamak iin prefix ve postfix komulara ihtiya duyulur. mem<data_size>[adress] eklinde bir komut varsayarsak ; mem32[1024] burada 32 prefix 1024 ise postfixdir. Yani 32 bitlik balang adresi 1Kb olduunu belli eder. Arm komutlar verileri register iinde ilerler. Bu yzden verileri ilemeden nce mutlaka registerlara transfer edilmesi gerekmektedir. Bu bilgi bizim iin ok nemlidir. Bunu yapmann yolu hafzada load/store komutlar kullanarak verinin yazmalara alnmasn salamaktr. ARM komutlar genel olarak 3 veya 2 operand alrlar. Bunu bir rnek ile aklamak gerekirse; ADD r0(rd),r1(rn),r2(rm) Komutu r2 ve r1 yazmalarnn iindeki deerleri toplayarak sonucu r0 yazmacnn iine atar. burada rd, rn ve rm deerlerini ARM1 adl yazmzda gsterdiimiz ilk fotorafta yer alan blok diyagramda hangi registerlar olduunu gstermesi iin ekledim. Buradan elde edilecek bilgi eer komut setinde barrel shifter kullnmak istiyorsak bunu sadece rm iareti olan r2 yazmacnda yapabiliriz.
MOV Komutu : Mov komutu her mikroilemcide olduu gibi ARM mikroilemcilerinde de bulunur. Kullanm ok basittir. lem yapmadan nce registera istenilen ilk deerlerin yklenmesini salar. Kullanm yaps u ekildedir. <instruction>{<condition>} {S} Rd, N MOV r0, r1 veya MOV r0,5 iki rnektede grld gibi R1 ve 5 ifadesi N deerine karlk gelmektedir. Yani MOV komutu ile sabit bir say veya bir yazma deerini dier bir yazmaa atabiliriz. MVN Komutu : Mov komutunun yapt ilemin yannda sonucun deilini alr. MVN Rd,N yazarsak N iindeki deerin deilini alr yani sonu olarak Rd deeri ~N e eit olur.
Barrel Shifter : lk yazlarmzda da deindiimiz gibi komutlarmzn iinde barrel shifter kullanabiliriz. Bu ilemi yapabilmemiz iin deerin Rm yazmac iinde olmas gerekir.( Bknz : ARM-1 Yazs ilk ekil) Bu kaydrc vastasyla register iindeki deeri, komutun belirtildii sini deitirmeyecektir. Ksaca sonular ALUda ileme tabi tutulmadan nce barrel shifter vastasyla n ileme tutulurlar. MOV r7, r5, LSL #2 ; Bu ilemin sonunda r7 = r5*4 = (r5 << 2) olur.( Saysal devrelerden hatrlarsanz bir sayy iki sola kaydrmak sayy 4 ile arpmak ile eittir. Yine ayn ekilde sayy 2 saa kaydrmak sayy 4e blmek demektir. Barrel Shifter ile kullanacamz komutlar aada gzkmektedir. Operation Description Logical shift left Logical shift left Logical shift right Logical shift right Assembler Cycles
Arithmetic shift rightASR Rd, Rn, #<imm>1 Shift Arithmetic shift rightASR Rd, Rn, Rs 1
Burada greceiniz zere komutlarn ka cycle alaca aklanmtr ve iki trl kullanm bulunmaktadr. Bu kullanmlar herhangi bir registern deeri belirlenen sabit bir say kadar kaydrlabilir veya herhangi bir yazmacn belirttii deer kadar kaydrabilir. Son olarak bir rnek verelim. cpsr = nzcvqiFt_USER | r0 = 000000000 | r1 = 080000004 MOVS r0, r1, LSL #1 cpsr = nzCvqiFt_USE | r0 = 000000008 | r1 = 080000004
Yukarda rneimizde ilk nce cpsr bitlerimizin bilgi durumu gsterilmitir. daha sonra r0 vr r1 yazmalarnn ilk deerleri belirlenmitir. Burada MOVS komutu grlmektedir. Bu komut yeni bir komut deildir sadece mov komutuna ekstra zellik kazandrmaktadr. Buradaki S harfi cpsr yazmacnn deerini gncelleme demektir. MOVS komutu iletildiinde grld gibi r1 yazmac bir bit sola kaydrlm ve sonu r0 yazmacna yazlmtr ve cpsr yazmac da C byk harfle gsterilmitir yani elde olmutur.
Aada yer alan tablodan ise kullanlabilecek komutlar ve bu komutlarn aklamalarn bulabilirsiniz.
32 bitlik 2 veriyi ve elde bitini toplar Rd = Rn + N + carry 32 bitlik 2 veriyi toplar 32bitlik 2 sayy karr Rd = Rn + N Rd = Rn N
RSC
Normal karma ileminde eksilen ve farkn yerleri deimesine ilave olarak eldenin de hesaba katlmas Rd = N Rn !(carry flag) Normal karma ileminde eksilen ve farkn yerleri deimitir Rd = N Rn Elde bitini hesaba katarak karma ilemi
RSB
SBC
Rd = Rn N !(carry flag)
Kullanacamz komutlar akladktan sonra imdi biraz grsel rnekler zerinde alalm. Balang olarak r0 = 000000000 | r1 = 000000002 | r2 = 000000001 deerlerimizin olduunu dnelim. SUB r0, r1, r2 komutunu uyguladktan sonra r0 = 000000001 olacaktr. Balang olarak r0 = 000000000 | r1 = 000000077 | olduunu dnelim. RSB r0, r1, #0 komutunu uygularsak 0 dan r1 deerini karr. Yani; Rd = 00 r1 r0 = -r1 = 0xffffff89 olacaktr.
Yukardaki komut dikkatli incelenirse SUB komutunun tersi bir yapya sahiptir. Yani SUB komutuna gre eksilen ve fark yer deitirmitir. Bir sonraki rneimizde komut yapsnda yer alan S ekini
kullanalm. Hatrlayacanz zee komuta ek olarak kullanlan S komutu cpsr iindeki bitleri gncellemeye yaryordu. cpsr = nzcvqi | r3 = 000000001 | deerimizin olduunu dnelim. SUBS r3, r3, #1 komutu ile r3 yazmacndan 1 karp sonucu yine r3 yazmacna yazarz r3 = 000000000 sonu olara r3 0a eit olacak ve nZCvqi gncellenecektir.
Bu zamana kadar genelde karma ilemi yaptk bu rneimizde ise hem barrel shifter hemde toplama rneimizi yapalm. Balang olarak r2 = 000000000 | r4 = 000000005 olduunu dnelim. ADD r2, r4, r4, LSL #2 komutunu uygularsak r4 yazmac ilk olarak iki kere sola kaydrlacak ( 4 ile arplacak ) ve daha sonra tekrar r4 ile eklenip r2 ye yazlacak yani 5 * r4 ilemi yaplm olacaktr. r2 = 000000014 | r4 = 000000005 olacaktr. Son olarak aritmetik ilemlerimizi iaretli ve iaretsiz olarak ( signed and unsigned) olarak yapabileceimizi hatrlatarak konumuza arpmada kullanlacak komutlarla devam edelim. arpma Komutlar arpma komutlarn kullanrken dikkat etmemiz gereken en nemli husus arpmann sonucunun ka bit olacadr. Eer arpma ileminin sonucu 32 biti ayorsa burada sonucun 64 bitlik sonu reten arpma kodlarn kullanmamz gerekmektedir.
MLA MUL SMLAL SMUL UMLAL UMULL arp ve Topla arp aretli olarak uzun arp ve topla aretli uzun arpma aretsiz olarak uzun arp ve topla aretsiz uzun arpma Rd = (RmRs) + Rn Rd = RmRs [RdHi, RdLo]=[RdHi, RdLo]+ (Rm Rs) [ RdHi, RdLo]= Rm Rs [RdHi, RdLo]=[RdHi, RdLo]+ (Rm Rs) [RdHi, RdLo]= Rm Rs
Yukarda ki tabloda grlen komutlarn yaps u ekildir. MLA ve MUL komutlar iin {<cond>}{S} Rd, Rm, Rs, Rn Dier 4 komut iin <instruction>{<cond>}{S} RdLo, RdHi, Rm, Rs
Burada ufak bir hatrlatma yapmak istiyorum. Komutun iletme evrimi (instruction cycle) 1 deildir. Bu zaman ilemcinin mimarisine ve rs iindeki saynn geniliine gre deimektedir. Son olarak MUL ve UMULL komutlarn kullanalm. r0 = 000000000 | r1 = 000000002 | r2 = 000000003 ilk deerlerine sahip olduunu dnelim. MUL r0, r1, r2 ; komutu ile r2 ve r1 arplp sonu r0a atlr. Yani r0 = r1*r2 . r0 = 000000006 | r1 = 000000002 | r1 = 000000003
imdi 32 bitlikten geni bir yer tutan arpma ilemini iaretsiz olarak yapalm.
r0 = 000000000 | r1 = 000000002 | r2 = 0xf0000002 | r3 = 000000002 ilk deerlerini dnelim UMULL r0, r1, r2, r3 ; komutunu uygularsak sonu 32 bitten fazla olacandan dolay ilemin sonucu yksek 32 bit r1 yazmacnda ve dk 32 bit r0 yazmacnda olmak zere tutulacaktr. Yani [r1,r0] = r2*r3 olacaktr.
Mantk Komutlar Yazmzn ikinci blm mantk operasyonlarn iermektedir. Mantk operatrleri aada aklamalar ile yer almaktadr. Bu aklamalara girmeden nce komut yapsn verelim. Komut yaps aritmetik operatrlerin kullanm ile ayndr. <instruction>{<cond>}{S} Rd, Rn, N
32 bitlik 2 veriyi ve ilemine tabi tutar Rd = Rn & N 32 bitlik 2 veriyi or ilemine tabi tutar Rd = Rn | N 32bitlik 2 sayy xor ilemine tabi tutar Rd = Rn N 32bitlik 2 sayy ve deil ilemine tabi tutar Rd = Rn & N
r0 = 000000000 | r1 = 002040608 |r2 = 010305070 | ilk deerlerini dnelim. ORR r0, r1, r2 komutunu uygularsak r0 = 012345678 sonucuna ularz. Son rnek olarak BIC komutunu kullanalm. Bu komutun yapt ilem yukarda da belirttiimiz zere ve deil ilemidir. r0 = 0b0000 | r1 = 0b1010 | r2 = 0b0101 olarak tanmlansn. Burada tanmlamamzn binary olduunu unutmayn. BIC ro,r1,r2 komutunu ugularsak ( r0 = r1 and (not r2)) ilemini yapm oluruz. r0 = 0b1010 sonucuna ularz
Yukardaki tablodan greceiniz zere aslnda bu komutlarla yaplan ilemleri daha nce renmitik. CMP ile karma ilemi yapp sonucuna gre eer ilemin sonucu sfrsa SIFIR bayra 1 yaplr. CMN ileminde de ayn mantk kullanlmakla birikte sadece ikinci register deerinin tersi alnarak karlma yaplmaktadr. TEQ ilemi ile mantksal xor ve yine benzer ekilde TST ile mantksal ve ilemi yaplr sonuca gre bayraklarn durumu gncellenir. Son olarak konu ile ilgili olarak basit bir rnek verelim. cpsr = nzcvqi bayrann ilk nceki durumu r0=24 | r2=24 CMP r0, r2 cpsr = nZcvqi bayrann son durumu. Grdnz gibi Z bayra 1 olmutur. Burada ro ve r1 deeri birbirinden karldnda sonu sfr olduundan dolay Z biti 1 yaplmtr.
Dallanma Komutlar Dallanma komutlar ile alt programlarn altrlmas dnglerin yaplmas ve if-else gibi komutlarn iletilmesi mmkn olmaktadr. Aada kullanabileceiniz komutlarn listesi bulunmaktadr.
Dallanma
pc = etiket pc = etiket | lr = blden sonra gelen bir sonraki komutun adresi pc = Rm & 0xfffffffe, T = Rm &1 pc = etiketpc = Rm & 0xfffffffe, T = Rm &1 lr = blden sonra gelen bir sonraki komutun adresi
BL
BX
Dallanma deiimi
BLX
Bu komutlarn kullanm sz dizimi u ekildedir. B{<cond>} etiket BL{<cond>} etiket BX{<cond>} Rm BLX{<cond>} etiket | Rm
Laf ok fazla uzatmadan rneklere geelim isterseniz. lk rneimizde ileri veya geri dallanmann nasl gerekletireceimizden bahsedeceiz.
B ilerle ADD r1, r2, #4 CMP r0, r6, ADD r3, r7, #4 ilerle AND r1, r1, r3 dongu ADD r1, r2, # CMP r0, r6, AND r1, r1, r3 B dongu
lk rneimizde B ileri komutu ile altnda belirtilen kodlar ilenmeden direkt olarak ilerle etiketine srama yaplmtr. kinci rneimizde ise surekli olarak b dongu etiketine dn oluturan her seferinde etiketin altndaki kodlarn iletildii sonsuz bir dng tanmlanmtr.
Bundan sonraki rneimiz ise bir alt programn ana programdan nasl arld ile ilgilidir. BL AltProgram ; AltPrograma dallanma CMP r1,r2 ADD r1,r2,r3 AltProgram CMP r2,r4 ADD r5,r6,r8 MOV pc, lr ; BLnin alt satrna geri dndrme bu programn incelenmesini yaparsak ilk nce BL ile AltProgram etiketi arlr daha sonra bu etiketin altndaki komutlar ilendikten sonra link yazmacnn deerini program yazmacna atarak programn BL kodunun alt tarafndan yani CMP r1,r2 ile tekrar balatlmas salanr.
Konunun anlalmas iin basit bir rnek yazalm ve bu rnei bir grsel ile ifade edelim. MOV ro,5 MOV r1,200 STR ro,[r1] LDR r2,[r1]
Bu kod blouuzda MOV komutuyla yazmalara balang deerini vermi bulunmaktayz. Daha sonra ise STR komutuyla ro deerini r1in gsterdii bellekteki adrese yazlmas gerekletrilmitir. STR komutuyla yaplan i ise r1 in gsterdii adres deerinin iinde yer alan verinin r2 yazmacna yklenmesidir. Bu konu iin grsel aklama aada yer almaktadr. Grsel konuyu anlamanz
kolaylatracaktr. Burada tanan saylar 32 bit eklindedir. Eer 16 bit veya 8 bit uzunluunda ilemler yapmak isteseydik yapmamz gereken tek ey tabloda buna karlk gelen deerleri programmzda yazmak olacakt.
Veri
bellek[balang yazmac + ofset] bellek[balang yazmac + ofset] bellek[balang yazmac
Yazmc
balang yazmac + ofset gncellenmez balang yazmac + ofset
rnek
LDR r0,[r1,#4]! LDR r0,[r1,#4] LDR r0,[r1],#4
Tabloyu aklamak gerekirse preindexde yap ncelikle tamann gereklemesi prensibine dayanr eer base yazmacnn deerinin gncelleme istersek ! nlem iareti kullanmamz gerektiini grrz.Post indexleme de ise tama ileminin sonradan gereklemesi ve base yazmacnn otomatik olarak deer arttrmas gereklemektedir. Bu modlarn birbirine gre avantaj ve dezavantajlar bulunmaktadr. Preindexde bir veri yapsnn elemanlarna eriim salanabilirken post index ve preindex with write back belli bir array iinde gezinti yapmak iin idealdir. Konunun anlalmas iin yine basit bir rnek zerinden gidelim. MOV ro,5 MOV r1,200 STR ro,[r1, #12]
Kod parasn dnelim. Burada yaplan temel ilem ilk rnekten farkl olarak r1in gsterdii adrese 12 eklenerek ron iindeki 5 saysnn bu adrese yazlmasdr. Bunu aada yer alan grsel ile aklayabiliriz.
Yukardaki rneimize ek olarak eer veriyi 0*1f4 adresinde saklamak isteseydik STR ro,[r1, #-12] komutunu kullanmamz gerekecekti. Yine ayn ekilde base yazmacnn deerini otomatik olarak deitirmek isteseydik STR ro,[r1, #12]! kullanmamz gerekecekti. Btn kullanm yntemlerinin akland tabloya aadan eriebilirsiniz.
Yaps
[Rn, #+/-ofset_12] [Rn, #+/-offset_12]
Barrel Shifter ile register nindexleme [Rn, +/-Rm, shift #kaydrma_miktar] Preindex writeback ile sabit bir deerle nindexleme Preindex writeback ile register kullanlarak nindexleme Barrel Shifter ile register kullanlarak Preindex writeback Sabit bir deerler sonindexleme Register kullanarak son indexleme Barrel Shifter ile register kullanlarak Son indexleme [Rn], +/-Rm, shift #kaydrma_miktar [Rn, +/-Rm, shift #kaydrma_miktar]! [Rn], #+/-offset_12 [Rn], +/-Rm [Rn, +/-Rm]! [Rn, #+/-ofset_12]!
Bugnk son rneimizi ise post indexleme kullanarak verelim. MOV ro,5 MOV r1,200 STR ro,[r1], #12
Burada postindexleme kullanlmtr. Dier rneklerden deiik olarak burada 5 deeri ilk nce 200 adresine yazlr daha sonra base yazmacnn deeri 12 arttrlarak 0*20c olur. Aadaki ekilden post
indexleme
ile
yaplan
ilemi
daha
iyi
anlayabilirsiniz.
Yine ayn ekilde eer veriyi 0*200 adresinde tutup base yazmacnn son deerinin 0*1f4 adresini gstermesini isteseydik STR ro,[r1], #-12 komutunu kullanmamz gerekecekti.