मैंने अभी अपने एम्बेडेड प्रोजेक्ट पर सी ++ 20 के साथ जीसीसी 10 डाउनलोड किया है।

हालांकि एम्बेडेड अनुप्रयोगों में रजिस्टर स्ट्रक्चर मैपर्स के लिए अस्थिर का उपयोग करना काफी आम है।

चूंकि कंपाइलर को यह नहीं पता होता है कि रजिस्टर वैल्यू को डीएमए द्वारा बाहरी रूप से बदला गया था, इसलिए इस रजिस्टर के रीलोड को "बल" देना समझ में आता है।

प्रदर्शन बढ़ाने के लिए इनमें से कुछ वाष्पशील को सी हेडर फाइलों में रखा जाता है। जब मैं इन शीर्षलेखों को एक सीपीपी फ़ाइल में शामिल करता हूं, तो मुझे बहुत सारी अस्थिर बहिष्करण त्रुटियां मिलती हैं।

क्या इन त्रुटियों को अक्षम करने का कोई तरीका है?

@Edit जैसा कि कुछ उदाहरण कोड का अनुरोध किया गया है।

/*!
 * @brief Enable the clock for specific IP.
 *
 * @param name  Which clock to enable, see \ref clock_ip_name_t.
 */
static inline void CLOCK_EnableClock(clock_ip_name_t name)
{
    uint32_t regAddr = SIM_BASE + CLK_GATE_ABSTRACT_REG_OFFSET((uint32_t)name);
    (*(volatile uint32_t *)regAddr) |= (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT((uint32_t)name));
}
C:/xxx/kinetisSDK/2.7.0/devices/MK64F12/drivers/fsl_clock.h:671:37: error: compound assignment with 'volatile'-qualified left operand is deprecated [- Werror=volatile] 
671 |     (*(volatile uint32_t *)regAddr) |= (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT((uint32_t)name));      |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

चूंकि ये परिभाषाएँ पूरे NXP SDK में फैली हुई हैं, इसलिए मैंने केवल आवश्यक भागों को निकालने का प्रयास किया।

https://godbolt.org/z/WKzj5j

हालाँकि गॉडबोल्ट ठीक लगता है। शायद ऐसा इसलिए है क्योंकि मैं आर्म ईबी के लिए जीसीसी 10 का उपयोग कर रहा हूं।

4
JHeni 14 जिंदा 2021, 12:26
1
कृपया कोड और चेतावनी दिखाएं जो आपको मिलती है। volatile के केवल कुछ उपयोगों को हटा दिया गया है। बहिष्कृत सामग्री का उपयोग न करने के लिए अपनी हेडर फ़ाइल को बदलने का सबसे अच्छा तरीका है।
 – 
Werner Henze
14 जिंदा 2021, 12:27
1
यदि आप समस्या को हल किए बिना चेतावनियों को शांत करना चाहते हैं, तो -Wno-deprecated चेतावनियों को पूरी तरह से दबा देगा, और -Wno-error=deprecated को चेतावनियों को ध्यान में रखते हुए, -Werror ध्वज से त्रुटियों को हटा देना चाहिए।
 – 
Yksisarvinen
14 जिंदा 2021, 12:36
2
compound assignment with 'volatile'-qualified left operand is deprecated 'volatile' is deprecated के समान नहीं है
 – 
Clifford
14 जिंदा 2021, 13:08
2
विक्रेता द्वारा आपूर्ति किए गए हेडर को छोड़कर आम तौर पर सी एपीआई के लिए सी ++ इंटरऑप के लिए एक सशर्त extern 'C' रैपर के साथ होते हैं। यह जटिल हो जाएगा, और तृतीय-पक्ष हेडर को संशोधित करने से अपडेट लागू करना मुश्किल हो जाता है। सी ++ 20 का उपयोग नहीं करना एक और संभावना है। मुझे विश्वास नहीं है कि छोटे एम्बेडेड लक्ष्यों के लिए यह जरूरी है। मानक ऐसे स्थान जा रहे हैं जो अधिकांश एम्बेडेड सिस्टम डेवलपर्स के लिए बहुत कम रुचि रखते हैं।
 – 
