ARM7 mimarisi, özellikleri ve ARM/Thumb programlama

Başlatan Petek, 13 Ocak 2006, 13:23:06

Petek

Alıntı yapılan: "tatlisukurnazi"@petek

Teşekkür ederim petek hocam. Bir de test sonuçları arm thumb şeklinde ayrılmış. Nedir bu arm thumb ayrimi? İyi çalışmalar...
Valla kim kime teşekkür etmeli ben de şaşıyorum. Bişey değil diyeyim...

Arm kodlama 32 bit Thumb kodlama 16 bit.
#pragma ARM // Switch to ARM instructions
int main(void)
{
while(1)
{
THUMB_function(); //Call THUMB function
}
}
#pragma THUMB //Switch to THUMB instructions
void THUMB_function(void)
{
unsigned long i,delay;
for (i = 0x00010000;i < 0x01000000 ;i = i<<1) //LED FLASHer
{
for (delay = 0;delay<0x000100000;delay++) //simple delay loop
{
;
}
IOSET1 = i; //Set the next led
}
}


32 bit derleme yapmasını istediğiniz yerin başına #pragma ARM ekliyorsunuz. 16 bit derleme yapmasını istediğiniz yere de #pragma THUMB.

Normalde işlemci ARM derleme yapıyor, interrupta geçtiğinde ARM komutları bekliyor. Orada isterseniz 32 bitlik derlenmiş komutlar icra ediliyor isterseniz tekrar Thumb için dönüşüm yapılarak 16 bit komutlar. Kullanıcının isteğine kalmış. Aslında istekten ziyade benchmark sonuçlarına göre hareket etmek lazım. Aritmetik işlem yapılacaksa veya string işlemleri ... onlara uygun şekli seçmek gerek.
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

Petek

Keil'in bir led yakıp söndürme örneği var. exammples altında blinky.. Onu incelerken
for (i = 0x00010000;i < 0x01000000 ;i = i<<1) //LED FLASHer
satırı ile karşılaştım. Allahallah bu adamlar neden böyle bir şey yapmışlarki dedim. Zaten 2. döngüde şart sağlanır. Bunu başka şekillerde de halledebilirlerdi diye düşündüm. Sonradan farkına vardım 0x01000000 ile 0x00010000 arasında 8 bit var ve döngü 8 defa dönüyor  :oops: Alışmışım binary işlemlere, böyle 32 bitlik sayıyı görünce başlangıçta algılayamadım.
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

aYe

Alıntı yapılan: "Petek"32 bit derleme yapmasını istediğiniz yerin başına #pragma ARM ekliyorsunuz. 16 bit derleme yapmasını istediğiniz yere de #pragma THUMB.

Mesajından anladığım kadarıyla sadece kodun tamamı için tek seçim değil de, aynı kodun içinde önbildirmelerle şu kısımı 16bit  bu kısımı 32bit şeklinde seçebiliyoruz biliyoruz. Güzel bir özellik katmışlar. Detaylar için teşekkür ederim. Ellerine sağlık...
Dünyada iki şey sonsuzdur. İnsanın aptallığı ve evren. Ancak ikincisinden o kadar emin değilim... (Einstein)

aYe

Alıntı yapılan: "Petek"Keil'in bir led yakıp söndürme örneği var. exammples altında blinky.. Onu incelerken
for (i = 0x00010000;i < 0x01000000 ;i = i<<1) //LED FLASHer
satırı ile karşılaştım. Allahallah bu adamlar neden böyle bir şey yapmışlarki dedim. Zaten 2. döngüde şart sağlanır. Bunu başka şekillerde de halledebilirlerdi diye düşündüm. Sonradan farkına vardım 0x01000000 ile 0x00010000 arasında 8 bit var ve döngü 8 defa dönüyor  :oops: Alışmışım binary işlemlere, böyle 32 bitlik sayıyı görünce başlangıçta algılayamadım.

