बाहरी रैम से चलाने के लिए कोड संकलन


13

मैं PIC18F85J5 पर आधारित एक न्यूनतम गेम प्रणाली के लिए डिजाइनों पर विचार कर रहा हूं। मेरे डिजाइन का हिस्सा यह है कि चिप को रीप्रोग्राम किए बिना या प्रोग्राम मेमोरी को फ्लैश किए बिना गेम को एसडी कार्ड से लोड किया जा सकता है। मैंने उस चिप को चुना क्योंकि इसमें एक बाहरी मेमोरी इंटरफ़ेस है जो मुझे बाहरी SRAM से कोड चलाने की अनुमति देगा।

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

आंतरिक कार्यक्रम मेमोरी में ग्राफिक्स, नियंत्रक इनपुट और अन्य विभिन्न उपयोगिताओं के लिए विभिन्न पुस्तकालय भी होंगे।

मुझे पूरा विश्वास है कि मुझे पता है कि आंतरिक फर्मवेयर भागों को कैसे ठीक करना है। समस्या बाहरी रैम से चलाने के लिए प्रोग्राम बना रही है। यह एक नियमित तस्वीर को लक्षित करने के समान नहीं है, और इसे उन लाइब्रेरी फ़ंक्शंस के बारे में पता होना चाहिए जो आंतरिक मेमोरी में उपलब्ध हैं, लेकिन उन्हें recompile नहीं, केवल उनसे लिंक करें। इसे आंतरिक फ्लैश के 32k के बाद पतों का उपयोग शुरू करने की आवश्यकता है, शून्य पर नहीं। क्या इन प्रकार की बाधाओं का उपयोग करके एक कार्यक्रम संकलित करने का एक अच्छा तरीका है?

मैं MPLab IDE का उपयोग कर रहा हूं, लेकिन मैं इसके बारे में सुपर परिचित नहीं हूं, या इस तरह के अनुकूलन कैसे करें।


सबसे अच्छे प्रश्नों में से एक मैंने यहाँ थोड़ी देर में देखा है ... मैं विचारों और उत्तरों को सुनने के लिए उत्सुक हूं।
जॉन एल

कुछ रोचक वैकल्पिक तरीकों में चर्चा कर रहे हैं electronics.stackexchange.com/questions/5386/...
टोबी Jaffey

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

जवाबों:


8

आपके दो अलग-अलग मुद्दे हैं:

  1. बाहरी रैम एड्रेस रेंज के लिए कोड का निर्माण।

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

    आधार कोड बाहरी मेमोरी में एक नए ऐप को लोड करने के बाद, इसे कैसे निष्पादित करना है, यह जानना होगा। सबसे आसान बात शायद पहले बाहरी रैम स्थान पर निष्पादन शुरू करना है। इसका अर्थ है कि आपके कोड को उस पूर्ण प्रारंभ पते पर एक CODE अनुभाग की आवश्यकता होगी। इसमें बाकी कोड में एक GOTO से लेकर सही लेबल शामिल है, जो सभी को स्थानांतरित कर देगा।

  2. आधार कोड में ऐप्स को लाइब्रेरी रूटीन से जोड़ना।

    मौजूदा माइक्रोचिप उपकरणों के साथ ऐसा करने का कोई तुरंत सरल तरीका नहीं है, लेकिन यह उतना बुरा भी नहीं है।

    एक बड़ा मुद्दा यह है कि आप आधार कोड परिवर्तनों से कैसे निपटना चाहते हैं। सरलीकृत रणनीति अपने आधार कोड का निर्माण करना है, वैश्विक पतों की कटाई करने के लिए परिणामी मैप फ़ाइल पर एक कार्यक्रम चलाना है, तो क्या इसने विश्व स्तर पर परिभाषित सभी प्रतीकों के लिए EQU बयानों के साथ एक आयात फ़ाइल लिखी है। यह आयात फ़ाइल तब सभी ऐप कोड में शामिल होगी। लिंक करने के लिए कुछ भी नहीं है, क्योंकि ऐप सोर्स कोड अनिवार्य रूप से आधार कोड प्रविष्टि बिंदुओं के लिए निर्धारित पते के संदर्भ हैं।

    यह करना आसान है और काम करेगा, लेकिन विचार करें कि जब आप आधार कोड बदलते हैं तो क्या होता है। यहां तक ​​कि एक मामूली बग फिक्स के कारण सभी पते घूम सकते हैं, और फिर सभी मौजूदा ऐप कोड अच्छे नहीं होंगे और उन्हें फिर से बनाना होगा। यदि आप सभी ऐप्स को अपडेट किए बिना आधार कोड अपडेट प्रदान करने की कभी योजना नहीं बनाते हैं, तो शायद आप इससे दूर हो सकते हैं, लेकिन मुझे लगता है कि यह एक बुरा विचार है।

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

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

    मेरा प्रीप्रोसेसर और अन्य संबंधित सामान का एक गुच्छा www.embedinc.com/pic/dload.htm पर मुफ्त में उपलब्ध है ।


