Platform bağımsız NOP

Başlatan hasankara, 02 Nisan 2015, 10:23:15

hasankara

Standart C, nop komutu barındırır mı? Yani ben öyle bir nop komutu yazayım ki her derleyici bunun nop olduğunu anlasın.

MrDarK

#1
NOP komutu bir ASM kodu olduğu için her derleyici için farklı şekilde yazılması gerekiyor olabilir.

Örneğin GCC için asm("nop"); iken

Keil kendi sitesinde _nop_ ();

şeklinde tanıtmış. Bana kalırsa en doğrusu şu şekilde kullanmak;

#define NOP   (derleyicinin algıladığı nop komutu)

for(i=0;i<10;i++)
NOP


http://www.keil.com/support/docs/2315.htm

http://www.microchip.com/forums/m156162.aspx

http://stackoverflow.com/questions/24359632/how-does-asmnop-works

http://stackoverflow.com/questions/25762871/equivalent-for-nop-in-c-for-embedded

Picproje Eğitim Gönüllüleri ~ MrDarK

Tagli

Alıntı YapStandart C, nop komutu barındırır mı?
Sanmıyorum. NOP doğrudan işlemci komutuna bağlı. C'de boş komut olarak sadece ; koyabilirsin ama tahminimce derleyici tarafından yok sayılıyordur.

Ama zaten farklı işlemcilerde NOP kullanmak anlamsız olacaktır. NOP genelde o işlemcide özel bir gereksinimi karşılamak için kullanılır. Bekleme kodu yazmak için kullanımı uygun değildir.

Yine de gereksinimin varsa şu şekilde yapabilirsin: Kodunu hangi işlemcilerde çalıştıracağın az çok bellidir. Derleyiciler genelde kendi isimlerine göre bir tanımlama yaparlar gizli bir #define komutu ile. Sen de kod içinde örneğin #ifdef XC8 NOP(); #endif gibi kullanabilirsin. (XC8'i salladım, başka bir şey olabilir)
Gökçe Tağlıoğlu

hasankara

Teşekkürler arkadaşlar. Esasında her işlemcide olabilecek bir komut diye düşündüğüm için c de böyle bir nop yazımı olabileceğini düşünmüştüm. Nitekim gnu bu konuda benimle hem fikir. İhtiyaç derken esasında şöyle bir durum oluştu;

pic32 ile çalışırken, bit operasyonu yaparken şöyle bir durum meydana geldi. Üst üste aynı kaydedici üzerinde farklı bitlerde operasyon yaparken, ilk operasyon başarısız oluyor. Ancak araya bir nop komutu koyunca bu problem ortadan kalkıyor. Daha öncede bu problem canımı sıkmıştı. Nihayet bu gün problemin kaynağını tespit edebildim.

Nop yerine ilgili registerin ismini yazıp, direk sonuna noktalı virgül koyduğumda, operasyon işlemi için yerleştirilen asm kodlarından sonuncu olan asm kodunu tekrar yerleştiriyor. Yine nop gibi tek satır kaplıyor ve sanırım bu problemi bu şekilde de çözmeye yetti.

Salih

Simulasyonda mı yoksa gerçek devrede mi problem oluyor.
Bende de proteus da devre denerken böyle durum oluyordu,
ama gerçek devrede olmuyordu.

hasankara

Gerçek devrede problem oluyor. Yapılan işlem tek asm kodunda bitmediği için sonraki asm kodu ile ile çakışma meydana getiriyor diye bir yorum getirebildim.