Sie sind auf Seite 1von 207

ARM Programlama

ARM Programlama

ARM Programlama
ARM konusunda oluturulan bu e-kitap size ARM Cortex-M4F tabanl ilemcilerin alma yaps, C
programlama ve Assembler konusunda gerekten hatr saylr bir kaynaktr. Eitimler Texas Instruments
firmasnn dk g tketimi ile alan ve olduka ucuz olan Stellaris Launchpad kiti kullanlarak
anlatlmtr. Yazlar Dr. Miro Samek'in yaynlad ve Eren BATRK'n evirdii eitimler temel alnarak
yazlmtr. Bu yazlar hazrlarken desteini grdm Ahmet Alpat'a ve tm izgi-TAGEM ailesine
teekkrlerimi sunuyorum. Faydal bir yaz olmas dilei ile, iyi almalar.
Arif Ahmet Balk

Yazar Hakknda

ARF Ahmet BALIK

Bir teknik lisede web programcl dalnda okuyor. Gml sistemler ve FPGA merakls.
birkodyaz.blogspot.com.tr adl bloun kurucusu ve yazar. uan YT Teknoparkta bir ARGE irketi olan
KATIHAL Elektronik Yazlm ARGE A'de part-time olarak alyor. stanbul HackerSpace yesi.
letiim
arifbalik@outlook.com

Eren BATRK
1990 Kayseri doumlu. 2005 ylnda ilkokul eitimini tamamlayp Antalya Adem Tolunay Anadolu Lisesinde eitimine
devam etti. 2009 ylnda Sleyman Demirel niversitesi Elektronik ve Haberleme Mhendislii blmn kazand. Halen
ayn niversitede 3.snf rencisi olarak eitimine devam etmektedir. Gml Sistemler , Linux letim Sistemleri , Fpga ,
Yazlm Gelitirme ve Saysal Elektronik zerine almalarn srdrmektedir.
letiim
iletisim@erenbasturk.com

ARM Programlama

ARM Programlama

NDEKLER
1. Balang .........................................................................................................................4
2. Saym ..............................................................................................................................10
3. Kontrol Ak ..................................................................................................................42
4. Deikenler ve aretiler ..............................................................................................56
5. Led Yakp Sndrme.......................................................................................................75
6. nilemci ve Volatile.....................................................................................................101
7. C'de Bitsel Opreratrler ...............................................................................................114
8. Diziler ve areti Aritmetii.........................................................................................135
9. Fonksiyonlar ve Stack...................................................................................................155
10. Modller, zyineleme ve AAPCS169

ARM Programlama

ARM Programlama

ARM Programlama

ARM Programlama
Herkese Merhabalar, lk derste cretsiz gml gelitirme ara setini (IAR Embedded
Workbench) ykleyeceiz ve pahal olmayan bir gelitirme kart olan Stellaris
Launchpad'i nereden sipari edeceimizi gstereceim. Bu kart sayesinde kodlarnz
fiilen gerek bir mikrodenetleyici zerinde altrabilirisiniz. Ancak gelitirme
kart olmadan da bu eitim serisini takip edebilirsiniz nk komut seti
simlatrnn nasl kullanlacan reneceiz.

C Programlama Dili
reneceimiz yksek seviyeli olarak adlandrlan programlama dili
C'dir. Fakat sklkla dk seviyeli makine
koduna ineceiz ve size gml ilem srecinde neler olacan gstereceim. Siz'de
ilemcinizin kodunuzu nasl altrdn verileri nasl ilediini ve bir
bilgisayarn gerek dnyada yapabildii eyleri greceksiniz. Bir ledi yakp sndrmek
gibi. Bu kavrama gc sizin C dilini daha etkin ekilde ve daha fazla gven duygusu
ile kullanmanz salayacak. Programlama anlayn kazanacaksnz. Sadece
programnzn yapmas gerekenleri deil,
bunun yannda bu durumlarn nasl makine dolarna nasl evrildiini anlayn ve
ilemcinin kodlar ne kadar hzl altrabildii anlayn kazanacaksnz.
ARM Cortex-M4F

ARM Programlama

ARM Programlama
Bu Kursta Arm Cortex-M4F adndaki ilemciyi kullanacaz.
Ama bu rendiklerimizi btn Cortex-M ilemci ailesine CortexM0'dan M0+'a, Cortex-M3 ve M4'e uygulayabileceksiniz.

Bu kurs boyunca gnmzde ve uzun yllar boyunca


bulabileceiniz gml mikrodenetleyici ilemci ekirdeklerinden en
popler, en modern ve en fazla enerji tasarruflu ilemci ailesini
setim.
IAR Embedded Workbench

ncellikle bu kurs iin ilk ihtiyacmz olan gml gelitirme


setini "Embedded Workbench for ARM" iin desteklenen IAR'dan EWW
sistem olarak adlandrlan profesyonel ara setini setim. Bu ara
setinin ticari versiyonu piyasadaki en pahal versiyonlardan
birisidir ancak IAR size kod limiti olan zaman limiti olmayan bir
yazlm gelitirme srmn soruyor, imdi hangi srm nasl
indirilecek ve nasl yklenecek gstereceim. IAR EWARM'n
yklenecei websitesi www.iar.com. Siteye girdikten sonra ekildeki
gibi nce SERVICE CENTER sonra Downloads'a tklayalm.

ARM Programlama

ARM Programlama

Sonra ekildeki gibi ARM iin Size-limited licence'n altnda bulunan


balantya tklayalm.

Karmza kan szlemeyi aaya kaydrarak ekildeki gibi indirme


balantsna tklayalm.

ARM Programlama

ARM Programlama

Dosya boyutu biraz byk olduu iin indirme biraz zaman alabilir.
Dosya indikten sonra ift tklayp an ve yklemenin tamamlanmasn
bekleyin.

ARM Programlama

ARM Programlama

Ykleme bittikten sonra karnza kan ekrandan ekildeki gibi


"Install IAR Embedded Workbench" zerine tklayn.

Geriye kalan standart ykleme ilemini gerekletirin. Ykleme


bittikten sonra karnza bir uyar kacaktr bu uyar size
ARM Programlama

10

ARM Programlama
"licence dongle yklensinmi" diye soruyor. buna hayr deyip
geiyoruz.
IAR ile ilk karlatnzda size bir kayr ilem kutusu ibraz
edilecek. "Register"a tklayn. Doldurmak zorunda olduunuz kayt
formu karnza kacak buradaki en nemli adm kod limiti lisans
trn semek geri kalan eyleri doldurup son olarak "submit
registration" butonuna tklayn. Mail adresinize eglen linki an ve
lisans numarasn IAR' atmzda karmza kan ekrandaki metin
kutusuna yazn.
Tebrikler! Artk gml yazlm gelitirmek iin bir ara setine
sahipsiniz.
Stellaris LM4F120 Launchpad

Dersin son aamas olarak pekte pahal olmayan bir gelitirme


kartnn nasl alnacan gstereceiz.
Tekrar ediyorum bu aama gerekli deildir IAR ara setinde bulunan
simulatr ile derslerin byk blmn takip edebilirsiniz.
uan izgi-TAGEM'in internet sitesinde %29 indirimli olarak 39,83
TL'ye bu gelitirme kartn alabilirsiniz. ilgili web sitesi :
http://market.cizgi.com.tr/product/education/ti-stellaris

ARM Programlama

11

ARM Programlama

SAYIM
Tekrar merhaba. Gml sistem programlama derslerinin 2. serisine
ho geldiniz. Bu derste bilgisayarlarn nasl saym yaptn
greceiz. Bu ve bundan sonraki derslerde, ilk derste anlatlan IAR
ara setinin cretsiz srmn kullanacaz.
lk projemizi oluturalm, IAR EWARM' balatn ve Project > Create
New Project mensn sein.

Karmza kan ekranda C proje tipini geniletelim ve main'e


tklatalm.

ARM Programlama

12

ARM Programlama

Bir dosya gezgini alacak, projeniz iin kaydedilecek bir yer


semelisiniz. Ben btn ders boyunca Gml Programlama adnda bir
klasr oluturup projeleri buraya kaydedeceim, sizinde byle
yapmanz tavsiye ediyorum. Bu klasr altnda ders 1 adnda bir
klasr daha ap proje isimini ise proje yapyorum ve kaydet
diyoruz.

ARM Programlama

13

ARM Programlama

Grdnz zere, birazdan aklayacam proje oluturulmu bir main


dosyas ieriyor.

ARM Programlama

14

ARM Programlama
Projenin konfigrasyonunu bitirmek iin birka parametreyi
ayarlamanz gerekiyor. Project > Options mensne tklatalm.

Target sekmesi iinde, ilemci trn belirtmemiz gerekiyor.


Device'i sein ve seim butonuna tklayn, listeden "Texas
Insruments > LM4F Family ve LM4F120H5QR" donanmn sein.

ARM Programlama

15

ARM Programlama
Hemen sonra C/C++ Complier kategorisini sein. Varsaylan dil olarak
C'yi ve varsaylan C diyalektini c99 olarak gryorsunuz.

Bu eitim boyunca size en yeni C diyalektini reteceim. (Diyalekt


: Yazm Standard)
Son olarak Optimizations sekmesini aalm ve varsaylan optimizasyon
seviyesinin low olduundan emin olalm.

ARM Programlama

16

ARM Programlama

yksek optimizasyonlu kodun nasl yazldn retene kadar, byle


kalmas gerekiyor. OK deyip kapatyoruz.
Bylelikle, sonunda IAR ara seti araclyla oluturulmu kodlara
eriiyoruz.
Nitekim ilk olarak geerli olan C kodlarn dorulamay deneylim.
Bunu derleme ilemi ile yapabiliriz. Bu derleme derleyici denilen
(Complier) denilen bir program aracl ile alyor. Project
mensnden Make seeneini sein ve F7 ksa yolunu bir yere not
edin, ounlukla bu ksayolu kullanacaksnz.

ARM Programlama

17

ARM Programlama

Projenizi ilk derlediinizde IAR bir dosya gezgini ile size alma
alannz sorar, genel bir isim verip kaydedelim (calisma_alani)
Bu derleme 0 hata ve 0 uyar ile tamamlanyor. lk legal programnz
iin tebrikler.

ARM Programlama

18

ARM Programlama

Kodlarn daha dzenli ve okunabilir olmas iin biraz dzenleme


yapalm.

ARM Programlama

19

ARM Programlama
ilk kme parantezini bir st satra aldk ve return 0; ve bundan
sonra gelecek ifadeleri 4 boluk girinti olacak ekilde ayarladk,
aslnda bu derleyici iin hibir nemi yoktur, derleyici btn
kodlar tek ve uzun bir satr olarak alglar, yaptmz bu
dzenlemeler kodun okunabilirliini arttrmak iindir.
Fakat C ile yaptmz her ilem legal deildir. rnein illegal bir
eyler yazp F7'ye basp tekrar derleyelim.

Bu sefer derleyici bize hatalar bildiriyor. Hata raporunun zerine


ift tkladnz zaman sizi hatann olduu satra gtryor.
Problemi giderdikten sonra kodun doruluunu kontrol etmek iin
tekrar derleyiciye sormak iyi bir yol.

ARM Programlama

20

ARM Programlama

Derleyicinin, sizi omzunuzun zerinden izleyen en iyi dostunuz


olduuna inanmanz istiyorum, tm ihtiyacnz sk sk F7'ye basarak
ona bir ans vermeniz.
imdi bilgisayarlarn nasl saym yaptn gstermek iin
kullanacamz bir saya deikeni tanmlayalm.

Bir deiken bir deeri bilgisayar belleinde tutmak iin bir


konumdur, bir say gibi. C'de bir deer kullanmadan nce bir
deiken tanmlamak zorundasnz. Bunu deikenin trn belirtip
(1) ardndan bir isim belirtip (2) ve opsiyonel olarak bir balang
deeri belirterek yapabilirsiniz (3).
ARM Programlama

21

ARM Programlama
Hemen F7'ye basarak kodumuzun doru alp almadn
derleyiciye soralm.

Gzel. Hibir hata yok fakat sayac adl deikeninin tanmland


ancak kullanlmadn syleyen bir uyar var, bu doru.
imdi saya deikenini u anki deerinden birer birer arttralm.
C'de bu arttrma iin n arttrma (pre-increment) olarak
adlandrlan zel bir operatre (++) sahip.

ARM Programlama

22

ARM Programlama

Her zamanki gibi derleyiciyi kontrol edelim.

Bilgisayarn nasl saym yaptn izlemek istediimiz iin sayac


adl deikeni birka kez daha arttralm.

ARM Programlama

23

ARM Programlama

F7'ye basp son bir kez daha derleyelim ve dzgn altndan emin
olalm.
imdi bu programn nasl altrlacan gstereceim. ncelikle
projenin simulatr iin yaplandrldndan emin olun, aslnda bunu
stteki simulatr mensnden anlayabilirsiniz fakat iki defa kontrol
edelim. Project > Options mensne tklayn. Debugger kategorisinde
Simulator seeneini grmelisiniz.

ARM Programlama

24

ARM Programlama

Program altrmak iin 2 seenee sahipsiniz. lki Project >


Download and Debugmens, dieri ise ara ubuu butonu. Ben bu
butonu kullanacam.

imdi, IAR ara seti hata ayklaycs (Debugger) moduna geti.


Takip eden hata ayklayc grnmlerinin grnr olduundan emin
ARM Programlama

25

ARM Programlama
olun (Disassembly, Memory, Register ve Locals), bunlar amak iin
View mensnden ilgili alanlar seelim.

Menleri srkleyip dzenleyelim. Bylece ARM Cortex-M4F


ilemcisinin iindeki en iyi grnme sahibiz.

ARM Programlama

26

ARM Programlama

ncelikle Disassembly mensne gz atalm. Programmz iin


derleyici tarafndan retilmi olan kodlar bu grnm mens size
makine kodu olarak gsteriyor. Ana (main) fonksiyomuzun
balangcndaki vurgulanm satrda ilemci durmu.

ARM Programlama

27

ARM Programlama

Makine Komutlar, bilgisayarn iinde baka bir deyile sadece


saylardr.

Sembollerin sandaki komutlar, komut anmsatc (instruction


mnemonics) olarak adlandrlr ve komut anmsatclar hata ayklac
tarafndan okunurluu arttrmak iin ekleniyor.

ARM Programlama

28

ARM Programlama

Sembollerin solunda kalan say stunlar komutlarn bellek


adresidir. Bellek adresleri basit olarak bellee bayt olarak atanan
saylardr. Unutulmamaldr ki komutlar sadece bellekteki
saylardr.

Bellek grnm mensne bir gz atalm. Bellei byk bir bayt


tablosu olarak dnebilirsiniz. Sfrdan balayp sral olarak
numaralandrlm.

ARM Programlama

29

ARM Programlama
Bunlar sralar saylar, adresler olarak adlandrlanlar, bellek
grnm mensnn solunda say stunu boyunca gsteriliyor.
Bellekteki makine kodlarn daha iyi tanmak iin grnm 2xbirim
olarak deitirelim nk ARM Cortex komutlarnn byk ounluu
bellekte 2 bayt igal eder.

imdi komutlar rahatlkla tanmalsnz. rnein 0x12c adresinde,


ayn sayy Disassembly mensnde greceksiniz.

ARM Programlama

30

ARM Programlama

Bu 0x130 ile 0x14a bulunan komutlar iinde ayndr.

0x12 ifadesinden sonra gelen c harfinin neyi temsil ettiini ksaca


aklamak istiyorum.

ARM Programlama

31

ARM Programlama

Her bir komut bir stunda saklanr ve stunlar yukarda grld


gibi adlandrlr, yani0x120 adresi 000d verisini tutarken 0x122
adresi eb00 verisini tutar.
Buraya kadar herey anlaldysa, C kodunun bandan sonuna kadar
satr satr ilerleyelim. Bunu yapmak iin aada gsterildii
ekilde Step-Into butonuna tklayn.

ARM Programlama

32

ARM Programlama

Grld zere mevcut komut bir ilerledi ve sayac deikeninin


deeri 0 olarak deiti.

ARM Programlama

33

ARM Programlama

Ayrca Register grnmn dikkatlice incelerseniz PC


saklaycs0x12e olarak deiti.
PC program sayacn (Program Counter) simgeliyor nk program
sayac komutlarn saymn yapyor ve her zaman mevcut komutun
adresini tutuyor.
imdi bir sonraki komutu altrmak iin Step-Into butonunun stne
bir kez daha tklatalm.
Bu sefer sayc (sayac) deerinin deeri 1'e ykseldi.

Sayc (sayac) deikenin R1 saklaycsnda yer aldn locals


ARM Programlama

34

ARM Programlama
mensnde grebilirsiniz.

Kaydedici (Register) grnm mensn gzden geirdiinizde deR1'in


deerinin 1 oldunu grebilirsiniz.

Fakat nedir bu saklayclar ?


Eer imdiye kadar bir hesap makinesi kullandysanz nceden bir
fikir sahibisiniz demektir nk mikrodenetleyicilerdeki
kaydedicilerle hesap makinesindeki kaydediciler birbirlerine ok
benzer. Genel anlamda bir hesap makinesinin bellek kaydedicisine
ekleme yapabilir (+), geri arabilir (M+) ve temizleyebilirsiniz
(MRC).

ARM Programlama

35

ARM Programlama

ARM Cortex-M ilemcisi bunun gibi 16 kaydediciye sahip, bunlarR0'dan


R15'e sral olarak isimlendirilmi.
Fakat burada 15 tane kaydedici gryoruz. Peki nerede bu 16.
kaydedici. R15, PC kaydedicisinin dier addr.

Tm bu kaydediciler 32 bitlik saylar tutabilir.

ARM Programlama