मुझे निश्चित रूप से एक निश्चित कूद तालिका का विचार पसंद है। मैं बस फ्लैश मेमोरी के अंत से शुरू कर सकता हूं और प्रत्येक सिस्टम कॉल के लिए स्थान निर्धारित कर सकता हूं। मैं भी शायद सभी सबरूटीन्स के पते के साथ मैन्युअल रूप से बनाए गए हेडर फ़ाइल के साथ दूर हो सकता हूं अगर मैं आपके द्वारा वर्णित सभी प्रीप्रोसेसर वूडू का पता नहीं लगा सकता।
कैप्टनक्रिग

5

विकल्प 1: व्याख्या की गई भाषाएँ

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

उदाहरण के लिए, एलुआ परियोजना कम-संसाधन (64 kB RAM) की व्याख्या की गई भाषा का एक उदाहरण है। यदि आप कुछ सुविधाएँ निकालते हैं, तो आप इसे 32k RAM तक निचोड़ सकते हैं (नोट: यह आपके वर्तमान प्रोसेसर पर काम नहीं करेगा, जो कि 8-बिट आर्किटेक्चर है। बाहरी रैम का उपयोग करना संभवतः ग्राफिक्स के लिए बहुत धीमा होगा)। यह एक तेज़, लचीली भाषा प्रदान करता है जिसमें नए उपयोगकर्ता आसानी से गेम खेल सकते हैं यदि आप न्यूनतम एपीआई प्रदान करते हैं। ऑनलाइन भाषा के लिए बहुत सारे दस्तावेज उपलब्ध हैं। अन्य भाषाएँ (जैसे कि फोर्थ और बेसिक) हैं, जिनका उपयोग आप इसी तरह से कर सकते हैं, लेकिन मुझे लगता है कि इस समय लुआ सबसे अच्छा विकल्प है।

एक समान नस में, आप अपनी खुद की डोमेन-विशिष्ट भाषा बना सकते हैं। आपको अधिक पूर्ण एपीआई और बाहरी प्रलेखन प्रदान करना होगा, लेकिन अगर खेल सभी समान थे, तो यह बहुत मुश्किल नहीं होगा।

किसी भी स्थिति में, PIC18 शायद ऐसा प्रोसेसर नहीं है जिसे मैं किसी ऐसी चीज के लिए उपयोग करूंगा जिसमें कस्टम प्रोग्रामिंग / स्क्रिप्टिंग और ग्राफिक्स शामिल हैं। आप प्रोसेसर के इस वर्ग से परिचित हो सकते हैं, लेकिन मेरा सुझाव है कि डिस्प्ले ड्राइवर और अधिक मेमोरी के साथ कुछ का उपयोग करने का यह एक अच्छा समय होगा।

विकल्प 2: बस पूरी बात को दोहराएं

यदि, हालांकि, आप पहले से ही सभी गेमों को सी में प्रोग्रामिंग करने की योजना बना रहे हैं, तो एसडी कार्ड से सिर्फ गेम लॉजिक लोड करने से परेशान न हों । आपके पास फ्लैश को रीप्रोग्राम करने के लिए सिर्फ 32kB है, और इसके लिए आसानी से 4 जीबी माइक्रोएसडी कार्ड प्राप्त कर सकते हैं। (ध्यान दें: बड़े कार्ड अक्सर एसडीएचसी होते हैं, जिनके साथ इंटरफेस करना कठिन होता है)। यह मानते हुए कि आप अपने 32 kB के हर अंतिम बाइट का उपयोग करते हैं, जो एसडी कार्ड पर 131,072 प्रतियों के लिए आपके फर्मवेयर की जो भी गेम लॉजिक की जरूरत है, उसके लिए कमरा छोड़ देता है।

AN851 की तरह PICs के लिए बूटलोडर लिखने के लिए बहुत सारे अपॉइंटमेंट हैं । आपको अपने बूटलोडर को मेमोरी के एक विशिष्ट क्षेत्र (शायद मेमोरी क्षेत्र के शीर्ष, आप इसे लिंकर में निर्दिष्ट करेंगे) पर कब्जा करने के लिए डिज़ाइन करने की आवश्यकता होगी, और निर्दिष्ट करें कि पूर्ण फर्मवेयर प्रोजेक्ट इस क्षेत्र तक नहीं पहुंचते हैं। एपनोट इसे और अधिक विस्तार से बताता है। बस "बूट अनुभाग मैं PIC18F452 के बूट" को "बूट अनुभाग मैं लिंकर में निर्दिष्ट करता हूं" के साथ बदलें और यह सभी समझ में आएगा।

