कंपाइलर किसी भी त्रुटि का पता नहीं लगाएगा और कोड संकलित और निष्पादित करेगा। इसलिए, यह देखने के लिए कि पीछे के दृश्यों के जादू का पता लगाने के लिए हमें क्या करने की आवश्यकता है। सारांश के लिए, समाप्त करना छोड़ें।
आपके कोड में दूसरी पंक्ति वह जगह है जहाँ जादू होगा और जहाँ हमें ध्यान केंद्रित करने की ज़रूरत है।
pinMode(pin, OUTPUT);
के भाग pinMode
इस चर्चा के लिए प्रासंगिक है:
void pinMode(uint8_t pin, uint8_t mode)
{
uint8_t bit = digitalPinToBitMask(pin); //The first instance where pin is used
uint8_t port = digitalPinToPort(pin);
if (port == NOT_A_PIN) return;
//Do something
}
(पूरा कार्यान्वयन wiring_digital.c में पाया जा सकता है )
तो, यहाँ, एक मध्यवर्ती बिट की गणना digitalPinToBitMask
करने के लिए उपयोग pin
किया जा रहा है। आगे की खोज, digitalPinToBitMask
एक मैक्रो है Arduino.h
जिसकी परिभाषा में यह एक-लाइनर है:
#define digitalPinToBitMask(P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM + (P) ) )
यह अजीब दिखने वाला एक लाइनर एक बहुत ही सरल कार्य करता है। यह सरणी में P th तत्व को अनुक्रमित करता है digital_pin_to_bit_mask_PGM
और इसे लौटाता है। इस सरणी digital_pin_to_bit_mask_PGM
को pins_arduino.h
विशिष्ट बोर्ड के उपयोग के लिए या पिन मैप में परिभाषित किया गया है।
const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = {
_BV(0), /* 0, port D */
_BV(1),
_BV(2),
_BV(3),
_BV(4),
_BV(5),
_BV(6),
_BV(7),
...
};
इस सरणी में कुल 20 तत्व हैं, इसलिए हम भाग्य से बाहर हैं। 999 इस सरणी के बाहर फ्लैश मेमोरी में मेमोरी लोकेशन को इंडेक्स करेगा, जिससे अप्रत्याशित व्यवहार हो सकता है। या होगा?
अभी भी हमारे पास रनवे की अराजकता के खिलाफ रक्षा की एक और पंक्ति है। इसके कार्य की अगली पंक्ति pinMode
:
uint8_t port = digitalPinToPort(pin);
digitalPinToPort
हमें एक समान रास्ते पर ले जाता है। इसे मैक्रो के साथ-साथ परिभाषित किया गया है digitalPinToBitMask
। इसकी परिभाषा है:
#define digitalPinToPort(P) ( pgm_read_byte( digital_pin_to_port_PGM + (P) ) )
अब, हम P वें तत्व को अनुक्रमित करते हैं , digital_pin_to_port_PGM
जो पिन मैप में परिभाषित एक सरणी है:
const uint8_t PROGMEM digital_pin_to_port_PGM[] = {
PD, /* 0 */
PD,
....
PC,
PC,
};
इस सरणी में 20 तत्व हैं, इसलिए 999 फिर से सीमा से बाहर है। फिर से, यह कमांड पढ़ता है और फ्लैश मेमोरी से एक वैल्यू देता है जिसका मूल्य हम निश्चित नहीं कर सकते हैं। यह फिर से यहाँ से अप्रत्याशित व्यवहार को जन्म देगा।
अभी भी रक्षा की एक अंतिम पंक्ति है। यह वापसी मूल्य पर if
चेक pinMode
है digitalPinToPort
:
if (port == NOT_A_PIN) return;
NOT_A_PIN
में 0 के रूप में परिभाषित किया गया है Arduino.h
। इसलिए, यदि लौटाया गया बाइट digitalPinToPort
शून्य होता है, तो pinMode
चुपचाप विफल हो जाएगा और वापस आ जाएगा।
किसी भी मामले में, pinMode
हमें अराजकता से नहीं बचा सकता है। 999 को कयामत में परिणाम के लिए किस्मत में है।
टीएल; डीआर, कोड निष्पादित करेगा और इसका परिणाम अप्रत्याशित होगा। सबसे अधिक संभावना है, कोई पिन सेट नहीं किया जाएगा OUTPUT
, और digitalWrite
विफल हो जाएगा। यदि आपके पास असाधारण रूप से बुरी किस्मत है, तो एक यादृच्छिक पिन सेट हो सकता है OUTPUT
, और digitalWrite
इसे सेट कर सकता है HIGH
।