Clifford
14 जिंदा 2021, 13:16
1
यह कोड काइनेटिस एमसीयू में कुछ हार्डवेयर परिधीय की घड़ी की स्थापना की संभावना है, इसलिए यह हार्डवेयर के बहुत करीब है और इस प्रकार सी ++ के लिए बहुत अनुपयुक्त है। विशेष रूप से 2011 के बाद जारी सी ++ के सभी लाला-इम-ए-पीसी संस्करणों के मामले में।
 – 
Lundin
14 जिंदा 2021, 13:23

1 उत्तर

सबसे बढ़िया उत्तर

अब आप |= का उपयोग नहीं कर सकते, लेकिन आप = का उपयोग कर सकते हैं, इसलिए इसे बदलें:

(*(volatile uint32_t *)regAddr) |= (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT((uint32_t)name));

इसके लिए:

*(volatile uint32_t *)regAddr = *(volatile uint32_t *)regAddr | (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT((uint32_t)name));
7
John Zwinck 14 जिंदा 2021, 12:52
उह यह मेरा कोड नहीं है। वह एनएक्सपी का एसडीके है। इस तरह के बयान पूरे एसडीके में फैले हुए हैं। मुझे डर था कि आप कह सकते हैं कि: ओ तो मुझे सी रैपर बनाकर सी ++ कोड से इन वाष्पशील को "छिपाना" होगा: ओ
 – 
JHeni
14 जिंदा 2021, 13:02
1
(*(volatile uint32_t *)regAddr) |= , *(volatile uint32_t *)regAddr = *(volatile uint32_t *)regAddr के बराबर नहीं है, क्योंकि बाद वाला दो बार अस्थिर व्यंजक का मूल्यांकन करता है। तो इस बार एम्बेडेड सिस्टम प्रोग्रामर की भारी उपस्थिति के साथ शानदार सी ++ समिति का तर्क क्या है?
 – 
Lundin
14 जिंदा 2021, 13:33
2
मानक x |= y के व्यवहार को परिभाषित नहीं करता है यदि x का मान उन तरीकों से बदलता है जो संकलक वैसे भी ऑपरेशन के निष्पादन के दौरान नहीं जानता है। आप निश्चित रूप से इस तरह के कोड को पोर्टेबल रूप से नहीं लिख सकते हैं - "पोर्टेबल यूएआरटी फ्लैग रजिस्टर" जैसी कोई चीज नहीं है, यह एक हार्डवेयर क्विर्क है जिसके लिए प्लेटफॉर्म-विशिष्ट कोड की आवश्यकता होती है। आपका प्लेटफ़ॉर्म गारंटी दे सकता है कि |= सही काम करता है, लेकिन यह एक प्लेटफ़ॉर्म-विशिष्ट गारंटी होगी, C++20 नहीं।
 – 
David Schwartz
14 जिंदा 2021, 14:10
1
इसका सीधा सा मतलब है कि इसका कोई भी दुष्परिणाम दो बार नहीं हो सकता है। उदाहरण के लिए, यदि आप *i++ |= j करते हैं, तो इसका मतलब है कि केवल एक वेतन वृद्धि हो सकती है। इसका मतलब यह नहीं है कि अगर i मेमोरी में है तो कार्यान्वयन i दो बार नहीं पढ़ सकता है। जबकि हार्डवेयर परिधीय समान है, परिवार और कोर अलग हैं, इसलिए आप कोड में हार्डवेयर का उपयोग कैसे करते हैं यह अलग है।
 – 
David Schwartz
14 जिंदा 2021, 14:18
1
हालांकि आप ऐसा नहीं कर रहे हैं। यहाँ एक अस्थिर ग्लवल्यू द्वारा निर्दिष्ट कोई वस्तु नहीं है। अगर आपको लगता है कि वहाँ है, तो मुझे बताओ कि वह कौन सी वस्तु है।
 – 
David Schwartz
14 जिंदा 2021, 19:02