Mengapa setiap alamat dalam mikrokontroler hanya berukuran 8 bit?


18

Saya telah melihat bahwa, dalam mikrokontroler 32-bit, setiap alamat memori hanya menampung 8 bit data; itu sama untuk MC 16 bit juga. Untuk data 32-bit, ia menggunakan kombinasi 4 alamat. Mengapa alamat tidak dapat membuat data 32-bit secara langsung (menjadikannya masing-masing 32 bit atau 16 bukannya 8)?


2
Itu tergantung pada bus data Microcontroller. Mikrokontroler 32-bit mana yang memiliki memori byte? Apakah Anda punya contoh?
Swanand

4
Sama sekali tidak benar, yang merupakan alasan mengapa bahasa pemrograman seperti C dan C ++ menggabungkan kemungkinan byte lebih besar dari 8 bit. Hanya saja mayoritas bekerja paling baik dengan 8 bit byte, tetapi 9bit atau 18bit ada di sana.
PlasmaHH

6
Ini seperti permen. Mereka terus membuat mereka lebih kecil dengan harga yang sama.
Olin Lathrop

4
Bisakah pertanyaan ini diulang lagi "Mengapa semua alamat disejajarkan dengan 8 bit"?
Florian Castellane

2
@FlorianCastellane Ini. Alamatnya tidak berukuran 8 bit (kecuali Anda dapat menemukan perangkat dengan <256 bit memori, maka itu mungkin).
jayjay

Jawaban:


11

Ini adalah pilihan desain yang efektif, tidak ada alasan kuat mengapa harus begitu. Dulu, ketika prosesor komoditas bervolume tinggi beroperasi pada nilai 8-bit, pemetaannya lebih konsisten 1: 1. Untuk konsistensi ketika desain berevolusi menjadi prosesor 32 dan 64 bit modern, masuk akal untuk menjaga pemetaan byte-address yang lebih lama meskipun bus data meningkat (dengan biaya trade-off pengubahan yang berubah). Beberapa MCU 32 bit mungkin masih menerapkan hanya 16 bit data bus ke beberapa memori, prosesor kelas atas akan memiliki 256 bit atau lebih, dan mampu memuat beberapa register inti dalam satu transaksi memori tunggal. Antarmuka lebar baik untuk operasi burst atau streaming.

Ukuran memori kecil yang dapat dialamatkan bermanfaat tidak hanya dalam kasus penanganan nilai byte dalam kode, tetapi untuk bekerja dengan struktur dalam memori seperti paket ethernet di mana byte spesifik perlu dibaca atau dimodifikasi. Seringkali operasi semacam ini harus dapat melakukan operasi kecil tetapi sangat efisien.

Ada juga skenario di mana perlu untuk beroperasi dengan big-endian, little-endian atau data endian campuran. Sekarang sering ada dukungan perangkat keras khusus untuk ini, tetapi sekali lagi, pengalamatan byte memori akan membuat jenis operasi ini lebih efisien dalam beberapa skenario.

Hal ini cukup baru bahwa jumlah bit alamat dalam register telah menjadi faktor pembatas untuk ruang alamat, jadi membuang 2 bit untuk mengatasi byte daripada kata-kata 32 bit tidak akan menjadi masalah besar 10-15 tahun yang lalu (dan sekarang dengan 64 bit pointer, umumnya untuk mengimplementasikan 48 atau 56 bit, alamat byte). Pendahuluan Pengajaran ilmu komputer masih sedikit macet di era mainframe pasca-baru, dan tidak selalu membahas aspek evolusi dengan sangat jelas. Banyak terminologi mulai digunakan (dan definisi) sekitar waktu itu arsitektur biaya rendah volume rendah (dalam arti paling umum) mulai dilengkapi dengan lebih banyak sumber daya yang terbatas dan desain prosesor yang lebih berfokus pada komoditas.

