जब कोड बूटलोडर का उपयोग करके अपलोड किया जाता है तो क्या होता है?


13

जब मैं ऑप्टिबूट बूटलोडर का उपयोग करके अपने Arduino Uno को एक नया स्केच अपलोड करता हूं, तो वास्तव में क्या होता है?

  • Arduino को क्या भेजा जाता है?
  • यह कैसे प्रतिक्रिया करता है?
  • "सिंक में नहीं मतलब" क्या है?
  • वैसे भी "सिंक में" क्या है?

नोट: यह एक "संदर्भ प्रश्न" के रूप में है


बहुत ही रोचक पोस्ट! बस एक और सवाल। धारावाहिक संचार (चित्र) का पता लगाने के लिए आप किस सॉफ्टवेयर का उपयोग कर रहे हैं?
जूलियो

यह एक तर्क विश्लेषक का उत्पादन है, जैसे कि Saleae Logic 8. saleae.com बहुत अच्छा थोड़ा विश्लेषक। ~ $ 125, 150 के लिए 24 मेगाहर्ट्ज नमूना दर हुआ करता था। वर्तमान कैप्चर स्पीड 100 और 500 मेगाहर्ट्ज है। > SPI, I2C और अधिक> अधिकांश डिजिटल संचार एक विशेष प्रोटोकॉल का उपयोग करता है जो निर्दिष्ट करता है कि जानकारी कैसे स्थानांतरित की जाती है। लॉजिक सॉफ़्टवेयर में प्रोटोकॉल एनालाइज़र होते हैं जो स्वचालित रूप से SPI, I2C, सीरियल, 1-वायर, CAN, UNI / O, I2S / PCM, MP मोड, मैनचेस्टर, मोडबस, DMX-512, समानांतर, JAGAG, लिन, Atmel SWI को डीकोड कर सकते हैं। MDIO, SWD, LCD HD44780, BiSS C, HDLC, एचडीएमआई CEC, PS / 2, USB 1.1, Midi - या अपना स्वयं का बनाएं
CrossRoads

जवाबों:


21

जब आप ऑप्टिबूट लोडर को चलाने वाले एक यूनो को रीसेट करते हैं, तो बूटलोडर पहले तीन तीन बार पिन फ्लैश करता है।

पिन 13 को फ्लैश किया जा रहा है

शीर्ष रेखा (ग्रे) को Arduino पर भेजा जाता है, मध्य रेखा (नारंगी) को Arduino से भेजा जाता है।

जबकि ऐसा हो रहा है, avrdudeआपके कंप्यूटर पर चल रहा प्रोग्राम डिवाइस को एक क्वेरी भेज रहा है:

STK_GET_SYNC / CRC_EOP  (0x30/0x20)

Arduino पहले "गेट सिंक" को नोटिस नहीं करता है क्योंकि यह फ्लैश चमकाने में व्यस्त है। 13. एक बार जब यह हो जाता है तो "सिंक प्राप्त करें" को नोटिस करता है (यह सीरियल हार्डवेयर द्वारा बफ़र किया जाएगा) और उत्तर देता है:

STK_INSYNC / STK_OK (0x14/0x10)

ऐसा लग रहा है कि एवरड्यूड थोड़ा अधीर हो गया, और समय समाप्त हो गया, क्योंकि यह "सिंक प्राप्त करें" क्वेरी के साथ फिर से कोशिश करता है। इस बार ऑप्टिबूट तुरंत प्रतिक्रिया देता है।


शेष अपलोड अगली छवि में वर्णित है। उदाहरण स्टॉक "ब्लिंक" कार्यक्रम को अपलोड करने का उत्पादन किया।

ऑप्टिबूट अपलोड प्रक्रिया

(एक बड़े वर्जन के लिए ऊपर दिए ईमेज पर क्लिक करें)


