Betapa berbedanya mikrokontroler 8-bit dari mikrokontroler 32-bit dalam hal memprogramnya

19

Benar, jadi kita memiliki mikrokontroler 8-bit, 16-bit, dan 32-bit di dunia ini saat ini. Semuanya sering digunakan. Apa bedanya dengan memprogram mikrokontroler 8-bit dan 16-bit? Maksud saya, apakah itu membutuhkan teknik atau keterampilan yang berbeda? Mari kita ambil microchip misalnya. Apa hal baru yang perlu dipelajari seseorang jika mereka ingin beralih dari mikrokontroler 8-bit ke mikrokontroler 32-bit?

quantum231
sumber
Tidak. Tentu ada kekhawatiran yang berbeda, tetapi sebagian besar berada di tingkat detail perangkat tertentu. Misalnya, apakah akses kata yang tidak selaras diizinkan? (Pada ARM itu belum - belum pada x86 itu). Pertanyaan ini tidak cukup spesifik.
Chris Stratton
Wow teman-teman, terima kasih atas jawabannya. Jadi sebenarnya ada perbedaan yang sangat penting yang perlu kita pertimbangkan ketika memprogram prosesor 32 bit vs prosesor 8 bit. Di sini saya merujuk ke C karena saya pikir kebanyakan orang tidak mempelajari Assembly untuk pemrograman karena alasan yang kita semua tahu semua. Terima kasih atas tanggapan terperinci, saya sangat menghargainya.
quantum231
Dengan uc 32 bit, ada opsi BANYAK lebih banyak dan register BANYAK lebih banyak yang harus Anda lakukan dengan benar. Saya kira itu tergantung pada apa yang Anda lakukan. Yang mengatakan, hari ini Anda bisa mendapatkan papan pengembangan, compilier, debugger, IDE untuk sekitar $ 50. Kembali pada hari yang biayanya mendekati $ 1000.

Jawaban:

33

Secara umum, beralih dari 8 hingga 16 ke 32 bit mikrokontroler berarti Anda akan memiliki lebih sedikit pengekangan pada sumber daya, terutama memori, dan lebar register yang digunakan untuk melakukan operasi aritmatika dan logis. Monikers 8, 16, dan 32-bit umumnya mengacu pada ukuran bus data internal dan eksternal dan juga ukuran register internal yang digunakan untuk operasi aritmatika dan logis (dulu hanya satu atau dua yang disebut akumulator). , sekarang biasanya ada bank register 16 atau 32).

Ukuran port port I / O umumnya juga akan mengikuti ukuran bus data, sehingga mikro 8-bit akan memiliki port 8-bit, 16-bit akan memiliki port 16-bit dll.

Meskipun memiliki bus data 8-bit, banyak mikrokontroler 8-bit memiliki bus alamat 16-bit dan dapat mengatasi 2 ^ 16 atau 64K byte memori (itu tidak berarti mereka memiliki hampir mendekati yang diimplementasikan). Tetapi beberapa mikro 8-bit, seperti PIC low-end, mungkin hanya memiliki ruang RAM yang sangat terbatas (mis. 96 byte pada PIC16).

Untuk mengatasi skema pengalamatan terbatas mereka, beberapa mik 8-bit menggunakan paging, di mana isi dari register halaman menentukan salah satu dari beberapa bank memori untuk digunakan. Biasanya akan ada beberapa RAM umum yang tersedia tidak peduli apa halaman register diatur.

Mikrokontroler 16-bit umumnya terbatas pada memori 64K, tetapi juga dapat menggunakan teknik paging untuk menyiasatinya. Mikrokontroler 32-bit tentu saja tidak memiliki batasan seperti itu dan dapat menangani hingga 4GB memori.

