Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => ARM7 Mikrodenetleyici => Konuyu başlatan: z - 06 Nisan 2007, 01:13:25

Başlık: ARM islemciyi C ile 32 bit kullanma
Gönderen: z - 06 Nisan 2007, 01:13:25
ARM da henuz cok fazla acemiyim ve ilk kez bir cipi hic tanimadan cipe program yazmaya calisiyorum.

ARM islemciyi 32 bit modunda kullanmak icin ne yapiyoruz? C derleyici benim cipi 16 bit mi yoksa 32 bit mi kullanacagimi nasil bilecek?

Basit bir 32 bit uygulamasi varmi?
Başlık: ARM islemciyi C ile 32 bit kullanma
Gönderen: mp3dragon - 06 Nisan 2007, 09:20:25
@bunalmış,

1.. çipi çok fazla tanımana gerek yok, delphide program yazarken p4 yazmaçlarınamı bakıyorsun?Ben de hayatımda ilk defa tek satır ASM yazmadan bir işlemcide "pure C" kod yazdım.
2..ARM de iki mod vardır THUMB/ARM
3.. THUMB-->16 bit, ARM-->32 bit modudur.
4..THUMB modunda yazılan programlar ARM yapısı gereği yaklaşık %30 hızlı çalışır ve daha az yer kaplar. Buna göre ARM ASM de thumb ve ARM olmak üzere iki farklı komut seti vardır. Bunu derleyicide tanımlarsın.(kod satırına bir şey yazmadan da olur. tabi ki kod satırınde ön işlemci komutuda var, söylediklerim Keil derleyici için)
5.. C de kod yazdığın için işlemcinin 8,16,32 bit olmasının tek dikkat edilecek noktası int türü değişkenler 8 bit derleyicilerde 2 bayt iken, 16 ve 32 bit işlemcilerde 4 bayt olmakta (double word). Örnek olarak verdiğim kodda dikkat etmişsindir belki;

void delay_ms(int count){
 int i;
 count *= 3200;
 for (i = 0; i < count; i++){
 }
}


yukarıda int i; ve int count tanımlaması var, count=1000 olduğunda 3200 ile çarpılınca 3.200.000 rakamı çıkar ki bu 8 bit işlemcide ki int tanımlamasının ( 2 bayt max = 65.536 sayısı) kapsamı dışındadır. Ama burda int artık 4 bayt tır (double word).
Başlık: ARM islemciyi C ile 32 bit kullanma
Gönderen: z - 06 Nisan 2007, 13:06:25
Hocam ben de C yi ilk kez, kendi yaptigim kartlarin islemcilerine program yazmada kullanacagim.

Ancak ilk hevesle cipi tanimayi bir kenara biraktim (birazda gozum korktu acikcasi, pdf dokumani bile yuzlerce sayfa) Ancak cipi tanimak sart.

Ornegin I/O portlara 4 register uzerinden hukmedildigini ve bu 4 regin islevini bilmek gerekiyor. Bunlar zaman icinde olacak seyler.

32 bit derken islemci dogrudan 32 bit komut islesin istiyorum.

Mesela C de 2 adet 32 bit degisken icerigini toplattigimda derleyici bunu islemciye 16 bit kodlama ile mi yaptiracak yoksa 32 bit kodlama ilemi yaptiracak. Yada derleyiciyi o satirda ben mi yonlendirecegim.

C dilinde 32 bitlik register olan A,B,C degiskenleri uzerinde yapilacak C=A+B isleminde, islemin asm kodlarla 16 bit islemlerle bir kac satirda mi yoksa dogrudan 32 bit kodlama ile tek hamlede mi yapildigi su anda benim icin mechul.  (Amacim tek hamlede yaptirmak)

Zirt pirt THUMB mod ARM mode arasi gecis yapabilirmiyim? Bu tanim C de nasil yapiliyor?
Başlık: ARM islemciyi C ile 32 bit kullanma
Gönderen: mp3dragon - 06 Nisan 2007, 13:49:11
Hocam,