कदम हैं:

  • प्रश्न: सिंक करें? उत्तर: सिंक में।
  • प्रश्न: पैरामीटर प्राप्त करें? (प्रमुख संस्करण) उत्तर: संस्करण 4।
  • प्रश्न: पैरामीटर प्राप्त करें? (मामूली संस्करण) उत्तर: संस्करण 4।
  • डिवाइस पैरामीटर सेट करें। निम्नलिखित उपकरण मापदंडों को चिप में भेजा जाता है:

    0x42  // STK_SET_DEVICE
    0x86  // device code
    0x00  // revision
    0x00  // progtype: “0” – Both Parallel/High-voltage and Serial mode
    0x01  // parmode: “1” – Full parallel interface
    0x01  // polling: “1” – Polling may be used
    0x01  // selftimed: “1” – Self timed
    0x01  // lockbytes: Number of Lock bytes.
    0x03  // fusebytes: Number of Fuse bytes
    0xFF  // flashpollval1
    0xFF  // flashpollval2
    0xFF  // eeprompollval1
    0xFF  // eeprompollval2
    0x00  // pagesizehigh
    0x80  // pagesizelow
    0x04  // eepromsizehigh
    0x00  // eepromsizelow
    0x00  // flashsize4
    0x00  // flashsize3
    0x80  // flashsize2
    0x00  // flashsize1
    0x20  // Sync_CRC_EOP

    ऑप्टिबूट उन सभी को अनदेखा करता है और इनकाउंटर / ओके के साथ जवाब देता है । :)

  • विस्तारित डिवाइस पैरामीटर सेट करें:

    0x45  // STK_SET_DEVICE_EXT
    0x05  // commandsize: how many bytes follow
    0x04  // eeprompagesize: EEPROM page size in bytes.
    0xD7  // signalpagel: 
    0xC2  // signalbs2: 
    0x00  // ResetDisable: Defines whether a part has RSTDSBL Fuse 
    0x20  // Sync_CRC_EOP

    ऑप्टिबूट उन सभी को भी अनदेखा करता है और इन सिंक / ओके का जवाब देता है।

  • प्रोग्राम मोड दर्ज करें। उत्तर: सिंक / ओके में।

  • हस्ताक्षर पढ़ें। ऑप्टिबूट 0x1E 0x95 0x0F वास्तव में हस्ताक्षर को पढ़े बिना जवाब देता है ।

  • फ़्यूज़ लिखें (चार बार)। ऑप्टिबूट फ्यूज नहीं लिखते हैं, लेकिन केवल सिंक / ओके में उत्तर देते हैं।

  • लोड पता (शुरुआत में 0x0000)। पता शब्दों में है (यानी एक शब्द दो बाइट्स है)। यह पता सेट करता है कि डेटा का अगला पृष्ठ कहाँ लिखा जाएगा।

  • कार्यक्रम पृष्ठ (128 बाइट तक भेजे जाते हैं)। ऑप्टिबूट तुरंत "सिंक में" का जवाब देता है। तब लगभग 4 एमएस का एक ठहराव होता है, जबकि यह वास्तव में पेज को प्रोग्राम करता है। फिर यह "ओके" का जवाब देता है।

  • लोड पता (अब 0x0040)। यह दशमलव में 64 का पता है, अर्थात। प्रोग्राम मेमोरी की शुरुआत से 128 बाइट्स।

  • एक और पेज लिखा है। यह क्रम तब तक जारी रहता है जब तक कि सभी पृष्ठ लिखे नहीं जाते।

  • लोड पता (0x0000 पर वापस)। यह लेखन को सत्यापित करने के लिए है।

  • पृष्ठ पढ़ें (128 बाइट तक पढ़े जाते हैं)। यह सत्यापन के लिए है। ध्यान दें कि भले ही सत्यापित विफल हो जाए, खराब डेटा पहले ही चिप पर लिखा जा चुका है।

  • प्रोग्रामिंग मोड को छोड़ दें।


"सिंक में नहीं" का क्या मतलब है?

जैसा कि आप ऊपर से देख सकते हैं, प्रोग्रामिंग अनुक्रम के माध्यम से हर कदम Arduino को "इन सिंक" (0x14) के साथ उत्तर देने की उम्मीद है, संभवतः कुछ डेटा द्वारा पीछा किया जाता है, इसके बाद "ओके" (0x10)।

यदि यह "सिंक में नहीं" है तो इसका मतलब है कि एवरूड को "सिंक में" प्रतिक्रिया नहीं मिली। संभावित कारण हो सकते हैं:

  • गलत बॉड दर का इस्तेमाल किया
  • IDE में गलत सीरियल पोर्ट चुने गए
  • IDE में चयनित गलत बोर्ड प्रकार
  • कोई बूटलोडर स्थापित नहीं है
  • गलत बूटलोडर स्थापित
  • बूटलोडर का उपयोग करने के लिए कॉन्फ़िगर नहीं किया गया बोर्ड (फ़्यूज़ में)
  • कुछ डिवाइस Arduino पर पिन D0 और D1 में प्लग करते हैं, धारावाहिक के साथ हस्तक्षेप करते हैं
  • USB इंटरफ़ेस चिप (ATmega16U2) ठीक से काम नहीं कर रहा है
  • बोर्ड के लिए गलत घड़ी
  • Atmega328P पर गलत फ्यूज सेटिंग्स (उदाहरण के लिए "8 से विभाजित घड़ी")
  • बोर्ड / चिप क्षतिग्रस्त
  • दोषपूर्ण USB केबल (कुछ USB केबल केवल शक्ति प्रदान करते हैं, और डेटा के लिए नहीं हैं, उदाहरण के लिए USB प्रशंसकों के लिए सस्ते केबल)