Saya belum menjawab secara khusus untuk MCU, batas arsitekturalnya tidak sejelas yang Anda kira. Bahkan desain MCU ground-up modern memiliki peluang bagus untuk diintegrasikan bersama dengan prosesor server banyak-inti, atau hanya ada satu poin dalam serangkaian produk yang dapat diskalakan; baik cara pendekatan yang konsisten untuk mengakses memori bermanfaat bagi pengguna akhir yang perlu menulis atau kode port.

Saya mengajukan pertanyaan pada retrocomputing SE tentang ukuran register untuk menindaklanjuti aspek historis dari pertanyaan ini.


2
Saya pikir prosesor dengan ukuran kata yang lebih lama lebih dulu daripada prosesor 8-bit. Prosesor 8-bit akan sangat tidak berguna tanpa cara yang efisien untuk menambahkan dua angka multi-byte, dan prosesor awal tidak dapat secara efisien menangani angka yang lebih besar dari satu kata mesin.
supercat

1
Saya bekerja dengan prosesor 8-bit yang cukup untuk mengetahui bahwa mereka dapat dengan mudah menambahkan angka multi-byte, tetapi tidak dengan instruksi CPU tunggal. Pertama, tambahkan dua byte terendah, dan dapatkan byte hasil terendah, dan bit carry terpisah. Karena banyak byte lain yang ada, tambahkan byte input berikutnya dan bit carry dari langkah sebelumnya, berikan byte output berikutnya dan bit carry berikutnya. Ketika tidak ada lagi byte input, konversikan bit carry terakhir menjadi satu byte output lagi.
user6030

@ user6030: Bukankah sudah biasa memiliki instruksi ADC? AVR tidak (mikrokontroler RISC 8-bit jadi gcc harus menggunakan ADC untuk intdanlong ), begitu juga x86, begitu juga ARM. Saya berasumsi sebagian besar CPU 8-bit akan, karena akan ada lebih banyak permintaan untuk itu daripada pada sistem dengan regs yang lebih luas. Oh, apakah supercat mengatakan bahwa prosesor awal tidak memiliki ADC yang efisien?
Peter Cordes

Saya pikir ini poin yang valid mengenai evolusi ukuran register (walaupun saya kekurangan data)
Sean Houlihane

25

Ada beberapa DSP (misalnya, TI C54x) yang tidak dapat menangani nilai yang lebih kecil dari 16 bit, dan beberapa DSP audio menggunakan 24 bit. Namun, nilai 8-bit digunakan di hampir semua kode tujuan umum, sehingga semua CPU tujuan umum mendukungnya.

Dan hanya karena unit yang lebih kecil yang digunakan untuk alamat memori adalah byte 8-bit tidak berarti bahwa ini akan menjadi unit terbesar yang sebenarnya digunakan di bus; kebanyakan CPU menggunakan ukuran kata aslinya (16/32 bit) atau bahkan ukuran yang lebih besar untuk mengalamatkan memori, dan ketika menggunakan byte yang diakses, secara otomatis mengekstrak byte dari kata yang lebih besar.

Sebagai contoh, bus PCI selalu menggunakan transaksi 32-bit, tetapi memiliki byte yang memungkinkan sinyal untuk akses yang harus lebih kecil.


Terima kasih. apakah ada MC yang lebar yang menggigit bukannya byte dalam memori?
Arun Joe Cheriyan

4
Mungkin Intel 4004?
pjc50

6
@ArunCheriyan Contoh CPU yang bekerja dengan camilan sebagai kata terkecil yang dapat ditekankan adalah Saturnus : CPU yang dirancang oleh HP dan digunakan pada kalkulator kelas atas pada abad terakhir (khususnya HP48 yang terkenal). Itu arsitektur yang sangat tidak biasa (register 64 bit, 4 bit ALU, 20 bit alamat, ...).
redup

Contoh lain: Unit addressable terkecil untuk TMS320C3x TI adalah 32-bit.
kkrambo

