2012-02-10 15 views
18

अतीत में, मैंने 8 बिट एवीआर और एमएसपी 430 के साथ बहुत कुछ काम किया है जहां रैम और फ्लैश दोनों चिप पर सीधे संग्रहीत किए गए थे। जब आप अपने प्रोग्राम को संकलित और डाउनलोड करते हैं, तो यह "बस काम करता है" की तरह है और आपको इस बारे में चिंता करने की आवश्यकता नहीं है कि वास्तव में कहां और कैसे चर संग्रहीत किए जाते हैं।माइक्रोकंट्रोलर पर बाहरी मेमोरी का उपयोग कैसे करें

अब मैं एक प्रोजेक्ट शुरू कर रहा हूं जहां मैं कुछ बाहरी मेमोरी को माइक्रोकंट्रोलर (एक टीआई स्टालेरिस एलएम 3 एस 9 डी 9 2) में जोड़ने में सक्षम होना चाहता हूं, लेकिन मुझे पूरा यकीन नहीं है कि आप अपना कोड कैसे उपयोग करते हैं बाहरी राम मैं देख सकता हूं कि आप बाहरी बस को किसी अन्य परिधीय की तरह कैसे कॉन्फ़िगर करते हैं लेकिन मुझे क्या भ्रमित करता है यह है कि कैसे प्रोसेसर बाहरी स्मृति से बात करने और आंतरिक से बात करने के लिए ट्रैक करता है।

जो मैं बता सकता हूं, बाहरी रैम को उसी एसआरएएम (आंतरिक 0x20000000 पर शुरू होता है और 0x60000000 पर बाहरी शुरू होता है) के समान पता स्थान पर मैप किया जाता है। इसका मतलब यह है कि अगर मैं कुछ इस तरह लिखा है:

int* x= 0x20000000; 
int* y= 0x60000000; 

x और y पहले 4 बाइट्स क्रमशः आंतरिक और बाहरी रैम (32 बिट ints कल्पना करते हुए) को इंगित होता होगा? यदि हां, तो क्या हुआ अगर मैं कुछ इस तरह था: मैं यह सब गलत है और हार्डवेयर है

int x[999999999999]; //some super big array that uses all the internal ram 
int y[999999999999]; //this would have to be in external ram or it wouldn't fit 

मैं कल्पना है कि मैं जहां स्मृति के प्रत्येक प्रकार है या कर की सीमाओं के बारे में कुछ बताने के लिए आवश्यकता होगी अपने आप इसे आंकड़े बताते हैं? क्या लिंकर स्क्रिप्ट इस से निपटते हैं? मुझे पता है कि उनके पास मेमोरी मैपिंग के साथ कुछ करना है लेकिन मुझे नहीं पता कि वास्तव में क्या है। एआरएम क्रॉस कंपाइलर को कैसे सेट अप करने के बारे में पढ़ने के बाद मुझे यह महसूस हो रहा है कि दृश्यों के पीछे Winavr (avr-gcc) मेरे लिए बहुत सारी चीज़ें कर रहा था, इसलिए मुझे इससे निपटना नहीं होगा।

थोड़ी देर के लिए खेद है, लेकिन अगर कोई मुझे बता सकता है कि मैं इस सामान के साथ सही रास्ते पर हूं तो मैं वास्तव में इसकी सराहना करता हूं।

अद्यतन

भविष्य के किसी भी पाठकों को मैं http://www.bravegnu.org/gnu-eprog/index.html googling के एक और कुछ घंटों के बाद यह पाया है। यहां उत्तरों के साथ संयुक्त ने मुझे बहुत मदद की।

+0

आप http://electronics.stackexchange.com/ पर पूछना चाहेंगे। आप [तारकीय डेटा शीट] (http://www.ti.com/lit/ds/spms257a/spms257a.pdf) को भी देखना चाहते हैं। –

उत्तर

11

आम तौर पर यह बिल्कुल काम करता है। आपको हार्डवेयर को ठीक से सेटअप करना होगा और/या हार्डवेयर में पहले से ही निश्चित पतों पर हार्डकोड की चीजें हो सकती हैं।

आप एक ही सवाल पूछ सकते हैं, हार्डवेयर कैसे जानता है कि जब मैं 0x21000010 को संबोधित करने के लिए बाइट लिखता हूं (मैंने अभी इसे बनाया है) कि यह यूआरटी ट्रांसमिट होल्डिंग रजिस्टर है और लिखने का मतलब है कि मैं एक बाइट भेजना चाहता हूं यूआर्ट बाहर? जवाब क्योंकि यह इस तरह तर्क में हार्डकोड किया गया है। या तर्क में ऑफसेट हो सकता है, यूआर्ट इसे स्थानांतरित करने में सक्षम हो सकता है, यह किसी अन्य नियंत्रण रजिस्टर सामग्री और 0x10 पर हो सकता है। उस नियंत्रण रजिस्टर को बदलें (जिसमें स्वयं कुछ हार्डकोडेड पता है) 0x21000000 से 0x90000000 तक और फिर 0x90000010 पर लिखें और दूसरा बाइट यूर्ट से बाहर हो जाता है।

मुझे उस विशेष भाग को देखना होगा, लेकिन यदि यह बाहरी स्मृति का समर्थन करता है, तो सिद्धांत में आपको केवल यह पता होना चाहिए कि प्रोसेसर एड्रेस स्पेस में कौन से पते उस बाहरी मेमोरी में मैप किए गए हैं और पढ़ते हैं और लिखते हैं बाहरी मेमोरी का उपयोग करेगा।

