Picproje Elektronik Sitesi

DERLEYİCİLER => Diğer Derleyiciler => KEIL => Konuyu başlatan: z - 04 Kasım 2010, 19:00:11

Başlık: Keil'de C fonksiyonlarında parametre aktarımı
Gönderen: z - 04 Kasım 2010, 19:00:11
Keil de seçilen işlemci için

C fonksiyonlarını çağırırken ve dönerken parametre aktarımında hangi registerleri ne maksatla kullandığı ve
stacka attığı verilerin atılış sırlaması gibi bilgilere ihtiyacım var.

Keilin sitesine baktım ama göremedim.

Muhakkak bir gören olmuştur.
Başlık: Ynt: Keil'de C fonksiyonlarında parametre aktarımı
Gönderen: SpeedyX - 04 Kasım 2010, 19:57:15
Hocam bu işlemler keil den çok kullanılan işlemcinin donanım mimarisi ile ilgilidir, yada soruyu yanlış mı anladım?

İşlemci ARM ise 16 tane working registerı vardır (PIC lerdeki W gibi), bunlar aracılığıyla işlemler yapılır, stacka atılan veri sıralamasına ise içindeki router karar verir, tekli çiftli gibi sıralama şekilleri vardır.
Başlık: Ynt: Keil'de C fonksiyonlarında parametre aktarımı
Gönderen: z - 04 Kasım 2010, 20:17:56
Tamam işte kendi işlemcimle ilgili olanı arayıp bulacağım da yerini bulamadım.

Ben ARM Cortex M3 tipi işlemciler için gerekli bilgileri arıyorum.

İşlemcinin register vs bilgileri belli de Keil'in bunları ele alış şeklini arıyorum.
Başlık: Ynt: Keil'de C fonksiyonlarında parametre aktarımı
Gönderen: X-Fi - 04 Kasım 2010, 20:23:57
SpeedyX hocam keil de pic C deki gibi manual dosyası nerede? ben avr yazılımında bi fonksiyon bulmak için aramıştım bulamadım şimdilik örneklerden yola çıkarak yolumu buluyorum.
Başlık: Ynt: Keil'de C fonksiyonlarında parametre aktarımı
Gönderen: SpeedyX - 04 Kasım 2010, 21:27:31
@bunalmis hocam ozaman sanırım RealView compiler olarak araman gerekiyor, çünkü bu işleri keil ayarlamıyor.
Keil daha çok editör ve modüler derleyiciler kullanıyor diye biliyorum, derleyicilerin yapısı da birkaç stage den oluşur, sanırım size ASM ye dönüştürüldükten sonraki işlemlerle ilgili bilgi lazım.

@X-Fi, keil de hazır kütüphaneler klasik C derleyicilerindekiler gibi. Startup ve INC klasörlerindeki dosyaları kullanabilirsin, dosyaların içinde fonksiyonlar tanımlanmış ama bunların dökümante edilmiş haline hiç ihtiyacım olmadı, keil.com da vardır diye düşünüyorum.
Başlık: Ynt: Keil'de C fonksiyonlarında parametre aktarımı
Gönderen: z - 07 Kasım 2010, 17:33:04
Henuz dokumanlarda aradigim bilgiyi bulamadim ancak simulasyonda

Parametrelerin sirayla registerlere atildigini tespit ettim.

Ornegin

void func(int par1)

de par1 R0 icinde gidiyor.

void func(int par1, int par2, int par3) de R0,R1,R2 ile gidiyor.
Başlık: Ynt: Keil'de C fonksiyonlarında parametre aktarımı
Gönderen: tmcone - 07 Kasım 2010, 18:16:14
Alıntı yapılan: bunalmis - 07 Kasım 2010, 17:33:04
Henuz dokumanlarda aradigim bilgiyi bulamadim ancak simulasyonda

Parametrelerin sirayla registerlere atildigini tespit ettim.

Ornegin

void func(int par1)

de par1 R0 icinde gidiyor.

void func(int par1, int par2, int par3) de R0,R1,R2 ile gidiyor.


