यदि एक 32- बिट प्रोसेसर लगभग 4 GiB RAM (यानी ) बाइट्स को संभाल सकता है , तो मेरे Arduino Mega 2560 में 8 kb का SRAM है, अगर 8- बिट होने की अनुमति देता है सिर्फ 256 बाइट्स संभालें ( )? या मैं निम्नलिखित पृष्ठ गलत पढ़ रहा हूँ?2 8
यदि एक 32- बिट प्रोसेसर लगभग 4 GiB RAM (यानी ) बाइट्स को संभाल सकता है , तो मेरे Arduino Mega 2560 में 8 kb का SRAM है, अगर 8- बिट होने की अनुमति देता है सिर्फ 256 बाइट्स संभालें ( )? या मैं निम्नलिखित पृष्ठ गलत पढ़ रहा हूँ?2 8
जवाबों:
अधिकांश 8 बिट सीपीयू में 16 बिट एड्रेस बसें होती हैं जो उन्हें 64kbytes को संबोधित करने की अनुमति देती हैं, ठीक है क्योंकि 256 बाइट्स वास्तव में बहुत ज्यादा करने के लिए पर्याप्त नहीं हैं! इसका मतलब है कि उन्हें एक के बजाय दो बाइट्स लोड करने की आवश्यकता है, हर बार उन्हें एक पते को लोड करने की आवश्यकता होती है। उनके आकार को देखते हुए थोड़ा धीमा लेकिन सहन करने योग्य।
(और हाँ कई अपवाद भी हैं, ज्यादातर तब विकसित हुए जब 64k बहुत छोटा हो गया, लेकिन हम यहां मूल विचार के बारे में बात कर रहे हैं)।
पता बस और डेटा बस अलग होती है तो वे विभिन्न आकारों हो सकता है। किसी भी विशिष्ट पते बस आकार के लिए रजिस्टर बिट चौड़ाई की तुलना में अधिक मेमोरी को संबोधित करने के लिए बहुत सारी तकनीकें हैं
सबसे आम तरीका किसी भी तरह से एड्रेस बस की चौड़ाई बढ़ा रहा है
पते के लिए कई रजिस्टरों का उपयोग करना
X
, Y
और Z
अधिकतम 64KB RAM की अनुमति देने के लिए डेटा एड्रेसिंग रजिस्टर होता है। बदले में उन के साथ जोड़ा जा सकता है RAMPX
, RAMPY
, RAMPZ
भी बड़ा संस्करणों में उच्च रैम पतों का उपयोग करने की। इसमें रैम 1 के 256 बाइट्स वाले वेरिएंट के SPH
अलावा स्टैक पॉइंटर के हाई बाइट्स भी हैंSPL
H
& L
, B
& C
, D
और E
जिसे 16-बिट एड्रेस रजिस्टर के रूप में एक साथ उपयोग किया जा सकता हैसंबोधित करने के लिए प्राकृतिक आकार से बड़ा एक भी बड़ा विशेष रजिस्टर का उपयोग करना
पते के उच्च भाग के लिए एक विशेष रजिस्टर का उपयोग करना । कुछ मेमोरी को संबोधित करते समय, डिफ़ॉल्ट रूप से 8 बिट बिट्स को 8-बिट तत्काल या 8-बिट रजिस्टर से 8-बिट माइक्रोकंट्रोलर पर लिया जाएगा, जबकि उच्च बिट्स को अन्य पते रजिस्टर के मूल्य से बदल दिया जाएगा।
call
या goto
निर्देश करते समय, पते के 8 या 9 कम बिट्स को तत्काल द्वारा इंगित किया जाता है और शेष वर्तमान प्रोग्राम काउंटर से लिया जाता है। इसलिए वर्तमान खंड के आस-पास कुछ भी नहीं पहुंचना केवल 1 निर्देश का उपयोग करता है, जबकि आगे के पते पर 2 निर्देशों (उच्च बिट्स को सेट करने के लिए) की आवश्यकता होगी।PC
बिना शर्त कूदते हुए उच्च 6 बिट्स के साथ निचले 26-बिट तत्काल पते को जोड़ती है ।इसे प्राप्त करने का दूसरा तरीका मेमोरी बैंकिंग है । यह आजकल भी कुछ आर्किटेक्चर में एक उपयोगी विधि है। इस मॉडल में, मेमोरी को कई बैंकों में विभाजित किया गया है । हर बार आप केवल एक विशिष्ट बैंक को ही संबोधित कर सकते हैं। अक्सर एक वैश्विक बैंक या पता सीमा होती है जो हमेशा किसी भी समय दिखाई देती है, लेकिन अन्य भागों के लिए आपको ज़रूरत पड़ने पर बैंक स्विच करना चाहिए।
एक बहुत ही सामान्य तकनीक नहीं है, लेकिन इंटेल 8051 में पाया जा सकता है । 8-बिट डेटा पते के साथ एक माइक्रोकंट्रोलर के रूप में, इसमें अधिकतम 256 पते हो सकते हैं। आधी जगह (उच्च भाग) का उपयोग विशेष फ़ंक्शन रजिस्टर ( एसएफआर ) के लिए किया जाता है , जो वास्तविक रैम को केवल 128 बाइट्स के लिए संबोधित करता है। हालांकि आधुनिक 8051 श्रृंखला के निर्माताओं ने मेमोरी एक्सेस को अलग करके इसे दूर करने का एक चतुर तरीका पाया । प्रत्यक्ष पते अप्रत्यक्ष रूप से संबोधित करते हुए एसएफआर तक पहुंचेंगे , हालांकि रजिस्टरों में रैम के उच्च भाग तक पहुंच होगी जिसका मतलब है कि अब आपके पास 256 + 128 = 384 पता योग्य बाइट्स हैं।
1 https://en.wikipedia.org/wiki/Atmel_AVR_instruction_set#Memory_addressing_instructions
सबसे छोटे कोर में डेटा एड्रेस स्पेस के 6256 बाइट्स होते हैं (I / O पोर्ट्स और अन्य आरक्षित पते हटाए जाने के बाद रैम की tes128 बाइट्स) और प्रोग्राम रोम के 198192 बाइट्स (B किब)। इनमें केवल 8-बिट स्टैक पॉइंटर (SPL में) है, और केवल 12-बिट सापेक्ष कूद / कॉल निर्देश RJMP / RCALL का समर्थन करता है। (क्योंकि AVR प्रोग्राम काउंटर 16-बिट शब्दों को गिनता है, बाइट्स को नहीं, एक 12-बिट ऑफ़सेट ROM के 213 बाइट्स को संबोधित करने के लिए पर्याप्त है।)
उपलब्ध संसाधनों को एक्सेस करने के लिए आवश्यक अतिरिक्त मेमोरी एड्रेसिंग क्षमताएं मौजूद हैं:
- डेटा एड्रेस स्पेस के 256 बाइट्स (by256 बाइट्स ऑफ रैम) वाले मॉडल में 16-बिट स्टैक पॉइंटर होता है, जिसमें SPH रजिस्टर में हाई हाफ होता है।
- ROM के 8 KiB वाले मॉडल 2-शब्द (22-बिट) JUMP और CALL निर्देश जोड़ते हैं। (कुछ शुरुआती मॉडल को एक गलतफहमी झेलनी पड़ती है अगर एक स्किप इंस्ट्रक्शन को 2-वर्ड इंस्ट्रक्शन द्वारा फॉलो किया जाता है।)
- ROM के 64 KiB वाले मॉडल ELPM निर्देश और इसी RAMPZ रजिस्टर को जोड़ते हैं। एलपीएम निर्देश Z में ROM पते को शून्य-विस्तारित करता है; ELPM निर्देश उच्च बिट्स के लिए RAMPZ रजिस्टर प्रस्तुत करता है। यह सामान्य एलपीएम निर्देश के समान नहीं है; ELPM (ATmega103 और at43usb320) के केवल शून्य-ऑपरेंड रूप के साथ "क्लासिक" मॉडल मौजूद हैं। जब ऑटो-इंक्रीमेंट उपलब्ध होता है (अधिकांश मॉडल), यह RAMPZ सहित पूरे 24-बिट पते को अपडेट करता है।
- (दुर्लभ)> 128 केबी के रोम के मॉडल में 3-बाइट प्रोग्राम काउंटर होता है। सबरूटीन कॉल और रिटर्न स्टैक स्पेस के एक अतिरिक्त बाइट का उपयोग करते हैं, इंडिरेक्ट जंप और कॉल के लिए अतिरिक्त उच्च बिट्स प्रदान करने के लिए एक नया EIND रजिस्टर है, और नए विस्तारित निर्देश EIJMP और EICALL हैं जो EIND: Z का उपयोग गंतव्य पते के रूप में करते हैं। (पिछले IJMP और ICALL निर्देश शून्य-विस्तारित Z का उपयोग करते हैं)
- (दुर्लभ) RAM पता स्थान के 64 KiB मॉडल के साथ RAMPX, RAMPY, RAMPZ और RAMPD रजिस्टरों के साथ 16-बिट RAM पता सीमा का विस्तार होता है। ये मोड को संबोधित करने के लिए अतिरिक्त उच्च बिट्स प्रदान करते हैं जो क्रमशः X, Y, या Z रजिस्टर जोड़े का उपयोग करते हैं, या सीधे संबोधित करने वाले निर्देश LDS / STS। रॉम एक्सेस के विपरीत, कोई अलग "विस्तारित" निर्देश नहीं हैं; इसके बजाय RAMP रजिस्टरों का बिना शर्त उपयोग किया जाता है।
लगभग सभी 8-बिट प्रोसेसर में कम-ऑर्डर वाले हिस्से और उच्च-ऑर्डर वाले हिस्से से 16-बिट पते बनाने की क्षमता होती है। मूल 8080 सहित कुछ प्रोसेसर पर, एक पते के ऊपरी और निचले हिस्से को रखने के लिए समर्पित रजिस्टर हैं (हालांकि एक प्रोग्रामर के दृष्टिकोण से 8080 के स्टैक पॉइंटर जैसे कुछ रजिस्टर हो सकते हैं जो उन्हें अलग से संबोधित करने के लिए निर्देश नहीं देते हैं)। कुछ अन्य प्रोसेसर में, एक पते के ऊपरी या निचले आधे हिस्से के लिए समर्पित रजिस्टर नहीं होते हैं, लेकिन पते "मक्खी पर" इकट्ठे होते हैं। उदाहरण के लिए, 6502 पर, निर्देश "एलडीए $ 1234, एक्स" संचायक को 1234 डॉलर 8-बिट एक्स रजिस्टर में जोड़कर बनाए गए पते से लोड करता है [मान लीजिए कि इसमें $ F0 शामिल है]। उस निर्देश का निष्पादन 4 या 5 चरणों में आगे बढ़ेगा:
संचायक के लिए रीड बाइट का स्थानांतरण अगले अनुदेश के लाने को ओवरलैप करेगा। इसके अतिरिक्त, कई परिचालनों के लिए, यदि चरण 3 में कोई वहन नहीं होता है, तो चरण 4 में सही पता पढ़ा होगा और निष्पादन चरण 4 से सीधे अगले चरण पर जा सकता है, चरण 5 को दरकिनार कर सकता है।
यदि कोई संचालन के अनुक्रम की जांच करता है, तो एक नोटिस करेगा कि एक छोटे-एंडियन आर्किटेक्चर का एक बड़े-एंडियन पर एक निश्चित लाभ है, जिसमें ज्यादातर मामलों में (यद्यपि दिखाया गया एक नहीं है), भले ही एएलयू प्रदर्शन करने के लिए एक चक्र लेता है। इसके अलावा, ALU परिणाम की प्रतीक्षा किए बिना, गणना किए गए पते से एक बाइट को पढ़ना संभव है, क्योंकि आमतौर पर जो उच्च बाइट प्राप्त किया गया था, वह लक्ष्य ऑपरेंड का उच्च बाइट होगा। 8-बिट ALU के साथ एक बड़े-एंडियन मशीन पर, एक अनुक्रमित लोड कम से कम 5 चक्र लेगा (क्योंकि पते के निचले आधे हिस्से को चरण 3 तक नहीं पढ़ा जाएगा, और इस प्रकार चरण 4 में गणना की जाएगी)।
डेटाबस लाइनें (पिन) और पता लाइनें (पिन) पूरी तरह से अलग हैं। सीधे शब्दों में कहें, डेटबस लाइनें अधिकतम संख्या में बिट्स निर्धारित करती हैं जिन्हें एक बार में स्थानांतरित किया जा सकता है (और मेमोरी पर संग्रहीत किया जाता है) जबकि एड्रेस लाइन्स अधिकतम संख्या में मेमोरी "सेल" निर्धारित करती हैं जिन्हें चुना जा सकता है।
यह ज्यादातर एक विपणन बात थी कि 32-बिट x 86 सीपीयू 4 जीबी से अधिक रैम को संबोधित नहीं कर सकता था। मुझे याद है कि पेंटियम 4 सीपीयू पर A33-34 पिन थे।
यह अक्सर सच है कि पता योग्य स्मृति आकार और आंतरिक रजिस्टर आकार के बीच कुछ संबंध है, हालांकि यह संबंध अलग-अलग कारणों से भिन्न होता है। माइक्रोप्रोसेसरों के शुरुआती दिनों में पता स्थान के 256 बाइट्स को बहुत छोटा माना जाता था, इसलिए अधिकांश आठ बिट प्रोसेसर 16 बिट (दो बाइट) पते का उत्पादन करते थे, जो 64 किलोबाइट्स को संबोधित करते थे। बैंक स्विचिंग के साथ, हालांकि (मूल रूप से कुछ निश्चित आई / ओ लाइनों का उपयोग करके और भी अधिक पता लाइनें बनाने के लिए), यह बहुत अधिक होना संभव था।
पहले 16 और 32 बिट प्रोसेसर में, डिवाइस पर हमेशा पर्याप्त पिन नहीं थे जो सभी आंतरिक स्थानों तक पहुंच सकें, जो उनके आंतरिक पते के रजिस्टरों को संबोधित कर सकते हैं। उदाहरण के लिए, मोटोरोला 68000 पर, 16 मेगाबाइट रैम को संबोधित करने के लिए केवल पर्याप्त पता पिन (24) थे, हालांकि आंतरिक पता रजिस्टर 32 बिट चौड़ा था।
मैं इस प्रश्न का उत्तर विशेष रूप से आपके द्वारा उल्लिखित AVR नियंत्रकों के लिए दूंगा। मूल सिद्धांत कई अन्य 8-बिट आर्किटेक्चर के लिए भी सही है।
एवीआर 8-बिट कोर हैं। इसका मतलब है कि उनके पास 8-बिट रजिस्टर हैं। हालाँकि, स्मृति की उपयोग करने योग्य राशि तक पहुँचने के लिए 8 बिट पर्याप्त नहीं हैं। इसलिए, AVR कोर 16 बिट पॉइंटर रजिस्टरों के रूप में संयुक्त रजिस्टरों के एक विशिष्ट सेट का उपयोग करने में सक्षम है। रजिस्टर r30 और r31 (ZL और ZH के रूप में भी अलियास किए गए) इसके लिए एक उदाहरण हैं। साथ में वे Z पॉइंटर बनाते हैं।
असेंबली में 0x1234 पते पर एक बाइट पढ़ने पर ऐसा लगेगा:
ldi ZL, 0x34 ; Load r30 (ZL) with low byte of address
ldi ZH, 0x12 ; Load r31 (ZH) with high byte of address
ld r16, Z ; Load byte to r16
AVR परिवार के पास 3 रजिस्टर जोड़े हैं जिनका उपयोग इसके लिए किया जा सकता है। वे विशेष रूप से इस तरह के संचालन की अनुमति देने के लिए हार्डवेयर में डिज़ाइन किए गए हैं।
C जैसी उच्च स्तरीय भाषा में प्रोग्रामिंग करते समय कंपाइलर इस सामान को संभालता है।
नोट: कुछ AVRs 64k से बड़े मेमोरी साइज़ को भी सपोर्ट करते हैं। इन नियंत्रकों में एक विशेष फ़ंक्शन रजिस्टर होता है जिसमें अभिगमन के पहले अतिरिक्त पते लिखे जाते हैं। इस पते में निम्न बिट्स (MSB से LSB) होते हैं:
विशेष समारोह रजिस्टर (आमतौर पर 1 बाइट), ZH (8bit), ZL (8bit)।
Atmel के 8 बिट AVR वास्तव में एक 16 बिट डेटा पते का उपयोग करते हैं। कई अन्य 16 बिट रजिस्टर और यहां तक कि कुछ 16 बिट टाइमर हैं। चूंकि यह केवल 8 बिट प्रोसेसर है, यह आमतौर पर 16 बिट रजिस्टर को लोड करने के लिए दो घड़ी चक्र का उपयोग करता है।
विकिपीडिया इसे बहुत अच्छी तरह से समझाता है:
आठ-बिट CPUs 8-बिट डेटा बस का उपयोग करते हैं और इसलिए एकल मशीन निर्देश में 8 बिट डेटा तक पहुंच सकते हैं। व्यावहारिक और किफायती विचारों के कारण पता बस आम तौर पर एक डबल ओकटेट चौड़ा (यानी 16-बिट) है। इसका मतलब है कि ज्यादातर 8-बिट प्रोसेसर पर केवल 64 KB का प्रत्यक्ष पता स्थान है।
यह धारणा कि प्रोसेसर की "बिट चौड़ाई" रैम की अधिकतम मात्रा स्थापित करती है जो प्रोसेसर पता कर सकता है कि कंप्यूटिंग में सबसे व्यापक मिथकों में से एक है। वास्तव में उद्योग का इतिहास सिर्फ सीपीयू के साथ है, जिसके लिए यह रिश्ता नहीं था।
एचपी 21 एमएक्स, एचपी 1000: 16-बिट सीपीयू, मेमोरी 16 एमबी
पीडीपी -11: 16-बिट सीपीयू, 4 एमबी तक मेमोरी
VAX-11/780: 32-बिट सीपीयू, मेमोरी 512 एमबी
आदि आदि।