कंपाइलर किसी भी त्रुटि का पता नहीं लगाएगा और कोड संकलित और निष्पादित करेगा। इसलिए, यह देखने के लिए कि पीछे के दृश्यों के जादू का पता लगाने के लिए हमें क्या करने की आवश्यकता है। सारांश के लिए, समाप्त करना छोड़ें।
आपके कोड में दूसरी पंक्ति वह जगह है जहाँ जादू होगा और जहाँ हमें ध्यान केंद्रित करने की ज़रूरत है।
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।