ARM 16/32 bitlik bir işlemcidir. Komut setide THUMB/ARM olarak 16/32 bitliktir. Kod satırı içerisinde önişlemci komutu ile (hiç kullanmadım ama galiba "#define __ARM" veya "#define __THUMB" gibi 16/32 bit arasında geçiş yapılabilir.

Daha kolay yolu ve de rahat takip edilmesi açısından (Keil da bunu denedim) 16 bit çalıştırcağın fonksiyonları ayrı dosyada (xxx_THUMB.c gibi) yazıp bunu derleyici ayarlarından (options for xxxxx.c ayarı) hangi modda (THUMB/ARM) derleyeceğini bildirmek.

Doğrudan 32 bit işleyeceksen zaten default ARM modu kullanman yeterli.
testini yapmadım ama 32 bitlik matematiksel işlemlerde ARM modu daha verimli olmalı. Elbette 16 bit modunda da işlemi yapacaktır.

C içerisinde tek satır asm yazmadım dememin sebebi ARM de buna hiç ihtiyaç duymamam. Yoksa diğer işlemcilerde illa bir yerde asm yazmak gerekiyordu. Bu sebeple çok detaya girmeden çoğu işlemi yapabilirsin.

600 küsür sayfalık manuel gözünü korkutmasın. Aradığın her şey onun içinde. Temel giriş - çıkış ve çevre birim ayarları kolay. Sadece "vectored interrupt controller" kısmı biraz dikkat istemekte.

Elime aldığım ilk yarım saat içinde giriş-çıkış, spi, rtc vs gibi işlemleri çözmüştüm, zaten bol bol da örnek kod var. Özellikle examples klasöründeki örnekleri incelemeni tavsiye ederim. Gerisi çorap söküğü gibi gelecektir.
Başlık: ARM islemciyi C ile 32 bit kullanma
Gönderen: ise - 06 Nisan 2007, 14:03:04
arm mimarisini tanımak çok fazla gerekli değil . interruptlar donanım kontrolleri (spi seriport i2c uart usb can io vs.) bunlar bilindiği takdirde çok rahatlıkla program yazılabilmekte. tüm iş C nin üzerine kalıyor thumb veya arm modlar arasında direkt geçiş mümkün ister thumb(16) ister arm(32). her işlemcide çevresel birimleri farklı farklı yapıyor. aduc7xxx serisinde vectörel interrupt olmazken  st ve lpc shaarp serilerinde vectorel interrupt mevcut.işlemciler için hazırlanmış firmaların dağıttığı c kodlarıda mevcut bunlarda çok rahatlıkla yapıyı anlamamızı ve işlemciyi hızlı kullanmamızı sağlıyor
Başlık: ARM islemciyi C ile 32 bit kullanma
Gönderen: z - 06 Nisan 2007, 14:03:19
Bir de Keilde yazdigim C programin ASM ciktisini da gorebilmek istiyorum ancak bir turlu ASM dosyayi urettiremedim. Bu nereden ayarlaniyor? Bir yerde ASM kutucugu vardi onu isaretledim ama gene asm dosya uretilmedi.

JTAG kartimi ve programini Keil'e tanittigimda satirlari adim adim calistirip tek tek reg iceriklerini gorebiliyorum ancak bana limitli debugging imkani veriyor. (Tam degeri hatirlamiyorum 100 satirmi yoksa 1000 satirmi neydi, keil 2010 senesine kadar crakli ama debugging islemi ek lisans istiyor bu lisans islemine cozum yokmu?)
Başlık: ARM islemciyi C ile 32 bit kullanma
Gönderen: ise - 06 Nisan 2007, 14:15:21
project->options for  target ... ->Listing-> Asmcode seçeneği işaretlendiğinde asm üretir
Başlık: ARM islemciyi C ile 32 bit kullanma
Gönderen: ise - 06 Nisan 2007, 14:18:01
debug konusunda henüz bir problemle karşılaşmadım en son versiyonu alıp keilcrackv3.2 ile cracklediğiniz de çalışması gerekli en azından bende çalışıyor
Başlık: ARM islemciyi C ile 32 bit kullanma
Gönderen: mp3dragon - 06 Nisan 2007, 14:19:57
@bunalmiş,

donanımsal debug yapmatım ama software debug(simulations) Keil'ın son versiyonunda çalışmakta.

Asm çıktısını; options for target-->Listing içerisinde asembler listing kutucuğunu işaretlersen görürsün.
Başlık: ARM islemciyi C ile 32 bit kullanma
Gönderen: kurumahmut - 06 Nisan 2007, 14:48:20
debuga geçince demo moda dönmesi kullanılan crack ile alakalı. Bende aynı sorunla karşılaşmıştım. Yeni serial numaralarıyla sorunu aşmıştım. Doğru şifre bulmak için keygenle epeyce denemeler yapmıştım. Sizde bu yolu deneyin.

ARM 32 bit işlemcidir. Ancak ROM tasarrufu için komutlarını 16bit olarak sıkıştırabilmektedir. İşletme zamöanı geldiğinde yani ROMdan fetch edildiğinde 32bite tekrar genişletilir ve yürütülür. Yani tüm işlemler 32bit olmaktadır.

Thumb modunu çok sık kullanmadığınız hızlı çalışması gerekmeyen rutinlerinizde tercih edebilirsiniz.

ARM / Thumb mode kodun saklanması ile alakalı bir seçimdir. Eğer kodları 16bit olarak saklarsanız. Tekrar 32bite genişletileceğinden yaklaşık %30 hız kaybı yaşarsınız. Ancak ROM da kapladığı alan daralacağından daha fazla kodu işlemciye gömebilirsiniz. Thumb modu kullanmadan kodunuzu derlerseniz 32bite genişletme prosedürü uygulanmayacağından kodunuz gene yaklaşık %30 daha hızlı çalışacaktır. Ancak bu seferde ROMu müsrif kullanacaksınızdır.

Ben bunu böyle biliyorum. Sanırım burda biraz daha farklı vurgulandı.

İyi çalışmalar
Başlık: ARM islemciyi C ile 32 bit kullanma
Gönderen: mp3dragon - 06 Nisan 2007, 15:51:12
@kurumahmut,

ARM7TDMI-S iki komut setine sahiptir,

ARM/THUMB komut setidir ve 16/32 bit olarak farklıdır.

http://www.arm.com/documentation/Instruction_Set/index.html
http://www.arm.com/pdfs/DDI0234A_7TDMIS_R4.pdf

ayrıca;

Thumb code is able to provide up to 65% of the code size of ARM, and 160% of the performance of an equivalent ARM processor connected to a 16-bit memory system.

For critical code size applications, the alternative 16-bit Thumb Mode reduces code by more than 30% with minimal performance penalty.

Thumb mode which gives the best code efficiency with minimal speed penalty.

kaynak; http://www.keil.com/support/docs/2940.asp?bhcp=1

kısaca hassas zamanlama gerektiren DSP vs gibi uygulamaların dışında tavsiye edilen thumb modudur. Elbette 16 bit olan komut setinin uzunluğudur. Register, memory, adress ve aritmatik işlemler 32 bit uzunluğundadır.
Başlık: ARM islemciyi C ile 32 bit kullanma
Gönderen: demovar - 06 Nisan 2007, 21:33:15
mesajları vakit darlığından çok hızlı okudum, belkide aynı şeyler yazılmıştır,

ARM da Thumb ve ARM modu var, özellikle Keil derleyicisinde bu modlar arasındaki geçiş çok kolay, sadece ilgili kısmın başına:


#pragma  ARM  

veya    

#pragma thumb

yazılıyor, böylece aynı modül içinde istediğiniz kısmı istediğiniz mod'da derletebiliyorsunuz.
Başlık: ARM islemciyi C ile 32 bit kullanma
Gönderen: z - 06 Nisan 2007, 22:42:40
Bir moddan diger moda geciste islemcide onemli hiz kaybi oluyor mu? Bilginiz varmi?

Demek istedigim mod gecisi kac cycle da oluyor? Yoksa mod degisimlerinde islemci iceride hic hazirlik yapmiyor sadece komutun 32bit mi 16 bit mi olduguna mi bakiyor?
Başlık: ARM islemciyi C ile 32 bit kullanma
Gönderen: demovar - 06 Nisan 2007, 22:57:21
bu çok güzel bir soru, cevabını malesef bilmiyorum ama mutlaka araştırcam,
ama şöylede birşey var,

mesela, 16 bitlik wide byte memory kullanıyorsunuz ve okuma yazma yapıyorsunuz, o zaman o kısım için thumb mod'a geçmek hızı çok arttırıyor, ARM modunda bir sürü 16 bitlik maskelemelerden kurtarıyor,

diğer yandan başka bir rutininiz kayan noktalı aritmatik işlemler yapıyor, o zaman ARM mode ciddi avantaj,

ama tabiki zaman kritik problemlerde bu geçişlerin süresi çok önemli, mutlaka araştırcam,

kolay gelsin hocam
Başlık: ARM islemciyi C ile 32 bit kullanma
Gönderen: ground - 07 Nisan 2007, 01:05:28
Derginin 2. sayısı için armlarla alakalı bikaç bölüm koysak iyi olacak sanırım..

mp3 hocam yapacaktı :)

