Jika prosesor 32- bit dapat menangani kira-kira 4 GiB RAM (yaitu ) byte, mengapa Arduino Mega 2560 saya memiliki 8 KiB SRAM, jika menjadi prosesor 8- bit memungkinkan untuk hanya menangani 256 byte ( )? Atau apakah saya salah membaca halaman berikut?
arduino
microcontroller
microprocessor
sdram
ZaqueoAlejandro
sumber
sumber
Jawaban:
Kebanyakan CPU 8 bit memiliki bus alamat 16 bit yang memungkinkan mereka untuk mengatasi 64kbytes, tepatnya karena 256 byte sebenarnya tidak cukup untuk melakukan banyak hal! Itu hanya berarti mereka perlu memuat dua byte, bukan satu, setiap kali mereka perlu memuat alamat. Sedikit lebih lambat tapi lumayan mengingat ukurannya.
(Dan ya ada banyak pengecualian, sebagian besar dikembangkan ketika 64k menjadi terlalu kecil, tetapi kita sedang berbicara tentang ide dasar di sini).
sumber
The bus alamat dan bus data dipisahkan sehingga mereka mungkin memiliki ukuran yang berbeda. Untuk ukuran bus alamat tertentu ada banyak teknik untuk mengatasi lebih banyak memori daripada lebar bit register
Cara paling umum adalah meningkatkan lebar bus alamat entah bagaimana dengan
menggunakan beberapa register untuk alamat
X
,Y
danZ
register pengalamatan data memungkinkan maksimum 64KB RAM. Mereka pada gilirannya dapat dipasangkan denganRAMPX
,RAMPY
,RAMPZ
untuk mengakses alamat RAM yang lebih tinggi dalam versi yang lebih besar. Ini juga memilikiSPH
untuk byte byte stack yang tinggi danSPL
varian dengan lebih dari 256 byte RAM 1H
&L
,B
&C
,D
&E
yang dapat digunakan bersama sebagai register alamat 16-bitmenggunakan register khusus besar tunggal lebih besar dari ukuran alami untuk mengatasi
menggunakan register khusus untuk bagian paling atas dari alamat . Ketika menangani beberapa memori, secara default 8 bit rendah dari alamat akan diambil dari register 8-bit langsung atau 8-bit pada mikrokontroler 8-bit, sedangkan bit-bit tinggi akan diganti dengan nilai register alamat lain.
call
ataugoto
instruksi, 8 atau 9 bit rendah dari alamat ditunjukkan oleh langsung dan sisanya diambil dari penghitung program saat ini. Jadi mengakses sesuatu yang tidak jauh di sekitar segmen saat ini hanya menggunakan 1 instruksi, sedangkan alamat lebih lanjut akan membutuhkan 2 instruksi (untuk mengatur bit tinggi).PC
saat melompat tanpa syarat.Cara lain untuk mencapai ini adalah memory banking . Ini adalah metode yang berguna yang masih digunakan di beberapa arsitektur saat ini. Dalam model ini, memori dibagi menjadi beberapa bank . Setiap kali Anda hanya dapat mengatasi bank tertentu. Sering ada bank global atau rentang alamat yang selalu terlihat kapan saja, tetapi untuk bagian lain Anda harus beralih bank saat diperlukan.
Ada juga teknik yang tidak terlalu umum tetapi dapat ditemukan di Intel 8051 . Sebagai mikrokontroler dengan alamat data 8-bit, ia dapat memiliki paling banyak 256 alamat. Setengah dari ruang (bagian tinggi) digunakan untuk register fungsi khusus ( SFR ), membatasi RAM nyata yang dapat dialamatkan hanya 128 byte. Namun pabrikan seri 8051 modern menemukan cara cerdas untuk mengatasinya dengan memisahkan akses memori . Pengalamatan langsung akan mengakses SFR sementara pengalamatan tidak langsung meskipun register akan mengakses bagian tinggi RAM yang berarti sekarang Anda memiliki 256 + 128 = 384 byte yang dapat dialamatkan.
1 https://en.wikipedia.org/wiki/Atmel_AVR_instruction_set#Memory_addressing_instructions
sumber
Hampir semua prosesor 8-bit memiliki beberapa kemampuan untuk membentuk alamat 16-bit dari bagian orde rendah dan bagian orde tinggi. Pada beberapa prosesor termasuk 8080 asli, ada register yang didedikasikan untuk memegang bagian atas dan bawah alamat (meskipun dari sudut pandang programmer mungkin ada beberapa register seperti stack pointer 8080 yang tidak menawarkan instruksi untuk mengatasinya secara terpisah). Di beberapa prosesor lain, tidak ada register yang dikhususkan untuk bagian atas atau bawah dari suatu alamat, tetapi alamat dirakit "on the fly". Misalnya, pada 6502, instruksi "LDA $ 1234, X" memuat akumulator dengan alamat yang dibentuk dengan menambahkan $ 1234 ke register X 8-bit [anggap mengandung $ F0]. Eksekusi instruksi tersebut akan dilanjutkan dalam 4 atau 5 langkah:
Transfer byte baca ke akumulator akan tumpang tindih dengan pengambilan instruksi berikutnya. Selain itu, untuk banyak operasi, jika langkah 3 tidak menghasilkan carry, langkah 4 akan membaca alamat yang benar dan eksekusi dapat melompat langsung dari langkah 4 ke instruksi berikutnya, melewati langkah 5.
Jika seseorang memeriksa urutan operasi, orang akan melihat bahwa arsitektur little-endian memiliki keunggulan yang pasti daripada yang big-endian, dalam banyak kasus (meskipun bukan yang ditunjukkan), meskipun ALU membutuhkan siklus untuk melakukan sebagai tambahan, dimungkinkan untuk membaca byte dari alamat yang dihitung tanpa menunggu hasil ALU, karena biasanya byte tinggi yang diambil akan menjadi byte tinggi dari operan target. Pada mesin big-endian dengan ALU 8-bit, beban yang diindeks akan membutuhkan setidaknya 5 siklus (karena bagian bawah alamat tidak akan dibaca sampai langkah 3, dan dengan demikian akan dihitung pada langkah 4).
sumber
Databus lines (pin) dan address lines (pin) sepenuhnya terpisah. Sederhananya, garis databus menentukan jumlah bit maksimum yang dapat ditransfer satu per satu (dan disimpan di memori) sedangkan garis alamat menentukan jumlah maksimum "sel" memori yang dapat dipilih.
Itu sebagian besar hal pemasaran yang 32-bit x86 CPU tidak bisa mengatasi lebih dari 4GB RAM. Saya ingat di suatu tempat bahwa ada pin A33-34 pada CPU Pentium 4.
sumber
Seringkali benar bahwa ada beberapa hubungan antara ukuran memori yang dapat dialamatkan dan ukuran register internal, meskipun hubungannya bervariasi karena alasan yang berbeda. Ruang alamat 256 byte dianggap terlalu kecil bahkan pada hari-hari awal mikroprosesor, sehingga sebagian besar prosesor delapan bit menghasilkan alamat 16 bit (dua byte), yang menangani 64 kilobyte. Namun, dengan peralihan bank (pada dasarnya menggunakan jalur I / O tertentu untuk menghasilkan lebih banyak garis alamat), dimungkinkan untuk memiliki lebih banyak.
Dalam prosesor 16 dan 32 bit pertama, tidak selalu ada pin yang cukup pada perangkat untuk mencapai semua ruang yang bisa dialamatkan oleh register alamat internal mereka. Misalnya, pada Motorola 68000, hanya ada cukup pin alamat (24) untuk mengatasi 16 megabita RAM, meskipun register alamat internal lebarnya 32 bit.
sumber
Saya akan menjawab pertanyaan ini khusus untuk pengendali AVR yang Anda sebutkan. Prinsip dasar juga berlaku untuk banyak arsitektur 8-bit lainnya.
AVR adalah inti 8-bit. Ini berarti mereka memiliki Register 8-bit. Namun, 8 bit tidak cukup untuk mengakses jumlah memori yang dapat digunakan. Oleh karena itu, inti AVR dapat menggunakan satu set register spesifik yang digabungkan sebagai register pointer 16 bit. Register r30 dan r31 (juga disebut sebagai ZL dan ZH) adalah contoh untuk ini. Bersama-sama mereka membentuk Pointer Z.
Dalam perakitan membaca byte di alamat 0x1234 akan terlihat seperti ini:
Keluarga AVR memiliki 3 pasangan register yang dapat digunakan untuk ini. Mereka secara khusus dirancang dalam perangkat keras untuk memungkinkan operasi tersebut.
Saat memprogram dalam bahasa tingkat yang lebih tinggi seperti C, kompiler menangani hal ini.
Catatan: Beberapa AVR bahkan mendukung ukuran memori yang lebih besar dari 64k. Kontroler ini memiliki register fungsi khusus di mana bit tambahan alamat ditulis sebelum akses. Oleh karena itu alamat terdiri dari bit-bit berikut (MSB ke LSB):
Daftar fungsi khusus (biasanya 1 byte), ZH (8bit), ZL (8bit).
sumber
Atmel 8 bit AVR sebenarnya menggunakan alamat data 16 bit. Ada banyak register 16 bit lainnya dan bahkan beberapa timer 16 bit. Karena ini hanya prosesor 8 bit, biasanya menggunakan dua siklus clock untuk memuat register 16 bit.
sumber
Wikipedia menjelaskannya dengan cukup baik:
sumber
Gagasan bahwa "lebar bit" dari suatu prosesor menetapkan jumlah maksimum RAM yang dapat diatasi oleh prosesor adalah salah satu mitos paling luas dalam komputasi. Bahkan sejarah industri hanya dipenuhi dengan CPU yang tidak dimiliki hubungan ini.
HP 21MX, HP 1000: 16-bit CPU, memori hingga 16 MB
PDP-11: CPU 16-bit, memori hingga 4 MB
VAX-11/780: CPU 32-bit, memori hingga 512 MB
dll, dll.
sumber