2015-08-06 4 views
6

निम्नलिखित कोड को देखते हुए:एक अनुक्रम बिंदु के भीतर अस्थिर-योग्य प्रकार के साथ एक से अधिक पढ़ने की पहुंच क्यों नहीं होगी?

static volatile float32_t tst_mtr_dutycycle; 
static volatile uint8_t tst_mtr_direction; 
static volatile uint32_t tst_mtr_update; 

void TST_MTR_Task(void) 
{ 
    if (tst_mtr_update == 1U) 
    { 
     tst_mtr_update = 0; 

     MTR_SetDC(tst_mtr_dutycycle, tst_mtr_direction); 
    } 
} 

मैं मिश्रा सी 2012 नियम 13.2 के साथ समस्याओं मिल गया और मैं कुछ शोध करने का फैसला किया। मैं यहां पाया (http://archive.redlizards.com/docs/misrac2012-datasheet.pdf) कि:

वहाँ एक अनुक्रम अंक के भीतर अस्थिर योग्य प्रकार के साथ एक से अधिक पढ़ने के लिए पहुंच होगी

यहाँ बात यह है कि मैं स्वर्ग है ' एक उदाहरण या स्पष्टीकरण खोजने में सक्षम नहीं है जो स्पष्ट करता है कि एक अनुक्रम बिंदु के भीतर अस्थिर-योग्य प्रकार के साथ एक से अधिक पढ़ने का उपयोग क्यों नहीं किया जाएगा।

मुझे उल्लंघन कोड के लिए समाधान खोजने की आवश्यकता है, लेकिन मुझे वास्तव में यह स्पष्ट नहीं है कि क्या करना है।

मुझे पता है कि एक अनुक्रम बिंदु के भीतर अस्थिर-योग्य प्रकार के साथ एक से अधिक पढ़ने की पहुंच नहीं होगी। सवाल यह है, क्यों? और मुझे यह जानने की जरूरत है कि समाधान को कार्यान्वित करने और यहां सभी को समझाने के लिए क्यों मैं कोड बदल रहा हूं।

सम्मान।

उत्तर

4

शासन के लिए औचित्य है:

(आवश्यक) एक अभिव्यक्ति और उसके लगातार दुष्प्रभावों के मूल्य सभी के तहत समान होंगे मूल्यांकन आदेश

अधिक यदि अनुमति एक अस्थिर-योग्य चर से अनुक्रम बिंदुओं के बीच पढ़ा जाता है, फिर यह अनिर्दिष्ट है जिसे पहले पढ़ा जाता है। एक अस्थिर चर पढ़ना एक दुष्प्रभाव है।

void TST_MTR_Task(void) 
{ 
    if (tst_mtr_update == 1U) 
    { 
     tst_mtr_update = 0; 

     float32_t dutycycle = tst_mtr_dutycycle; 
     uint8_t direction = tst_mtr_direction; 
     MTR_SetDC(dutycycle, direction); 
    } 
} 
+0

बिल्कुल सही !! धन्यवाद! यह उत्तर मुझे अन्य मुद्दों के साथ भी मदद कर सकता है। मैं नियम के साइड इफेक्ट्स हिस्से को याद कर रहा था। – m4l490n

+0

ऐसा कुछ है जो मेरे लिए बहुत स्पष्ट नहीं है। एक अस्थिर चर एक साइड इफेक्ट क्यों पढ़ रहा है? – m4l490n

+1

@ m4l490n क्योंकि यह वही है जो 'अस्थिर' है - यह निर्दिष्ट करता है कि लिखता है और पढ़ता है कैश या पुन: व्यवस्थित नहीं किया जा सकता है।एक उदाहरण एक हार्डवेयर रजिस्टर होगा, जहां पढ़ना लगातार पढ़ने पर विभिन्न मूल्यों को वापस कर सकता है, और इसके परिणामस्वरूप मनमानी कार्रवाई होती है। – ecatmur

2

एक समारोह कॉल के तर्कों फ़ेच करने के बीच कोई अनुक्रम अंक के होते हैं:

समाधान स्पष्ट रूप से ऑर्डर करने के लिए पढ़ता है। तो वे जो आदेश प्राप्त कर रहे हैं वह मानक द्वारा अपरिभाषित है। ओटीओएच, कंपाइलर को अस्थिर वस्तुओं तक पहुंच के क्रम को बनाए रखना है, इसलिए यह एक विरोधाभास है।

नॉन-वोलाटाइल temps के लिए चर लायें और समारोह कॉल के लिए उन का उपयोग करें:

float32_t t1 = tst_mtr_dutycycle; 
uint8_t t2 = tst_mtr_direction; 
MTR_SetDC(t1, t2); 

नोट यह वास्तव में मानक सी के लिए एक मुद्दा है और सिर्फ मिश्रा पालन न करने से संबंधित नहीं।

जैसा कि आपको मानक अनुपालन के संबंध में कई समस्याएं दिखाई देती हैं, तो आप अपने तकिए के नीचे standard रखना चाहेंगे।

+0

यह स्पष्ट करने के लिए धन्यवाद कि "फ़ंक्शन कॉल के तर्क प्राप्त करने के बीच कोई अनुक्रम बिंदु नहीं है"। – m4l490n

+1

@ m4l490n: http://port70.net/~nsz/c/c11/n1570.html#Cp1 – Olaf

+0

धन्यवाद, मैं इसे देख लूंगा। – m4l490n

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