Kaldirilan for dongusu ve tumb modunda inline asm yasagi

Başlatan bunalmis, 27 Aralık 2010, 13:12:34

z

Cipin initilaize islemleri asamasinda registerlere pespese veri yuklerken bazi yuklemelerin sonrasinda kucuk gecikmeler gerekiyor ve bu durumlar icin for (i=0; i<1000; i++); seklinde for donguleri yaziyorum.

Ancak derlenmis kodlari debug ederken bu satirlarin isleme dahi alinmadigini goruyorum.

Eger bunu optimizasyon adina yapiyorsan bu optimizasyonu bu asamada yapma cunku bu bir delay, fakat diger satirlarda kod kisaltmasi yapabiliyorsan kisaltma yap diyemezmiyim?

Neden bu for dongusu kaldirilip atiliyor?

Ote yandan for dongusu kaldirilmasin nop gibi bir asm kod kossun dedigimde   for (i=0; i<1000; i++) __asm ("NOP"); satirini yaziyorum.

Derlemeye kaltigimda ise Main.c(26): error:  #1113: Inline assembler not permitted when generating Thumb code mesaji aliyorum.

Thumb modda iken  inline asm kod yazilmasina neden izin verilmiyor?

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

tmcone

Döngü değişkenine ilaveten volatile bir değişken tanımlayıp döngü içerisinde buna atama yaparsanız derleyici optimizasyon nedeniyle döngüyü kaldırmamalı.

volatile int j; // dummy variable
for(i=0; i<1000; i++)
     j = 0;


Ya da döngü değişkenini volatile tanımlayıp artırma veya azaltmayı döngü içerisinde yaparak deneyebilirsiniz. Son olarak sadece debug amaçlı ise derleyicinin optimizasyon seviyesini en düşük seviyeye getirerek deneyebilirsiniz.


Hataya gelince kodun tamamını görmeden yorum yapmam doğru olmaz. Ama aşağıdaki linki inceleyebilirsiniz.
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0282b/CHDGDDCJ.html




iyildirim

Keil kullanmadım, keil de nasıldır bilmem ama, derleyici direktifleri (#pragma) ile yapılabilmeli.


z

Volatile degisken isimi gordu.

Inline asm yasagi hala devam ediyor ve bunu keil ozellikle yapmis. Sebebi basit, Cortex M3 komutlari optimizasyona cok musait. O anki satirin altida kalan satirlara ait C kodlarinda kullanilacak registerlerin secimi, daha o an isletilecek C satirinda kullanilacak registerlele uygun olacak sekilde secilebiliyor. Bu durumda ileri satirlarda olabilecek gereksiz register yuklemeleri ortadan kalkiyor ve kisa bir kod uretilebiliyor. Eger bu isleyisi sekteye ugratacak inline asm yazim yaparsaniz ortaya kotu bir kod dizilimi cikiyor. Keil gelistiricileri, siz benim kodlamama karismayin deyip kestirip atmis.

Eger benim gibi illaki asm kod yazmaniz gerekiyorsa bu durumda asm kodlari C programinizin icinde ayri bir asm fonksiyon olarak yazabiliyorsunuz. Bu durumda sadece fonksiyona git gel zaman kaybi oluyor. Hazir lib fonksiyonlari kullanmadan ciplak C yazilim yapiyorsaniz privileged modda  core registerlerine erisimde asm kodlama gerekiyor.

Ornek isterseniz asagida.

__asm void My_ASM()
{
        MRS          R0,PRIMASK	
        CPSIE       I 			
        ........
        ........
        ........
        BX            LR	
}
Bana e^st de diyebilirsiniz.   www.cncdesigner.com