Sizlerden de bekliyoruz..

İyi Çalışmalar.
Başlık: ARM islemciyi C ile 32 bit kullanma
Gönderen: mp3dragon - 07 Nisan 2007, 02:07:40
@bunalmis,

mode geçişlerinde yaşanacak gecikme nedir hiç bir litaratürde gözüme çarpmadı, hatta thumb ve ARM modlarındaki performans ile ilgili bile bir ayrıntılı açıklama veya test görmedim. bu tamamen koşturulan kodun ne olduğu ile alakalı.
yaklaşık 54 - 55 mips de çalışan bir işlemcide oluşacak 15 - 20 ns lik zamanlama hatalarının dikkate alınacağı program herhalde çok sık karşılaşılmaz; ki böyle bir durumda zaten zırt pırt mode değiştirmek yerine kod alanından fedakarlık edip doğrudan ARM modunu kullanmak daha mantıklı.

Keil yukarıda verdiğim linkte bu konu ile ilgili olarak kendilerinin bir ölçüm yapmadığını, philipsinde kendilerine bir döküman vermediğini ancak philipsin çoğu uygulama için thumb modunu tavsiye ettiğini belirtmiş.

Konunun çok ileri uygulamalarda incelenmesi gerekebilir ama başlangıç seviyesinde fazla detaya takılmamak gerektiği kanaatindeyim.
Başlık: ARM islemciyi C ile 32 bit kullanma
Gönderen: kurumahmut - 07 Nisan 2007, 13:54:01
ROM dan fatch edilecek kodun ARM mı thumb mı olduğuna Anlık Program Durum Yazmacı (CPSR-Current Program Status Register) nın 5.bitine göre karar veriliyor. İşlemcinin 32bit olduğu düşünüldüğünde geçişin bir bitin değişim süresi kadar olduğu söylenebilir. Çünkü ARM / thumb modları arası geçişi yapmanın espirisi fatch olayının nasıl olacağını belirtse gerek yani romdan 32bit mi 16bit mi komutlar okuyacağım. Okuyan birimde hep aynı olduğunu düşünürsek geçişin gecikmesi registerın bi bitinin değişimi kadar olduğu söylenebilir. Ancak daha doğru bilgi için araştımak gerekir.

