Keil'de C fonksiyonlarında parametre aktarımı

Başlatan bunalmis, 04 Kasım 2010, 19:00:11

z

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

SpeedyX

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.

z

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

X-Fi

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.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

SpeedyX

@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.

z

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

tmcone

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ı.


z

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

Elektroemre

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?

z

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

Elektroemre

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?

mcan

#11
 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ı?

z

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.


Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

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

mcan

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?