36

ARM Programlama
Bu kaydedicilerin nem durumu gerek u ki makine kodlar genel
olarak bir saat evriminde (clock cycle) dorudan kayedicileri
hnerli bir ekilde kullanabilirler.

Zaten komutlarn kaydedicileri kullanmasnn 2 rneini grdnz


0'dan R1'e olan deiim ve R1'e ekleme yapma gibi.
imdi ayn dzende kod boyunca ilerleyelim (Step-Into) ve saya
(sayac) deikeninin artn izleyelim.

ARM Programlama

37

ARM Programlama

Herey beklenildii gibi alyor gibi grnyor fakat saya


(sayac) 10'a ulatnda ilgin birey oluyor. Hatrladmz
kadaryla "sayac" R1 kaydedicisinde bulunuyor sayac'n 10 deerinde
Locals ve Register grnm mens senkronizasyonun dna km
gibi grnyor nk R1'in deerini 'A' olarak gryoruz. Bu biraz
aklama gerektiriyor.

Locals grnm mens sayac deikenini onluk say sisteminde


gsteriyor. nsanlar bunu benimsemi nk normal bir insan 10
parmaa sahip. Halbuki, C programclarnn bir sre sonra ilerinde
parmaklarnn says 16'ya kyor. rnein alttaki resim yllarca C
programlamadan sonra parmaklarmn hali.

ARM Programlama

38

ARM Programlama

Programclar 16'lk
say sistemini, almak iin 10'luk say sistemine gre daha uygun
buluyorlar nk 16'lk say sistemi ksusursuz bir ekilde tm
bilgisayarn temelini oluturan ikilik say sistemini haritalyor.
Yanda grdnz bu karlatrma 10'luk, 2'lik (BIN) ve 16'lk say
sistemleri arasnda tek bir 16'lk hane 4 bitlik bir grubu temsil
ediyor. Karlatrmada, 10'luk (DEC) sistem 9 zerindeki saylar
iin 2 haneye ihtiya duyuyor. Her 16'lk hanenin nende garip
grnml '0x' n eki, C dilindeki hexadecimal (16'lk say sistemi)
saylarn kodlanmasnn bir dzenidir.
Alttaki resim bir 32 bitlik saynn 16'lk sistemdeki karlnn
bir rneinin uygulamasn tablonun zerinden grebilirsiniz. Bitler
8 li drlk paketler halinde gruplanm. Her 8 bit bir Bayt olarak
adlandrlyor, her bayt iki adet 4 bit (yarm bayt - nibble)
ieriyor. Biraz nce akladm zere, yarm bayt'lar direkt olarak
16'lk sistemin hanelerini haritalyor. rnein '1010' yarm bayt'
hex hanesi olarak A'y haritalyor. '0101' yarm bayt' 5'i
haritalyor ve benzeri eyler. Sonunda tm 32 bit'lik ikilik say
sistemindeki dizi '0x260F3E5A' deerine denk geliyor.

ARM Programlama

39

ARM Programlama

Ayrca ben, hata ayklama (Debug) mensnn konuyu daha iyi


anlamanza yardmc olacan dnyorum nk bunlarn ou 16'lk
bir sistemi gsteriyor '0x' n ekini anladnz zere.

imdi, programmzla 'sayac' deikeninin deerini arttrmay


brakmadan nce saylar byk deer aldnda ne olacan test
etmek iin bir bit ile aldatma yapalm. Bunu yapmak hata
ayklaycs (Debug) grnm mensnde olduka kolay nk manuel
olarak herhangi bir deeri deitirebilirsiniz, sadece stne
tklayn ve yeni bir deer girin.

Test iin
'0x7FFFFFFF' deerini yanmamz gerekiyor, bu say onluk sistemdeki
en byk saydr. Bu sayy yazp Enter tuuna basnca karmza
onluk sistemdeki say kyor.
imdi Step-Into butonuna tklayarak sayac deikenini bir
arttralm.

ok garip birey oluyor. R1 kaydedicisi '0x80000000' iken, sizin


sayac deikeninizin deeriniz onluk sistemdeki byk bir negatif
sayy gsteriyor. Tekrar, bu biraz aklama gerektiriyor.
ARM Programlama

40

ARM Programlama

Sayac adl deikenimiz bir tamsay (integer - int) olarak


bildirildi, bu C dilinde iaretli bir saydr. Bu Pozitif/Negatif
btn saylar depolayabilir anlamna geliyor. Sonunda anlald ki
bilgisayar olduka garip bir yntemle negatif saylar ifade ediyor.
Yukardaki ekildeki dairesel grafik nasl altn aklyor.
Grafikteki her ok bir art simgeliyor. Kk pozitif saylar iin,
herey tm bitler dolana kadar beklenildii gibi alyor ama en
nemli bir bit... Bu say 32 bitlik pozitif iaretli say, en byk
deeri temsil edebilir (0x7FFFFFFF). bu numaray bir arttrrsanz
en nemli bit'i tam olursunuz. say bu noktada negatif deerli
bir say olur. Aslna bakarsak, bu 32 bit ile temsil edilen en kk
negatif oluyor (0x80000000). Oradan arttrmaya devam ettiinizde
deer tm bitleri doldurmanza kadar daha kk bir negatif say
oluyor (0x80000001... 0xFFFFFFF). Bu noktada -1'e ulayoruz
(0xFFFFFFF). -1'i arttrdmz zaman 0 deerine ulayorsunuz ve bu
evrim tekrarlanr.
Hata ayklayc (Debug) mensne geri dnelim, sayacn deerini -1
olarak deitirip R1 kaydedicinin ieriini izleyelim.

Bunun iin Step-Into butonuna tklayarak sayac adl deikenimizi


bir arttryoruz ve sayac tekrar 0 yapyoruz.

Hata ayklayc mensn 'X' butonuna basarak kapatn.


Sevimsiz hocalar gibi davranp size bir dev veriyorum. Sizden
iaretsiz tamsaylarn (unsigned int) saymn istiyorum. Bunu
yapn. Sayac deikeninin trn unsigned int olarak deitirmeniz
gerekiyor.

ARM Programlama

41

ARM Programlama

Yeniden derleyin ve hata ayklayc mensn balatn. Bu derste


biraz nce yaptmz gibi.
Son olarak, size Launchpad Board zerinde bir kodun nasl
altrlacan gsterme sz vermitim. Bunu yapalm, proje
seeneklerini deitirmeniz gerekiyor Project > Optionsmensnn
zerine tklayn. Debugger kategorisini sein aa alan listeden
TI-Stellaris seeneini sein.

ARM Programlama

42

ARM Programlama

Daha sonra, Download sekmesinin zerine tklayn ve Use flash


loader(s) ve Verify download seeneini setikten sonra OK deyip
kapatyoruz.

ARM Programlama

43

ARM Programlama

Bu noktadan sonra bilgisayar ile Launchpad arasnda USB kablo ile


balant kurabilirsiniz. Eer kart ilk defa takyorsanz gerekli
srclerin yklenmesi iin 2 dakika kadar bekleyin. Ledlerin
yanmasn salayan kart iine retilirken yklenmi bir programdr.
imdi her zamanki gibi F7 ksayolunu kullanarak Launchpad'in flash
hafzasnn iine yazdmz kodlar ykleyebiliriz. Programnzn
kartn iine kalc olarak yklendiini sylemek isterim, yani led
snecek. Ama umutsuzlua kaplmayn, bunu ve bundan fazlasn ilerde
yapacaz.

ARM Programlama

44

ARM Programlama

KONTROL AKII

Gml sistemler programlama derslerine ho geldiniz, bu ders


kodlarmzda tmyle kontrol aknn nasl deitirileceini
gstereceim.
nceki ders1 projesinin bir kopyasn alarak balayalm ve sonra
ders1i ders2 olarak isimlendirelim. Eer ders1 dosyasna sahip
deilseniz bu yazy okuyabilirsiniz.

ARM Programlama

45

ARM Programlama

Yazlm gelitirmenin altn kural sadece kk deiiklikler


yaparak alan kodlar her zaman saklamaktr. Dolaysyla eer
alan bir eye sahipseniz onu kaydedin. Bir aamay
kartrdnz zaman yaptnz bu iten ok memnun olacaksnz.
alan son srmn yedeini almak, hatal kodu dzeltmeye
almaktan daha kolaydr.
Ders2 klasrnn iine girin ve IAR ara setini amak iin alma
alan dosyasnn stne ift tklayn (.eww uzantl dosya). Eer
IAR ara setine sahip deilseniz bu yazy okuyabilirsiniz.
IAR ara seti alnca geen karmza ilk derste oluturduumuz C
program kyor. Her C program aadaki gibi bir main
fonksiyonunun yrtlmesiyle balar. Main iinde, kontroln
yukardan aaya doru akt ok basit dorusal bir koda
sahipsiniz.

ARM Programlama

46

ARM Programlama

lemcinizin bu kolay kontrol akn nasl ele alacan grmek


iin hata ayklaycya hzlca bir gz atalm. Hata ayklaycnn
simlatr olarak ayarlandndan emin olun veDownload and Debug
butonunun zerine tklayn. Hata ayklama modunda ne grdmz
hzl bir ekilde hatrlayalm.
Disassembly grnm mens makine komutlarn gsteriyor.

Register grnm mens ARM Cortex-M kaydedicilerinin durumunu


gsteriyor.

Halihazrdaki komutlarn adreslerini ieren disassembly grnm


mensnde sizin iin vurgulanm olan, bu dersin sizin iin en ilgi
ekici eyi program saya (PC) kaydedicisidir.

ARM Programlama

47

ARM Programlama

Bir seferde bir makine kodu atlatn ve PC kaydedicisinin her admda


nasl deitiini gzlemleyin.

ARM Programlama

48

ARM Programlama

Sadece R1 kaydedicisini arttrmak iin komutlar altrdmza


dikkat edin nk PCkaydedicisini arttrmak iin herhangi zel bir
komut bulunmuyor aksine her komut yan etki olarak PC kaydedicisini
arttryor. Bylece buradan anlyorsunuz ki bu basit komutlar kendi
ilerinde tmyle dzgn ak denetimindeki kodlar boyunca donanmla
btnleiktir. Bu derste, bu donanmla btnleik kontrol aknn
nasl deitirileceini reneceksiniz, bylelikle program dng
yada arta bal olarak kod paracklarnn zerinden atlayabilir.
Kontrol akndaki bu gibi deiiklikler yinelemeleri nlemeyi ve
alma annda karar vermeye olanak salayacak. imdi bu nedenle
hata ayklaycdan kalm ve kodu bir dngyle beraber kullanmak
iin kodun zerinde deiiklik yapalm.

ARM Programlama

49

ARM Programlama
C dilindeki en basit dng while dngsdr. Bunu "while" anahtar
kelimesini ekleyerek yapabiliriz (1), bunu takiben parantez iinde
bir art kodlayalm (2), son olarak dngnn gvde ksmn
kodlayalm (3).

int main(){
int sayac = 0;
while(sayac < 5){
sayac++;
}
return 0;
}
Bu kod art kontrol ederek balyor ve eer bu art doruysa, bu
dngnn gvde ksmndaki kodlar altryor ve art tekrar
kontrol etmek iin geri dnyor. Bu dngden sadece art
salanmadnda k yaplyor.

ARM Programlama

50

ARM Programlama

Bu durumda, saya deikeni 21 arta sahip oluyor bylelikle


"(counter < 21)" art ile artn ayn sayda olmas iin
altralm. Derleyelim ve bu kodu simlatrde altralm.
lk komut (int sayac = 0) saya deikenini tutmak iin uan
kullanlmakta olan R0kaydedicisine 0 deerini tayor.

Bir sonraki B komutu ok ilgin bir dallanma komutudur nk bu


komut PC zerinde deiiklik yapyor.

ARM Programlama

51

ARM Programlama

Bundan dolay bu birka komutun zerinden atlyor. Komutun


kendisinde hexadecimal sistemde 15 olarak kodlanm fiilen
grdmz CMP komutu R0 kaydedicisini 21 saysyla karlatryor.
Application Program Status Register (APSR) iin bulunan CMP komutu
APSR kaydedicisinin deitirilmesinde ilgin bir yan etkiye sahip.
zellikle CMP komutu APSR de N (negatif) bitini belirliyor, nk
negatif sonulandrlan karlatrma R0-5 bir fark olarak
gerekletirilmi.

ARM Programlama

52

ARM Programlama

BLT komutu dallanma komutunun bir eididir. Siz zaten nceden bunu
grdnz fakat bu arta bal bir dallanmadr. zellikle sadece N
biti APSR'ye atand zaman BLT komutu PC zerinde deiiklik
yapyor. Aksi takdirde BLT komutu basit olarak bir sonraki komut
iin baarszla uruyor ve program sonlanyor.
Bu noktada u gzel bir soru : "Dallanma komutu nereye dallanacan
nasl biliyor ?". Gzel, bu bilgi komutta kodlanm olan bilgiden
dar kyor. Aada tm B komut trlerinin kodlanmasn
aklayan ARM mimarisi kullanma klavuzundan bir sayfa.

Komutumuz "0xD" ile balyor bu demek oluyorki bu T1 kodlamas


kullanyor.

ARM Programlama

53

ARM Programlama
Komuttaki sonraki yarm bayt koul anlamna geliyor ve "0xB" LT
(Less Than) koulu anlamna geliyor. Sonunda, offset olarak
adlandrlan fc bayt PC kaydedicisinin ne kadar deimesi
gerektiini kodluyor. uan offset iaretli bir tamsaydr ve ilk
dersten, iaretli saylarn ikinin tmleyen gsterimini kullandn
hatrlamalsnz. Buna binayen fc bayt -4 temsil ediyor.
Bylelikle imdi, PC kaydedicisinin yeni deerini hesaplayabiliriz.
0x7E olarak verilen deerini uanki PCnin deeri 0x82 deerinden 4
eksilterek anlyorsunuz. Hesap makinesini programc modunda ap 82
deerinden 4 karrsak 7E deerini buluyoruz.
Bu dallanmann nereye gideceini beklediiniz yerdir. Bunu BLT
komutunu altrarak dorulayalm.

Hey! artc!, siz haklsnz. PC geriye dallanyor, bylelikle


kod boyunca giderek dorulayabileceiniz bir dngye sahipsiniz.
Endielenmeyin, komutlarn i ytapsn irdeleme zerine daha fazla
zaman harcamayacam fakat BLT komut aklamasnn retici olduunu
dnyorum nk bu ARM Cortex-M ilemcisinin i ileyiine anlk
bir bak verdi.
imdi kontrol akna geri dnelim. Disassembly kodlar while
dngs iin akladm kodlarn farkl bir kontrol ak
gerekletiini anladnz umuyorum.
Asl kodun ilk koulu kontrol etmesi gerekiyor ve eer koul doru
deilse dng gvdesinin zerinden dallanr, yani arttrma ilemi
gereklemez.
Derlenmi kod koulsuz bir blm ile balyor ve dng gvdesinin
yolunu geri dndryor ve koulu test ediyor. Bunun hakknda
dndnz zaman geri, bu iki kontrol ak eit, retilen kodun
daha hzl olmas bekleniyor nk bu sadece dngnn altnda bir
koula sahip. Bu rnek iki nemli noktay gsteriyor. lk olarak,
tek bir C ifadesi while gibi, birlikte gruplanm olmas
gerekmeyen birden ok makine kodu retebiliyor.

ARM Programlama

54

ARM Programlama
kincisi : derleyici olduka akll ve ilemcinin size gre daha iyi
olduunu biliyor ayrca dzgn olmayan kontrol ak ilemcinin
sizin kodlarnz ne kadar hzl altraca zerine nemli bir
etkiye sahip ve bir gml sistemler programcs olarak bunun
farknda olmanz gerekiyor. lk olarak burada bir dng ek yk var
nk sadece dngy ilemek iin uan ilaveten test ve dallanma
yapyorsunuz.
Fakat bir dakika! burada daha kt bir ey var. Dallanmalar ek
olarak iletiim hatt (Pipeline) gecikmelerinden dolay iletim
gecikmesi ekliyor.
Aklayalm ;
Btn modern ilemciler, ARM Cortex-M'de dahil olmak zere
verimlilii arttrmak iin bir iletiim hatt (Pipeline) kullanyor.

lemci ilemenin eitli aamalarnda oklu komutlar zerinde


alan iletiim hatt bir assembly hatt gibidir.
Bu verilen bir zamanda ilenebilen komutlarn saysn arttryor.
Her komut, bamsz aamalar dizisi haline blnr, bellek
kullanm(1), kod zme(2) ve altrma(3) gibi.

Halbuki bu admlarn her birinin tamamlanmas bir saat evrimi


(clock cycle) alyor. Komutlar srayla yrtld zaman iletiim
hatt tam kapasite alyor. Fakat sralama bir dallanma komutu
tarafndan bozulduu zaman iletiim hatt ksmen ileme tabi tutulan
komutlar atmas gerekiyor ve tekrar komutu balatmas gerekiyor. Bu
iletiim hatt gecikmelerinin birka evrim iin olduu anlamna
geliyor. Az nce gerekten nemli sadece kritik zamanl koddan sz
ettim, kesme ilemi gibi ve dier durumlarn ou iin nemsiz
olmas gibi. Ne var ki, baz eyleri hzlandrmanz gerektiinde ne
ARM Programlama

55

ARM Programlama
yapmanz gerektiini biliyorsunuz. Baz dngleri ya tamamen yada
ihtiyacnz olduu kadaryla aabilirsiniz. rnein while dngsn
uygun olarak deitirebilirsiniz : saya art miktarn dng
boyunca tek bir gei bana arttrabilirsiniz ve dngy
ayarlayabilirsiniz.

imdi. Kodu altrdmz zaman, test etme ve dallanmann daha az


sklkla gerekletiini grebilirsiniz. Oysa, 5 artla ayn sayda
altryorsunuz.
Sonunda bu ders iin, programn alma annda karar vermek iin
kontrol aknn nasl kullanlacan gstermek istiyorum.
Farz edelim, rnein siz saya deikeninin tek say olduu her
zaman zel bir ey yapmak istiyorsunuz. Kodumuzu 20 art haline
getirelim ve if ifadesini yazarak kodlamaya balayalm.

f anahtar kelimesini takiben parantez iin artla balayn, bunu


takiben art doru olduunda kodu altrn. Sayacn ift olup
olmadn test etmek iin kullanlan koul ifadesi biraz aklama
gerektiriyor.

ARM Programlama

56

ARM Programlama

Sayacn her biti arasndaki ve ilemi gerekletiren ampresan(&)


iareti bitsel AND operatr iin ve ikinci terim iindir.

Aadaki rnekte grdnz gibi, bir testin ikinci terimi saya


ift olduu zaman sfr ve saya tek olduu zaman bir.
nlem eit operatr (!=) eit deil anlamna geliyor.
Sadece art yanl olduunda altrlan bir kodu ayrca istee
bal olarak ife ekliyebilirsiniz.

Cde i ie yerletirilebilen kontrol ak ifadelerinin farkna


vardnz umuyorum bylelikle while iinde if olan bir dngye
sahipsiniz.

ARM Programlama

57

ARM Programlama

DEKENLER ve ARETLER
Merhaba. Gml sistemler programlama derslerine hogeldiniz. Bu
derste deikenler ve iaretiler hakknda konuacaz.
nceki ders2 projesinin bir kopyasn alalm ve bunu ders3 olarak
isimlendirelim. Eer ders2 dosyasna sahip deilseniz bu yazy
okuyabilirsiniz.
ders3 klasrnn iine girin ve IAR ara setini amak iin alma
dosyasnn zerine ift tklayn (.eww uzantl dosya). Eer IAR
ara setine sahip deilseniz bu yazy okuyabilirsiniz.
Ve burada ders2'de oluturduumuz C dosyas var. Bunu birazck
temizleyelim ve saya deikeninin nerede bulunduuna ve nasl
eriildiine hata ayklaycda hzlca bir gz atalm.
Kod boyunca gittiiniz ve Locals grnm mensn izlediiniz zere,
saya deikeninin R0 kaydedicisi iinde bulunduu ve dorudan
makine kodlaryla eriildiini gryorsunuz.

imdi, deiken tanmlamasn (int counter = 0;) main fonksiyonunun


dna tayalm, yeniden derleyelim ve hata ayklaycya geri
dnelim.

ARM Programlama

58

ARM Programlama

lgin ekilde, saya deikeni artk Locals grnm mensnde


deil, nk artk local (yerel deiken) deil.
imdi saya deikenini grmek iin farkl bir grnm mensne
ihtiyacmz var. Viewmensne gelin ve Watch > Watch1 grnm
mensnn zerine tklayn.

ARM Programlama

59

ARM Programlama

Watch grnm mens ald zaman ilk satra tklayn ve


deikenin adn yazn.

ARM Programlama

60

ARM Programlama
Artk saya yorumlanabilecek bir durumda.
Grnd zere, imdi 0x2 ile saya deikeninin konumu byk bir
sayyla balyor.

Bu adres ARM Cortex-M mikro denetleyicilerindeki Ram Accesed


Memory'nin balangcdr. Bu nedenle saya deikeni RAM' de
bulunuyor.
Eer gerekten bu byle ise deiken
penceresinde (Memory) grnr olmal.

dorudan

bellek

grnm

Bunu kontrol edelim, bellek grnm mensne 0x2000000 saysn


atayn (1) ve bellek ayarlama grnm mensn 4 byte'lk tamsaylar
olarak gstermek iin 4x birim eklinde deitirin (2).

imdi, kod boyunca tek aama gidelim ve hata ayklayc grnm


mensn takip edelim.
STR komutunun Watch1 grnm mensnde sfrdan bire deiime neden
olduunu fark edin.

ARM Programlama

61

ARM Programlama

Kod boyunca ilerleyin ve art gzlemleyin.


Bellekte derleyicinin saya deikenine erimek iin rettii makine
kodlarn anlamaya alalm. Bellekten kaydediciye ykleme yapmak
iin bulunan ilk ilgin komut LDR'dir.

LDR.N komutu, ??main2 etiketinden R0 kaydedicisine bir eyler


yklyor.

ARM Programlama

62

ARM Programlama
Aslna bakarsak bu
kaydrabilirsiniz.

etikete ne
Hey,

yklediini grmek
bu
benzer

R0'a yklenen deer saya deikeninin adresidir.


LDR.N komutunu altralm ve R0' izleyelim.

ARM Programlama

63

iin aaya
gzkyor.

ARM Programlama

Bir sonraki LDR komutu R0' tekrar yklyor, fakat bu sefer saya
deikeninin adresi iin olan deer R0'n u anki tutulan adresinden
geliyor. Bir adm gidelim ve R0'n uan 3 deerine sahip olduunu
dorulayalm.

ARM Programlama

64

ARM Programlama
ADDS komutu R0' bir arttrmada asl ii yapyor bylelikle R0 4
oluyor.

Bir sonraki LDR.N komutu R1'e saya deikeninin adresini yklyor.

Ve sonunda, STR komutu R1 kaydedicisi tarafndan gsterilen bellee


R0 kaydedicisinin deerini yklyor. Ltfen bu komutu altrdktan
sonra Watch1 ve bellek grnm mensnn nasl deitiini fark
edin.

ARM Programlama

65

ARM Programlama

Bu noktada, ARM ilemcide bellee erimenin genel olarak modelini


grmeye baladnz umuyorum.
Sadece zel ykleme komutlar ile okunabilen ARM, komut kmesi
azaltlm bilgisayar (RISC) olarak adlandrlan mimarinin bir
rneidir. Bu, tm veri, maniplasyonlar, kaydedicileri iinde
bulundurur ve sonunda deitirilmi kaydedici deerleri zel
depolama komutu ile bellee geri depolanabilir.
Bu karlatrmada kark komut kmeli bilgisayar (CISC) yaps
kompleks komutlarn kullanld, bilgilerin bazlarnn
kaydediciler iinde olmasna gerek olmayan ve yine bellek iinde
olabilen. Kiisel bilgisayarlarn iindeki sayg deer x86 ilemci
gibi.
Fakat ilemci mimarisi ne olursa olsun, sizin bellek adreslerinin
grevlerini beenerek baladnz umuyorum, nk bir yerden veri
yklemek yada veriyi tutmak iin bellee her eriim ister istemez
bellek adreslerinin bilgisini gerektirir.

ARM Programlama

66

ARM Programlama

Tm bunlar ilgin bir soruya yol ayor. Eer CPU iin bunlarn
bellek adresleri olduka belirginse, bunlar C dilinde temsil
edilebilir mi?
Bunun cevab "Evet"'tir. C programlama dilinde adresler
deikenlerin iinde iaretiler(pointers) olarak adlandrlan
yapyla tutulabilir.
Burada C'de bir iareti deikeninin rnei var.

ou C bildirimi gibi, aklamann en iyi yolu bir tanesini geriye


doru okumaktr. Bylelikle, tamsay belirtecinden (int) sonra
yazlan yldz iareti, p_int adl deikenin bir iareti olduu
anlamna geliyor. Baka bir deyile tamsay deikenlerinin adresini
tutabilen p_int, bir deikendir.
Eer yle ise, bu durumda p_int'in deerleri arasnda tamsay olarak
tanmlanan saya deikeninin adresini tutmas gerekir.
Dorusunu sylemek gerekirse, C'de bu kolaylkla salanabilir.
Ampresand (&) operatr saya deikeninin adresini veriyor ve bu
adres legal olarak p_int'e atanabilir.

ARM Programlama

67

ARM Programlama

Sonunda, referanstan ayrma (De - Referencing) iaretisi olarak


adlandrlan bu iaretiden verilen bir adreste saklanan deeri
almak
olduka
kullanldr.

*p_int bu durumda saya deikeninin deeri olan p_int iaretisi


iinde gncel olarak saklanan adresteki deer anlamna geliyor.
Bu
eitlik
sayesinde,
saya
deikeni
ile
*p_int'i
deitirebilirsiniz ve program eskisi gibi ayn alr.

yer

Bakalm derleyici bu program ile memnun mu?


ler yolunda, bylelikle imdi hata ayklaycya gidelim ve grnm
menlerini hazrlayalm. Bu sefer saya deikenini grmek iin
Watch1 grnm mensne ve p_int iaretisini grmek iin Locals
grnm mensne ihtiyacmz var.
Kod boyunca ilerlemeden nce, Disassembly grnm mensne bir gz
atalm ve p_int iaretisini tantmadan nce imdiki makine kodu ile
ncekini karlatralm.

ARM Programlama

68

ARM Programlama

Grdmz zere, saya deerinin adresini ykleyen LDR komutu en


st blme tand ve ayn komutun bir kopyas birlikte kaldrld.
Baka bir deyile, p_int iareti komutu makine kodunun iini
kolaylatrd ve verimlilii arttrd. Bu kod ayrca p_int
iaretisinin R0'da bulunduunu gsteriyor.
uan kod boyunca adm adm ilerleyebilir ve saya deikeninin
artn hem Watch1 grnm mensnde hem de bellek grnm
mensnde izleyebilirsiniz, tamamen ncekiyle ayn.
Bu saya deikeninin bir ad olduunu tamamen doruluyor.
Sonunda, eer dngnn sonuna kadar altrmak isterseniz fakat kod
boyunca tek tek ilerlemekten sklyorsanz bir krlma noktas
(Breakpoint) atayabilir ve program tam hznda altrmak iin
"Go" butonuna basabilirsiniz.

Krlma noktasn atadktan sonra final deerinin 20 olduunu


dorulayabilirsiniz, beklendii gibi.
ARM Programlama

69

ARM Programlama

Dersin son
istiyorum.

admnda,

iaretilerin

inanlmaz

gcn

gstermek

Bu noktada, bu mthi bir hack olacak (hacklemek teriminin yanl


anlalmas zerine bir makalemi yaknda yaynlayacam). Bu size
gml sistemler programlamasnda fiilen kullanlan bir teknik
gsterecek.
Daha nce sylediim zere, bir iareti deikeni, p_int gibi, bir
tamsaynn adresini tutuyor fakat bu neredeyse hemen hemen her adres
olabilir, sadece saya deikeninin adresi deil. yleyse, p_int'e
uydurma bir adres atamay deneyelim.

Hata ayklaycda grdnz zere ilk giriimizde sadece bir hex


says olarak ifade edilen bir adres kullanmay deneyebilirsiniz.
Fakat F7'ye basp derlediimiz zaman derleyici kodu kabul
etmeyecektir.

ARM Programlama

70

ARM Programlama

Bir sonraki denememizde, saynn sonuna U ekleyerek bir iaretsiz


say kullanmay deneyebilirsiniz fakat derleyici bu ikisinden de
holanmyor.

ARM Programlama

71

ARM Programlama

Bu noktada derleyici ile olan grmeniz bozuldu. Fakat C dili bir


tr kalplama kullanm uygulamak iin bir mekanizmaya sahiptir. Siz
ifadenin nne trnn adn yerletirerek bunu
gerekletirebilirsiniz.

imdi derleyicinin herhangi bir seenei yok, bunu kabul edecektir.

ARM Programlama

72

ARM Programlama

aretiyi inceleyelim ve kolayca anlalabilir tamsay deerini.


Gml programclar bu gaye iin l sr (DEAD BEEF (l Sr).
ngilizcede kullanlan bir metafordur. Bu metaforun baarszla
uram, bellek temizlenmesi gibi anlamlar vardr.) gibi gzkyor.

Akas, bu hack'in test edilmesi gerekiyor. Fakat kusurlar


nceden grmek iin bir eyler alabilir ki ben Stellaris gelitirme
kart zerinde bu kodu altrmak istiyorum. Bylelikle eer bu
karta sahipseniz bunu bilgisayarnzn USB konektrne takn. Sonra,
Projectmensnden Options'u an ve hata ayklaycy TI Stellaris
ara yz olarak ayarlayn. AyrcaDownload sekmesinin altndaki "Use
ARM Programlama

73

ARM Programlama
flash loader" seeneini semeyi unutmayn. Eer karta sahip
deilseniz, bu admlar gein ve simlatr ile birlikte takip edin.

Her iki durumda da, hata ayklaycya erimek iin "Download and
Debug" butonuna tklayn.

ARM Programlama

74

ARM Programlama

p_int iaretisinin yeniden atanmasnda bir krlma noktasna sahip


olduunuza emin olun ve ayrca saya deikenini izleyebilmek iin
Watch grnm mensn grlr yaptnzdan emin olun.
Krlma noktasn altrmak iin "Go"'ya basn. Disassembly
penceresinde bir sefer bir makine komutu gitmek iin tklayn.
R0 kaydedicisine uydurma bir adres ykleyen LDR komutunu uygulayn
ayrca bu adres p_intdeikeninin Locals grnm mensnde ayrca R0
grnm mensnde de grndn dorulayn.

ARM Programlama

75

ARM Programlama

R1'e 0xDEADBEEF deerini ykleyen LDR komutunu altrn. Ve


sonunda, bellekte p_intadresine 0xDEADBEEF'i depolayan STR komutunu
altrn.
Bunun etkisi korkutucu trdr. Uydurma adresin bilinli yanl
ayarlanmasndan dolay, 0xDEADBEEF deeri ksmen saya deikeni
zerinden ve ksmen bellekte sonraki szcn zerine yazlm olur.

Cortex-M4 bu yanl ayarlamay kabul etti fakat Cortex-M0 bununla


bir sorun yaard.

ARM Programlama

76

ARM Programlama
Bylelikle, siz imdi iaretileri bir etkili mekanizma olarak
gryorsunuz ayrca eer bunu dikkatsizce kullansaydm, bu ok
tehlikeli olabilirdi.

LED YAKIP SNDRME


Merhaba. Gml sistemler programlama derslerinin 5. serisine ho
geldiniz. Bu derste Stellaris Launcpad'in zerindeki bir ledin nasl
yanp sneceini test edeceiz.

Bu ders iin, Stellaris Launcpad'in


Manual) indirmeniz gerekiyor.