फिर, आपके बूटलोडर को उपयोगकर्ता को एसडी कार्ड से चलने के लिए एक प्रोग्राम का चयन करने की अनुमति देने की आवश्यकता है, और पूरी चीज़ की प्रतिलिपि बनाएँ। एक यूआई हो सकता है कि उपयोगकर्ता को चयन मोड में प्रवेश करने के लिए एक पुश बटन दबाए रखना होगा। आमतौर पर, बूटलोडर बस रीसेट पर इस बटन की स्थिति की जांच करेगा, और, अगर यह नीचे आयोजित नहीं किया जा रहा है, तो खेल में बूट करें। यदि इसे नीचे रखा जाता है, तो उपयोगकर्ता को एसडी कार्ड पर फ़ाइल चुनने, प्रोग्राम को कॉपी करने और [नए] गेम में बूट करना जारी रखने की अनुमति देनी होगी।

यह मेरी वर्तमान सिफारिश है।

विकल्प 3: गहरी जादू जिसमें हेक्स फ़ाइल का केवल एक भाग होता है

आपके प्रचलित तंत्र के साथ परेशानी यह है कि प्रोसेसर एपीआई और फ़ंक्शन कॉल के साथ सौदा नहीं करता है, यह संख्याओं के साथ काम करता है - वे पते जिनसे अनुदेश सूचक कूद सकता है और उम्मीद करता है कि कोड हो सकता है जो एपीआई युक्ति के अनुसार फ़ंक्शन कॉल निष्पादित करता है। यदि आप प्रोग्राम के सिर्फ एक भाग को संकलित करने का प्रयास करते हैं, तो लिंक करने वाले को पता नहीं चलेगा कि आप कॉल करते हैं check_button_status()या क्या करते हैं toggle_led()। आप जान सकते हैं कि प्रोसेसर पर हेक्स फ़ाइल में वे फ़ंक्शन मौजूद हैं, लेकिन यह ठीक से पता होना चाहिए कि वे किस पते पर रहते हैं।

लिंकर पहले से ही आपके कोड को कई वर्गों में तोड़ देता है; आप सैद्धांतिक रूप से इसे कुछ -sectionऔर #pragmaभस्मों के साथ अतिरिक्त खंडों में तोड़ सकते हैं । मैंने ऐसा कभी नहीं किया है, और न जाने कैसे। जब तक उपरोक्त दो विधियां मुझे विफल नहीं करती (या कोई व्यक्ति यहां एक भयानक उत्तर पोस्ट करता है), मैं शायद इस तंत्र को नहीं सीखूंगा, और इसलिए मैं इसे आपको नहीं सिखा सकता।


नंबर 2 पर मेरी आपत्ति यह है कि फ्लैश मेमोरी में चिप के जीवनकाल में सीमित संख्या में साइकिल होती है। मैं बीफ़ियर mcu का उपयोग नहीं करना चाहता क्योंकि मैं 8-बिट अतिसूक्ष्मवाद के लिए जा रहा हूं।
कैप्टनक्रिग

@ सीएमपी - इसमें कम से कम 10,000 मिटाए गए चक्र हैं। अगर कोई हर दिन एक अलग खेल खेलता है, तो यह वर्ष 2039 तक चलेगा। फ्लैश लगभग निश्चित रूप से बाकी सर्किट को बाहर कर देगा। मुझे नहीं लगता कि आपको इस बारे में चिंतित होने की आवश्यकता है जब तक कि यह एक आर्केड में प्रत्येक दिन दर्जनों बार न खेला जाए।
केविन वर्मियर

1
दूसरा, 8-बिट अतिसूक्ष्मवाद शांत लग सकता है, लेकिन यह प्रोग्रामिंग के लिए बेकार है। यह एक मजबूत माइक्रोकंट्रोलर पाने के लिए बहुत आसान है और इसे रेट्रो बनाने के लिए मजबूर करने की तुलना में इसे देखो, क्योंकि आप अपने प्रोसेसर की सीमा को आगे बढ़ा रहे हैं।
केविन वर्मर

1
दोनों बहुत अच्छे अंक। यहां तक ​​कि अगर कम भाग की गणना के लिए जा रहा है, एक pic32 है कि लागत या बाहरी घटकों से अलग नहीं है, और अगर यह 512K की आंतरिक फ्लैश है तो यह भी जीतता है।
अक्टूबर

ऐसा लगता है कि एक व्यावहारिक समाधान के लिए एक pic32 का उपयोग करना होगा और एक बूटलोडर लिखना एसडी कार्ड से बचना होगा। मेरे पास बूट लोडर और उपयोगकर्ता कोड दोनों के लिए कार्यों का पुन: उपयोग करने में एक कठिन समय होगा, लेकिन जब तक मैं इसे 12k बूट फ्लैश में रखता हूं तब तक इसे उपयोगकर्ता कोड को पूरी चिप देनी चाहिए, और वे स्रोत में जो भी लाइब्रेरी चाहते हैं, उन्हें शामिल कर सकते हैं स्तर।
captncraig
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.