Aradığınız bilgileri ARM Architecture Procedure Call Standard (aapcs)  dökümanında bulabilirsiniz. Kısaca özetlemek gerekirse parametreler için R0 - R3 kullanılır. İlk olarak R0, daha sonra R1 ...  Dönüş değeri R0 üzerindendir. Eğer 4 parametreden fazla geçmek isterseniz struct kullanmanız verimli olur. Eğer fonksiyonunuz R4-R11 register larını değiştiriyorsa bunları stack a atıp tekrar yüklemeniz lazım; bu register ların fonksiyona girmeden önceki değerleri korunmalı.

Başlık: Ynt: Keil'de C fonksiyonlarında parametre aktarımı
Gönderen: z - 16 Mayıs 2011, 03:19:47
R0..R3 yazboz register olarak gorunuyor. R4..R8,R10,R11 Lokal degiskenler icin kullaniliyormus.
Keil'e, R4..R7 i de yazboz olarak kullanmama izin ver deme sansimiz varmi?

Lokal degisken sayisi fazla olursa zaten keil, fazla degiskenleri ramda tutuyor. Dolayisi ile R4..R7 yi bana devretmesinde sakinca yok gorunuyor.
Eger bu mumkun olursa herdefasinda bozacagim R4..R7 degerlerini pusp popla korumama gerek kalmayacak ve bu bana avantaj getirecek.

☻B☻
Başlık: Ynt: Keil'de C fonksiyonlarında parametre aktarımı
Gönderen: Elektroemre - 19 Ocak 2012, 14:19:24
Hocam keilin ürettiği kodlara baktığımda dediğiniz gibi R0...R3 push-pop ihtiyacı hissedilmeden öylece kullanılmış.

Bir interrupt rutininde R0...R3 kullansam, tam bu interrupt rutininin içerisinde başka bir interrupt gelse ve işlemci oraya gitse döndüğünde r0...r3'ün içindeki değerlerin değişmediği garantisini ARM mimarisi bana verebiliyor mu?
Bunlar dallanmalarda otomatikmi push-pop ediliyor? Yada böyle hassas zamanlarda bunlarıda push-pop etmek gerekir mi?
Başlık: Ynt: Keil'de C fonksiyonlarında parametre aktarımı
Gönderen: z - 19 Ocak 2012, 14:43:12
Evet interrupt mekanizması r0..r3 ü otamatik olarak saklıyor. Bunlara ilave olarak R15, R14, R12 ve PSR de saklanıyor.

Fonksiyon çağırma gibi durumlarda bunları  saklayıp saklamamak senin inisiyatifinde. CPU hiç bir şeyi saklamıyor, herşeyi sen saklayacaksın.
Başlık: Ynt: Keil'de C fonksiyonlarında parametre aktarımı
Gönderen: Elektroemre - 19 Ocak 2012, 14:51:07
Teşekkürler hocam, anladım. Amacım hassas zamanlamalı ve mümkün olduğunca kısa süren bir interrupt rutini yazmak.

Peki cortex-m3'te program çalışırken çat diye interrupt geldiğinde;
*int rutinindeki kodun olduğu yere gelene kadar kaç clock zaman geçiyor?
*Aynı şekilde geri dön dediğimde?
*Daha kısa sormak gerekirse boş bir int rutinine girip-çıkıldığında toplam kaç cycle geçiyor?

En önemliside bu süreler sabit mi?
Başlık: Ynt: Keil'de C fonksiyonlarında parametre aktarımı
Gönderen: mcan - 19 Ocak 2012, 21:32:46
 Dökümanın birinde m3 için şu ifadeyi okudum
Alıntı YapThe processor implements the ARM v7-M architecture. This includes the entire 16-bit
Thumb instruction set and the base Thumb-2 32-bit instruction set architecture. The
processor cannot execute ARM instructions.
Bizim debugger penceresinden gördüğümüz sadece thumb*thumb2 kodları mı?
Başlık: Ynt: Keil'de C fonksiyonlarında parametre aktarımı
Gönderen: z - 19 Ocak 2012, 21:53:43
Alıntı yapılan: Elektroemre - 19 Ocak 2012, 14:51:07
Teşekkürler hocam, anladım. Amacım hassas zamanlamalı ve mümkün olduğunca kısa süren bir interrupt rutini yazmak.

