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_))
_suspect_ veya _found_? :) – sarnold
Şimdiye kadar şüphelendim. Ben geçmişte optimizasyon yan etkileri ile ısırılmış oldum bu yüzden dikkatli olduğum için – CodePoet
@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