Keil mi vermiş bu örnegi? Bu kadar çirkin bir kod yazımı daha olamaz. Binary süsü verilmiş 32bit HEX ile 8 turluk döngü. Kaş yapiyim derken göz çıkartmışlar. :)
Dünyada iki şey sonsuzdur. İnsanın aptallığı ve evren. Ancak ikincisinden o kadar emin değilim... (Einstein)

Petek

Alıntı yapılan: "tatlisukurnazi"
Alıntı yapılan: "Petek"32 bit derleme yapmasını istediğiniz yerin başına #pragma ARM ekliyorsunuz. 16 bit derleme yapmasını istediğiniz yere de #pragma THUMB.
Mesajından anladığım kadarıyla sadece kodun tamamı için tek seçim değil de, aynı kodun içinde önbildirmelerle şu kısımı 16bit  bu kısımı 32bit şeklinde seçebiliyoruz biliyoruz. Güzel bir özellik katmışlar. Detaylar için teşekkür ederim. Ellerine sağlık...
Thumb komutları da aslında tam işleneceği sırada ARM komutlarına (işlemci tarafından) dönüştürülerek işleniyormuş. Dönüştürücüye Thumb decompressor deniyor (PDF sayfa 24 te.) O nedenle istenilen yerlerde bu dönüşümü yapabiliyorsunuz.

Başlığın ilk mesajında verdiğim PDF dosyasındaki benchmark testlerinde genel olarak Keil ilk sırada imiş. IAR'ın sayfasındaki testlerde 8farklı versiyonlarda) IAR öne geçmiş. IAR son versiyonlarda optimizasyona ağırlık vermiş, hatta matematik işlemlerini yapan rutin yeniden yazılmış... Demek istediğim ARM/Thumb dönüşümü yerinde düzgün yapılırsa maximum performans elde edilecektir.
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

aYe

@petek

Sana faydasi olur belki diye biraz kurcaladim ve lcp2138 le yapilmis bir kod örnegi buldum. LM60 sıcaklık sensörü ile sicakliği okuyup USB'den pc ye göndermişler. Zipli dosyada Basic de yazılmış pc programı ve açık kodu+Keil de yazilmiş C kodu+ şemalar mevcut.
http://www.hemenpaylas.com/download/80323/LCP2138_APP.zip.html

İyi çalışmalar...
Dünyada iki şey sonsuzdur. İnsanın aptallığı ve evren. Ancak ikincisinden o kadar emin değilim... (Einstein)

mcan

Thumb is a 16-bit compressed version of the normal 32-bit ARM instruction set. It includes a subset of the most commonly used 32-bit ARM instructions. While Thumb instructions have 16-bit wide opcodes, they operate on the same 32-bit register set as ARM code, and have most other benefits of the 32-bit core (32-bit address space, 32-bit barrel shifter, 32-bit ALU, etc.) Thumb-enabled processors) have decompression hardware in the instruction pipeline. The decompressor translates Thumb instructions into equivalent ARM instructions. Thumb code density approaches, and even exceeds, that of many CISC processors. It is much better than ARM in certain contexts, for example (the numbers are approximate):

ben de şu kısmı çevirmeye çalışıyım  thumb dedikleri 32 bitlik komutsetlerinin 16 bitlik sıkıştırılmış versiyonlarıymış,ve bu komutlar en çok kullanılan 32 bitlik komutlarmış  (sanırım başparmak(thumb) bunun için deniyor baş komutlar :D ) 16 bitlik olmalarına karşın arm kodları gibi 32bitlik yazmaçlarda çalışıyorlarmış.....

şimdi gnu arm ve keilin karm242(uvision3) setuplarını indirdim gnu yu kurdum ama hiç bir şeye benzemiyor onunda pdf sini okumam gerekecek

