2012-07-05 15 views
9

Kodun kritik bölümlerini tanımlayabilmek için kesmeleri devre dışı bırakıp etkinleştiren bazı C makrolarım var. Optimizatörün işlemlere uygun olmasını ve bunları taşımamasını veya çıkarmamasını sağlamak istiyorum. aşağıdaki gibiOptimize edici bir derleyicinin kesme gerektirmeyen kritik bölümleri kesintiye uğratmasını nasıl önleyebilirim?

#define ARM_INT_KEY_TYPE   unsigned int 
#define ARM_INT_LOCK(key_) ({ \ 
    asm("MRS %0,cpsr" : "=r" (key_)); \ 
    asm("MSR cpsr_c,#(0x1F | 0x80 | 0x40)"); \ 
}) 
#define ARM_INT_UNLOCK(key_) asm("MSR cpsr_c,%0" : : "r" (key_)) 

kullanım şöyledir:

int init_i2c(p_device_i2c dev){ 

// Interrupts are enabled 
doSomething(); 

ARM_INT_KEY_TYPE key; 
ARM_INT_LOCK(key); 

// Interrupts are disabled 
pMX27_GPIO i2c_clk = (pMX27_GPIO)(GPIO_BASE_ADDR | I2C_CLK_PORT); 
pMX27_GPIO i2c_sda = (pMX27_GPIO)(GPIO_BASE_ADDR | I2C_DATA_PORT); 

i2c_clk->GIUS &= ~(1 << I2C_CLK_PIN);   // I2C Signals 
i2c_sda->GIUS &= ~(1 << I2C_DATA_PIN);  // I2C Signals 

ARM_INT_UNLOCK(key); 
// Interrupts ON again 

// Wait for stable 
ARM_delay_clocks(5000); 

i2c_stop(dev); 

kod optimizasyonu kapalı beklendiği gibi çalışır ancak optimizasyonu ile sorunlar AÇIK olabileceğini sanıyorum.

Asm ifadelerine volatil eklenir mi?

#define ARM_INT_UNLOCK(key_) asm volatile ("MSR cpsr_c,%0" : : "r" (key_)) 
+0

_suspect_ veya _found_? :) – sarnold

+0

Şimdiye kadar şüphelendim. Ben geçmişte optimizasyon yan etkileri ile ısırılmış oldum bu yüzden dikkatli olduğum için – CodePoet

+2

@sarnold Peki "her zaman çalışır" ve "bu her derde deva ile bu özel kod üzerinde çalışacak" arasında bir fark var, bu yüzden biraz soruyorum Davranışı garanti eden belgeler bu tür şeyler için iyi bir fikirdir. – Voo

cevap

7

Evet, asm volatile Bu makroyu yazmak için doğru yoldur. Hata ayıklayıcısında bu kodu geçerek ve montaj seviyesindeki operasyon sırasını izleyerek davranışı kolayca kontrol edebilirsiniz. Veya işlevinizin sökme çıktısını görsel olarak kontrol edebilirsiniz.

Burada sadece anahtar değişkeni uçucu niteliği ihtiyaç

http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#ss5.4

0

satır içi asm bazı yararlı gcc belgeleri var.