ถ้าตัวประมวลผลแบบ32บิตสามารถรองรับ RAM ได้ประมาณ 4 GiB (เช่น ) ไบต์ทำไม Arduino Mega 2560 2560 ของฉันมี SRAM 8 KiB ถ้าเป็นตัวประมวลผลแบบ8บิตทำให้สามารถจัดการได้เพียง 256 ไบต์ ( )? หรือฉันกำลังอ่านหน้าต่อไปนี้ผิด
ถ้าตัวประมวลผลแบบ32บิตสามารถรองรับ RAM ได้ประมาณ 4 GiB (เช่น ) ไบต์ทำไม Arduino Mega 2560 2560 ของฉันมี SRAM 8 KiB ถ้าเป็นตัวประมวลผลแบบ8บิตทำให้สามารถจัดการได้เพียง 256 ไบต์ ( )? หรือฉันกำลังอ่านหน้าต่อไปนี้ผิด
คำตอบ:
ซีพียู 8 บิตส่วนใหญ่มีบัสแอดเดรส 16 บิตที่อนุญาตให้แอดเดรส 64kbytes ได้อย่างแม่นยำเพราะ 256 ไบต์ไม่เพียงพอที่จะทำมาก ๆ ! หมายความว่าพวกเขาต้องการโหลดสองไบต์แทนที่จะเป็นหนึ่งครั้งในแต่ละครั้งที่พวกเขาต้องการโหลดที่อยู่ ช้าลงเล็กน้อย แต่ก็ทนได้เมื่อพิจารณาถึงขนาดของมัน
(และใช่มีข้อยกเว้นมากมายส่วนใหญ่พัฒนาเมื่อ 64k กลายเป็นเล็กเกินไป แต่เรากำลังพูดถึงแนวคิดพื้นฐานที่นี่)
รถบัสที่อยู่และบัสข้อมูลจะถูกแยกออกเพื่อให้พวกเขาอาจจะมีขนาดแตกต่างกัน สำหรับขนาดบัสแอดเดรสที่เฉพาะเจาะจงมีเทคนิคมากมายในการจัดการหน่วยความจำได้มากกว่าความกว้างบิตเรจิสเตอร์
วิธีที่พบมากที่สุดคือการเพิ่มความกว้างของบัสแอดเดรสอย่างใด
ใช้ลงทะเบียนหลายที่อยู่
X
, Y
และZ
ข้อมูลที่อยู่ที่ลงทะเบียนจะอนุญาตให้ 64KB สูงสุด RAM สามารถจับคู่กับRAMPX
เหล่าRAMPY
นั้นRAMPZ
เพื่อเข้าถึงที่อยู่ RAM ที่สูงขึ้นในรุ่นที่ใหญ่กว่าได้ นอกจากนี้ยังมีSPH
ไบต์สูงของตัวชี้สแต็กนอกเหนือจากSPL
ตัวแปรที่มี RAM 1มากกว่า 256 ไบต์H
& L
, B
& C
, D
& E
ที่สามารถใช้ร่วมกันเป็นการลงทะเบียนที่อยู่ 16 บิตใช้การลงทะเบียนพิเศษครั้งใหญ่ที่ยิ่งใหญ่กว่าขนาดที่เป็นธรรมชาติ
โดยใช้การลงทะเบียนพิเศษสำหรับส่วนสูงของที่อยู่ เมื่อจัดการกับหน่วยความจำบางส่วนโดยค่าเริ่มต้นที่อยู่ต่ำ 8 บิตจะถูกนำมาจากการลงทะเบียนทันที 8 บิตหรือ 8 บิตบนไมโครคอนโทรลเลอร์ 8 บิตในขณะที่บิตสูงจะถูกแทนที่ด้วยค่าของการลงทะเบียนที่อยู่อื่น
call
หรือgoto
คำสั่งจะมีการระบุแอดเดรสต่ำ 8 หรือ 9 บิตในทันทีและส่วนที่เหลือจะถูกนำมาจากตัวนับโปรแกรมปัจจุบัน ดังนั้นการเข้าถึงทุกสิ่งที่อยู่ไม่ไกลรอบ ๆ เซกเมนต์ปัจจุบันใช้เพียงคำสั่งเดียวเท่านั้นในขณะที่ที่อยู่เพิ่มเติมจะต้องมี 2 คำสั่ง (เพื่อตั้งค่าบิตสูง)PC
ในขณะที่กระโดดโดยไม่มีเงื่อนไขวิธีการที่จะบรรลุเป้าหมายนี้ก็คือธนาคารหน่วยความจำ นี่เป็นวิธีที่มีประโยชน์ที่ยังคงถูกใช้ในสถาปัตยกรรมบางอย่างในปัจจุบัน ในรูปแบบนี้หน่วยความจำจะแบ่งออกเป็นหลายธนาคาร ทุกครั้งที่คุณสามารถอยู่ธนาคารที่เฉพาะเจาะจงเท่านั้น มักจะมีธนาคารทั่วโลกหรือช่วงที่อยู่ที่สามารถมองเห็นได้ตลอดเวลา แต่สำหรับส่วนอื่นคุณต้องเปลี่ยนธนาคารเมื่อจำเป็น
นอกจากนี้ยังมีเทคนิคไม่ได้ค่อนข้างบ่อย แต่สามารถพบได้ในIntel 8051 ในฐานะที่เป็นไมโครคอนโทรลเลอร์ที่มีที่อยู่ข้อมูล 8 บิตจึงสามารถมีได้สูงสุด 256 ที่อยู่ ครึ่งหนึ่งของพื้นที่ (ส่วนที่สูง) ใช้สำหรับการลงทะเบียนฟังก์ชั่นพิเศษ ( SFR ) ซึ่ง จำกัด RAM จริงที่อยู่ได้เพียง 128 ไบต์ อย่างไรก็ตามผู้ผลิตที่ทันสมัย 8051 ซีรีส์พบวิธีที่ฉลาดที่จะเอาชนะนี้โดยแยกเข้าถึงหน่วยความจำ การกำหนดแอดเดรสโดยตรงจะเข้าถึงSFRขณะที่การกำหนดตำแหน่งทางอ้อมแม้ว่ารีจิสเตอร์จะเข้าถึงส่วนสูงของ RAM ซึ่งหมายความว่าตอนนี้คุณมี 256 + 128 = 384 ไบต์แอดเดรสที่กำหนดได้
1 https://en.wikipedia.org/wiki/Atmel_AVR_instruction_set#Memory_addressing_instructions
คอร์ที่เล็กที่สุดมีพื้นที่ข้อมูล data256 ไบต์ (หมายถึง≤128ไบต์ของ RAM หลังจากพอร์ต I / O และที่อยู่สำรองอื่น ๆ ถูกลบ) และ ROM โปรแกรม≤8192 (8 KiB) สิ่งเหล่านี้มีเพียงตัวชี้สแต็ก 8 บิต (เป็น SPL) และสนับสนุนคำสั่งการกระโดด / การโทรแบบ 12 บิตที่เกี่ยวข้อง RJMP / RCALL (เนื่องจากตัวนับโปรแกรม AVR นับจำนวนคำ 16- บิตไม่ใช่ไบต์ออฟเซ็ต 12 บิตจึงเพียงพอต่อการระบุ ROM 213 ไบต์)
ความสามารถในการกำหนดแอดเดรสหน่วยความจำเพิ่มเติมมีอยู่ตามที่จำเป็นในการเข้าถึงทรัพยากรที่มี:
- รุ่นที่มีพื้นที่ที่อยู่ข้อมูล> 256 ไบต์ (≥256ไบต์ของ RAM) มีตัวชี้สแต็ก 16 บิตโดยมีครึ่งสูงในการลงทะเบียน SPH
- รุ่นที่มี ROM มากกว่า 8 KiB ให้เพิ่มคำสั่ง JUMP และ CALL แบบ 2 คำ (22 บิต) (รุ่นแรก ๆ บางรุ่นจะได้รับ erratum หากคำสั่ง skip ตามด้วยคำ 2 คำ)
- รุ่นที่มี ROM> 64 KiB เพิ่มคำสั่ง ELPM และการลงทะเบียน RAMPZ ที่เกี่ยวข้อง คำแนะนำ LPM เพิ่มที่อยู่ ROM เป็นศูนย์ใน Z คำแนะนำของ ELPM จะเป็นการลงทะเบียน RAMPZ สำหรับบิตสูง นี่ไม่ใช่สิ่งเดียวกับคำสั่ง LPM ทั่วไป มีโมเดล "คลาสสิค" ที่มีเฉพาะรูปแบบ zero-operand ของ ELPM (ATmega103 และ at43usb320) เมื่อมีการเพิ่มอัตโนมัติ (รุ่นส่วนใหญ่) จะอัปเดตที่อยู่ 24 บิตทั้งหมดรวมถึง RAMPZ
- (หายาก) รุ่นที่มี ROM> 128 KiB จะมีโปรแกรมนับจำนวน 3 ไบต์ รูทีนย่อยการโทรและส่งคืนจะใช้ไบต์ของสแต็กพื้นที่เพิ่มเติมมีการลงทะเบียน EIND ใหม่เพื่อให้บิตสูงเพิ่มเติมสำหรับการข้ามและการโทรแบบไม่ต้องลงทะเบียนและมีคำแนะนำเพิ่มเติมใหม่ EIJMP และ EICALL ซึ่งใช้ EIND: Z เป็นที่อยู่ปลายทาง (คำแนะนำ IJMP และ ICALL ก่อนหน้านี้ใช้ Z เป็นศูนย์ขยาย)
- (หายาก) รุ่นที่มีพื้นที่ที่อยู่ RAM> 64 KiB ขยายขีด จำกัด การกำหนดแอดเดรส RAM แบบ 16 บิตด้วยการลงทะเบียน RAMPX, RAMPY, RAMPZ และ RAMPD สิ่งเหล่านี้จัดเตรียมบิตสูงเพิ่มเติมสำหรับโหมดการกำหนดแอดเดรสซึ่งใช้คู่ X, Y หรือ Z register ตามลำดับหรือคำสั่งการกำหนดแอดเดรสโดยตรง LDS / STS ต่างจากการเข้าถึง ROM ไม่มีคำแนะนำ "ขยาย" ที่ชัดเจน แทนที่จะใช้การลงทะเบียน RAMP โดยไม่มีเงื่อนไข
โปรเซสเซอร์ 8 บิตเกือบทั้งหมดมีความสามารถในการสร้างที่อยู่ 16 บิตจากชิ้นส่วนที่มีราคาต่ำและชิ้นส่วนที่มีคุณภาพสูง ในโปรเซสเซอร์บางตัวรวมถึง 8080 ตัวเดิมมีรีจิสเตอร์เพื่อเก็บส่วนบนและส่วนล่างของแอดเดรส (แม้ว่าจากจุดยืนของโปรแกรมเมอร์อาจมีรีจิสเตอร์บางตัวเช่นสแต็คพอยน์เตอร์ของ 8080 ในโปรเซสเซอร์อื่น ๆ บางรุ่นไม่มีการลงทะเบียนที่อุทิศให้กับที่อยู่ครึ่งบนหรือล่างของที่อยู่ แต่ที่อยู่จะถูกรวมเข้าด้วยกัน ตัวอย่างเช่นบน 6502 คำสั่ง "LDA $ 1234, X" จะโหลดตัวสะสมพร้อมที่อยู่ที่เกิดขึ้นโดยเพิ่ม $ 1234 ลงในการลงทะเบียน X แบบ 8 บิต [สมมติว่ามันมี $ F0] การดำเนินการของคำสั่งนั้นจะดำเนินการใน 4 หรือ 5 ขั้นตอน:
การถ่ายโอนไบต์อ่านไปยังแอคคิวมูเลเตอร์จะทับซ้อนกับการดึงคำสั่งถัดไป นอกจากนี้สำหรับการดำเนินการหลายอย่างหากขั้นตอนที่ 3 ไม่ได้สร้างการพกพาขั้นตอนที่ 4 จะอ่านที่อยู่ที่ถูกต้องและการดำเนินการสามารถข้ามโดยตรงจากขั้นตอนที่ 4 ถึงคำแนะนำถัดไปโดยข้ามขั้นตอนที่ 5
หากมีการตรวจสอบลำดับของการปฏิบัติงานหนึ่งจะสังเกตเห็นว่าสถาปัตยกรรมแบบ end-endian มีข้อได้เปรียบที่ชัดเจนมากกว่าแบบ big-endian ซึ่งในกรณีส่วนใหญ่ นอกจากนี้ยังเป็นไปได้ที่จะอ่านไบต์จากที่อยู่ที่คำนวณได้โดยไม่ต้องรอผล ALU เนื่องจากปกติไบต์สูงที่ถูกดึงข้อมูลจะเป็นไบต์สูงของตัวถูกดำเนินการเป้าหมาย บนเครื่องขนาดใหญ่ที่มี 8 บิต ALU การโหลดดัชนีจะใช้เวลาอย่างน้อย 5 รอบ (เนื่องจากครึ่งล่างของแอดเดรสจะไม่ถูกอ่านจนกว่าจะถึงขั้นตอนที่ 3 และจะถูกคำนวณในขั้นตอนที่ 4)
เส้น Databus (พิน) และบรรทัดที่อยู่ (พิน) แยกออกจากกันโดยสิ้นเชิง เพียงแค่วางสาย databus จะกำหนดจำนวนบิตสูงสุดที่สามารถถ่ายโอนทีละครั้ง (และเก็บไว้ในหน่วยความจำ) ในขณะที่บรรทัดที่อยู่จะกำหนดจำนวน "เซลล์" หน่วยความจำสูงสุดที่สามารถเลือกได้
ส่วนใหญ่เป็นเรื่องการตลาดที่ซีพียู x86 แบบ 32 บิตไม่สามารถระบุ RAM ได้มากกว่า 4GB ฉันจำได้ว่ามี A33-34 พินอยู่ในซีพียู Pentium 4
บ่อยครั้งที่ความจริงนั้นมีความสัมพันธ์ระหว่างขนาดหน่วยความจำที่กำหนดแอดเดรสได้และขนาดการลงทะเบียนภายในแม้ว่าความสัมพันธ์จะแตกต่างกันไปด้วยเหตุผลที่แตกต่างกัน พื้นที่ที่อยู่ 256 ไบต์ถือว่าเล็กเกินไปแม้ในช่วงแรก ๆ ของไมโครโปรเซสเซอร์ดังนั้นตัวประมวลผลแปดบิตส่วนใหญ่จึงสร้างที่อยู่ 16 บิต (สองไบต์) ซึ่งระบุ 64 กิโลไบต์ ด้วยการเปลี่ยนธนาคารแม้ว่า (โดยพื้นฐานแล้วจะใช้บรรทัด I / O บางรายการเพื่อสร้างบรรทัดที่อยู่ให้มากขึ้น) ก็เป็นไปได้ที่จะมีอีกมาก
ในโปรเซสเซอร์ 16 และ 32 บิตแรกไม่มีอุปกรณ์เพียงพอที่จะเข้าถึงพื้นที่ทั้งหมดที่การลงทะเบียนที่อยู่ภายในของพวกเขาสามารถทำได้ ตัวอย่างเช่นบน Motorola 68000 มีแอดเดรสพิน (24) เพียงพอต่อการระบุ RAM ขนาด 16 เมกะไบต์แม้ว่าที่อยู่ภายในจะมีความกว้าง 32 บิต
ฉันจะตอบคำถามนี้โดยเฉพาะสำหรับคอนโทรลเลอร์ AVR ที่คุณกล่าวถึง หลักการพื้นฐานยังคงเป็นจริงสำหรับสถาปัตยกรรม 8 บิตอื่น ๆ อีกมากมาย
AVR เป็นคอร์ 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 คอมไพเลอร์จัดการกับสิ่งนี้
หมายเหตุ: AVR บางตัวรองรับขนาดหน่วยความจำที่ใหญ่กว่า 64k ตัวควบคุมเหล่านี้มีฟังก์ชั่นพิเศษที่ลงทะเบียนซึ่งบิตเพิ่มเติมของที่อยู่จะถูกเขียนก่อนการเข้าถึง ที่อยู่จึงประกอบด้วยบิตต่อไปนี้ (MSB ถึง LSB):
ฟังก์ชั่นลงทะเบียนพิเศษ (ปกติ 1 ไบต์), ZH (8 บิต), ZL (8 บิต)
Atmel's 8 บิต AVR ใช้ที่อยู่จริงของข้อมูล 16 บิต มีรีจิสเตอร์อื่น ๆ อีก 16 บิตและแม้แต่ตัวจับเวลาขนาด 16 บิต เนื่องจากเป็นโปรเซสเซอร์เพียง 8 บิตจึงมักใช้วงจรนาฬิกาสองรอบเพื่อโหลดการลงทะเบียน 16 บิต
Wikipediaอธิบายว่ามันค่อนข้างดี:
ซีพียูแปดบิตใช้บัสข้อมูล 8 บิตและสามารถเข้าถึงข้อมูล 8 บิตในคำสั่งเครื่องเดียว ที่อยู่บัสโดยทั่วไปจะเป็น octet wide สองเท่า (เช่น 16 บิต) เนื่องจากข้อควรพิจารณาในทางปฏิบัติและประหยัด นี่หมายถึงพื้นที่ที่อยู่โดยตรงเพียง 64 KB บนโปรเซสเซอร์ 8 บิตส่วนใหญ่
แนวคิดที่ว่า "ความกว้างบิต" ของโปรเซสเซอร์กำหนดจำนวน RAM สูงสุดที่โปรเซสเซอร์สามารถจัดการได้เป็นหนึ่งในตำนานที่แพร่หลายที่สุดในการคำนวณ ในความเป็นจริงแล้วประวัติอุตสาหกรรมนั้นเพิ่งถูกทิ้งไว้กับซีพียูที่ความสัมพันธ์นี้ไม่ได้ถือ
HP 21MX, HP 1000: 16-bit CPU, หน่วยความจำถึง 16 MB
PDP-11: CPU 16 บิต, หน่วยความจำถึง 4 MB
VAX-11/780: CPU 32 บิตหน่วยความจำ 512 MB
เป็นต้น