1
@davidcary Oh, well ... Tanggal dan waktu tidak pernah menjadi pakaian kuatku. Tanya istri saya tentang hadiah ulang tahunnya, dan bos saya tentang tenggat waktu ...
redup

18

Mikrokontroler 16-bit atau 32-bit sering perlu memanipulasi data yang hanya selebar 8-bit (byte). Misalnya, string teks biasanya disimpan dengan satu karakter per byte. Dengan memiliki skema pengalamatan memori yang memungkinkan setiap byte individual ditangani, mikrokontroler dapat secara efisien memproses data selebar 8-bit. Apakah ini berarti bahwa data 32-bit biasanya berada pada alamat yang merupakan kelipatan dari 4 byte, misalnya 04, 08, 0C, dll. Tetapi jika memori 32-bit lebar maka mikrokontroler dapat membaca 32-bit dalam satu siklus baca . Micro's sering memiliki instruksi mesin yang dapat beroperasi pada data panjang yang berbeda, sehingga Anda akan menemukan bahwa instruksi data bergerak (MOV) dapat memiliki 3 bentuk, MOV.B, MOV.W dan MOV.L untuk memindahkan 8, 16 dan 32 bit data dalam satu instruksi.


7

Jawaban dasarnya adalah "karena itu berapa lama byte". Dengan badan kode yang besar dan kuat yang membuat asumsi itu, memecahnya akan menyebabkan berbagai masalah.

Kembali pada hari-hari awal, tidak ada kode yang ditetapkan. Prosesor sering menggunakan segala macam arsitektur aneh, seperti yang ditunjukkan oleh jawaban lain. Pada saat prosesor 16-bit keluar, ada cukup kode dengan asumsi ketersediaan data 8-bit yang gagal membuatnya mudah akan menjadi penghalang nyata untuk adopsi.

Memiliki satu kata 32-bit per alamat tidak memberikan kerugian dalam kecepatan memori. Pada sistem 32-bit, 2 bit alamat yang lebih rendah sering tidak masuk ke memori. Prosesor biasanya akan membaca keseluruhan kata 32-bit dan memilih (atau menutup) byte 8-bit yang dibutuhkan dalam kata itu. Selama ruang alamat Anda dapat menyimpan data yang cukup (terbatas pada 2 ^ 32 byte dengan sistem 32-bit) maka tidak perlu khawatir. Pada kenyataannya, pada banyak prosesor 16-bit / 32-bit dibutuhkan waktu lebih lama untuk melakukan pemrosesan dengan nilai byte dibandingkan dengan nilai panjang kata asli - membaca kata 32-bit dan membuang bagian dari kata itu jelas akan memerlukan operasi ekstra, dibandingkan dengan hanya membaca kata 32-bit.

Sebaliknya, jika Anda memiliki sistem di mana Anda perlu menggunakan memori secara efisien, maka Anda harus dapat mengakses masing-masing byte. Jika tidak bisa, Anda akan kehabisan memori. Dengan mengingat hal itu, dapat merujuk masing-masing byte jelas diperlukan, jadi masuk akal jika ingatan Anda terpotong dalam byte.


3
Memang. Dan kemudian ada pertanyaan tambahan apakah prosesor dapat menangani dua akses berbeda yang diperlukan untuk memuat atau menyimpan nilai 32 bit yang tidak selaras secara otomatis dalam perangkat keras, atau jika itu harus secara eksplisit ditangani dalam perangkat lunak.
Chris Stratton

5

Inilah yang disebut memiliki memori addressable byte . Biasanya hal yang baik, kecuali Anda kehabisan ruang alamat (misalnya 4GB dengan pointer 32-bit, bukan 16GB dengan pointer 32-bit di mana setiap alamat adalah kata 32-bit yang terpisah).