Seiring dengan ukuran memori yang berbeda adalah ukuran tumpukan. Dalam mik ujung bawah, ini dapat diimplementasikan dalam area memori khusus dan sangat kecil (banyak PIC16's memiliki 8-tingkat panggilan tingkat stack). Dalam mikro 16-bit dan 32-bit, tumpukan biasanya akan menjadi RAM umum dan hanya dibatasi oleh ukuran RAM.

Ada juga perbedaan besar dalam jumlah memori - baik program dan RAM - yang diterapkan pada berbagai perangkat. 8-bit micros mungkin hanya memiliki beberapa ratus byte RAM, dan beberapa ribu byte memori program (atau lebih sedikit - misalnya PIC10F320 hanya memiliki 256 kata 14-bit flash dan 64 byte RAM). Mikro 16-bit mungkin memiliki beberapa ribu byte RAM, dan puluhan ribu byte memori program. 32-bit micros sering memiliki lebih dari 64K byte RAM, dan mungkin 1/2 MB atau lebih dari memori program (PIC32MZ2048 memiliki 2 MB flash dan RAM 512KB; PIC32MZ2064DAH176 yang baru dirilis, dioptimalkan untuk grafis memiliki 2 MB flash dan RAM sebesar 32MB pada chip)

Jika Anda memprogram dalam bahasa assembly, batasan ukuran register akan sangat jelas, misalnya menambahkan dua angka 32-bit adalah tugas pada mikrokontroler 8-bit tetapi sepele pada 32-bit. Jika Anda memprogram dalam C, ini sebagian besar akan transparan, tetapi tentu saja kode kompilasi yang mendasari akan jauh lebih besar untuk 8-pahit.

Saya mengatakan sebagian besar transparan, karena ukuran berbagai tipe data C mungkin berbeda dari satu ukuran mikro ke yang lain; misalnya, kompiler yang menargetkan mikro 8 atau 16-bit dapat menggunakan "int" untuk berarti variabel bertanda 16-bit, dan pada mikro 32-bit ini akan menjadi variabel 32-bit. Jadi banyak program menggunakan #defines untuk secara eksplisit mengatakan ukuran yang diinginkan, seperti "UINT16" untuk variabel 16-bit yang tidak ditandatangani.

Jika Anda memprogram dalam C, dampak terbesar adalah ukuran variabel Anda. Misalnya, jika Anda tahu variabel akan selalu kurang dari 256 (atau dalam rentang -128 hingga 127 jika ditandatangani), maka Anda harus menggunakan 8-bit (unsigned char atau char) pada mikro 8-bit (mis. PIC16 ) karena menggunakan ukuran yang lebih besar akan sangat tidak efisien. Demikian juga ulang variabel 16-bit pada mikro 16-bit (misalnya PIC24). Jika Anda menggunakan mikro 32-bit (PIC32), maka itu tidak benar-benar membuat perbedaan karena set instruksi MIPS memiliki instruksi byte, word, dan double-word. Namun pada beberapa mikro 32-bit, jika mereka tidak memiliki instruksi seperti itu, memanipulasi variabel 8-bit mungkin kurang efisien daripada 32-bit karena masking.

Seperti yang ditunjukkan anggota forum vsz, pada sistem di mana Anda memiliki variabel yang lebih besar dari ukuran register default (mis. Variabel 16-bit pada mikro 8-bit), dan variabel itu dibagi di antara dua utas atau di antara utas dasar dan penangan interupsi, seseorang harus melakukan operasi apa pun (termasuk hanya membaca) pada variabel atom , yang membuatnya tampak dilakukan sebagai satu instruksi. Ini disebut bagian kritis. Cara standar untuk memitigasi hal ini adalah dengan mengelilingi bagian kritis dengan pasangan interupsi nonaktif / aktifkan.

Jadi dari sistem 32-bit ke 16-bit, atau 16-bit ke 8-bit, setiap operasi pada variabel jenis ini yang sekarang lebih besar dari ukuran register default (tetapi tidak sebelumnya) perlu dianggap kritis bagian.

Perbedaan utama lainnya, pergi dari satu prosesor PIC ke yang lain, adalah penanganan periferal. Ini kurang berkaitan dengan ukuran kata dan lebih banyak hubungannya dengan jenis dan jumlah sumber daya yang dialokasikan pada setiap chip. Secara umum, Microchip telah mencoba membuat pemrograman perangkat yang sama yang digunakan di berbagai chip yang sama mungkin (misalnya timer0), tetapi akan selalu ada perbedaan. Menggunakan perpustakaan periferal mereka akan menyembunyikan perbedaan-perbedaan ini sebagian besar. Perbedaan terakhir adalah penanganan interupsi. Sekali lagi ada bantuan di sini dari perpustakaan Microchip.

tcrosley
sumber
Mungkin perlu dicatat bahwa pada tingkat bahasa assembly, prosesor 8-bit cenderung memiliki register yang lebih sedikit dan instruksi ortogonal yang lebih sedikit (AVR adalah pengecualian yang lebih RISK), konsekuensi dari kendala desain ketika dikembangkan. Prosesor 32-bit cenderung merupakan keturunan RISC (Renesas 'RX, CISC modern, adalah satu pengecualian, dan ColdFire Freescale turun dari m68k).
Paul A. Clayton
9
Untuk tidak memulai jawaban baru hanya untuk penambahan ini, saya pikir penting untuk menambahkan bahwa transisi dari 32 bit ke 16 dari 16 ke 8 dapat menyebabkan kejutan yang tidak menyenangkan karena aritmatika berhenti menjadi atom. Jika Anda menambahkan dua angka 16 bit pada mikrokontroler 8-bit, dan menggunakannya dalam interupsi, Anda harus berhati-hati membuatnya menjadi thread-safe, jika tidak, Anda mungkin akan menambahkan hanya setengahnya sebelum interupsi memicu, menghasilkan nilai yang tidak valid dalam rutinitas layanan interupsi Anda.
vsz
2
@ vsz - Poin bagus, lupakan yang itu. Umumnya orang harus menonaktifkan interupsi di sekitar akses apa pun (termasuk hanya membaca) variabel volatil yang lebih besar dari ukuran register default.
tcrosley
1
Apakah benar bahwa 32-bit UC biasanya memiliki antarmuka I / O 32-bit? Saya pikir itu lebih umum hanya komunikasi serial.
clabacchio
1
@clabacchio Pengalaman saya adalah bahwa semua register port I / O didefinisikan sebagai 32-bit, tetapi kadang-kadang 16 bit teratas 16-31 tidak digunakan, jadi port paralel masih 16 pin fisik. Dalam kasus lain, seperti register RTCC, semua 32 bit digunakan.
tcrosley
8

Satu perbedaan umum antara mikrokontroler 8-bit dan 32-bit adalah bahwa mikrokontroler 8-bit sering memiliki rentang memori dan ruang I / O yang dapat diakses dalam satu instruksi, terlepas dari konteks eksekusi, sedangkan mikrokontroler 32-bit akan sering membutuhkan urutan multi-instruksi. Sebagai contoh, pada mikrokontroler 8-bit yang khas (HC05, 8051, PIC-18F, dll.) Seseorang dapat mengubah keadaan bit port menggunakan instruksi tunggal. Pada tipikal ARM (32-bit), jika isi register pada awalnya tidak diketahui, urutan instruksi empat instruksi akan diperlukan:

    ldr  r0,=GPIOA
    ldrh r1,[r0+GPIO_DDR]
    ior  r1,#64
    strh r1,[r0+GPIO_DDR]

Dalam sebagian besar proyek, controller akan menghabiskan sebagian besar waktunya melakukan hal-hal selain mengatur atau menghapus bit I / O individu, sehingga fakta bahwa operasi seperti menghapus pin port memerlukan instruksi lebih sering sering tidak masalah. Di sisi lain, ada kalanya kode harus "menggedor-gedor" banyak manipulasi port, dan kemampuan untuk melakukan hal-hal seperti itu dengan satu instruksi dapat membuktikan cukup berharga.

Di sisi lain, pengontrol 32-bit selalu dirancang untuk secara efisien mengakses berbagai jenis struktur data yang dapat disimpan dalam memori. Banyak pengontrol 8-bit, sebagai perbandingan, sangat tidak efisien dalam mengakses struktur data yang tidak dialokasikan secara statis. Pengontrol 32-bit dapat melakukan dalam satu instruksi akses array yang akan mengambil setengah lusin atau lebih instruksi pada pengontrol 8-bit yang khas.

supercat
sumber
Saya menganggap Anda berarti "bit-bang". Mungkin perlu dicatat bahwa ARM mendukung wilayah pita bit (di mana operasi kata adalah operasi bit tunggal) dan Ekstensi Khusus Aplikasi MCU untuk MIPS menyediakan Set Atom / Hapus Bit dalam instruksi Byte (ASET / ACLR).
Paul A. Clayton
@ PaulA.Clayton: Saya belum benar-benar melihat MIPS dalam 20 tahun terakhir; untuk wilayah bit-band, saya tidak pernah menemukan cara untuk menggunakannya dalam kode yang tampak masuk akal, dan bahkan jika saya bisa menggunakannya, mereka hanya akan menyimpan satu instruksi kecuali ada yang menggunakan tipuan pemrograman gila, dalam hal ini mereka mungkin menghemat dua [muat R0 dengan alamat genap atau ganjil berdasarkan apakah bit harus disetel atau dihapus, dan sesuaikan offset pada instruksi toko yang sesuai untuk mengkompensasi]. BTW, apakah Anda tahu mengapa wilayah bit-band menggunakan alamat kata?
supercat
@supercat: Pengalamatan kata memungkinkan Anda mengakses wilayah bit-band dari C atau C ++ melalui subscript penunjuk ( region_base[offset])
Ben Voigt
@ BenVoigt Dan mengapa orang tidak bisa melakukan itu dengan pengalamatan byte? (Mungkin satu alasan yang mungkin adalah untuk menghilangkan harapan / harapan bahwa operasi dua-bit dan empat-bit akan didukung.)
Paul A. Clayton
@ BenVoigt: Harus menskala angka bit dengan faktor 4 akan sering membutuhkan instruksi tambahan. Sebenarnya, apa yang ingin saya lihat, daripada area bit-band, akan menjadi seperangkat beberapa area yang akan duduk di offset tetap relatif terhadap akses memori "normal", tetapi tentukan yang menulis ke satu area akan jika mungkin hanya "mengatur" bit, dan menulis ke yang lain hanya akan "menghapus" bit. Jika bus memiliki bit kontrol "tulis-aktifkan" dan "tulis-nol-aktifkan" yang terpisah, seseorang dapat mencapai hal-hal yang dimungkinkan oleh bit-banding, tetapi dalam banyak kasus menghindari baca-modifikasi-tulis.
supercat
6

Perbedaan praktis terbesar adalah jumlah dokumentasi, sungguh, untuk sepenuhnya memahami seluruh chip. Ada 8-bit mikrokontroler di luar sana yang datang dengan hampir 1000 halaman dokumentasi. Bandingkan dengan sekitar 200-300 halaman yang layak untuk CPU 8 bit tahun 1980 dan chip periferal populer yang akan digunakan dengannya. Perangkat 32 bit yang kaya akan perangkat mengharuskan Anda membaca 2000-10.000 halaman dokumentasi untuk memahami bagian tersebut. Bagian-bagian dengan tepi grafis 3D modern pada 20k halaman dokumentasi.

Dalam pengalaman saya, dibutuhkan sekitar 10x selama mengetahui semua yang perlu diketahui tentang pengontrol 32 bit modern yang diberikan seperti halnya untuk bagian 8 bit modern. Maksud "segalanya" Maksud saya, Anda tahu cara menggunakan semua periferal, bahkan dengan cara yang tidak konvensional, dan tahu bahasa mesin, perakit yang digunakan platform serta alat lainnya, ABI (s), dll.

Sama sekali tidak terbayangkan bahwa banyak, banyak desain dilakukan dengan pemahaman parsial. Terkadang tidak penting, terkadang tidak. Switching platform harus dilakukan dengan pemahaman bahwa akan ada harga jangka pendek dan menengah dalam produktivitas yang Anda bayar untuk keuntungan produktivitas yang dirasakan dari arsitektur yang lebih kuat. Lakukan uji tuntas Anda.

Pasang kembali Monica
sumber
3

Saya pribadi tidak akan terlalu khawatir tentang peningkatan (8bit-> 32bit) UC dari keluarga yang sama dan Anda meningkatkan spesifikasi di seluruh papan. Secara umum, saya tidak melakukan apa pun di luar norma dengan tipe data karena mungkin sulit untuk mempertahankan jalan.

Menurunkan kode perangkat adalah cerita yang berbeda.

Nick Tullos
sumber
3
Ukuran tipe data ditentukan oleh kompiler, bukan arsitektur prosesor. Prosesor 8-bit dapat memiliki int 32-bit, meskipun itu akan membutuhkan banyak instruksi untuk memanipulasinya.
Joe Hass
komentar yang bagus - Saya menghapus baris pertama karena koreksi.
Nick Tullos
@JoeHass: Sebuah compiler untuk prosesor 8-bit bisa mendefinisikan intmenjadi 32 bit, atau bahkan 64 dalam hal ini, tapi aku tidak menyadari setiap ada kompiler 8-bit yang sebenarnya tidak menentukan intlebih besar dari 16 bit, atau mempromosikan Nilai 16 bit untuk sesuatu yang lebih besar.
supercat
-1

MCU 32-bit akan memakan lebih banyak daya untuknya. Dan membutuhkan lebih banyak sirkuit dukungan.

Seseorang tidak benar-benar beralih ke 32-bit dari 8-bit ... Anda akan tetap menggunakan keduanya, sering bersama-sama. Intinya adalah Anda harus menggunakan (dan belajar) apa pun yang sesuai untuk pekerjaan itu. Pelajari ARM karena baik itu mengguncang dunia tertanam sekarang dan akan terus melakukannya. Pelajari juga AVR atau PIC karena mereka adalah pengontrol papan yang mengagumkan.

Anda mungkin akan mengalami banyak kesulitan beralih dari AVR ke ARM seperti halnya dari ARM ke x86, ukuran bus benar-benar tidak membuat banyak perbedaan. Namun, semua perangkat keras canggih lainnya. Beralih dari interupsi standar ke array interupsi vektor dengan 6 tingkat prioritas akan jauh lebih sulit daripada mencari cara menghitung hingga empat miliar.

Hugo
sumber
4
Saya tidak tahu apakah akurat untuk mengklaim 32 bit MCU pada dasarnya lebih haus daya. Paling tidak satu lini produk perusahaan ( energi mikro ) adalah MCU berdaya sangat rendah, dan semuanya berbasis ARM 32-bit.
Connor Wolf
3
Baru saja mengerjakan sirkuit stm32l1 yang akan berjalan selama 7 tahun pada cr2032
Scott Seidman
2
Bisakah Anda membenarkan komentar bahwa MCU 32-bit membutuhkan lebih banyak "sirkuit dukungan"? Saya pikir Anda mengungkapkan beberapa pendapat yang tidak bisa dibenarkan di sini.
Joe Hass
1
Juga, komentar interupsi vektor Anda tidak masuk akal, karena Anda bisa mendapatkan beberapa tingkat prioritas dalam mikrokontroler 8-bit (lihat Atmel xmega MCU, yang memiliki 3 level prioritas), dan interupsi vektor tidak relevan ketika setiap perangkat perangkat keras memiliki itu. memiliki vektor independen.
Connor Wolf
2
Saya menggunakan prosesor Cortex-M0 32-bit untuk mengontrol pengisi baterai pintar untuk kendaraan listrik. Ia menggunakan pasokan 3,3 V tunggal. Ini memiliki osilator internal dan PLL jadi saya bahkan tidak perlu kristal. Saya menggunakan paket DIP 28-pin tapi saya bisa mendapatkan Cortex-M0 dalam DIP 8-pin jika saya mau. Bagaimana itu bisa lebih kompleks daripada PIC atau AVR yang khas?
Joe Hass