सी में @ के साथ परिवर्तनीय घोषणा


11

मैं कुछ सी कोड पढ़ रहा हूं और कार्यक्रम में इस घोषणा पर आया हूं:

unsigned char serv_ctr @0x0002;

क्या कोई मुझे दस्तावेज़ीकरण की ओर इशारा कर सकता है, या समझा सकता है कि Mplab XC8 v1.35 C संकलक में "@ 0x0002" क्या है ?


14
मुझे लगता है कि चर को एक विशिष्ट पते पर रखना एक संकलक विस्तार है।
यूजीन श।

2
सवाल #mplab टैग को लाभ दे सकता है, क्योंकि यह पता चला है कि यह Mplab- विशिष्ट है।
सिल्वेनुलग

बस इसे पाने के लिए: क्या इस साइट पर यह विषय है? मुझे लगता है कि यह एसओ का है। या यहां माइक्रो कंट्रोलर प्रोग्रामिंग के लिए पूछना ठीक है। इससे यह थोड़ा अस्पष्ट हो जाएगा कि यह प्रश्न कहां होना चाहिए।
गुडबाय एसई

6
@KamiKaze मैं यहां किन विषयों के बारे में पूछ सकता हूं? विषय के रूप में "नंगे-धातु या आरटीओएस अनुप्रयोगों के लिए फर्मवेयर का लेखन", और ऑफ टॉपिक के रूप में "पीसी के लिए प्रोग्रामिंग सॉफ्टवेयर" सूचीबद्ध करता है। चूंकि यह एम्बेडेड सिस्टम प्रोग्रामिंग के बारे में प्रतीत होता है, यह विषय पर एक नज़र में दिखाई देगा। यह स्टैक ओवरफ्लो के विषय पर भी हो सकता है, अपने आप ही इसे विषय से अलग नहीं करता है।
एक सीवीएन

@KamiKaze पूछने के लिए धन्यवाद, मेरे पास इसी तरह के प्रश्न थे (मैं इस एसई का नियमित उपयोगकर्ता नहीं हूं)
GPPK

जवाबों:


20

यह वैरिएबल को रखने के लिए एक निरपेक्ष पता निर्दिष्ट करना है।
से XC8 संकलक मैनुअल पेज 27, खंड 2.5.2 निरपेक्ष को संबोधित करते :

चर और कार्यों को __at()निर्माण का उपयोग करके एक पूर्ण पते पर रखा जा सकता है
......
2.5.2.2 प्रसार
8-बिट संकलक ने एक पूर्ण पते को निर्दिष्ट करने के लिए एक @ प्रतीक का उपयोग किया है


6

@सी भाषा का एक सामान्य गैर-मानक विस्तार है जो आपको एक विशिष्ट पते पर एक चर घोषित करने की अनुमति देता है। इसका उपयोग मेमोरी-मैप्ड हार्डवेयर रजिस्टरों आदि के लिए किया जा सकता है। उस स्थिति में वैरिएबल भी घोषित किया जाना चाहिए volatile, इसलिए आपका उदाहरण गलत है।

अन्य संकलक कुछ का उपयोग करते हैं जैसे __attribute__(section...या #pragma ..., यह सभी गैर-मानक सी।

एकमात्र तर्कसंगत कारण (यदि कोई हो), उपकरण श्रृंखलाएं ऐसा क्यों करती हैं, तो भद्दे डीबगर्स पर रजिस्टर डीबगिंग को सक्षम करना है। गैर-मानक सिंटैक्स यह सुनिश्चित करेगा कि रजिस्टर लिंकर आउटपुट और डीबग जानकारी का हिस्सा बन जाए। जो बदले में आपको भद्दे डिबगर में रजिस्टर को देखने की अनुमति देता है जैसे आप किसी अन्य चर को देख सकते हैं।

यदि आपके पास एक अच्छा डिबगर है, तो इसमें आपके विशिष्ट MCU का समर्थन और जागरूकता होगी। फिर आपको सी कोड में गैर-मानक बकवास की आवश्यकता नहीं है, लेकिन आप इसके बजाय शुद्ध, पोर्टेबल मानक सी लिख सकते हैं:

#define serv_ctr ( *(volatile uint8_t*)0x0002u )

1
जबकि कंपाइलर्स को बाद के फॉर्म को स्वीकार करने की आवश्यकता होती है, कार्यान्वयन को किसी भी तरह से पते के लिए संख्याओं को मैप करने की अनुमति दी जाती है, जिसमें वे फिट होते हैं। इसके अलावा, अधिकांश संकलक मैंने @कई मेमोरी स्पेस या अन्य मुद्दों के साथ नोटेशन टारगेट प्लेटफॉर्म का उपयोग किया है ताकि @नोटेशन का उपयोग करते हुए घोषित की गई अधिकांश चीजें बिना एक्सटेंशन के किए जा सकने वाली किसी भी चीज़ से अलग व्यवहार करें।
सुपरकैट

1

एक छोटा विस्तार:

यह अब xc8 2.0 और उसके बाद से काम नहीं कर रहा है। अब आपको लिखना होगा:

unsigned char serv_ctr __at(0x0002);

serv_ctrएक पूर्ण पते पर एक चर ( ) लगाने के लिए ( 0x0002)।

XC8 2.0 के साथ @सिंटैक्स का उपयोग करके अपने पुराने कोड को संकलित करना संभव है यदि आप "C90" प्रारूप का उपयोग करने के लिए संकलक सेटिंग्स सेट करते हैं। सेटिंग इस तरह दिखती है, यह "XC8 ग्लोबल ऑप्शंस" के तहत है और इसे "C मानक" कहा जाता है।


कई अन्य एम्बेडेड सिस्टम कंपाइलर @सिंटैक्स का समर्थन करते हैं , हालांकि, सिर्फ Mplab नहीं।
लंडिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.