Perhatikan bahwa ruang alamat dapat melampaui batas tersebut jika Anda membagi alamat menjadi bagian-bagian yang masing-masing akan cocok menjadi satu register. Saya pernah memiliki beberapa komputer 8-bit yang mencapai 64 KB memori dengan membagi alamat menjadi dua bagian disimpan dalam register terpisah, dan melihat iklan untuk komputer juga dengan prosesor 8-bit yang dapat mencapai 1 MB memori dengan membagi alamat menjadi tiga bagian.
user6030

AVR (mikrokontroler RISC 8-bit) melakukan hal itu: tiga pasang dari register 8-bit untuk keperluan umum dapat dereferensi sebagai penunjuk 16-bit. Ada juga beberapa fasilitas untuk menggabungkannya dengan segmen 8-bit lain untuk mendapatkan alamat 24-bit.
Peter Cordes

4

Analog Devices Shark 32 bit DSP memiliki 32 bit sebagai unit terkecil dari memori yang dapat dialamatkan, jadi sizeof (int) == sizeof (pendek) == sizeof (char) == 1 (Ya, mereka memiliki 32 bit chars, sangat valid per standar C).

Juga hal-hal seperti int_8, int_16 dan semacamnya tidak didefinisikan dalam, kejutan buruk ketika porting kode dari platform lain.


1

Ukuran unit memori yang dapat dialamatkan pada dasarnya adalah kompromi antara berapa banyak memori yang dapat Anda atasi vs berapa banyak memori yang akan Anda buang.

Memori yang bisa dialamatkan . Pertimbangkan CPU 32-bit: jika Anda mengatasi byte, Anda dapat mengatasi memori hingga 4GB. Jika Anda menangani bit individual, jumlah itu akan dikurangi menjadi 512MB, dan jika Anda menangani kata-kata 32-bit Anda akan memiliki 16GB. (Pertanyaan Anda tampaknya menyarankan yang terakhir).

Memori yang terbuang . Jika Anda memiliki variabel yang dapat direpresentasikan dengan X bit, dan Anda hanya dapat mengalokasikan unit N bit untuknya, Anda akan membuang (N-1) / 2 bit rata-rata, dengan asumsi X> N. Jika Anda menangani masing-masing bit , Anda akan menggunakan memori dengan efisiensi 100% (setidaknya dari sudut pandang pengalamatan). Dengan byte, Anda akan membuang 3,5 bit per variabel (efisiensi 56%), dan dengan kata 32-bit, Anda akan membuang 15,5 bit (efisiensi 52%). Tapi itu semakin buruk: jika sebagian besar variabel Anda kecil (berpikir karakter, boolean, bendera status), Anda akan menghabiskan sebagian besar memori jika unit yang dialamatkan Anda terlalu besar.

Sebagai contoh, mari kita asumsikan ukuran rata-rata variabel adalah 8 bit.

  • pada komputer bit-addressable, Anda akan dapat mengalokasikan dengan efisiensi 100%, yang akan memberi Anda 512*1024*1024*100%= 0,54 miliar variabel.
  • pada komputer byte-addressable, Anda akan mengalokasikan dengan efisiensi 56%, yang akan memberi Anda 4096*1024*1024*56%= 2,4 miliar variabel. Itu hampir 5 kali lipat dibandingkan dengan komputer beralamat bit! Tentu saja, Anda harus membeli memori 8 kali lebih banyak.
  • pada komputer 32-bit-addressable, karena setidaknya setengah dari variabel Anda akan menempati kurang dari 8 bit, mereka akan dialokasikan dengan efisiensi di bawah 7% (menggunakan 4,5 bit dari 32). Bagaimanapun, Anda tidak akan mendapatkan lebih dari 4,3 miliar variabel (karena Anda hanya memiliki banyak alamat berbeda), dan kurang dari itu pada kenyataannya. Menghindari perhitungan yang rumit, saya kira mungkin akan mendapatkan penyimpanan 20-30% lebih berguna dibandingkan dengan komputer byte-addressable, sambil membayar 4 kali harga untuk RAM.

1