petek hocam bir yandan pdfleri okuyalım ama ben derimki okuduğumu anlamak adına küçük küçük örneklerde yapsak ne dersiniz mesela o led yakıp söndürmek gibi çünki bu yapıyı anlayana kadar bir önceki okuduğumu unutuyorum

aYe

Alıntı yapılan: "encryptedcode"petek hocam bir yandan pdfleri okuyalım ama ben derimki okuduğumu anlamak adına küçük küçük örneklerde yapsak ne dersiniz mesela o led yakıp söndürmek gibi çünki bu yapıyı anlayana kadar bir önceki okuduğumu unutuyorum

Petek hocam encryptedcode haklı , linkini verdiğim dosya'nın C kodlarına baktim çok kısa,  kısmen traşlayıp,mesela usb kısmını felan silip daha küçük bir kod oluşturupi ufak ufak eşelemeye başlasak. Takildiğin yerler olduğunda biz yardımcı olmaya çalışsak(vakit kaybetmemek açısından). Ve sonuçları sen bizimle paylaşsan vs. Saygılar...
Dünyada iki şey sonsuzdur. İnsanın aptallığı ve evren. Ancak ikincisinden o kadar emin değilim... (Einstein)

Petek

Alıntı yapılan: "tatlisukurnazi"@petek

Sana faydasi olur belki diye biraz kurcaladim ve lcp2138 le yapilmis bir kod örnegi buldum. LM60 sıcaklık sensörü ile sicakliği okuyup USB'den pc ye göndermişler. Zipli dosyada Basic de yazılmış pc programı ve açık kodu+Keil de yazilmiş C kodu+ şemalar mevcut.
http://www.hemenpaylas.com/download/80323/LCP2138_APP.zip.html

İyi çalışmalar...
Hocam örnekler çok güzel. Teşekkrüler. Şimdilik sorun LPC2138 temin etmek ve en azından kolay devre kurabilir hale getirmekte. SENAY arkadaşımız LPC2148'li bir kart hazırlıyordu. Daha sonra kendisiyle irtibat koptu...

Basic programının exesi çalışmadı. .ocx li bir dosya istedi. USB driver mı acaba? Uygulayacak imkanlarımız olduğunda Philipsin sitesinin altını üstüne getiririm, bulurum driverlarını  :twisted:

İyi çalışmalar size de...
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

Petek

Alıntı yapılan: "tatlisukurnazi"
Alıntı yapılan: "encryptedcode"petek hocam bir yandan pdfleri okuyalım ama ben derimki okuduğumu anlamak adına küçük küçük örneklerde yapsak ne dersiniz mesela o led yakıp söndürmek gibi çünki bu yapıyı anlayana kadar bir önceki okuduğumu unutuyorum

Petek hocam encryptedcode haklı , linkini verdiğim dosya'nın C kodlarına baktim çok kısa,  kısmen traşlayıp,mesela usb kısmını felan silip daha küçük bir kod oluşturupi ufak ufak eşelemeye başlasak. Takildiğin yerler olduğunda biz yardımcı olmaya çalışsak(vakit kaybetmemek açısından). Ve sonuçları sen bizimle paylaşsan vs. Saygılar...
Hocam, ISIS ta denedim ama led yakma programını çalıştıramadım. ISIS bir hata verdi. Ne olduğunu anlayamadım. Çalışmış olsaydı Blinky örneği ile başlayıp, LPC2124 ün pek çok özelliğini de incelerdik. Gnuchess programı GnuARM ile yazılmış. Onunla mı denesek diyorum ama onun için de gnuarm bulmam gerek.

@encryptedcode hocam, siz gnuarmı indirdiniz mi? linkini gönderebilirmisiniz? Hem forumda da kısayolu bulunmuş olur :)
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

Petek

Arm çekirdekli işlemcilerde port erişim, yönetim komutları PIC lerdekine pek benzemiyor. O nedenle biraz zorlanacağız. Alışkanlıklarımızın dışa çıkıyoruz...

