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)?
microcontroller
flash-memories
Arun Joe Cheriyan
sumber
sumber
Jawaban:
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.
sumber
int
danlong
), 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?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.
sumber
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.
sumber
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.
sumber
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).
sumber
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.
sumber
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.
512*1024*1024*100%
= 0,54 miliar variabel.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.sumber
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.
sumber
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 :)
sumber