इंटेल आधारित कंप्यूटर, पीसी, एक बड़े फ्लैट पता स्थान की तरह हैं, अपने लिनक्स बॉक्स पर lspci कमांड का उपयोग करें (यदि आपके पास कोई है) या कुछ अन्य कमांड यदि विंडोज या मैक, और आप पाएंगे कि आपका वीडियो कार्ड को पता स्थान का एक हिस्सा दिया गया है।यदि आप सीपीयू/ऑपरेटिंग सिस्टम की सुरक्षा से गुज़रते हैं और उस जगह के पते पर लिखना चाहते हैं तो यह प्रोसेसर को पीसीआई नियंत्रकों के माध्यम से और वीडियो कार्ड में ले जाएगा, या तो कहर पैदा हो सकता है या शायद सिर्फ रंग का रंग बदल रहा है पिक्सेल। आपने पहले से ही अपने एवीआर और एमएसपी 430 के साथ इसका सामना किया है। पता स्थान में कुछ पते फ़्लैश हैं, और कुछ राम हैं, सीपीयू कोर के बाहर कुछ तर्क है जो सीपीयू कोर पता बस को देखता है और उस पहुंच को कहां भेज सकता है पर निर्णय लेता है। अब तक कि फ्लैश बैंक और रैम बैंक और तर्क सभी चिप के सीमाओं के भीतर निहित हैं, यह एक खिंचाव से बहुत दूर नहीं है कि तर्क किसी पते पर प्रतिक्रिया देता है, और इससे बाहरी मेमोरी चक्र बनता है, जब यह होता है किया गया या नतीजा वापस पढ़ने पर आता है यह आंतरिक मेमोरी चक्र को पूरा करता है और आप अगली चीज़ पर जाते हैं।

क्या इससे कोई समझ आती है या क्या मैं इसे और खराब कर रहा हूं?

+0

यह मेरे लिए सही मायने रखता है, एक चीज जो मुझे अभी भी नहीं मिलती है: क्या मुझे सी में बाहरी/आंतरिक रैम में चर आवंटित करने की आवश्यकता होगी? मैं उम्मीद नहीं करता कि स्टैक आंतरिक/बाहरी सीमा को कूदने के लिए पर्याप्त स्मार्ट हो, लेकिन अगर मैं वैश्विक चर का एक टन घोषित करता हूं तो क्या होगा? क्या ऐसा कुछ कहने का कोई तरीका है जैसे "यह वैरिएबल आंतरिक रैम में रखता है अगर यह फिट बैठता है, अन्यथा, इसे बाहरी राम पर लाइव बनाते हैं"? – nightrain

+0

उन प्रकार के प्रश्न बाहरी मेमोरी के लिए विशिष्ट नहीं हैं, आपको अपनी याददाश्त का प्रबंधन करना होगा चाहे आप किस प्लेटफॉर्म पर हों। आपको उस स्मृति में जो कुछ भी रखना है, उसे रखने के लिए आपको लिंकर पर नियंत्रण लेने की आवश्यकता होगी। एक एम्बेडेड सिस्टम पर चलना आपको अपने ढेर और ढेर को प्रबंधित करना है यदि आप बीमा का उपयोग करने के लिए किसी का उपयोग नहीं करते हैं। ग्लोबल्स के टन ऐसा करने का एक सुरक्षित तरीका है लेकिन आवश्यक रूप से मेमोरी कुशल नहीं है। –

+1

gnu/gcc टूल्स के लिए एक लिंकर स्क्रिप्ट है जिसे आपने लिखा है या इसे कहीं कंपाइलर में दफनाया गया है और शायद आपके द्वारा चुने गए प्रोसेसर या सिस्टम प्रकार के आधार पर एक स्क्रिप्ट चुना गया है। आप उस पर ओवरराइड कर सकते हैं और अपना खुद का उपयोग कर सकते हैं। Gnu/gcc लिंकर स्क्रिप्ट कॉन्फ़िगर करने योग्य और शक्तिशाली होते हैं जो वे बनाने और उपयोग करने के लिए दर्दनाक हो सकते हैं, आप प्रत्येक फ़ाइल के लिए स्थान को ट्यून कर सकते हैं, यहां तक ​​कि फ़ंक्शंस या वेरिएबल तक भी। आम तौर पर आप सबसे तेज़ स्मृति में अपना ढेर चाहते हैं। –

0

आप आरक्षित शब्द रजिस्टर का उपयोग संकलक को सुझाव देने के लिए कर सकते हैं कि यह उस चर को आंतरिक मेमोरी स्थान में रखे: int int inInside; सावधानी बरतें; संकलक जानता है कि रजिस्टर स्टोरेज के कितने बाइट उपलब्ध हैं, और जब सभी उपलब्ध स्थान चले गए हैं तो इससे कोई फर्क नहीं पड़ता।

केवल उन चीजों के लिए रजिस्टर चर का उपयोग करें जो काउंटर जैसे बहुत बार उपयोग किए जा रहे हैं।

+0

'आंतरिक रैम' का मतलब CPU रजिस्टर्स नहीं है। इसके अलावा ओपी अत्यंत विपरीत करना चाहता है: बाहरी मेमोरी का उपयोग करें (μC से अलग चिप) –

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