NOT: CPSR yazmacının 5.bitine yani T bitine direk olarak yazılması sakıncalıdır. Bu bitin nasıl değiştirildiği C deki hali dışında yani gerçekte nasıl yapıldığı sorusuna cevap bulunduğunda bitin değişim süresi geçiş süresini verecektir...

ARM ile ilgili stajım da bir çalışma yapmıştım e-dergi nin 2.sayısında yazılmasını planlamıştık Göktuğ ile. Aslında temelleri içeren bir yazı var elimde ama buna bir giriş ve sonuç gibi eklentiler yapılmalı ve geliştirilmeli. Bir süre ARM ile uğraşamayacağım için bu dökümanı başkasına verip dergi için geliştirmesini sağlayabiliriz. Yada olduğu kadarıyla foruma koyabilirim.???
Başlık: ARM islemciyi C ile 32 bit kullanma
Gönderen: kurumahmut - 07 Nisan 2007, 14:24:18
http://www.embedded.com/shared/printableArticle.jhtml?articleID=15200241

There are several ways to enter or leave the Thumb state properly.


Thumb Up başlığını inceleyin... Bi de bunun kullanılan Compiler da nasıl yaptığına bakmak gerek...


EK:
http://www.cs.cornell.edu/courses/cs414/2001fa/armcallconvention.pdf

