Arduino बूटलोडर विवरण


11

क्या कोई यह बता सकता है कि Arduino बूटलोडर कैसे काम करता है? मैं यहाँ एक उच्च स्तरीय उत्तर की तलाश नहीं कर रहा हूँ, मैंने कोड पढ़ा है और मुझे इसका पता चल गया है। मैंने इस अन्य पोस्ट के माध्यम से भी पढ़ा है (मैं भी उत्तरदाताओं में से एक रहा था)।

प्रोटोकॉल इंटरेक्शन का एक गुच्छा है जो Arduino IDE और बूटलोडर कोड के बीच होता है, जिसके परिणामस्वरूप अंततः इनलाइन असेंबली निर्देशों की एक संख्या होती है जो कि प्रोग्राम को सीरियल इंटरफ़ेस पर प्रसारित होने के साथ फ्लैश को स्व-प्रोग्राम करता है।

मैं स्पष्ट नहीं हूँ जो लाइन 270 पर है:

void (*app_start)(void) = 0x0000; 

... जिसे मैं फ़ंक्शन पॉइंटर की घोषणा के रूप में पहचानता हूं, और NULL को आरंभ करता हूं। उन जगहों पर app_start के लिए बाद में कॉल होते हैं जहां बूटलोडर को उपयोगकर्ता-लोड किए गए कोड के निष्पादन के लिए सौंपना है।

निश्चित रूप से, किसी app_startको इसके लिए कुछ बिंदु पर गैर-पूर्ण मूल्य प्राप्त करने की आवश्यकता है ताकि सभी एक साथ आ सकें। मैं बूटलोडर कोड में नहीं देख रहा हूं ... क्या यह प्रोग्राम द्वारा जादुई रूप से जुड़ा हुआ है जो बूटलोडर द्वारा लोड हो जाता है? मुझे लगता है कि बूटलोडर का मुख्य चिप के रीसेट के बाद सॉफ्टवेयर में प्रवेश बिंदु है।

70 या विधानसभा की लाइनों में लिपटे गुप्त डिकोडर की अंगूठी होनी चाहिए जो मुख्य कार्यक्रम को बताती है जहां app_start वास्तव में है? या शायद यह कुछ निहितार्थ है कि Arduino IDE द्वारा लाभ उठाया जा रहा है? मुझे बस इतना पता है कि अगर कोई व्यक्ति 0 के अलावा कहीं और जाने के लिए app_start नहीं बदलता है, तो बूटलोडर कोड हमेशा के लिए अपने आप ही घूम जाएगा ... तो क्या चाल है?

एक अलग नोट पर, क्या बूटलोडर कोड के लिए इंटरप्ट पर भरोसा करना संभव होगा या यह कि नहीं-नहीं?

संपादित करें

मैं बूटलोडर को टिनी AVR (विशेषकर ATTiny44A) में पोर्ट करने की कोशिश कर रहा हूं जिसमें बूट लोडर कोड के लिए अलग मेमोरी स्पेस नहीं है। जैसा कि यह मेरे लिए स्पष्ट हो गया है कि बूटलोडर कोड कुछ फ़्यूज़ सेटिंग्स और चिप समर्थन पर निर्भर करता है, मुझे लगता है कि मैं वास्तव में क्या जानने में दिलचस्पी रखता हूं, यह बूटलोडर को एक चिप में पोर्ट करने में ले जाता है जिसमें उन फ़्यूज़ और हार्डवेयर नहीं होते हैं समर्थन (लेकिन अभी भी स्व-प्रोग्रामिंग क्षमता है)?

मैं सोच रहा था कि मैं एवीआर 307 के कार्यान्वयन का उपयोग यूएसआई को आधे-डुप्लेक्स यूएआरटी के रूप में उपयोग करने के लिए कर सकता हूं (टिमर0 इंटरप्ट और पिन-चेंज इंटरप्ट का उपयोग करता है)। क्या कोई इस बात के बारे में मार्गदर्शन दे सकता है कि बूटलोडर के लिए हार्डवेयर सपोर्ट न रखने वाली चिप के लिए बूटलोडर कोड लिखने / पोर्ट करने के बारे में कैसे जाना जाता है?

मुझे लगता है कि मैं अपना बूट लोडर कोड पता स्थान के लिए सामान्य स्थान पर रखूंगा (उदाहरण 0x029e या जहां भी संकलक डालता है)। फिर मैं इसे ऐसा बनाऊंगा कि बूटलोडर कोड में 'पता' ने एक ऑफसेट जोड़ा जिसने मुझे मुख्य के पिछले हिस्से में डाल दिया, और उस पते पर 'app_start' सेट कर दिया। क्या मैं इस बारे में सही ढंग से सोच रहा हूं या मैं पूरी तरह से कुछ याद कर रहा हूं? धन्यवाद!

EDIT 2

FWIW, मुझे एक ATTiny85 पर Arduino स्केच लोड करने के लिए एक प्रलेखित प्रक्रिया मिली , जो कि मैं मूल रूप से इस प्रश्न के साथ जा रहा था ... बहुत साफ-सुथरा मुझे लगता है


1
stackoverflow.com/questions/3652233/arduino-bootloader/… सोच रहा था कि मेरा जवाब कहाँ गया ...
Nick T

जवाबों:


12
void (*app_start)(void) = 0x0000; 

यह एक पूर्ण सूचक नहीं है। यह वास्तव में एप्लिकेशन कोड की शुरुआत का पता है, जिसे बूटलोडर कूदता है। Linker आपके एप्लिकेशन कोड को पते पर शुरू करने की व्यवस्था करता है। ATMEGA168 डेटशीट में तालिका 26-6 देखें।

बूटलोडर कोड फ्लैश में उच्च शुरू होता है। वास्तव में जहां बूटलोडर फ़्यूज़ पर निर्भर करता है।


बूटलोडर मुख्य कोड कहां रहता है ...
vicatcu

1
@ जॉबी, आह ठीक है ... मेरे सवाल का अपडेट देखें - मैं बूटलोडर को टिनी एवीआर में पोर्ट करने की कोशिश कर रहा हूं जिसमें बूट लोडर कोड के लिए अलग मेमोरी स्पेस नहीं है।
vicatcu 15

1
@ जॉबी, इसलिए बूटलोडर कोड "पर निर्भर करता है" ... बूट रीसेट फ़्यूज़ को प्रोग्राम किया जा सकता है, ताकि रीसेट वेक्टर रीसेट के बाद बूट फ्लैश स्टार्ट पते पर इंगित हो। इस मामले में, रीसेट के बाद बूट लोडर शुरू किया जाता है। "
विक्टास्कू

3
क्या आप विशेष रूप से Arduino बूटलोडर चाहते थे? यह STK500 प्रोग्रामर का अनुकरण करता है और जैसे कुछ भारी है। बूटलोडर्स dir में एक atmega8 संस्करण है जो gcc-3 के साथ 1K के तहत संकलित करता है, लेकिन यहां तक ​​कि यह आपको उपलब्ध फ्लैश पर काफी कम छोड़ देगा।
पीटर गिब्सन

3
क्या आप वास्तव में एक बूट लोडर भी चाहते हैं? निश्चित रूप से एक ATTiny के लिए यह ICSP प्रोग्रामर (जैसे usbTinyISP) का उपयोग करके डिवाइस को प्रोग्राम करने के आपके प्रयास के लायक है
SingleNegationElimination
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.