Mungkin sudah mengatakan berbagai cara dalam jawaban yang lain. Secara umum hari ini, tetapi tidak secara historis, byte adalah 8 bit. Sebagian besar waktu kita berurusan dengan "byte addressable memory" yang berarti hal TERKECIL yang dapat kita akses dengan satu alamat adalah byte. Tetapi itu tidak berarti bahwa HANYA hal yang bisa kita tangani. Bergantung pada platform, satu alamat dapat digunakan untuk mengakses byte, setengah kata / kata (16 bit), kata / doubleword (32 bit), dan sebagainya 64 bit apa pun. Instruksi pada dasarnya menentukan apa ukuran akses yang diinginkan (8,16,32,64, dll) biasanya di unit 8, 16, 32, 64. Tapi itu tidak sulit dan cepat, "tergantung".

Juga tergantung pada desain prosesor dan / atau sistem, tidak ada alasan untuk menganggap bahwa ukuran akses adalah ukuran memori atau ukuran akses terkecil. Dengan persyaratan yang lebih besar dan lebih besar, semakin tidak masuk akal seiring waktu untuk benar-benar menerapkan sistem memori menggunakan ukuran terkecil, komputer yang Anda baca ini kemungkinan menggunakan bus data lebar 32 bit atau bus data lebar 64 bit untuk semua akses, Anda ingin membaca satu byte, ia melakukan 64 bit membaca dan melemparkan sisa bit, mengapa tidak memerlukan biaya tambahan menjaga bus selebar itu hingga mendekati inti prosesor dan prosesor memilih jalur byte yang tepat. biaya lebih banyak logika dan atau jam untuk membuat bus lebih sempit atau memindahkan byte di dalam jalur byte, (kadang-kadang dilakukan). jadi domba jantan internal dalam mikrokontroler mungkin lebar 32 bit misalnya jika itu masuk akal untuk sistem. mungkin 16. Ya untuk menulis Anda membakar lebih banyak siklus, Anda harus membaca-memodifikasi-menulis di suatu tempat di sepanjang baris. Ingin menulis satu byte pada pc Anda, di suatu tempat 64 bit membaca terjadi, dan kemudian di suatu tempat satu byte dari 64 bit dimodifikasi, tergantung pada apa yang Anda lakukan setelah itu bahwa 64 bit dapat kembali keluar untuk dram dengan hanya 8 bit itu berbeda dari apa yang ada sebelumnya, caching dan kode Anda menjadikan ini bukan aturan umum. Menulis adalah api dan lupa, pengontrol memori dapat mengumpulkan alamat dan data dari prosesor dan memungkinkan prosesor untuk tetap berjalan sementara pada akhirnya melakukan jam tulis tulis, mungkin lebih banyak jam yang dibakar dalam baca-modifikasi-tulis (jika dalam cache sudah),

Ada pengecualian bahkan hari ini untuk hampir semua ini, mungkin ada instruksi atau jenis akses di beberapa sistem yang sedikit dialamatkan, ada beberapa sistem di mana alamatnya berada di unit sesuatu selain byte. Satu byte tidak selalu 8 bit dan mungkin ada sistem yang masih berjalan yang benar (kami dulu menggunakan oktal dan 9 bit byte 18 atau 36 bit kata banyak masuk akal bagi programmer manusia dan perancang chip yang berpikir oktal, sebuah 8 bit masuk akal bagi para pemikir heksadesimal).

Sekarang komputer Anda membaca ini, meskipun bus data untuk controller dram itu mungkin 32 atau 64 bit lebar, modul dram yang sebenarnya itu sendiri kemungkinan terdiri dari beberapa bagian lebar 8 bit, yang Anda dapat dengan mudah melihat. Jika memiliki 8 atau 9 chip di satu sisi mungkin bus lebar 64 bit atau 72 bit (64 bit plus 8 bit ECC) diimplementasikan dengan bagian lebar 8 bit. Jika Anda memiliki 4 atau 5 chip di satu sisi modul tetapi masih memiliki banyak pin, maka ia memiliki lebar 32 bit (tidak mungkin hari ini) atau 4 dari chip tersebut memiliki lebar 16 bit dan jika ada ke-5 mungkin menjadi 16 bit lebar dan hanya 8 digunakan atau itu adalah bagian lebar 8 bit. Ada bagian lebar 32 bit juga, tetapi lebar 8 bit paling umum. Praktek yang sangat umum yang berjalan jauh ke belakang.