Each subroutine pointer encodes the instruction set of its target in its least-significant bit    
(1 => Thumb, 0 => ARM).    

İlk linkte dallanma sırasında bir ekleme yaplarak thumb moda geçiliyordu. Bu kaynakta da sebebini açıklamış.

Bu konuda anahtar kelimeler

APCS ARM Procedure Call Standard
TPCS Thumb Procedure Call Standard
ATPCS ARM-Thumb Procedure Call Standard

Benzer başka bir dökümanda
http://www.arm.com/miscPDFs/8031.pdf



iyi çalışmalar
Başlık: ARM islemciyi C ile 32 bit kullanma
Gönderen: z - 07 Nisan 2007, 14:37:49
@kurumahmut

Alıntı Yap
"ROM dan fatch edilecek kodun ARM mı thumb mı olduğuna Anlık Program Durum Yazmacı (CPSR-Current Program Status Register) nın 5.bitine göre karar veriliyor. İşlemcinin 32bit olduğu düşünüldüğünde geçişin bir bitin değişim süresi kadar olduğu söylenebilir. Çünkü ARM / thumb modları arası geçişi yapmanın espirisi fatch olayının nasıl olacağını belirtse gerek yani romdan 32bit mi 16bit mi komutlar okuyacağım. Okuyan birimde hep aynı olduğunu düşünürsek geçişin gecikmesi registerın bi bitinin değişimi kadar olduğu söylenebilir. Ancak daha doğru bilgi için araştımak gerekir."

Ornegin 4 asamali pipeline yaparak hiz artirimi yapan islemcilerde pipelining'i bozarsan (pipeline penalty deniyor) artik islemci 4 komut icin yapilmis on hazirligi kaldirip atiyor ilk islenecek kodu isliyor ve pipeliningi yeniden baslatiyor. Bu penalti bugune dek ugrastigim bazi islemcilerde bazi komut dizilimlerinde kolayca olusuyordu. Haliyle hiz ibresi buralarda dusuyor.

ARMda durum ne bilmiyorum eger mod gecisinde boyle bir durum oluyorsa sik sik mod gecisleri zaman kritik uygulamalarda sikinti yaratacaktir.
Başlık: ARM islemciyi C ile 32 bit kullanma
Gönderen: controller - 25 Haziran 2007, 13:52:02
Alıntı yapılan: "mp3dragon"

4..THUMB modunda yazılan programlar ARM yapısı gereği yaklaşık %30 hızlı çalışır ve daha az yer kaplar.


sanırım burada bir yanlış anlaşılma olmuş.

Alıntı yapılan: "kurumahmut"

ARM / Thumb mode kodun saklanması ile alakalı bir seçimdir. Eğer kodları 16bit olarak saklarsanız. Tekrar 32bite genişletileceğinden yaklaşık %30 hız kaybı yaşarsınız. Ancak ROM da kapladığı alan daralacağından daha fazla kodu işlemciye gömebilirsiniz. Thumb modu kullanmadan kodunuzu derlerseniz 32bite genişletme prosedürü uygulanmayacağından kodunuz gene yaklaşık %30 daha hızlı çalışacaktır. Ancak bu seferde ROMu müsrif kullanacaksınızdır.

bence doğrusu @kurumahmut arkadaşımızın dediği gibi olacak. çünkü;

Alıntı Yap
Although the ARM7 is a 32-bit processor, it has a second 16-bit instruction set caled
THUMB. The THUMB instruction set is realy a compressed form of the ARM instruction
set. This alows instructions to be stored in a 16-bit format, expanded into ARM instructions and
then executed. Although the THUMB instructions wil result in lower code performance
compared to ARM instructions
, they wil achieve a much higher code density. So, in order
to build a reasonably-sized application that wil fit on a smal single chip microcontroler, it
is vital to compile your code as a mixture of ARM and THUMB functions. This process is
caled interworking and is easily supported on al ARM compilers. By compiling code in the
THUMB instruction set you can get a space saving of 30%, while the same code compiled
as ARM code wil run 40% faster.