"सिंक में" क्या है?

जैसा कि ऊपर उल्लेख किया गया है, प्रतिक्रिया "सिंक में" का अर्थ है कि Arduino (बूटलोडर) अपलोडिंग प्रोग्राम के साथ सिंक्रनाइज़ है।


क्या प्रोटोकॉल का उपयोग किया जा रहा है?

प्रोटोकॉल Atmel द्वारा प्रलेखित STK500 प्रोटोकॉल है। नीचे संदर्भ देखें।


संदर्भ

नोट : STK500 संस्करण 2 का उपयोग ऑप्टिबूट में नहीं किया गया है, लेकिन यह जानकारी के लिए शामिल है कि आप मेगा 2560 जैसे बोर्डों का उपयोग कर रहे हैं।


STK500 स्थिरांक

/* STK500 constants list, from AVRDUDE */
#define STK_OK              0x10
#define STK_FAILED          0x11  // Not used
#define STK_UNKNOWN         0x12  // Not used
#define STK_NODEVICE        0x13  // Not used
#define STK_INSYNC          0x14  // ' '
#define STK_NOSYNC          0x15  // Not used
#define ADC_CHANNEL_ERROR   0x16  // Not used
#define ADC_MEASURE_OK      0x17  // Not used
#define PWM_CHANNEL_ERROR   0x18  // Not used
#define PWM_ADJUST_OK       0x19  // Not used
#define CRC_EOP             0x20  // 'SPACE'
#define STK_GET_SYNC        0x30  // '0'
#define STK_GET_SIGN_ON     0x31  // '1'
#define STK_SET_PARAMETER   0x40  // '@'
#define STK_GET_PARAMETER   0x41  // 'A'
#define STK_SET_DEVICE      0x42  // 'B'
#define STK_SET_DEVICE_EXT  0x45  // 'E'
#define STK_ENTER_PROGMODE  0x50  // 'P'
#define STK_LEAVE_PROGMODE  0x51  // 'Q'
#define STK_CHIP_ERASE      0x52  // 'R'
#define STK_CHECK_AUTOINC   0x53  // 'S'
#define STK_LOAD_ADDRESS    0x55  // 'U'
#define STK_UNIVERSAL       0x56  // 'V'
#define STK_PROG_FLASH      0x60  // '`'
#define STK_PROG_DATA       0x61  // 'a'
#define STK_PROG_FUSE       0x62  // 'b'
#define STK_PROG_LOCK       0x63  // 'c'
#define STK_PROG_PAGE       0x64  // 'd'
#define STK_PROG_FUSE_EXT   0x65  // 'e'
#define STK_READ_FLASH      0x70  // 'p'
#define STK_READ_DATA       0x71  // 'q'
#define STK_READ_FUSE       0x72  // 'r'
#define STK_READ_LOCK       0x73  // 's'
#define STK_READ_PAGE       0x74  // 't'
#define STK_READ_SIGN       0x75  // 'u'
#define STK_READ_OSCCAL     0x76  // 'v'
#define STK_READ_FUSE_EXT   0x77  // 'w'
#define STK_READ_OSCCAL_EXT 0x78  // 'x'


1
अच्छी बात! मैंने उत्तर के लिए कुछ संदर्भ जोड़े। धन्यवाद।
निक गैमन

ध्यान दें कि यहां वर्णित सत्यापन प्रक्रिया विशेष रूप से एक पृष्ठ रीड का उपयोग करती है, जिसका अर्थ है कि किसी भी बूटलोडर का avrdudeडिफ़ॉल्ट सत्यापन व्यवहार का समर्थन करने वाला एक बूटलोडर है जो फ्लैश सामग्री को पढ़ने का समर्थन करता है।
क्रिस स्ट्रैटन

1
यह व्यापक और वर्णनात्मक कार्यक्रम निर्देश और Optiboot / STK500 का विश्लेषण मन-उड़ाने वाला कमाल है। धन्यवाद, महान निक गैमन!
डेविड रिफॉआ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.