Yine Philips LPC2124 işlemcilerini esas alarak şu örneğe bakarsak,
IODIR1  = 0x00FF0000;   /* P1.16..23 defined as Outputs  */

16 bitlik (16-31) P1 portunun 16 dan başlayıp 23 e kadar ki pinlerinin yönü INPUT değil OUTPUT olarak tanımlanıyor. Piclerde 1 i, 0 o yerine idi.

P1.16 pininin çıkışını 1 yapmak için
IOSET1 =   0x00010000;

Aynı pinin çıkışını 0 yapmak için
IOSET1 =   0x00000000;  !!! DEĞİL !!!
IOCLR1 =   0x00010000; ....YAPIYORUZ...

Neyse en azından banklarla pagelerle uğraşmaktan kurtulduk :)

31-0 bit sayının 0. mı 31. mi bitinin MSB olacağına biz karar verebiliyormuşuz. Bunun pratikteki anlamı nedir acaba. Philips bunu kolay yoldan halletmiş. 31. bit MSB olacak demiş :) Bunu biz de biliyorduk :) Öbür türlü tanımlasak acaba ne değişirdi ki? Bunun cevabını bilen varsa lütfen daha sonra yazsın. Şimdilik aklımızda kalanları unutmadan buraya aktaralım.  Kendi adıma bunu yaparken de fazla kafa karıştırmış olmayayım. Sadece dikkat çekmek istedim ...
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

aYe

Alıntı yapılan: "Petek"Basic programının exesi çalışmadı. .ocx li bir dosya istedi. USB driver mı acaba? Uygulayacak imkanlarımız olduğunda Philipsin sitesinin altını üstüne getiririm, bulurum driverlarını  :twisted

İyi çalışmalar size de...

Petek hocam nasıl Dll. ler C'nin sistem dosyalariysa Ocx'lerde basic için sistem dosyaları. Ocx hatası aldiginda ör mscomm32.ocx bunu google'a aynen yaz ve arat binlercesini bulursun "windows/system32/" klasörünün içine kopyala bütün mesele bu. Diger mesajlarina şimdilik yorum yok, önce detayli incelemem lazim.  Kolay gelsin...
Dünyada iki şey sonsuzdur. İnsanın aptallığı ve evren. Ancak ikincisinden o kadar emin değilim... (Einstein)

mcan

gnu arm ı keilden indirdim upload edeyimde bir işe yarayayım geliyor bekleyin(biraz uzun ürebilir dediğim gibi keile girdim oradan uvision 3 için forum doldurdum indirme seçeneklerinden gcc yide seçtim o doyayı upload ediyorum rapidshare ye ama uzun sürecek gibi yinede upload edeceğim)

Petek

Zahmet olmaz ise hemenpaylas a yüklesen iyi olur. Hiç değilse 30 gün indiren olmazsa silinmezdi :).

Rapid kadar hızlı değil tabi. Rapide başladıysan devam et.

@tatlisukurnazi, dediğin gibi googledan bulacağım.

Becerebilirsek denemeye Gnuarm ile başlarız. Linux kullanıcıları ile paslaşırız bu konuda :) ISIS'ın yeni versiyonlarında problem olmaz ise Keil ile de devam edebiliriz, gnuarm ile de. Şu Blinky ISIS'ta bir çalışsa gerisi gelicek inşaallah. Keil'in kendi simulatörü çalıştırıyor ama önemli olan ISIS üzerinde çalıştırabilmek.

Galiba gnuarm arkasındaki destek : CodeSourcery, in partnership with ARM, Ltd.  :D  Yanlış mı anlıyorum yoksa öyle mi?

http://www.codesourcery.com/gnu_toolchains/arm/index_html
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

aYe

Dünyada iki şey sonsuzdur. İnsanın aptallığı ve evren. Ancak ikincisinden o kadar emin değilim... (Einstein)