hem daha hızlı çalışıp hem de daha az yer kaplayacaksa kim ARM moduna ihtiyaç duyarki?
Başlık: ARM islemciyi C ile 32 bit kullanma
Gönderen: nthere - 30 Kasım 2008, 13:53:45
Alıntı:

Although the ARM7 is a 32-bit processor, it has a second 16-bit instruction set caled
THUMB. The THUMB instruction set is realy a compressed form of the ARM instruction
set. This alows instructions to be stored in a 16-bit format, expanded into ARM instructions and
then executed. Although the THUMB instructions wil result in lower code performance
compared to ARM instructions, they wil achieve a much higher code density. So, in order
to build a reasonably-sized application that wil fit on a smal single chip microcontroler, it
is vital to compile your code as a mixture of ARM and THUMB functions. This process is
caled interworking and is easily supported on al ARM compilers. By compiling code in the
THUMB instruction set you can get a space saving of 30%, while the same code compiled
as ARM code wil run 40% faster.



hem daha hızlı çalışıp hem de daha az yer kaplayacaksa kim ARM moduna ihtiyaç duyarki?


Konuyu çok iyi toparlamıssınız fakat son cümleniz sanırımki yanlış.
THUMB instruction set you can get a space saving of 30%, while the same code compiled as ARM code wil run 40% faster.
Ben yanlış anlamadıysam aynı kaynak kodunu thumb komut setine göre derlediğimizde %30 yer kazancı sağlıyoruz, fakat Arm komut seti ile derleme yaptığımızda %30 yer kazancı yerine thumba göre %40 hız kazancı elde ediyoruz.
Başlık: ARM islemciyi C ile 32 bit kullanma
Gönderen: controller - 30 Kasım 2008, 20:18:15
Alıntı yapılan: "enderpiyale"Alıntı:

Although the ARM7 is a 32-bit processor, it has a second 16-bit instruction set caled
THUMB. The THUMB instruction set is realy a compressed form of the ARM instruction
set. This alows instructions to be stored in a 16-bit format, expanded into ARM instructions and
then executed. Although the THUMB instructions wil result in lower code performance
compared to ARM instructions, they wil achieve a much higher code density. So, in order
to build a reasonably-sized application that wil fit on a smal single chip microcontroler, it
is vital to compile your code as a mixture of ARM and THUMB functions. This process is
caled interworking and is easily supported on al ARM compilers. By compiling code in the
THUMB instruction set you can get a space saving of 30%, while the same code compiled
as ARM code wil run 40% faster.



hem daha hızlı çalışıp hem de daha az yer kaplayacaksa kim ARM moduna ihtiyaç duyarki?


Konuyu çok iyi toparlamıssınız fakat son cümleniz sanırımki yanlış.
THUMB instruction set you can get a space saving of 30%, while the same code compiled as ARM code wil run 40% faster.
Ben yanlış anlamadıysam aynı kaynak kodunu thumb komut setine göre derlediğimizde %30 yer kazancı sağlıyoruz, fakat Arm komut seti ile derleme yaptığımızda %30 yer kazancı yerine thumba göre %40 hız kazancı elde ediyoruz.

@enderpiyale

aynı şeylerden bahsediyoruz, benim son cümlemde bir yanlışlık yok. ben son cümlemi thumb mod için yazdım. yani daha da açık hali;

"thumb mod ile derlenen kod hem daha hızlı çalışıp hem de daha az yer kaplayacaksa kim ARM mod ile derlenmiş koda ihtiyaç duyar ki?"
Başlık: ARM islemciyi C ile 32 bit kullanma
Gönderen: nthere - 30 Kasım 2008, 22:54:26
@controller

Benimde demek istediğim thumb mod sadece az yer kaplıyor hızlı çalışmıyor. Hızlı olan ARM
Başlık: ARM islemciyi C ile 32 bit kullanma
Gönderen: controller - 01 Aralık 2008, 00:28:47
Alıntı yapılan: "enderpiyale"@controller

Benimde demek istediğim thumb mod sadece az yer kaplıyor hızlı çalışmıyor. Hızlı olan ARM

@enderpiyale

ben farklı birşeymi söylüyorum, benimde son cümlemde vurgulamak istediğim bu zaten. okuduğuzu anlamakta güçlük çekiyorsunuz galiba.