2010-11-01 20 views
19

RealView एआरएम सी संकलक supports चर विशेषता at(address) का उपयोग कर एक दिया स्मृति पते पर एक चर रखने स्मृति में दिए गए पूर्ण पते पर एक चर जगह:कैसे (जीसीसी) के साथ

int var __attribute__((at(0x40001000))); 
var = 4; // changes the memory located at 0x40001000 

जीसीसी एक है समान परिवर्तनीय विशेषता?

+1

मैंने एक [लेख] (http://a3f.at/articles/register-syntax-sugar) लिखा, जहां मैं ऐसा करने के साधनों का आकलन करता हूं। कुछ के लिए उपयोगी हो सकता है। रचनात्मकता के लिए – a3f

उत्तर

18

मुझे पता नहीं है, लेकिन आप आसानी से इस तरह एक समाधान बना सकते हैं:

int *var = (int*)0x40001000; 
*var = 4; 

यह बिल्कुल एक ही बात नहीं है, लेकिन ज्यादातर स्थितियों में एक आदर्श विकल्प। यह किसी भी कंपाइलर के साथ काम करेगा, न केवल जीसीसी।

यदि आप जीसीसी का उपयोग करते हैं, तो मुझे लगता है कि आप GNU ld का उपयोग भी करते हैं (हालांकि यह निश्चित रूप से निश्चित नहीं है) और एलडी में wherever you want them चर रखने के लिए समर्थन है।

मुझे लगता है कि लिंकर को यह काम करना बहुत आम है।

@rib द्वारा उत्तर से प्रेरित, मैं जोड़ दूंगा कि यदि पूर्ण पता कुछ नियंत्रण रजिस्टर के लिए है, तो मैं सूचक परिभाषा में volatile जोड़ दूंगा। अगर यह सिर्फ राम है, इससे कोई फर्क नहीं पड़ता।

जीएनयू जीसीसी संकलक के साथ

आप निरपेक्ष मेमोरी स्थानों तक पहुँचने के लिए केवल सूचक परिभाषाओं का उपयोग हो सकता है:

+0

+1। यह वास्तव में काम नहीं करता है, लेकिन यह वास्तव में व्यावहारिक लगता है, साथ ही साथ पोर्टेबल (इस अर्थ में कि यह सभी कंपाइलरों के लिए काम करना चाहिए)। – falstro

+1

@roe: यह निश्चित मेमोरी मैप किए गए नियंत्रण रजिस्टरों के साथ हार्डवेयर के लिए डिवाइस ड्राइवरों में उपयोग करने योग्य एक मानक मानक चाल है। मानक उपयोगकर्ता एप्लिकेशन में, इसमें कोई उपयोगिता नहीं है जिसे मैं सोच सकता हूं। – JeremyP

+0

@ जेरेमीपी, एम्बेडेड डिवाइसों में, खासकर जिनके पास एमएमयू नहीं है, "उपयोगकर्ता अनुप्रयोग" हार्डवेयर को हिट करने के लिए यह बहुत आम है। –

8

आप section attributes और एक ld linker script का उपयोग उस अनुभाग के वांछित पते परिभाषित करने के लिए कर सकता है। यह शायद आपके विकल्पों की तुलना में गड़बड़ है, लेकिन यह एक विकल्प है।

+3

ध्यान दें कि यह दृष्टिकोण वैरिएबल के लिए वास्तव में आरक्षित * स्थान होगा, यह मानने के बजाय कि यह निर्दिष्ट पते पर मौजूद है। कई मामलों में, यह वही है जो आप चाहते हैं। – larskholte

+0

अनुभाग विशेषताओं के लिए एक और सीधा लिंक: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#Common-Variable- "अनुभाग" – Ponkadoodle

0
extern const uint8_t dev_serial[12]; 
    asm(".equ dev_serial, 0x1FFFF7E8"); 
/* or asm("dev_serial = 0x1FFFF7E8"); */ 
    ... 

    for (i = 0 ; i < sizeof(dev_serial); i++) 
     printf((char *)"%02x ", dev_serial[i]); 
+0

के लिए गुण और ctrl + f यह क्या जोड़ता है मौजूदा उत्तरों के लिए? – OrangeDog

+0

हालांकि यह कोड स्निपेट प्रश्न हल कर सकता है, [एक स्पष्टीकरण सहित] (https://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) वास्तव में आपकी पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और वे लोग आपके कोड सुझाव के कारणों को नहीं जानते हैं। स्पष्टीकरण टिप्पणियों के साथ अपने कोड को भीड़ न करने का प्रयास करें, इससे कोड और स्पष्टीकरण दोनों की पठनीयता कम हो जाती है! –