Kita perlu tahu mikrokontroler apa. Karena Anda menyebutkan 32 bit, sangat mungkin (tanpa info rinci meskipun kami tidak dapat mengatakan) bahwa memori di dalam bagian itu adalah 32 bit, dan semua akses ke sana adalah 32 bit. instruksi kemungkinan akan menentukan apa yang diinginkan oleh program yang mungkin menawarkan jenis akses 8 bit, 16 bit dan 32 bit, yang lebih kecil pada penulisan akan memerlukan baca-modifikasi-tulis di suatu tempat, membaca Anda mengabaikan jalur byte. Hal yang sama berlaku untuk flash, meskipun menulis flash adalah topik lain. Tetapi flash internal kemungkinan lebar 32 bit dan semua membaca dalam satuan 32 bit. Namun, flash eksternal, yang merupakan cerita lain, kemungkinan besar mereka satu bit lebar (spi atau i2c), meskipun bagian spi terkadang dapat mendukung 1, 2 atau 4 bit, tetapi satu pin miso paling umum. Secara internal mereka diatur dalam satuan byte, bisa lebar 8 bit atau 16 atau 32, atau siapa tahu, Anda menggeser dan mengatasinya dalam satuan byte. dengan spi Anda dapat menggeser di mana saja antara satu byte dan seluruh memori dalam satu transaksi, tergantung pada desain bagian flash.


0

Anda bisa mendapatkan prosesor 1 bit juga!

Lebar data akan mengikuti lebar register (akumulator). ini biasanya 'lebar prosesor' sedangkan buss alamat mungkin berbeda (biasanya lebih lebar), tetapi secara teknis bisa lebih sempit tergantung penggunaannya.

8 tentu saja adalah kekuatan dua angka. Kami memiliki sejarah untuk berterima kasih atas penggunaan di mana-mana 8 bit - dan BIAYA / kemampuan teknologi. Untuk waktu yang lama 8 bit dikuasai, sebagian alasannya adalah lebar bus dan kesulitan dalam membuat register (dan RAM) lebih dari 8 bit lebar (tidak ada titik dalam data 16 bit jika register Anda semuanya 8 bit). 8 bit agak bagus, dan masuk akal di Hex. 8 bit dapat menampung alfabet, angka, karakter menggambar & kontrol Anda (ASCII), atau 0 hingga 255 atau + -127 Mengakses lebih dari 256 byte data (bus alamat 8 bit) mudah dengan paging, Pilih halaman, kemudian byte misalnya 256 halaman dari 256 membawa Anda ke 64K (65536). Biasanya halaman nol akan menjadi bantalan awal karena akan lebih cepat diakses karena ini tidak akan memerlukan halaman yang akan ditetapkan. Komputer pertama saya memiliki ram statis 1 k x 8 bit! (RAM dinamis lebih murah, tetapi membutuhkan lebih banyak perangkat keras untuk menyegarkannya). Dengan beberapa flag (c, nc, z, nz), tambah, kurangi, putar kiri dan kanan, Anda dapat melakukan beberapa matematika yang cukup rumit pada mesin 8bit. Anda tidak perlu unit aritmatika floating point! Tidak super cepat, tetapi bisa dilakukan! Banyak prosesor awal dapat menjadi satu langkah, dan digunakan dengan RAM statis yang sederhana membuat proses debug sangat mudah; menambahkan beberapa buffer oktal dan LED merah awal, Anda dapat melihat alamat dan data bus berubah :)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.