Peki cortex-m3'te program çalışırken çat diye interrupt geldiğinde;
*int rutinindeki kodun olduğu yere gelene kadar kaç clock zaman geçiyor?
*Aynı şekilde geri dön dediğimde?
*Daha kısa sormak gerekirse boş bir int rutinine girip-çıkıldığında toplam kaç cycle geçiyor?

En önemliside bu süreler sabit mi?

Interrupt latency en az 12 Cycle kadar zaman aliyor. Bir 12 de donuste.

Fakat bu sabit degil. Giris latecy daha yuksek olabiliyor.

Bir fonksiyonu dogrudan cagirip iceride regleri push etmek soft interrupt ile cagirmaya gore belki de 1 yada 2 clk daha az zaman alir. Soft int kullanmak sadece kodu kisaltir. Push pop komutlarina ihtiyaci kaldirir.

Fakat soft interrupt rutininde int oldu ama amacimiz ne tespiti icin if yada switch tarzinda  kod yazman gerekir. Bu da isi uzatir. Bu daha cok user seviyesindeki kodun privileged kod isletmeye ihtuyac duymasinda basvurulabilecek bir yontem.


Başlık: Ynt: Keil'de C fonksiyonlarında parametre aktarımı
Gönderen: z - 19 Ocak 2012, 21:57:56
Alıntı yapılan: mcan - 19 Ocak 2012, 21:32:46
Dökümanın birinde m3 için şu ifadeyi okudum  Bizim debugger penceresinden gördüğümüz sadece thumb*thumb2 kodları mı?

Evet Cortex islemciler sadece thumb ve thumb2 kodlari isletebiliyor. Eger Arm komut isletmeye kalkar yada ARM moda gecmeye calisirsan exception olusur.
Başlık: Ynt: Keil'de C fonksiyonlarında parametre aktarımı
Gönderen: mcan - 19 Ocak 2012, 22:03:43
Alıntı yapılan: bunalmis - 19 Ocak 2012, 21:53:43
Interrupt latency en az 12 Cycle kadar zaman aliyor. Bir 12 de donuste.

Fakat bu sabit değil. Giris latecy daha yuksek olabiliyor.

Bir fonksiyonu dogrudan cagirip iceride regleri push etmek soft interrupt ile cagirmaya gore belki de 1 yada 2 clk daha az zaman alir. Soft int kullanmak sadece kodu kisaltir. Push pop komutlarina ihtiyaci kaldirir.

Fakat soft interrupt rutininde int oldu ama amacimiz ne tespiti icin if yada switch tarzinda  kod yazman gerekir. Bu da isi uzatir. Bu daha cok user seviyesindeki kodun privileged kod isletmeye ihtuyac duymasinda basvurulabilecek bir yontem.
Hocam ben bu soft interrupt olayını işlemcinin ayrıntılarını bilmediğim için deneme amaçlı loader programı yazma  amaçlı kullanmayı düşünmüştüm. Mesela bir program yazıyoruz bu programda sd karttan derlenmiş datayı okuyup romun bir köşesine yada ram e yazalım ana programdan da adresi yazdığımız rom bloğunun adresi olan bir fonksiyonu çağıralım. Bu durumda bizim sanki interrupt gelmiş gibi gerekli yazmaçları kopyalayıp işimiz bittiğinde ise geri yüklememiz gerekiyor değil mi?
Başlık: Ynt: Keil'de C fonksiyonlarında parametre aktarımı
Gönderen: z - 19 Ocak 2012, 22:15:53
Sorunu tam anlamadim. Software Int ile int rutinine gittiginde tamam yukaridaki mesajlarda adi gecen regler otomatik saklaniyor geri donuste de otomatik geri cekiliyor.

Dogrudan fonksiyon cagirsan bu reglerin zaten gerekmeyenleri saklanmayacak bosu bosuna zaman kaybi da olmayacak. Dolayisi ile dogrudan fonksiyon cagirmak bence daha mantikli.

Soft interrupt parametresi islemci tarafindan degerlendirilmedigi icin int rutininde bu parametrenin tespiti icin zaten 4-5 cycle zaman alacak kod isletmen gerekiyor.

Soft int kullanmak isletim sistemi gibi yapilar olustururken cok faydali.  Eger cipe yuklenen kodlarin tamami sana aitse soft int kullaniminin getirisini goremiyorum.