2012-07-05 15 views
9

मेरे पास कुछ सी मैक्रोज़ हैं जो इंटरप्ट को निष्क्रिय और सक्षम करते हैं ताकि मैं कोड के महत्वपूर्ण अनुभागों को परिभाषित कर सकूं। मैं यह सुनिश्चित करना चाहता हूं कि अनुकूलक संचालन का अनुपालन करता है और उन्हें स्थानांतरित नहीं करता है या उन्हें हटा नहीं देता है।मैं ऑप्टिमाइज़िंग कंपाइलर को बाधित मुक्त महत्वपूर्ण अनुभागों को बाधित करने से कैसे रोकूं?

#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_)) 

उपयोग इस प्रकार है:

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); 

कोड काम करता है अनुकूलन के साथ बंद कर दिया अपेक्षा के अनुरूप है, लेकिन मुझे लगता है अनुकूलन के साथ समस्याओं चालू हो सकता है।

एएसएम कथन में अस्थिर जोड़ना चाल करेगा?

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

_suspect_ या _found_? :) – sarnold

+0

अभी तक संदेह है। मुझे अतीत में ऑप्टिमाइज़ेशन साइड इफेक्ट्स द्वारा काट दिया गया है, इसलिए मैं सावधान रह रहा हूं – CodePoet

+2

@ कर्नाल्ड वेल "हमेशा काम करेगा" के बीच एक अंतर है और "इस विशिष्ट कोड पर इस विशिष्ट संकलक के साथ हर ट्यूडेडे के साथ काम करेगा", इसलिए कुछ मांगना दस्तावेज जो व्यवहार की गारंटी देता है, ऐसी चीजों के लिए एक अच्छा विचार है। – Voo

उत्तर

7

हां, asm volatile इस मैक्रो को लिखने का सही तरीका है। आप डीबगर पर इस कोड के माध्यम से कदम उठाकर और असेंबली स्तर पर संचालन के क्रम को देखकर आसानी से व्यवहार की जांच कर सकते हैं। या, आप अपने फ़ंक्शन के लिए डिस्सेप्लर आउटपुट की दृष्टि से निरीक्षण कर सकते हैं।

यहाँ इनलाइन एएसएम पर कुछ उपयोगी जीसीसी प्रलेखन

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

0

आप केवल कुंजी चर पर अस्थिर विशेषता की जरूरत है।

संबंधित मुद्दे