Kullanm

klavuzunu

(User

Stellaris Launcpad'ine sahip deilseniz, bu dersi hala takip


edebilirsiniz,
fakat
hata
ayklaycnzn
grnm
mens
Launcpad'den biraz farkl olacak ve tabii ki ledin yandn
gremeyeceksiniz.
Klavuzun bu sayfas size Launcpad ile salanan USB
zerinden kartn nasl bilgisayara balanacan aklyor.

ARM Programlama

77

kablosu

ARM Programlama

Bu sayfa ise kart zerindeki bileenlerin mikro denetleyiciye nasl


balandn aklyor.

ARM Programlama

78

ARM Programlama

Farkl birimlerin, Genel Amal Giri/k anlamna gelen GPIO'lar


ile birbirine bal olduunu grebilirsiniz.

ARM Programlama

79

ARM Programlama

Klavuzun sonunda ise kartn ematiini bulabilirsiniz.

ematiin ilk sayfasnda, LED_R, LED_G, LED_B klar ile ayr


ayr kontrol edilen transistorlar tarafndan glendirilen kullanc
led'inin R, G ve B komponentlerini grebilirsiniz.

ARM Programlama

80

ARM Programlama

Pin F1, pin F2 ve pin F3 olarak etiketlenmi mikro denetleyici


pinlerine bal olan klar tekrar st dzey olarak
grebilirsiniz. F harfi, bu durumda GPIO-F iin bulunuyor.

Bylelikle imdi, Led'in nasl bal olduu hakknda bir fikre


sahipsiniz, bu ders iin IAR projesini hazrlayalm. Alld
gibi, nceli ders3 dosyasnn bir kopyasn alp ve ders 4 olarak
isimlendirip balayalm. Eer ders3 dosyasna sahip deilseniz bu
yazy okuyabilirsiniz.

ARM Programlama

81

ARM Programlama
ders4 klasrnn iine girin ve IAR ara setini amak iin alma
dosyasnn stne ift tklayn (.eww uzantl dosya). Eer IAR ara
setine sahip deilseniz bu yazy okuyabilirsiniz.
Eer Launcpad kartna sahipseniz, imdi bilgisayarnza
balamalsnz ve hata ayklayc (Debugger) mensnde TI Stellaris
ara yzn konfigre etmelisiniz ve ayrca Download sekmesinin "Use
flash loader" seeneinin iaretli olduuna emin olmalsnz.

ARM Programlama

82

ARM Programlama

Eer karta sahip deilseniz, hata ayklaycnz simlatr olarak


konfigre edin ve yazy aynen takip edin.

Ayrca kart kullanyorsanz, ltfen TI Stellaris mensnn zerine


tklayn ve "Reset will do system reset" seeneini iaretleyin,
bylelikle kart her zaman temiz bir reset ile balayacaktr.

ARM Programlama

83

ARM Programlama

Sonunda, main.c dosyasn nceki ders3 projesinden ekmeyi nlemek


iin ltfen projeyi tamamen derleyin.
imdi, hata ayklaycya gidelim ve ilemcinin eitli adresleri
nasl kullandna hzlca bir gz atalm.
lk olarak, en dk adres 0 ile balyor, bunu makine kodlarndan
grebilirsiniz.

Bunlarn hepsi mikro denetleyici iinde depolanm sizin program


kodlarnzn derlenmi halidir.
Bu en dk adresler 0dan balayp flash hafzada haritalanyor
anlamna geliyor. Ayrca siz 0x2 den balayan adreslerin zaten
deikenler iin kullandn biliyorsunuz, saya deikeni gibi.
0x2 adresi, rastgele eriimli bellein (RAM) balangcnn bir ok
sfr ile takip edildii anlamna geliyor. Dorusu, hata
ayklaycnn bu adreslerden herhangi bir ey okuyamad anlamna
gelen RAMin balangcnn hemen nnde tm adreslerin iinde
grebilirsiniz, byk bir olaslkla nk onlar kullanlmad. Daha
ARM Programlama

84

ARM Programlama
iyi incelediimiz zaman, 0x2000,8000 adresinde RAMin sonlandn
grebilirsiniz bylelikle onluk sistemde 32KB olan bir island
0x8000 adresi iin bir uzatmadr. Bu mikro denetleyicinin 32KBlik
RAMe sahip olduu anlamna geliyor.
Bu noktada adresler hakknda bu kadar biliyorsunuz. Fakat bu dersin
hedefi olan led yakp sndrmek iin daha fazla renmeniz
gerekiyor. En iyi ekilde, tm eitli contient ve islandlarn
mapini bilmeniz gerekiyor, RAM island gibi.
Sizin mikro denetleyicinizin hafza haritasn data sheet olarak
adlandrlan ok daha detayl dokman aklyor. Bu url adresinden
sizin Launchpad kartnzn zerinde olan LM4F mikrodenetleyicisinin
spesifik data sheetini indirmenizi son derece tavsiye ediyorum.
Fakat data sheetlerin ok geni olma eiliminde olduunu hemen size
sylemeliyim. Yinede bu nispeten ksa, 1200 ksr sayfalk bir data
sheet. ansmza bu dkmanlar batan sona okumaya ynelik
tasarlanm. Dorusu bir gml sistemler mhendisi olmann byk
bir ksm datasheetlerde nasl yolunuzun bulunacandan oluuyor
bylelikle siz ihtiyacnz olan bilgiyi hzl bir ekilde
bulabilirsiniz. Bu eitim serisinde bu beceriyi aama aama elde
edeceimizi umuyorum. Bylelikle rnein, mikro denetleyicinizin
hafza haritasn (Memory Map) bulmak iin, memory map dizesini
basite datasheet iinde aratn.
Evet, bulduk. Tipik bir ARM Cortex-M mikro denetleyicisinin hafza
haritasnn bir ksm.

ARM Programlama

85

ARM Programlama

Bu ok ho ve herhangi bir blm ya da bellek bei olmadan ve basit


bir bellek alan. Eer dier mikro denetleyicilerle altysanz,
zellikle eski 8 bitlik olanlarla, umuyorum bir liner 32 bitlik
adres boluunun sadeliini ok beeneceksiniz.
Umuyorum 256KB flash bellee klarlk gelen 0dan 3e adreslenen
On-chip Flash olarak adlandrlan bu hafza zerinde ilk
island tandnz umuyorum.

ARM Programlama

86

ARM Programlama

Statik Ram iin bulunan SRAM, burada Bit-banded on-chip SRAM


olarak adlandrlm. 0x2 ile balayp 0la devam eden bilinen RAM
island tanmalsnz.

evre birimi blmnde, GPIO portlarn not etmelisiniz. Bu island


lar ilgin nk Ledinizin kontrol iin GPIO Port Fi aryoruz.
Aradmz Port burada

ARM Programlama

87

ARM Programlama

Balang adresini bir yere kaydedin ve IAR hata ayklaycsna geri


dnn.
Bellek grnt mensne GPIO-Fin adresini yazn ve ortaya ne
kacan izleyin.

Oops! Datasheette belirtilen GPIO-Fin adres aral bo grnyor


(Karta sahip olmayanlar iin bu geerli deildir). Eer bu size de
oluyorsa mitsizlie kaplmayn. Donanm engellemesi, varsaylan g
korumas tarafndan kapatlmasnn genel nedenidir. ipin belirli
paralarnn clock sinyalinin bloklanmas teknii Clock-Gating

ARM Programlama

88

ARM Programlama
olarak adlandrlr ve modern modern mikro denetleyicilerde olduka
yaygndr.
Bylelikle, datasheete geri dnmeye ihtiya duyacanz anlamna
gelen GPIO-F blounun nasl tersine evrilmesi gerektiini
kefetmeniz gerekiyor.
Dkmann bana gidin ve clock gating dizesini aratn.
Evet, burada bireyler var, Sayfaya gidelim.

Evet, GPIO clock geitleme kontrol kaydedicisi (GPIO Clock control


register) burada.

ARM Programlama

89

ARM Programlama

Kaydedici aklamasna daha yakndan bir gz atalm, nk bu


datasheetlerde yaygn olarak kullanlan ok genel bir format.
Bitlerin bir blou olarak gsterilen kaydedici her zaman 0dan
numaralanm. Gsterilen bitlerin eitleri ise yle;
RO (Read-Only)

: Salt okunabilir

R/W (Read / Write) : Okunabilir, yazlabilir


WO (Write-Only)

: Salt yazlabilir anlamna gelir.

Bitlerin mantksal olarak ilikili olduu gruplar kaydedici blok


resminin altnda dkmante edilmi.

ARM Programlama

90

ARM Programlama

En nemli bitten balyor. Sizin iin, en ilgi ekici 5. Bitin


aklamas nk bu bit GPIO Port-F iin clocka olanak salyor. Bu
kaydedici tamamen ne aradnz doruluyor.

ARM Programlama

91

ARM Programlama

Kaydedicinin taban (base) adresini kopyalayn ve ilaveten 0x608


adresini kaydedici adresine, tamamlamak iin eklemeniz gerektiini
fark edin.

ARM Programlama

92

ARM Programlama

Hata ayklaycya geri dnn ve orijinal bellek grnm mensnde


GPIO Port-F balang adresini e zamanl olarak izlerken saat
geitleme kaydedicisinde (clock-gating) bit 5i ayarlamak iin
sembolik bellek (Symbolic Memory) olarak adlandrlan ilave grnm
mensn an.

ARM Programlama

93

ARM Programlama

Sembolik grnm mensne datasheetten aldmz saat geitleme


kaydedicisinin temel adresini yaptrn ve 0x608 offseti eklemeyi
unutmayn.

imdi, belirtilen saat geitleme kaydedicisine gidin ve birinci


dersten hatrladnz 20 hex (ikilik sistemde 5. Biti 1 yapar)
saysn ekildeki gibi bit 5e atayn ve entera basn.

ARM Programlama

94

ARM Programlama
Hey! GPIO-Fin donanm engellemesi ortadan kalkyor.

Led yakp sndrme


aamaya gelmedik.

becerisine

olduka

yaknsnz

fakat

daha

Datasheetin GPIO blmnde baz eyler daha okumamz gerekiyor


nk dijital bir k sinyali olarak srayla sreceimiz krmz,
mavi ve yeil renklerin GPIO-F 1,2 ve 3 bitlerini konfigre etmeniz
gerekiyor.
Konfigre lemi
0x40025400 adresi iin GPIO-F adres blou iinde aa kaydrn veya
adresi yazp aratn.
kilik sistemde 1110a ve 16lk sistemde E deerine denk gelen 1,2
ve 3 bitlerine 1i atayn.

k Sinyali
Ek olarak , pinler iin fonksiyonu dijital k olarak ayarlayn
0x4002551C adresi iin GPIO-F blou iinde daha aaya inin ya da
aratn ve tekrar 1,2 ve 3 bitlerine 1i atayn.

ARM Programlama

95

ARM Programlama

Bylelikle, sonunda ledi kontrol edebiliriz. 0x400253FC konumunda


GPIO-F data kaydedicisine gelin ve ilk olarak sadece en dk yarm
bayta hex 2 deerini yazarak 1i atayn, tekrar bitlerin her zaman
0dan sayldn hatrlayn.

Heyy! Bu ie
etmelisiniz.

yarad,

krmz

led

0 yazarak ledi sndrmeyi deneyin.

ARM Programlama

96

parlyor.

Kendinizi

takdir

ARM Programlama
Harika.
Hex 4 yazarak bit 2yi ayarlamaya ne dersiniz.
Evet, led bu sefer maviye dnd. Gerekten harika!

imdi ise hex 8 yazarak bit 3 bir yapalm.


Bu sefer led yeil olarak yand. 0 yapp sndryoruz.
Bu uzun uzun ve ar ilemler bitiyor nk Cdeki tm kodlama ok
kolay olacak.
Ledi zel bellek adreslerine indirgeyerek kontrol etmek iin herey
burada ve siz zaten bunun iaretiler ile nasl yapldn
biliyorsunuz. zellikle size 3. Dersin sonunda gsterdiim PointerHacki kullancaksnz nk bu teknik herhangi bir bellek adresine
istediiniz sayy yazmanza izin veriyor.
stteki kodu silin sadece iareti ksmn brakn.

Aslnda, sizin iareti deikenlerini ayrmaya hi ihtiyacnz yok


nk birazdan greceiniz zere Pointer-Cast diye adlandrlan
yntemi kullanacaz.
3. derste int iin iaretileri kullandnz fakat ARM kaydedicileri
unsigned yani iaretsizdir, bu yzden iareti tipini unsigned int
olarak deitirmeniz gerekiyor.

ARM Programlama

97

ARM Programlama
GPIO-F blounu tersine evirmek iin kullandnz saat geitleme
sistemi kaydedicisinin adresiyle 3. Dersten retilmi olan adresi
deitirin.

Parantez iinde tm Pointer-Casti evreleyin ve tm bu eyin bir


iaretiyi unsigned int yapmak iin olduunu fark edin. Eer byle
ise, yldz operatr ile bu iaretiyi referanstan ayrabileceiniz
anlamna geliyor, aadaki satrda grdnz gibi.

imdi, iaretiye yazabilirsiniz. Hata ayklaycdaki deneyimden


hatrladnz zere bit 5i ayarlamanz gerekiyor bu kaydedici
iinde hex 20 anlamna geliyor. U son ekiyle belirteceiniz deer
unsgined olmal.

Artk kullandnz p_int iaretisinden kurtulun ve F7ye basarak


derleyicinin kodlarnz sevip sevmediini kontrol edin.

ARM Programlama

98

ARM Programlama

Tamam, hex E yazarak 1,2 ve 3 bitlerini atamaya ihtiya duyduunuz


GPIO-F Pin-Direction kaydedicisi olan bir sonraki kaydedici ile
devam edebilirsiniz.

Sonunda, GPIO-E konfigrasyon gerektiriyor ayrca dijital fonksiyon


kaydedicisinde 1,2 ve 3 bitlerini atamak gerekiyor.

Buda tamam, GPIO-F Data kaydedicisi krmz renkli Ledi bit 1i


temizleyerek yada atama yaparak yakp sndrebilirsiniz.

ARM Programlama

99

ARM Programlama

Aslnda, eer gerekten ledi yakp sndrmek istiyorsanz, bunu bir


defaya mahsus yakp sndremezsiniz. Bunu sonsuza kadar yapmanz
gerekiyor. Yapalm, led yakp ve sndrme iin kodu bir while
dngs iine alabilirsiniz. artn her zaman doru olduu anlamna
gelen artn yerine sabit 1 yazarsanz, sonsuz dngy kurmu
olursunuz.

Bu kodu derlediiniz zaman, sonsuz while dngsnn ak ynne


ulaamayacan gnderen bir uyar alacaksnz.

ARM Programlama

10
0

ARM Programlama

Launcpad zerinde bu kodu test edelim.


Saya
geitleme
kaydedicisi
ayarlamasnn
uyandrdn not edin, beklendii gibi.
Krmz ledin parladn gryorsunuz.

Ve tekrar karanlk oluyor.

ARM Programlama

10
1

GPIO-F

blounu

ARM Programlama
Sonsuz dng gzel bir ekilde alyor gibi grnyor. Eer herey
doru alyorsa, "Go" butonuna basarak kodu gerek hznda
altralm.
O da ne! Led srekli alr durumda kalyor. Break butonuna basarak
kodu durduralm ve tekrar tek tek ilerleyelim.
Bu sefer herey iyi, yinede gerek hznda altrdmz zaman
yanp snme duruyor. Problemin nerede olduunu biliyor musunuz ?
Evet, program insan gznn Led'in hzl yanp snmesini grmek iin
yetersiz. Program sadece ok ok hzl alyor. Program
yavalatmanz gerekiyor.
Bunun iin 2. derste rendiiniz saym while loop dngsn
kullanabilirsiniz. Bir dng CPU evriminin ounu boa harcamaya
benzer fakat while dngsnn artnda bir st limit atlamasyla
gecikme kontrol edilebilir.
Led'i yaktktan ve sndrdkten sonra her ikisinde de tekrar bir
gecikmeye ihtiya duyduunuzu not edin.

Tamam, tekrar bir deneme yapalm.


Evet, alyor!

ARM Programlama

10
2

ARM Programlama
Bu led yakp sndrme ile ilgi dersi sonlandralm. Bunun ok fazla
nemli olarak grnmemesine ramen, bu sizin gml programlama
kariyerinizde ok nemli bir dnm noktas.
Tebrikler!

N LEMC ve VOLATLE
Gml sistemler programlama derslerine ho geldiniz. Bu derste
sizlere C preprocessor (nilemci) ve Volatile (Uucu) anahtar
kelimeleri ile Led yak sndr nasl gelitireceinizi
gstereceim.
Her zamanki gibi, nceki ders4 projesini kopyalayp, ders5 olarak
yeniden adlandrarak balayalm. Eer ders4 dosyasna sahip
deilseniz bu yazy okuyabilirsiniz.
Yeni oluturulan ders5 dizinine girin ve almaalan (.eww uzantl
dosya) dosyasna ift tklayarak IAR balatalm. Eer IAR ara
setine sahip deilseniz bu yazy okuyabilirsiniz.
Aada ders4te oluturduumuz program gryoruz.

ARM Programlama

10
3

ARM Programlama

Stellaris Launcpad kartndaki krmz ledi yakp sndrme iini


grse de, pek okunabilir durumda deil. nk gizemli numaralar ile
dolu olmasnn yannda, ne olduunu anlatan yorumlar da yok.
Kodun okunabilirliini arttrmak amacyla, Registerlar (Yazma) iin
bu numaralar yerine isimler kullanabilmek ok iyi olurdu. Bunu
baarmamzn bir yolu, herhangi bir C kod parasn makro olarak
kullanmanz salayan C preprocessor (nilemci) kullanmaktr.
rnein, yazm yaptnz ilk Register iin bir makro tanmlayalm.
# karakteri, define kelimesi ve ardndan makronun ad ile
balayan yeni bir satr oluturun.

ARM Programlama

10
4

ARM Programlama

Entegre klavuzu (Datasheet), GPIO iin Run-Mode Clock Gating


Control Registern arm, bizde makromuzu bu registerin ba
harflerinden yola karak RCGCGPIO olarak adlandrdk. Makro adndan
sonra, makronun yerine geecei kodu yaptrn.

Makro tanmlandktan sonra, bu makroyu orijinal kod paras yerine


kullanabilirsiniz.

Derleyici buraya kadarki kodunuzu kabul edip etmediini anlamak iin


F7ye basn.
ARM Programlama

100
100
100

ARM Programlama
C preprocessor denmesinin nedeni, asl derleme ncesindeki metin
dzenleme ileminin ayr bir ilk basama oluudur. Preprocessor,
# iareti ile balayan tm satrlar kaldrr, bylece derleyici
bunlar grmez. rnein; Herhangi bir makro tanm yapn ama kod
ierisinde kullanlmasn. Hibir etkisi olmaz ve kod yine derlenir.

Ayrca, Preprocessor sadece kod ierisinde kullanlan makrolar


deitirir. Bylece; derleyici sadece karakter karlklarn grr,
makro isimlerini grmez. Bu demek olurki; makro C diline tamamen
uymasa da olur.

ARM Programlama

101
101
101

ARM Programlama

rnein, FOO makrosu, bir iareti ifadesinin sadece bir


parasdr. Ama makronun yerine getii metin, ierie
uygunsa,derleyici bunu kabul eder, nk aslnda derleyici aradaki
fark anlamaz. Buradan karacamz sonu ise, makrolarnz nasl
tanmladnza ve yerine getikleri blmlerde anlamlarnn
beklenmedik ekilde deimesine dikkat etmeniz gerektiidir.
rnein, salama almak amacyla, RCGCGPIO gibi makrolar parantez
ierisine alp, referanstan ayrmak her zaman iyi bir fikirdir.

Baka makrolar kullanarak, makro tanmlamak da mmkndr. rnein;


entegre klavuzunda belirtildii gibi GPIOF_BASE makrosunu
tanmlarsnz, bunu dier makrolarn tanmnda da kullanabilirsiniz.
Mesela bacak yn Register iin GPIOF_DIR makrosunu, ana adresten
0x400 uzakta, dijital etkinletirme iin GPIOF_DEN makrosunu, ana
adresten 0x51C uzakta ve GPIOF_DATA makrosunu, 0x3FC uzakta
tanmlyorum.

ARM Programlama

102
102
102

ARM Programlama

Son olarak, kodunuzda yorumlar eklemeniz iddetle tavsiye edilir.


Yorumlar sadece kodunuzu okuyan insanlarn yararnadr ve derleyici
tarafndan tamamen grmezden gelinir. C99 standard 2 yorum tipini
destekler;
/* ve */ karakterleri arasnda snrlanan geleneksel C yorum
tipi.

Ve de // ile balayp satr sonunda biten C++ yorum tipi.

Derleme ncesi bu yorumlarn hepsi birer boluk ile deitirilir


yani programa bir fayda salamazlar sadece dier yazlmclar
tarafndan okunabilirliini arttrr.
ki yorum tipide makro tanmnda kullanlabilir.

imdi kodumuz hala ledi yakp sndrebilecek mi,bunu grmek ilgin


olacak. Bunu gerekten grmek iin, Stellaris Launcpad kartn
kullanacam. Ancak karta sahip deilseniz, Benzetimci iin hata
ayklayc ayarn yapn ve takip edin (Debugger for simulator).

ARM Programlama

103
103
103

ARM Programlama

Harika, Led hala eskisi gibi yanp snyor, tm deiikliklerimiz


alyor.
imdi GPIOF_DATA makrosunu, derleyicinin nasl evirdiini ve bunun
ekstra bir yk katp katmadn detaylca inceliyelim. Sonuta,
kodumuz alrken CPUnun adres teleme ilemleriyle uraacandan
endieleniyor olabilirsiniz. Ama kodunuzu adm adm altrrsanz,
LDR.N komutunun, 0x400253FC adresini, toplama yapmadan, R0a direkt
yklediini grrsnz. Baka bir deyile, kod eskisi kadar verimli,
nk derleyici mmkn olan her sabiti derleme srecinde hesaplar ve
alma srecinde oluabilecek gereksiz hesaplamalar nler.

ARM Programlama

104
104
104

ARM Programlama

Son olarak, ledi yakan asl komutun hangisi olduunu grmek ok


ilgintir. Eer kodu kartnza yklediyseniz bunun STR komutu
olduunu grrsnz. Yani, CPUnun bak asyla, d dnya ile
konumak aslnda ok kolaydr ve belli bir adrese belli bir deeri
yazmak eklinde zetlenebilir.

Tamamdr, programnz hala alyor ve eskisi kadar verimli. Ancak


tm makrolar kendiniz tanmlamak zorundaymsnz gibi bir izlenim
vermek istemiyorum.
Aslna bakarsanz, zorunda deilsiniz. nk mikro denetleyici
reticileri, mesela Stellaris kart rneindeki Texas Instruments,
ARM Programlama

105
105
105

ARM Programlama
bu makrolar hali hazrda bir dosyada sunmaktadr. Hatta ders5
dizinine bu dosyay kopyalamtm. (buradan dosya ieriini
bulabilirsiniz. Tek yapmanz gereken bu ierii kopyalayp bir text
dosyasna yaptrmak ve dosya uzantsn '.h' olarak deitirmek.
http://users.ece.utexas.edu/~valvano/Volume1/lm4f120h5qr.h) Bu
dosyay, projenize sa tklayp, Add > Add Files seenei ile
ekleyebilirsiniz. Dosyann ad lm4f120h5qr.h eklindedir ve
Stellaris Launchpad kartnzdaki ilemci trne tekabl etmektedir.
.h dosya uzants, stbilgi (Header) dosyasdr ve .c
dosyalarna, rnein main.c, eklenmesi iin tasarlanmtr.

Bu stbilgi dosyasn aarsanz, demin tanmladmza benzeyen bir


sr makro ierdiini grrsnz. Ancak, bu stbilgi dosyasndaki
iareti (Pointer) tanmlar olduka farkldr ve biraz aklamaya
ihtiya duyuyorlar.

ARM Programlama

106
106
106

ARM Programlama

stbilgi dosyasndan bir makro alaym ve karlatrmak iin main.c


dosyasna yaptraym.

lk fark iareti tipidir. Main.cdeki makrolarmz iaretsiz int


(unsigned int) tipini kullanrken, st bilgi dosyas iaretsiz long
kullanmakta. Veri tiplerini baka bir derste anlatacam ama
imdilik yle anlataym; 32 bitlik bir cihazda, rnein ARM
ilemci, int tipi de long tipi de 32 bit geniliindedir. Yani
unsigned int ve unsigned long ayndr.
Asl fark Volatile niteleyicisindedir. Derleyiciye iaretinin
iaret ettii nesnenin aniden aniden aniden deiebileceini
bildirir. Bir nesneyi volatile olarak tanmlarsanz, derleyiciye,
programda nesneyi deitirecek bir ifade olmasada, bu nesnenin
deiebileceini sylersiniz. rnein; Launchpad kartnda, GPIOF
ARM Programlama

107
107
107

ARM Programlama
Registernn 2 biti, kullanc butonlarna baldr. Kullanc bu
butonlara basarsa ya da brakrsa, bu bitler deiir. Bu olay tabii
ki bir program komutu yznden meydana gelmez. Bu yzden, GPIOF
Register ve hatta ou dier Giri/k Registeri, Volatiledr.
Bu nemlidir, nk derleyici volatile olmayan nesnelerin deerini
CPU Registerna geirip, bir sre bu Register ile ilem yapp,
sonunda bu Registerdaki deeri nesneye geri yazacak ekilde bir
optimizasyon yapabilir. Volatile nesnelerde, derleyicinin bu tarz
bir optimizasyon yapma izni yoktur. Program, bir volatile nesneyle
yazma ya da okuma ilemi yapmak isterse, derleyici bunu yapmak
zorundadr. Aka grlyorki, volatile niteleyicisi GPIOF gibi
Giri/k Registerlar iin kullanldr. Ayrca normal
deikenlerde de, derleyicinin yapabilecei optimizasyonlar nlemek
iin kullanl olabilir.
rnein counter deikeni, sadece 2 gecikme dngsnde
kullanlmtr. Ancak bu dnglere, derleyicinin bak asndan
bakarsanz, ileme herhangi bir katklar yoktur. nk counter
deikeninin son deerinin ya zerine yazlmaktadr ya da bu deer
atlmaktadr. Bu durumda, derleyicinin gecikme dnglerini yok etmek
iin optimizasyon yapmaya izni vardr. Optimizasyon seviyesini
ykselterek bu durumu rahatlkla grebilirsiniz. Project > Otionsa
tklayn. C/C++ Complier ve ardndan Optimizations sekmesine gelin.
High optimizasyon seviyesini sein ve OKe tklayn.

Tekrar derleyin ve programnz Launchpad kartnda altrn.

ARM Programlama

108
108
108

ARM Programlama

Grdnz gibi led yanar ve yank kalr, sonsuza kadar.


Kodunuzu
adm
adm
altrrsanz,
ledi
yakp
sndrme
komutlarnn yerinde olduunu grrsnz. Ancak aradaki gecikme
dngleri gitmitir. Ancak artk volatile anahtar kelimesini
bildiinize
gre,
derleyicinizin
bu
gecikme
dnglerini
optimizsyonla yok etmesini nleyebilirsiniz. Counter deikenini
volatile yapmalsnz.

Bu arada volatile kelimesi, veri tipinden nce, stbilgi


dosyasndaki makro gibi, ya da sonra yazlabilir. Veri tipiden sonra
yazmanz tavisye ederim.

imdi volatile tanmnn sorunu zp zmediini test edin.


Evet, led yanp snyor.
Adm adm altrrsanz, gecikme dngsn de grebilirsiniz.
imdi .h header dosyasn ana programmza dahil ederek kullanalm.
Tekrardan, bunun iin Preprocessor kullanyoruz. Bir dosya eklemek
iin, yeni bir satra #include yazyorsunuz ve ardndan trnak
iinde dosya adnz ekliyorsunuz.

Ve tanmladmz makrolar header dosyasndakilerle deitirelim.


Mikro
denetleyici
reticisinin
yazd
header
dosyas,
Datasheetteki Register isimlerini kullanmakta. Bylece aradnz
registerler bulmakta sknt ekmezsiniz. rnein;
GPIO_PORTF_DATA, GPIO_PORTF_DIR ve GPIO_PORTF_DEN. Registerin doru
ad konusunda pheniz olursa, adresini kontrol ederek istediiniz
Register olduunu dorulayabilirsiniz. Tm makrolar deitirdikten
sonra, kendi tanmlamalarnz silip kodu tekrar derleyebilirsiniz.

ARM Programlama

109
109
109

ARM Programlama

Kodumuzu son bir kez test edelim, bakalm led hala yanp snecek mi
?

Bylelikle C Preprocessor ve Volatile anahtar kelimesi zerine


dersimiz sona eriyor.

ARM Programlama

110
110
110

ARM Programlama
Artk herhangi bir optimizasyon seviyesinde, doru olarak alan
programlar yazabileceksiniz. Tebrikler!

BTSEL OPERATRLER

Merhaba, gml sistemler programlama derslerine ho geldiniz. Bu


derste Launchpad board zerindeli komposite LEDin tm renklerinin
bitsel operatrler kullanlarak nasl yakldn gstereceim.
Her zaman kigibi bir nceki projeyi kopyalayp ismini ders6 ile
isimlendirerek balayalm. Eer eitimlere yeni balyorsanz,
nceki proje iin bu yazy okuyabilirsiniz.
Ders6 klasrnn iine girip alma sayfamz ayoruz (.eww
uzantl dosya). Eer IAR ara setine sahip deilseniz bu
yazy okuyabilirsiniz.
Bu program ders5de oluturmutunuz. Program 3 renkli ledin bal
olduu genel giri/k portlarnn ayarlanmas ile balyor. Daha
sonra bir sonsuz dng balyor. nce krmz ledi yakyor, bir
sre bekleyip, krmz led snyor. Ve tekrar dngye giriyor.
Sonuta krmz led yanp snyor.

ARM Programlama

111
111
111

ARM Programlama

Bu derste, komposit ledin dier renklerini de kullanmay


reneceiz. Mavi ve yeil renkler. Sanyorum, krmz ledi yakp
sndrdnz zaman boyunca mavi ledi yank tutmak istiyeceksiniz.
Peki bunu nasl yapacaksnz ?
lk adm basit. Mavi lede karlk gelen GPIOF 2 bitini sonsuz
dngden nceye alp ayarlama yapmak gerekir.

ARM Programlama

112
112
112

ARM Programlama

Daha sonra, dngnn iinde, krmz led yandnda bir sorun


olacaktr. Krmz led bitini 1 yaptmz zaman, mavi lede bal
bit 2 de dahil olmak zere dier btn bitleri de 0 yapm
olacaksnz. nk btn led bitleri tek bir register ierisinde
bulunur. Burada ihtiyacnz olan ey, bitleri yanllkla dierini
bozmadan teker teker set/reset yapabilmektedir. te tam burada C
dilinin bitsel operatrleri devreye giriyor. imdi C dilinde bitsel
operatrleri kod yazarak renmeye alalm. Birka tane unsigned
integer deiken tanmlyoruz, bunlara temel deerlerini atyoruz.

ARM Programlama

113
113
113

ARM Programlama

c adl deiken, bitsel operatrn sonucunu ifade edecek.


Bu bitsel OR.

Bu bitsel AND.

Bu bitsel XOR.

Bu bit tersleyici (1e komplementini yani tmleyenini alr)

ARM Programlama

114
114
114

ARM Programlama

Bu saa kaydrma biti.

Ve son olarak sola kaydrma biti.

Kodu derleyip altrmadan


olarak ayarlayalm.

ARM Programlama

nce,

115
115
115

optimizasyon

seviyesini

none

ARM Programlama
Debugger ksmnda Setup sekmesinde simulatr seeneini iaretleyin.
Bylece launchpad board kullanmanza gerek kalmayacak.

Artk F7ye basarak program derleyebiliriz. Download


butonu ile Debuggerde kodu adm adm yrtelim.

and

Debug

Buradaki admda a, b ve c deikenlerinin temel deerlerinin Locals


Windows penceresinde ikilik (binary) olarak gstermemiz gerekiyor.

ARM Programlama

116
116
116

ARM Programlama

Bu
admda
bitsel
inceliyoruz.

OR

ifadesinin

deikenindeki

sonucunu

Grdnz gibi, bitsel OR ifadesi a ve b deikenleri arasnda


mantksal OR gibi davranyor.

ARM Programlama

117
117
117

ARM Programlama
Eer okuldan hatrlarsanz 0n false yani yanl, 1in true yani
doru anlamna geldiini grebilirsiniz.
Doruluk tablosunu verecek olursak;
1 OR 0 = 1,
0 OR 1 = 1,
1 OR 1 = 1 ve
0 OR 0 = 0 dr.
Disassembly penceresinde, 32 bitlik OR ilemlerinin iki operand ile
tek bir makine evriminde ORRS komutu ile, olduka hzl ve etkili
yrtldn grrsnz.

Bitsel AND ifadesi a ve b deikenleri arasnda mantksal AND gibi


davranyor. Doruluk tablosunu hatrlarsanz;
0 AND 1 = 0,
0 AND 0 = 0,
1 AND 0 = 0 ve
1 AND 1 = 1 olduunu rahatlkla kavrayabilirsiniz.

ARM Programlama

118
118
118

ARM Programlama

Disassembly penceresinde, 32 bitlik AND ilemlerinin iki operand ile


tek bir makine evriminde ANDS komutu ile ilendiini grrsnz.

Bitsel XOR ifadesi a ve b deikenleri arasnda mantksal XOR gibi


davranyor. Doruluk tablosunu hatrlarsanz;
0 XOR 1 = 1,
0 XOR 0 = 0,
1 XOR 0 = 1 ve
1 XOR 1 = 0 olduunu rahatlkla kavrayabilirsiniz.
Disassembly penceresinde, 32 bitlik XOR ilemlerinin iki operand ile
tek bir makine evriminde EORS komutu ile ilendiini grrsnz.

ARM Programlama

119
119
119

ARM Programlama

Bitsel NOT ifadesi teklidir. Yani sadece tek bir operand var. Her
1i 0a, her 0 1e evirir.

Disassembly penceresinde MVNS komutu ile ilendiini, Move Negative


ifadesi ile gsterildiini grrz.

Saa kaydrma oparetr her biti bir saa kaydrr. Saa kaydrma
ilemi bir nevi int trnde bir deikeni 2 ile blmektir. Bir hesap
makinesi ile kantlayalm (DEADBEEF / 2). Locals grnm mensndeki
deikenleri onluk sistemde grnmesi iin ayarlyoruz.

ARM Programlama

120
120
120

ARM Programlama

Disassembly pencerisinde saa kaydrma iinin LSRS komutu ile


salandn gryoruz.

Not : LSRS komutu 0lar en nemli bit konumuna doru kaydrr.


Sola kaydrma operatr her biti bir sola kaydrr. Kaydrma ilemi,
2nin 3. Kuvvetine yani 8 ile arplmasna karlk gelir. Fakat
burada olduu gibi ilk bitin 32 bite fazla gelme ihtimaline kar
fazla gelen bite 32 bitlik yap iin yer kalmayacaktr.

Disassembly penceresinde
salandn gryoruz.

ARM Programlama

saa

kaydrma

121
121
121

iinin

LSLS

komutu

ile

ARM Programlama

NOT : LSLS komutu 0lar en nemsiz bit konumuna doru kaydrr.


Bylece, bitsel operatrlerin unsigned saylarda nasl altn
rendiniz.
Signed saylar iin, saa kaydrma
alr. Bir rnek ile inceleyelim.

operatr

tamamiyle

farkl

Signed int trnde, x adnda bir deiken tanmlayp, temel pozitif


deerlerini atayalm.
Baka bir signed int trnde, y adnda bir deiken tanmlayp,
temel negatif deerini atayalm.

Sonra, xin saa kaydrma ilemini baka bir deerde gsterelim.


Son olarak ynin saa kaydrma ilemini de ayn deerde gsterelim.

Derleyip test edelim.


Locals
grnm
grntlyerlim.

mensnde

deikenleri

binary

formatnda

Grdnz gibi, pozitif deer kaydrlma srasnda deerini korudu.


Sfrlar en nemli bite doru kaydrld.

ARM Programlama

122
122
122

ARM Programlama

10luk tabanda z ve xikarlatrrsanz, saa kaydrmann 2nin 3


ss yani 8e karlk geldiini rahatlkla grrsnz. ( 128 * (23)
= 1024 )

Ancak negatifin saa kaydrlmas dierinden tamamiyle farkldr.

nk imdi 1ler en nemli bite doru kaydrld.


Bylece, signed int trnde saa kaydrma ileminde, kaydrma
ileminden nce bit 0 ise 0lar en nemli bite doru kayar. Buna
iaret tamas denebilir. Negatif deerin 2ye tmleyenine karlk
gelir. (Ders 1e renildi) Bu ilem saa kaydrma ve 2nin
katlarna blnrken gerekli bir hal alr.
Aslnda, deeri decimale evirdiiniz zaman, z ve ynin negatif
olduunu ve znin hala ynin 8 ile blmne eit olduunu
grebilirsiniz.

ARM Programlama

123
123
123

ARM Programlama
Unsigned integer ve signed integer arasndaki bu farkllk,
disassembly penceresine baktnzda ok aktr.
Grdnz gibi derleyici saa kaydrma ileminde signed saylar
iin ASRS komutunu (Aritmetik Saa Kaydrma), unsigned saylar iin
ise LSRS (Mantksal Saa Kaydrma) komutunu retir.

Gml sistem programcs olarak, C dilindeki bitsel operatrlerin


arasndaki farklar ve ince ayrntlar ok iyi bilmeniz gerekiyor.
Mesela aritmetik kaydrma / mantksal kaydrma. Bu tr sorular i
grmelerinde sklkla sorulmaktadr.
Ayrca bitsel operatrler olduka yararldr. Sizin yazacanz led
yanp sndrme programnda size avantajlar salayacaktr.
Balang iin, ledlerin bal olduu GPIO bitlerini
tanmlayabiliriz. Krmz led bit 1, mavi led bit 2 ve yeil led bit
3.

ARM Programlama

124
124
124

ARM Programlama

NOT! : Bu bit kaydrma ifadeleri derleme zaman sabitleridir,


avantaj, kaydrlan bit numarasn derhal grebilirsiniz. Alt
seviyeli bitler iin bu avantaj pek etkileyici olamayabilir. Ama st
seviyeli bitler iin, 18 bitlik gibi, 1 saa kaydrma ifadesi
sonucunda 0x4000 saysnn sonucunu grmek hi de kolay bir i
olmayacaktr.
Bu
sabitlerin
tanmlanmas
bize
ok
zaman
kazandracak. Ayrca programda bir ok aptalca hatay nleyecektir.
Yani kesinlikle tavsiye ediyorum bunu!
Led renkleri iin sabitleri tanmladktan sonra hex saylar yerine
bunlar yazabiliriz. Kodun okunurluunu arttracaktr.

ARM Programlama

125
125
125

ARM Programlama

Aslnda kodunuz kendini aklar hale geliyor. Yorum satr gereksiz


bir hal alacaktr. Yorum satrlarn silebilirsiniz.
imdi, mavi ledi sndrmeden krmz renkli ledin yanmas
durumunda yaplacak GPIOF ayarlamalarn ele alalm. Bunun iin data
registerndaki o anki deer ile krmz renk biti arasnda bitsel OR
operatrn kullanabilirsiniz.

Bu ie yarar, nk bitsel OR, GPIOF iindeki herhangi bir bit ve


KIRMIZI_LED orijinal GPIOF bitini saklar.
KIRMIZI_LED zerindeki btn bitler
olmas durumunda sonu 1 olacaktr.

ise,

deiiklik

olmaz,

GPIO_PORTF_DATA_R
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
KIRMIZI_LED
00000000000000000000000000000010
--------------------------------------------------------GPIO_P.. | KIRMIZI_LED xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1x
NOT! : Bu durum sadece GPIOF register zerinden okuma ve yazma
ilemi yaptnzda geerli olur.
Yani byle bir durumda okuma/yazma izni olup olmadn veri
sayfalarndan kontrol edeceksiniz.
C dili, yazm kolayl salamak amacyla baz ksaltmalarn
yaplmasna izin vermektedir.
ARM Programlama

126
126
126

ARM Programlama
Eitliin sa veya sol tarafna OR iaretini tamak mmkndr ve
ayn sonucu verir.
Aada yazlm
almaktadr.

olan

bu

iki

kod

tam

olarak

ayn

ekilde

Bylece burada GPIOF registerndaki krmz led bitini ayarlamak


iin en ksa kodu grm oluyorsunuz.
Ltfen bunu C dilinde bir tr ksayol olarak hatrlayn.
GPIOF registerndaki krmz led bitini sfrlamak iin, krmz led
bitinin tersi ile bitsel AND operatrn kullanmalsnz.

Bu durum ie yarar, nk bitsel AND operatr ~KIRMIZI_LEDin 1


olduu yerlerde orijinal durumunu korur. 0 olduu zaman 0 durumuna
deiir.
GPIO_PORTF_DATA_R
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
~KIRMIZI_LED
00000000000000000000000000000010
--------------------------------------------------------GPIO_P.. & ~KIRMIZI_LED xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0x
Ve tekrar, bu operatr eitliini daha ksa bir kod parac ile
yazabilirsiniz.

Bunun C dilinde bit temizleme ksayolu olduunu unutmaynz.


imdi, bu kod ksayollarna biraz daha kritik bir gz atabilirsiniz.
rnein, mavi ledi yakmak, ayn anda GPIOF registernda bir biti
ayarlamaktr. Yani bu bit ayarlama ksayollaryla kod yazmay
gerektirecektir.

Aslnda kodumuzdaki ilk satrn hepsi, bit registerlarnn


deerlerini gsteriyor, yani onlarnda bit ayarlama ksayollar ile
yazlmas gerekecektir.

Ve son olarak, kodunuzun okunabilirliini arttrmak iin daha fazla


makro ekleyebilirsiniz.

ARM Programlama

127
127
127

ARM Programlama

Derlemeden nce, Project > Options sekmesinden, Optimization ksmn


High seviyesine ve Debugger ksmn TI Stellarise ayarlyoruz.

ARM Programlama

128
128
128

ARM Programlama

imdi program Launchpad boarda ykleyip, altralm.

ARM Programlama

129
129
129

ARM Programlama

Grdnz gibi mavi led hep ak, snk olan krmz led, gz
krpar gibi alp kapanyor.
Kodlara, krmz ledin set/reset ayar iin blme noktalar
koyarsak, grld gibi, krmz ledin set olmas Load Modify
Store ilemlerinden oluan bir dngye gerekleiyor.

Burada bitsel ORR makine komutu veriyi modife etmek iin


kullanlyor.
Krmz ledi resetlemek iin, bir dier Load Modify Store
dngs devreye giriyor.

ARM Programlama

130
130
130

ARM Programlama

Buradaki ilginlik, derleyici biti temizlemek iin gzel bir kod


olan BIC (Bit Clear) komutunu retiyor. Bu olduka dikkat ekici
nk derleyici kodlarnzn bitsel AND ve terleyici ile olan
ilemini harfi harfine takip etmeyecektir.
Derleyici tm kodlarda clear ilemini nerede yapma niyetin olduunu
anlamak yerine, daha kullanl bir kod retiyor.
Bu rnei iyi renmenizi istiyorum. nk bu rnek, bir biti
temizleme gibi kodlarn ksa ekilde kullanlarn, derleyicinin
sizin aslnda ne yapmak istediini anlamasn salamay, gsteriyor.
Sonu olarak, bu ders bitsel operatrler ile ilgi bilgi verdi.
Bitlerde nasl SET CLEAR TOOGLE ve kaydrma ilemlerinin
yaplacan gsterdi.

ARM Programlama

131
131
131

ARM Programlama

DZLER ve ARET
ARTMET

Gml sistemler programlama derslerinin 8. Serisine ho geldiniz.


Bu derste, C dilinde dizileri ve temel iareti aritmetiini
tantacam. Bu bilgilerin Stellaris bilgi kaydedicilerine nasl
uygulandn ve avantajlarn reneceksiniz.
lk nce, genel olarak bir nceki derste yaptklarmz
hatrlayacaz. Eer eitim serisine yeni katldysanz buradan
nceki ders dosyalarna ulaabilirsiniz. Her zamanki gibi ders6
dosyasn kopyalayp ders7 olarak adlandryoruz. Ders7 dosyasna
girin ve workspace dosyasna tklayarak IAR programn altrn.
Eer bilgisayarnzda IAR ykl deilse, bu dersi okuyabilirsiniz.

ARM Programlama

132
132
132

ARM Programlama

Bu proje ders6da yaptklarmzdr.


ayklamaya (Debug) geelim.

ARM Programlama

133
133
133

Biraz

dzenleyelim

ve

hata

ARM Programlama

Bu program genel giri/k portlarn deitirmek iin Read


Modify Write Sequence tekniini kullanr. Bylelikle dier
bitler deiiklikten etkilenmezler. rnein, bit 1 krmz ledi
kontrol eder. Program GPIOF DATAnn o anki deerini LDR
talimatlaryla okur. Daha sonra, bit 1i ayarlamak iin mantksal OR
ilemi yapar. Son olarak, deien deeri yazdrr.
Read Modify Write Sequence gereklidir, nk GPIO bitleri tek
bir byten iinde tek adreste kaytldr. Her bitin kendine zg
adreslerle donatldn hayal edin. Daha da iyisi, ihtimal
dahilindeki GPIO kombinasyonlarnn kendine zg adreslerinin
olduunu dnn.
Tek atomik yazma ilemi, dier bitleri ie kartrmadan GPIO
bitlerinin deitirilmesini salar. Bu derste, Stellaris donanmnda
az nceki anlattklarm nasl yapacanz gstereceim. Tipik Read
Modify Write Sequence ile bir adet Atomic Write ilemini
deitirebileceksiniz. Ancak, nasl yaptmz gstermeden, neden
bu kadar zahmete girdiimizi anlamak daha iyi olacaktr.
En nihayetinde, Read Modify Write Sequence ou zaman
yeterince hzldr. Ancak ilgilendiimiz konu hz deildir. GPIO
bitlerine, gerekten bamsz olarak mdahale etmenizi amalyorum.
Tm kodlarnzda, hatta kesmelerde bile. Kesmelere ilerleyen
blmlerde deineceiz. Kesmeler byleyici bir konudur, zellikle
gml sistemlerde. imdilik kesmelerin donanm tabanl olduunu ve
program
aknz
beklenmedik
bir
ekilde
deitireceini
syleyeyim. Bir kesme aktif olduunda, ilemcideki zel bir donanm
Program Sayacndaki (PC) deeri deitirir ve ilemci aniden ISR
(Interrupt Service Routine) ad verilen kodlar altrmaya balar.
ISR ksa kodlardan oluur. Kesme rutini bittii zaman ilemci
kald yere (Orijinal kodlara) dnerek almasna devam eder.
ARM Programlama

134
134
134

ARM Programlama
lgin ksm ise; kesme rutini, ana programn GPIO deerlerini
okuduktan sonra ve deitirilmi deeri yazmadan nce, Read Modify
Write ileminin ortasnda alrsa (1), kesme rutininin GPIOda
yapt deiiklikler kaybolur. nk esas kodlarmz kullanmdadr
ve GPIOun eski deerini kullanyordur (2).

Bu, Read Modify Write sekans iin doal bir problemdir.


Stellaris GPIO donanm tasarlayclar bu hatay dzeltmek iin,
Read Modify Write sekans yerine Atomic Write Operation
kullanmanz tavsiye ediyor.

ARM Programlama

135
135
135

ARM Programlama

Nasl altna bakalm. GPIO ile CPU (ilemci) arasnda pek ok


balant vardr. Bunlara bus denir. Her bir bit atanm veri yoluna
ve adrese baldr. Bit, adres yolu 1 olursa deiir. Dier
durumlarda bit etkilenmez. rnein, 3 GPIO bitini izole edip lede
balamak iin adresimizin 0000111000 olmas gerekir. En dk iki
adres, A0 ve A1 kullanlmad nk donanm, tm adreslerin 4n kat
olmas gerektirir. Yazdnz veri, pinlerin durumuna karar verir.
rnein, krmz ledi yakabilirsiniz, mavi ledi sndrebilirsiniz
veya yeil ledi yakabilirsiniz. Hepsini tek bir komutla yaparz.
Umarm her ey anlalyordur. Donanm dizaynnda pek ok kayt
kendine zg adres gerektirir. Sadece GPIO kendine zg adrese sahip
deildir. GPIO iin 8 kayt gerekir. Her bir bit kombinasyonu iin
ayr adres emada tanmldr. 8 adet GPIO bitleri iin tm mmkn
bit kombinasyonlarnda Stellaris GPIO, 0x40025000 adresi ile
balayan 256 adet 32 bit veri kayts barndrr. imdiye kadar,
1111111100 ikilik ve 0x3FC onaltlk GPIO_PORTF_DATA_R kaytlarn
kullandk. Bu kaytnn bitleri izole edilmemi grnyor fakat 8
GPIO bitleri veri yollaryla deitirilebilir. Bu derste dier
kaytlar da kullanacaz. imdi, dier tm GPIO kaytlarna
Cde nasl ulaacaz?
Birinci seenek, 3. Eitimde rendiimiz Brute Force yaklamyla
direkt adresleme. rnein, led den sorumlu 1 biti izole etmek iin,
manuel olarak adresi hesaplayabiliriz. Datasheette bulunan Base
adressten balarz, 2 bit sola kaydrarak KIRMIZI_LEDe ekleriz ve
kullanlmayan 2 biti atlam oluruz.
aretiye (pointer) ve iaretiyi kaldrmak iin sentezlenmi adres
dkmne ihtiyacnz vardr. Unutmayn bu adres tek biti izole eder,
bu bit iin yazdnz nemlidir. Dier bitler iin yazdnz
nemsizdir.

ARM Programlama

136
136
136

ARM Programlama
Gsterim iin, KIRMIZI_LEDe 1 dier bitlere de 0 deerini atayalm.

F7ye basalm ve derleyelim. Kit zerinde bunu test etmek ilgintir.

Grdnz zere Read Modify Write sekans, STR komutunu R2


adresinde basitletirir. GPIO base adresi 8 eklenerek offset edilir.
Kodlara baktmzda, krmz ledi yanyor, dier ledleri deimiyor
olarak grrz. Kodlar tam istediimiz gibi kite yansyor. Kodlar
alyor, fakat kodlarmz optimize ekilde deiller. Dizi
tanmlamas ile kodlar daha optimize hale getirebiliriz. Dizi
(Array), ayn tipteki bir grup deikenin ardk hafza bloklarna
yerletirilmesidir. rnein 256 adet GPIO veri kaytlar.
ARM Programlama

137
137
137

ARM Programlama
C dilinde, bir deikene keli parantez ierisine bir say yazp
ekleyerek dizi tanm yapabilirsiniz.

rnein; bu dizi, her biri geici tam say olan 2 saycdan oluur.
Hatta tm diziyi tanmlamak iin bu ekilde bir zm
uygulayabilirsiniz.

imdi
dizi
elemanlarn
kullanabilirsiniz.

normal

birer

deiken

olarak

C dilinde, parantez ierisindeki say dizi indisi (Array index)


olarak adlandrlr ve dizinin ilk elemannn indisi daima 0dr.
kincisi 1dir ve artarak devam eder.
F7ye basp derleyelim.
Cdeki diziler iaretilerle balantldr. Derleyici dizinin
balad noktaya iareti gibi davranr. indisli iaretiyi almak
iin, dizi iaretisine i eklersiniz.
Counter[1] yerine *(counter+1) yazlabilir. Bu iareti aritmetiine
bir rnektir.

ARM Programlama

138
138
138

ARM Programlama
Diziler ve iaretiler arasndaki haberleme ift ynldr nk her
bir iareti dizi olarak grntlenebilir. rnein, standart LM4F
header dosyas, iareti GPIO_PORTF_DATA_BITS_Ryi tanmlar.

Bu iareti, 256 GPIO kaytlarnn tmne ulamak iin


kullanlabilir. Sadece KIRMIZI_LED bitine ulamak iin,
GPIO_PORTF_BITS_Ra bu ekilde indis atayabilirsiniz.

ARM Programlama

139
139
139

ARM Programlama

areti aritmetii kullanm ile ayn kapya kyor.

ARM Programlama

140
140
140

ARM Programlama

Hata ayklamaya geelim ve bu seenei karlatralm.


Grdnz gibi, uygulama, R4e ayn adresi yazyor.

ARM Programlama

141
141
141

ARM Programlama

Bu kk deneyimiz, 3 farkl alternatifin de edeer olduunu ve


ayn makine kodlarn rettiini gsteriyor.
Kaynak kodumuza dnelim. Size iareti aritmetiinin farklarndan
bahsedeyim.
lk olarak, adres aritmetiini ve uzun iaretsiz iaretilerde raw
adres aritmetiini greceiz.
KIRMIZI_LEDi, 4 byte boyutundaki GPIO kaytsna almak iin, 2 bit
sola kaydrmanz gerekir.

kinci
olarak,
iareti
aritmetii
kullanrz
nk
GPIO_PORTF_DATA_BITS_R uzun iaretsiz iaretidir. areti
aritmetiinde elemann bykln kltmek zorunda deilsiniz, bu
otomatik olarak yaplr. Dizi indislemesi ve iareti aritmetii
denklii nedeniyle byle olmaldr.

seenek arasnda dizi indisleme en iyisi gibi grnyor.

Bu seenei kullanp dierlerini ayr tutuyorum.

ARM Programlama

142
142
142

ARM Programlama

Krmz ledi sndrmek iin dizi indisleme tekniini kullanalm.


Balant emasndan hatrlarsanz, bu teknikte KIRMIZI_LED bit
konumuna 0 yazmamz gerekiyor.

ARM Programlama

143
143
143

ARM Programlama

Sonunda MAV_LED bit ayar iin tutarl bir ekilde dizi indislemeyi
kullanyoruz.

ARM Programlama

144
144
144

ARM Programlama

Bu, GPIO bitlerini deitirmek iin,


tekniini kullandmz son programd.

Fast

Interrupt

alma kitimizde test edelim.


lk olarak, tam hzda alalm ve ledleri gzlemleyelim.

ARM Programlama

145
145
145

Safe

ARM Programlama

Grdnz gibi program nceden olduu gibi alyor.


Kodlar duraklattmzda KIRMIZI_LED bitini temizlemek iin, R0da
bulunan sadece bir adet STR komutu kullandmz grlyor.

Programmz
daha
iyi
hale
geldi,
mikrodenetleyicisi daha iyisini yapabilir.

ARM Programlama

146
146
146

ancak

Stellaris

LM4F

ARM Programlama

Yukardaki grntye baktmz zaman mikrodenetleyicinin bir deil


de, iki adet evresel busa sahip olduunu grrz. Advanced
Peripheral Bus (APB) ve Advanced High Performance Bus (AHB). GPIO
portlar her ikisine de baldr.
APB, n tanml olarak seilidir ve imdiye kadar bunu kullandk.
Ama APB eskidir ve AHBden daha yavatr. Bunun nedeni geriye dnk
uyumluluk olmas iindir. Dersin kalan ksmnda AHBnin nasl aktive
edileceini gstereceim.
lk olarak Datasheetten GPIO High-Performance Bus Control ksmn
bulun.

ARM Programlama

147
147
147

ARM Programlama

ekilde grld
edilmektedir.

zere,

PORTF

(GPIOHBCTL)5.

Bit

ile

kontrol

imdi LM4F header dosyasn an ve GPIOHBCTL kaytsna bakn.


Kayt ismini kopyalayn ve 5. Biti aktive edin.

ARM Programlama

148
148
148

ARM Programlama

Datasheette APB Apeture adyla geen, APB adres aralndan GPIO


adreslerini deitirmelisiniz. GPIO_PORTF iin LM4F header dosyasna
gz atn, _AHB n eki ile balayan kaytlarn bulun.

ARM Programlama

149
149
149

ARM Programlama

Bu n eki, programnzda tm GPIO_PORTF kaytlarna ekleyin.

ARM Programlama

150
150
150

ARM Programlama
En son ekli ile kodlar kitimizde test edelim.

Bu dersi, C dilinde diziler ve iareti aritmetii ile bitiriyoruz.


Stellaris GPIO konusunda uzman oldunuz. Tebrikler!

ARM Programlama

151
151
151

ARM Programlama

FONKSYONLAR ve STACK

Gml sistemler programlama dersinin 9. serisine ho geldiniz. Bu


derste C fonksiyonlar ve Stack'i (Yn) tantacam.
Fonksiyonlarla almann tm nemli ynlerini sadece bir derste
anlatmama imkan yok. Bu yzden, genel olarak C'deki stack'lerin
baka fonksiyonlar aran fonksiyonlar armay nasl mmkn
kldna odaklanacam.
C ya da C++'n alt dzeyde nasl alacana dair sadece tek bir
ey renmek istiyorsanz, C stack bu tek bir ey olmaldr. nk
fonksiyonlar, kesmeleri, programdan programa gei ve RTOS'u (Real
Time Operating System Gerek Zamanl letim Sistemi) anlamann
temelinde stack vardr.
Her zamanki gibi, bir ndeki ders7 projesini kopyalayp, ders8
olarak adlandrarak balayalm. Derse henz balyorsanz nceki
proje iin u yazy okuyabilirsiniz. Yeni oluturulan ders8
dizinine girin ve alma alan (.eww uzantl dosya) dosyasna ift
tklayarak IAR ortamnda an. IAR programna sahip deilseniz
uyazy okuyun.
abuk bir ekilde bu programn ne yaptn hatrlayalm.

ARM Programlama

152
152
152

ARM Programlama

GPIO hatlarna bal olan led'leri kontrol etmek iin LM4F


mikrokontrolcsndeki yazmalar ayarlamakla balyor (1). Sonra,
mavi led'i yakyor (2) ve devamnda sonsuz bir dngye giriyor (3).
Bu dng ierisinde, krmz led'i yakyor (4), gecikme dngsnde
bekliyor (5), krmz led'i sndryor (6), baka bir gecikme
dngsnde tekrar bekliyor (7) ve baa dnyor. u aamada, programa
baktnzda, gecikme dngsnn tekrar kullanmnn irkin
gzktn kabul edeceksinizdir. Hatta, DRY prensibine ters
dmektedir. Do Not Repeat Yourself (Kendini tekrar etme). Dier bir
deyile; programlama yaparken tekrarlamalar yok etmek iin
uramalsnz. Bylece ayn olmas gereken kodlarnz uyumsuz
almaz.
Bugn, tekrarlardan kanmann ana tekniklerinden birini
reneceksiniz. Bu teknik ise, ayn kodu harfi harfine tekrardan
yazmaktansa, bu kod parasn fonksiyona evirip, gerektii kadar
armaktr. C dilinde bir fonksiyon, nam dier procedure,
subroutine, sub-program, bir program ierisinde farkl yerlerden
altrlabilen, tekrar kullanlabilir bir kod parasdr. Bir kod
parasn, fonksiyona evirmek iin; ona bir isim, argman listesi
ve dn deeri tipi atamalsnz. Basit bir balang yapalm:
Gecikme fonksiyonumuzun ad beklet olsun, deikeni ve dndrd
bir deer olmasn.

ARM Programlama

153
153
153

ARM Programlama

Dn tipi, isim ve argman listesi birlikte bir fonksiyonun


imzasn olutururlar. mzadan sonra, parantez ierisinde fonksiyon
kodu olur.

Fonksiyonunuz tanmlandktan sonra, kolaylkla istediiniz kadar


arabilirsiniz. Bir fonksiyonu armak iin gereken szdizimi;
fonksiyon ad ve parantez ierisindeki argmanlar eklindedir.

ARM Programlama

154
154
154

ARM Programlama

Fonksiyon argmansz da olsa, parantezler gereklidir. Bir fonksiyon


armak, ak deitirerek fonksiyon kodunun balangcna atlamak,
kodu yrtmek ve ardan bir sonraki komuta geri dnmek demektir.
F7'ye basarak bu kodun derlenip derlenmeyeceine bakalm.

ARM Programlama

155
155
155

ARM Programlama

Bu kodu kit zerinde denemeden nce, proje seeneklerini


deitirelim. Optimizasyonu Low'a ayarlayn. nk yksek
optimizasyon seviyelerinde derleyici o kadar aklldr ki, imdiye
kadar yaptklarnz tersine evirip, fonksiyon ek ykn yok
edecektir. Buna bir fonksiyonu Inlining (Satriileme) denir ve bu
durumda byle Bir ey istemiyoruz. Ayrca, fonksiyonlarla alrken
REQUIRE PROTOTYPES seeneini iaretlemenizi iddetle tavsiye
ederim.

Bu sefer F7'ye basarak derlemeye altnzda, beklet()


fonksiyonunun bir prototipe sahip olmadna dair bir hata alrsnz.
Bir fonksiyon prototipi, fonksiyon imzasndan sonra, kod blm
yerine noktal virgl koyarak oluturulur.

ARM Programlama

156
156
156

ARM Programlama

Derleyici,
tanmlarndan
nce
her
fonksiyonun
prototipini
grmelidir. Bu arada, beklet() fonksiyonunuz bir argman listesi
istememektedir. Eski C dili standartlarnda, bunu void yazmak
yerine sadece bo brakrak tanmlayabilirdiniz.

Bunu bir deneyelim hemen.

Grdnz gibi kod artk derlenmiyor. Bunun nedeni, geriye


uyumluluk iin, bo argman listesinin, argmanlarn tanmlanmad
ve her ey olabilecei anlamna gelmesidir. REQUIRE PROTOTYPES
seenei ile, derleyici daha katdr ve byle zayf tanmlanm bir
prototipi tanmaz. Fonksiyonun argman listesini tekrar void
olarak tanmlayalm.
Artk kodu, Stellaris kartnda altrmak iin hazrsnz. lk i,
programn led'i hala yakabildiini test etmek.

ARM Programlama

157
157
157

ARM Programlama

Ve yanyor. Kodu durdurduumuzda, programnz beklet() fonksiyonu


iinde
bulacaksnz.
Bu
olaandr,
nk
program
zamannn
%99.999'unu gecikme dngsn yrtmekle geiriyor. Test edilecek
dier ilgin ey ise, ilemcinizin gecikme fonksiyonunu aslnda
nasl ard. Bir breakpoint (kesme noktas) koyalm ve program
altralm.

Grdnz gibi, gecikme fonksiyonunuza yaplan ar, BL isimli tek


bir komuttan ibarettir.

ARM Programlama

158
158
158

ARM Programlama
nceki kontrol ak konulu 2. dersimizden hatrlarsanz, bir
dallanma komutu, sadece program sayac (Program Counter PC)
yazmacnn deerini deitirir. BL komutu ise, fazladan bir etkisi
vardr ve sradaki komutun adresini R14 yazmacna, Link Register'a
(Balant yazmac) saklar.

Bylece, LR, fonksiyon tamamlandktan sonra dnlecek yeri hatrlar.


BL'den sonraki komutun adresinin 0xA8'de olduunu aklmzda tutalm.
Bu arada, BL komutunun 4 byte uzunluunda olduuna dikkat edin.
Dier komutlarn ou sadece 2 bayt uzunluundadr. ARM Cortex-M
ilemcisinin THUMB2 isimli komut seti, ounlukla 2 byte, nadiren de
4 byte komutlardan oluur. BL komutundan bir adm ileri giderseniz,
program sayacnn gerekten de beklet fonksiyonunuzun balangna
atladn ve LR'nin 0xA8 olarak deitiini grrsnz.

Bir dakika! Aslnda 0xA9 oldu. Bu olduka gariptir, nk THUMB2


komutlar ift sayl bir adres ile hizalanmaldr ve 0xA9 tekdir.
Bu gariplii birazdan, fonksiyonumuzun nasl geri dndn
gzlemledikten sonra aklayacam. Ama bundan nce, fonksiyon
kodumuz hakknada birka ilgin ey aklayacam.

ARM Programlama

159
159
159

ARM Programlama
Fonksiyon, SP yazmacn ayarlamakla balyor.

SP'nin alm Stack Pointer (Yn yazmac)'dr ve R13 yazmacnn


dier addr. Sp, C ar yn (call stack) mekanizmasnn
donanmsal uyarlamasdr ve bu dersteki renilecek en nemli
yazmatr. C yn, basite sylersek, RAM'deki tek bir taraftan
byyen ya da klen bir alandr. Bu tarafa yn tepesi denir ve
SP yazmac bu tepe adresi ierir.
Hafzadaki yn, Memory View'i (Hafza Grnm) SP'de saklanan
adrese ynlendirerek. Kolayca grebilirsiniz. Yn grmek iin,
hafza grnmn tek stuna ayarlamak en iyisidir.

ARM Programlama

160
160
160

ARM Programlama
ARM ilemcilerde, yn, en alt adreslere doru (Hafza grnmnde
yukarda) byr ve yksek adreslere doru (Hafza grnmnde
aada) klr. Dier ilemcilerde, yn ters ynde byyebilir.
C ynlar iin iyi bir benzetme, bulak ynlardr. Tabaklar
sadece en tepeden alabilir ya da ekleyebilirsiniz. Yani artk
anlayacaksnz ki, SP'den 4 karmak, yn bu kadar bytr ve
ynn tepesinde counter yerel deikenine yer aar. Sonrasnda
bu deiken sfrlanr ve 1 milyon kere arttrlr.

imdi, fonksiyonun sonuna bir breakpoint koyalm ve nasl geri


dndn grelim.
Geri dnmeden nce derleyicinin yapmas gereken ilk ey, fonksiyona
girilince ynda yaplan deiiklikleri geri almaktr.

ARM Programlama

161
161
161

ARM Programlama

Bizim rneimizde; counter deikeni tarafndan tutulan 4 baytlk


alan boaltmak iin yn klr. Ynn imdiki tepesinde
grebileceiniz gibi, counter'n son deeri 0xf4240'tr ve ondalk
tabanda 1 milyona denk gelmektedir. Yani gecikme dngmzdeki
tekrarlama says. Sonraki komut ise, fonksiyondan geri dnme
komutudur.

Geri dnme; BX dallanma komutu ile gerekleir. BX, branch (dallan)


ve exchange (deitir)'in ksaltmasdr. Bu komut, Program Counter'
belirlenmi bir yazmacn deerine ayarlar. Bu durumda LR. Ancak,
LR'deki bitlerin hepsi PC'ye aktarlmaz. zellikle PC'deki en dk
deerli bit 0'a ayarlanr. Bu mantkldr nk geri dn adresi
ift olmaldr. LR'nin en dk deerli bit'i adreleme yerine, komut
ARM Programlama

162
162
162

ARM Programlama
seti deiim bit'i olarak kullanlr. Bu bit 1 ise, ilemci THUMB
komut setine, 0 ise ARM komut setine gei yapar. Ancak ARM Cortex-M
serisi, sadece THUMB2 komut setini destekler ve aslnda ARM setine
geemez. Yani, Cortex-M'de, BX komutunun bu davran sadece eskiden
kalan bir mirastr. imdi BX komutunu iletelim ve nereye
gideceimizi grelim.

Gerekten de 0xA8 adresine gidiyoruz, ki bu adres beklet()


fonksiyonumuzdan bir sonraki komutun adresidir. Son olarak ne
olacan grmek iin, beklet() fonksiyonunun sonuna gidelim ve
LR'nin en dk deerli bitini 0 yapalm.

Bylece ekirdek durumu ARM'a


ekirdeinde destekli deildir.

ARM Programlama

163
163
163

dnecektir,

ama

ARM,

Cortex-M

ARM Programlama

Grdnz gibi, BusFault (Veriyolu Hatas) istisnai durumu


oluuyor. stisnai durumlar, kesmeler hakkndaki bir sonraki yazda
anlatacam. imdilik, bir ilemcinin olaslksz bir durumu nasl
idare ettiini gstermek istedim. Makine istisnai durum ileyicisine
girer. Bu da projenize tanmlayacanz bir fonksiyon gibidir.
leyiciden kmak iin, makineyi yeniden ayarlamanz (Reset)
gerekir.

Reset, sizi main'in bana getirdii iin, baka bir fonksiyonu


aran bir fonksiyonu incelemeniz iin iyi bir frsattr. Artk
main()'in de aslnda, beklet fonksiyonu gibi bir fonksiyon olduunu
fark ettiinizi umuyorum. beklet()'i armadan nce, main bir
yaprak (Leaf), aacnn bir yapra gibi, fonksiyondu, nk baka
fonksiyonu armamt. beklet()'e ary eklediinizde, main
artk bir yaprak fonksiyon olmaktan kar ve kendi geri dn
adresini korumak iin zel bir ey yapmas gerekir. Hatrlarsanz,
geri dn adresi, LR yazmacnda saklanr. Ama bu yazma, BL komutu
tarafndan yeni bir geri dnme adresi ile doldurulur. BL komutunu
ileten her fonksiyon, bir ekilde LR'nin nceki deerini doru yere
dnmek iin saklamaldr. Asl soru, LR'yi saklamak iin en iyi yer
neresidir? Koddaki gibi, bu yerin stack olduunu umarm grrsnz.
PUSH (itme) ilemi, belirli yazma listesini stack'e kaydeder ve
stack'i bytmek iin otomatikman ve hassasiyetle stack iaretisini
azaltr. Bunu PUSH komutunu altrarak dorulayalm.

ARM Programlama

164
164
164

ARM Programlama

zetlersek, stack'in 2 ama iin kullanldn rendiniz. lki;


arlan fonksiyonlarn yerel deikenlerini tutmak ve ikincisi;
geri dnme adresini saklamak.
Son olarak, fonksiyon argmanlarnn ne iin olduunu ve nasl
kullanlacan gstermek istiyorum.
Fonksiyon argmanlar fonksiyon arldnda yerel deikenlerin
ilk deerlerini belirtmenizi salar. Bylece her ar, farkl
argman deerleri ile yaplabilir. rnein, beklet() fonksiyonunuzun
her yrtmede farkl bir tekrarlama saysn iletmesini
isteyebilirsiniz. Bunun iin, fonksiyon iindeki tekrarlamay
snrlayan iter isimli bir integer argman tanmlayabilirsiniz.

Bir fonksiyona argman tanmladktan sonra, her arlnda


balang argman deerleri verilmelidir. Program imdi derlemeyi
denerseniz, derleyici, beklet() fonksiyonuna yaplan 2 ar iin
hata verecektir. nk artk prototipe uymuyorlar.

ARM Programlama

165
165
165

ARM Programlama

Bu da prototipleri kullanmann gzelliidir. nk derleyici, her


fonksiyon arsnda doru sayda ve tipte argman vermeyi
unutursanz, sizi uyarabilecektir.
Artk argmanlar verelim.
lk ar iin 1 milyon tekrarlama ve ikincisi iin sadece 500 bin
kullanyorum. Bylece krmz led, snk olduu srenin iki kat
yank
kalacaktr.

Bu kodu LaunchPad kartndan altralm. lk olarak, tm


breakpoint'leri kaldralm ve led'i izlemek iin engel olmadan
altralm.

ARM Programlama

166
166
166

ARM Programlama
Gerekten de greceksinizki
kalmakta.
Sonra, parametrelerin nasl
fonksiyonuna
yaplan

krmz renk, iki


iletildiini
arlara

kat sreyle yank

grmek iin
breakpoint

beklet()
koyun.

Grdnz gibi, BL komutundan nce, R0'a sabit bir deer atanm.


beklet()'e ikinci arda bu sabit 0x7A120, yani ondalk tabanda 500
bin.

lk arda ise, R0'a yklenen deer nceden de tandmz 0xF4240,


yani ondalk tabanda 1 milyon deeri ykleniyor.

ARM Programlama

167
167
167

ARM Programlama

Grdnz gibi, iki durumda da, iter argman R0 yazmacna


tanmtr. imdi gecikme fonksiyonumuza geelim ve iter
argmann nasl kullandn grelim.

Gerekten de, iter argman R0'da ve counter deikeni stack'in


tepesinde bulunuyor, nk counter'n adresi SP yazmacndaki deer
ile ayn.
Bylelikle fonksiyonlar ve ar stack'i zerine ilk dersimiz
sona eriyor. Fonksiyonlar son derece nemlidir, nk onlar
dzgn bir ekilde tasarlayabilirseniz, iin NASIL yapldn
gz ard edebilir ve sadece NE yapldna odaklanabilirsiniz,
ki bu ok daha kolaydr.
ARM Programlama

168
168
168

ARM Programlama

Modller, zyineleme ve AAPCS

Gml sistemler programlama derslerine ho geldiniz. Bu derste Cde


fonksiyon konusuna devam edeceim. Bugn fonksiyonlarn programnz
nasl ayr dosyalara bldn reneceksiniz. lk zyineleme
fonksiyonunuzu yazacaksnz ve ARM uygulama prosedr arma
standard (AAPCS) hakknda bilgi edineceksiniz.
Yine her zamanki gibi nceki ders8 projesini kopyalayarak balayalm
ve ismini ders9 olarak deielim. Eer eitime yeni katlyorsanz
nceki proje iin bir nceki yazy okuyabilirsiniz. Ders9 dizinine
girin ve workspace (.eww uzantl dosya) dosyasna ift tklayarak
IAR Tool Seti an. Eer IAR Tool Setiniz ilk eitime
gidebilirsiniz.
imdiye kadar ne yaptmz hzlca anlataym. Son derste
belirtilen sayda dng yinelemesi iin beklet fonksiyonumuzu
oluturmutuk. Aada beklet fonksiyonumuzun ifadesi var.
Bu ayrca prototip olarak bilinir. Bu resimde
ise beklet fonksiyonumuzun kendisi var.

Beklet fonksiyonu programda iki yerde arlm.

ARM Programlama

169
169
169

ARM Programlama

Tek fonksiyonun defalarca arlabilir olmas, tekrarlanan kodlarn


yerine ilk etapta fonksiyonlarn kullanm iin iyi bir rnek oldu.
Fonksiyonlar programda daha ok uyum salamaya imkn salar.
Fonksiyonlar program paralara blmenizi salar,
bylece beklet gibi rutinlerin, dosyalarn hepsini main
fonksiyonunda tutmak zorunda kalmazsnz.
Bugn yapmak istediim ilk ey beklet fonksiyonunu kendi dosyasna
tamak. lk olarak yeni belge ara butonuna tklayarak yeni bir
dosya oluturalm.

Sonra beklet fonksiyonunu kesip bu dosyaya yaptralm.

ARM Programlama

170
170
170

ARM Programlama

Son olarak bu dosyay proje dosyanza beklet.c olarak kaydedin. Bu


noktada dosya proje dizininizdedir ama henz projenin paras
deildir. Projeye bu dosyay eklemeniz gerekecek.
Projeye sa tklayn ve ekleyi (Add) ve alan menden beklet.ci
sein.

ARM Programlama

171
171
171

ARM Programlama

Bu aamada F7ye basarak projeyi derlediinizde bir hata alrsnz.

ARM Programlama

172
172
172

ARM Programlama

Bu, beklet fonksiyonu bir prototip olmadan tanmlanm demektir.


Kolayca bu hatay giderebilirsiniz. Prototipi main.cden beklet.ce
kopyalayn.

ARM Programlama

173
173
173

ARM Programlama

Fakat bu ok berbat bir dzeltmedir. nk Eer birini deitirip


dierini unutursanz, tekrarlanan prototipler ok kolay farkl hale
gelebilir. Bu KENDN TEKRARLAMA! prensibi (DRY) iin bir rnektir.
Tek prototip tanmlayp bunu tm dosyalarnzda ierebilirsiniz.
Bu beklet fonksiyonunun prototipi olabilir.
Daha nce olduu gibi yeni bir belge oluturun
ve beklet fonksiyonunun prototipini kesip bu dosyaya yaptrn.

ARM Programlama

174
174
174

ARM Programlama

Dosyay beklet.h olarak kaydedin. imdi tekrarlanan fonksiyon


prototipi yerine, beklet.h dosyasn main.c ve beklet.c ye include
(iermek) edebilirsiniz.

ARM Programlama

175
175
175

ARM Programlama

ARM Programlama

176
176
176

ARM Programlama

Son dokunu olarak birden fazla dahil edilmesine kar koruma iin
beklet.h dosyasna bir eyler ekleyebilirsiniz. Otomatik koruma
yararldr nk bir balk dosyas altnda baka balk dosyas
ierebilir. Balk dosyasnn birden fazla dahil edilmesi kolayca
byle bir duruma yol aabilir. Aslnda byle ou balk dosyas
eitli ktphanelerde salanr. Lm4f.h balk dosyas da birden ok
iermeye kar bir tr koruma bulundurur. Bu C nilemcisi ile
aadaki gibi salanr.

ARM Programlama

177
177
177

ARM Programlama

Dosyann st ksmnda #ifndef nilemci ynergesi, takiben dosyann


sslenmi ismi (mangling name) ve isim sslemenin belirli kurallar.
Burada rnek olarak iki alttan izgi, n geniletme (boluk), son
geniletme byk harfle dosya ismi gryorsunuz. Burada dnce bu
makronun nceden tanmlanm olmasdr. Bylece ilemci ilk
seferinde #ifndefin sonrasna gidecektir. Ancak sonraki
satrda #define nilemcisi ile makro tanmlanr, bylece bu
tanmlama artk aktr. Bu nedenle balk dosyas tekrar
ierilemez. nilemci geilen #ifndef talimatna gitmeyecektir ve
dosyann sonuna yani #endif satrna atlayacaktr.
imdi beklet.h balk dosyasnda bu teknii uygulayalm. Lm4f.h
dosyasndaki ilk 2 satr kopyalayp beklet.h dosyasna kopyalayp
ismini deitirelim.

ARM Programlama

178
178
178

ARM Programlama

Dosya sonuna #endif nilemcisini eklemeyi unutmayn.


Hzlca bir zetle siz C programlama dilinin en gl
zelliklerinden biri hakknda kullanabileceiniz bilgiler edindiniz;
Ayr ayr derlenmi kaynak dosyalarndan programlar oluturma
yetenei. Kullanc fonksiyonlaryla etkinletirilen bu yetenek
kritik nem tar nk sadece bir dosyayla tamamlanan programlama,
hem elverisiz hem de rahatsz edicidir. Bir yoldan bir program
dosyalar dzenlemesi size genel olarak yapsn anlamanza yardmc
olabilir ve bu yapy uygulamak iin derleyebilmenizi salar. Bu
ekilde modle etme, derleme ilemini hzlandrmak iin faydaldr.
nk sadece deien dosyalarn derlenmesi gerekir.
imdi dier baz zelliklerini kefetmek iin hareket edelim. Bir
deer dndrme yetenei gibi. rnek olarak tam say argmann
faktriyelini hesaplamak iin bir fonksiyon dnn ve bu fonksiyonu
yukardan aa tasarlayalm.
Bu tasarm prototip ve kullanma durumu ile balyor. Fonksiyon
ismi fakt ve unsigned tipinde n adnda bir argman var.

ARM Programlama

179
179
179

ARM Programlama

Faktriyel fonksiyonu unsigned (iaretsiz) deerini dndrr bir


kez, iki kez, kez, .. her seferinde n kadar.

ARM Programlama

180
180
180

ARM Programlama

Sonra fonksiyonu yazmadan nce main fonksiyonuna gelelim ve


fonksiyon iin deerleri atayalm.
Faktriyel fonksiyonu tarafndan Bir unsigned volatile deikeni
olan x, dndrlen deerleri saklamak iin kullanlacaktr.

ARM Programlama

181
181
181

ARM Programlama

Derleyici geici deikeni korumak iin onun uzanda optimize eder.


Birazdan burada nasl bir deer dndren fonksiyon arldn
greceksiniz. Fonksiyondan dnen deeri sadece bir deikene
atayabilirsiniz.

ARM Programlama

182
182
182

ARM Programlama

Bu noktada siz ayrca fonksiyon argmanlarnn izin verilen


araln dnmelisiniz. Matematiksel olarak her faktriyel iin
dk deer sfr tanmlanr. Aslna daha akas bizim fonksiyona
gndereceimiz argman tipi unsigned olmaldr nk bu fonksiyon
unsigned deer dndrr.

Ayrca hemen bir deikene atanm olmak yerine, bir ifadede


kullanlabilir.

ARM Programlama

183
183
183

ARM Programlama

Son olarak siz ayrca bir ey yapmadan sadece dn deeri ile


fonksiyonu arabilirsiniz. Fonksiyonunuz yan etkilere sahipse bu
mantkl olacaktr. Temizleme yaparsanz bu dnen deere dikkat
etmeniz gerekmez. Bu satrda dnen deeri bo olarak ayarlayalm.

ARM Programlama

184
184
184

ARM Programlama

Bu ksmda programnz derlemeye altnzda bir hata alrsnz.


Fakat bu bir derleyici hatas deil, linker (balayc) hatasdr.
Bir program oluturmann sonraki adm tm derleme birimlerinin
hepsinin birbirine baland yerdir. Hata penceresini yukar
kaydrdmzda balant aamasnda baarsz olduunu
grebilirsiniz, nedeni fakt fonksiyonunun bulunamaydr.

ARM Programlama

185
185
185

ARM Programlama

nk fonksiyonumuzu henz tanmlamadk. Bunun nedeni aktr. Fakat


ben dikkat ekmek istedim. Bu hata tipi derleyici tarafndan
saptanamaz. nk derleyici hangi dosya iinde bu ilevin tanmnn
bulunduunu bilemez.
imdi fakt fonksiyonunu tanmlayalm. Prototipi kopyalayalm ve
sayfann en altna yaptralm. Fonksiyon kodlarmz yazmadan nce
matematiinizi tazelemek isteyebilirsiniz. Fonksiyon iin aslnda
iki tanmlama var, yinelemeli (iteratif) ve zyinelemeli (recusif).
Bu uygulama iin siz zyinelemeli tanmlamay kullanacaksnz.
Burada faktriyel 0, 1dir (0! = 1). Ve N sfrdan byk olmak art
ile n faktriyel, n kere n-1 faktriyeldir (n > 0
n! = n*(n1)!).
Bu dnm C iine aln.
Eer n iaretsiz deikeni 0a eitse..

ARM Programlama

186
186
186

ARM Programlama

aretsiz 1 deerini dndr.

ARM Programlama

187
187
187

ARM Programlama

Aksi halde, geriye n*fakt(n-1U) dndr.

ARM Programlama

188
188
188

ARM Programlama

Grdnz gibi bir fonksiyon dn ifadeleri vastasyla sonu


retir. imdi F7ye bastnz zaman derleme ve balamann ikiside
baarl olacaktr. Tebrikler! lk zyinelemeli fonksiyonunuzu
yazdnz. Bu fonksiyon kendisini aryor.
Tamam, imdi nihayet gerekten nasl altn grme zaman. Kodun
gerek donanmda nasl altn grmek iin, bunu TI boardnda
altracam. Ama eer TI kitiniz yoksa simlatr de
kullanabilirsiniz. Ctrl+Dye basarak kodu kite yklyoruz.
Kod iinde admlamadan (satr satr altrma) nce ynn stn
grmek iin bir bellek grnt mensn ayarlayacam.
Son dersten hatrlayacanz gibi bu, yn iaretisindedir. SP
kaytsnda.
Hafza grntsnde yn ieriini izlemenize yardmc olmas
amacyla geerli ynn stn iaretlemek iin grntlerde bir ok
kullanacam.

ARM Programlama

189
189
189

ARM Programlama

Kod ierisinde admladnzda greceksiniz ki faktriyel


fonksiyonunuzun arlmas iki talimattan oluur. Birincisi argman
deeri R0a hareket eder ve sonra ube kullanm ve BL talimat ile
fonksiyon arlr.

ARM Programlama

190
190
190

ARM Programlama

Faktriyel fonksiyonu iinde kodun yapt ilk ey register itmek


(PUSH); R4 ve LR link registerlarn yna iter. Neden olduunu
anlamalsnz. Neden LR kaydedilmitir? Bunun nedeni faktriyel
nceden var olan bir fonksiyon deildir. Bu yzden LR register BL
talimat tarafndan kendisini tekrar armak iin korunur.

ARM Programlama

191
191
191

ARM Programlama

Bir sonraki talimat LR register kaydnn neden gerekli olduuna dair


size bir ipucu vermelidir. Belki son dersten fonksiyonun ilk
argmannn R0 registerna getiini hatrlyorsunuzdur. Ama biz
faktriyeli R0 iine deer dnmesini salamak iin kullanmaktayz ve
ayrca argman olarak i ie faktriyel arsn kullanyoruz.
Bylece derleyici R4den R0a hareket eder. Burada R0 register
iine dn deeri olarak 1 hareket deerinin ettirildiini
grebilirsiniz.

ARM Programlama

192
192
192

ARM Programlama

Fonksiyonun son komutu ok ilgintir. nk bu komut bir tala iki


ku ldrr. Bildiiniz gibi fonksiyon balangcnda herhangi bir
yn ilemi yrtlrken fonksiyon tam olarak Maine dnmeden her
eyin baa dndrlmesi gerekir.
Burada fonksiyon balangta itilmi olan 2 register atar. Ama LR
orijinal ierii doudan geri dne yol gsteren program sayc
(PC) iine ykler.

ARM Programlama

193
193
193

ARM Programlama

Ltfen dikkat edin, yndaki deer PC iine atanr. Aslnda hex 49


tek says eklenir. PC geri dn adresini bir ift say olan hex 48
olarak getirir.

ARM Programlama

194
194
194

ARM Programlama

Ben adresin en kk anlaml bitinin BX komutunda neden zel olarak


ele alndn akladm; var olan bir fonksiyondan geri dndrmede
kullanld iin (beklet gibi).
Burada grdnz gibi PCye atama talimat da zel blgededir ve BX
talimat gibi davranr.
Son olarak burada grdnz zere tekrar fonksiyon R0 deeri
dndrr. Ynn stnde hafzaya alnan; x deikeninin bulunduu
yerdeki.

ARM Programlama

195
195
195

ARM Programlama

Faktriyeli sonraki armanzda siz bu faktriyelin kendisini


ardn grebilirsiniz.

ARM Programlama

196
196
196

ARM Programlama

Burada en nemli gzlem faktriyelin sonraki arm nceki ar


dnmeden ve registerlar yndan kmadan nce olmasdr. Bu yzden
bunlar ynn st ksmnda, birinci ar tarafnda
bulundurulmaktadr.
Burada grdnz gibi zyineleme ars dnnden sonra
dndrlen R0 deeri R4de saklanan n argmannn orijinal deeri
ile arplr. Sonu fonksiyondan dndrlmek iin tekrar R0da
saklanr.

ARM Programlama

197
197
197

ARM Programlama

Main fonksiyonuna dnerseniz, ifadenin nasl gerekletirildiini;


faktriyel deerini R0dan ald yerde ki gibi grebilirsiniz. 5
faktriyelinin son ars zyineleme arsnn 6. Dzeyini
gsterir. Ltfen kodlar hzlca admlarken aka fark
edilebilen n argmannn eksilmesini ve dn adreslerini yn
oluumu ile izleyin.

ARM Programlama

198
198
198

ARM Programlama

Bu noktada zyinelemeli arma durdurulduunda btn i ie


arlar bir zaman ekleyerek dnecektir.
Tekrar dn dizisine admlyorum. Ltfen ynn nasl aldn
gzlemleyin.

ARM Programlama

199
199
199

ARM Programlama

Faktriyel fonksiyonu nihayet tm yaplanlarla Maine dndkten


sonra sonu olarak 5 faktriyelinin gerek deeri, R0da hex 78 ve
120 decimali rettiini grebilirsiniz (ondalk sistem).

ARM Programlama

200
200
200

ARM Programlama

Bu derste deinmek istediim son konu fonksiyon arma


kurallardr. nceden beri tartlan bir eyi fark ettiinizi
umuyorum. Fonksiyon arc ile arlan fonksiyon arasnda baz
uzlamalar olmaldr. rnek olarak her iki tarafnda fonksiyona
salanacak dn adresinin LR registerda olduunu anlalmaldr.
Ayrca her iki tarafta ilk argmann R0a geileceini kabul
etmelidir ve dn deeri de R0a dnecektir. Elbette birok byle
kk anlamalar vardr. Bunlarn hepsi bir resmi szleme olan ARM
Uygulama Prosedr arma Standard (AAPCS)de bulunur. Tm resmi
dokman olduka karmaktr ve online arama yaparak AAPCSyi
bulabilirsiniz. Burada ben sadece AAPCSnin ARM registerlar iin
ykmllkleri nasl atadndan bahsetmek istiyorum. nk ARM
ilemcilerde kesme ilemeyi rendiiniz zaman bu sizin iin ok
faydal olacak. Saklayc R0dan R3e ve R12ye parametre geirmek
ve deer dndrmek iin kullanlr ve bir fonksiyon dn olabilir.

ARM Programlama

201
201
201

ARM Programlama

Dier taraftan fonksiyon R4den R11e 8 register rezerv etmelidir.


Bu, fonksiyon R4den R11 arasn kullanamaz anlamna gelmez. Fakat
bunu yaparsa, fonksiyon kodu onlar yna kaydetmelidir ve dn
yapmadan nce onlar geri yklemelidir. rnek olarak faktriyel
fonksiyonunuzu R4 kullanarak tekrar arn ama onu yna kaydedin.
Bu kural fonksiyon arcnn n rezerv edilmi registerlar
kullanmasna izin verir, fonksiyon arldnda deerler salam
kalr. Yine n parametresi deerini arn; faktriyel zyinelemeli
arsnn salam kalmas iin R4de saklanmtr. nk bu son
arpmda gereklidir. Faktriyel hesaplamasn konuurken, bu derste
kullandm zyineleme uygulamas derin arma srasnda gsterim
iin uygun olur. Yn byme ve klmesini izleyebilirsiniz. Ama
normalde bir derin ar srasnda gml programlamadan tam olarak
kanlmaldr nk bu yn iin ok fazla RAM kullanr.
Faktriyelden ok daha iyi bir uygulama olacaktr; iteratif tip veya
daha da iyisinin kullanm.
Modller, deer dndren fonksiyonlar, zyineleme fonksiyonlar ve
ARM uygulama prosedr arma standard ile tamamladk. Ancak
fonksiyonlarla olan iimizi bitirmedik.
Sonraki derste siz fonksiyon parametreleriyle ilgili daha fazla
bilgi edineceksiniz. aret parametreleri ierii ile kapsaml ve
yerel yn tabanl deikenler hakknda bilgi edineceksiniz. Son
olarak yn tamasnda neler olabileceini greceksiniz. Herkese
iyi almalar.

ARM Programlama

202
202
202

Das könnte Ihnen auch gefallen