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?
microcontroller
programming
quantum231
sumber
sumber
Jawaban:
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.
sumber
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:
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.
sumber
region_base[offset]
)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.
sumber
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.
sumber
int
menjadi 32 bit, atau bahkan 64 dalam hal ini, tapi aku tidak menyadari setiap ada kompiler 8-bit yang sebenarnya tidak menentukanint
lebih besar dari 16 bit, atau mempromosikan Nilai 16 bit untuk sesuatu yang lebih besar.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.
sumber