ARM islemciyi C ile 32 bit kullanma

Başlatan bunalmis, 06 Nisan 2007, 01:13:25

z

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?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mp3dragon

@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).
İyilik Yap, Denize At, Balık Bilmezse, Halik Bilir.

z

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?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mp3dragon

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.
İyilik Yap, Denize At, Balık Bilmezse, Halik Bilir.

ise

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

z

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?)
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ise

project->options for  target ... ->Listing-> Asmcode seçeneği işaretlendiğinde asm üretir

ise

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

mp3dragon

@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.
İyilik Yap, Denize At, Balık Bilmezse, Halik Bilir.

kurumahmut

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

mp3dragon

@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.
İyilik Yap, Denize At, Balık Bilmezse, Halik Bilir.

demovar

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.
________________________________________ çalışmalı, üretmeli, paylaşmalı

z

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?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

demovar

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
________________________________________ çalışmalı, üretmeli, paylaşmalı

ground

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.
⌒╮'╭⌒╮⌒╮.
╱◥██◣                  
| 田︱田田|              
╬╬╬╬╬╬╬╬╬

Picproje - Sözde değil özde paylaşım..