Mengapa kita memerlukan program terpisah dalam memori program flash yang sama dari mikrokontroler, khususnya STM32F103, yang disebut bootloader?
Apa yang istimewa tentang itu agar tetap terpisah dari program aplikasi utama?
Secara umum, apakah bootloader dari sistem berbasis mikroprosesor (katakanlah PowerPC MPC8270) melakukan pekerjaan yang sama dengan mikrokontroler (katakanlah STM32F103 ARM) atau apakah mereka melakukan pekerjaan yang secara fundamental berbeda satu sama lain namun keduanya disebut 'bootloader' ?
microcontroller
stm32
programming
flash
bootloader
alt-rose
sumber
sumber
Jawaban:
Bootloader pada mikrokontroler bertanggung jawab untuk memperbarui firmware utama melalui saluran komunikasi selain dari header pemrograman. Ini berguna untuk memperbarui firmware di lapangan melalui BLE, UART, I2C, kartu SD, USB, dll. Akan sangat merepotkan untuk meminta pelanggan membeli programmer hanya untuk memperbarui firmware pada perangkat mereka.
Alasan mengapa bootloader disimpan terpisah adalah untuk keandalan. Bootloader dan kode aplikasi ditempatkan di bagian flash yang terpisah, sehingga kode aplikasi dapat dihapus dan ditulis ulang oleh bootloader tanpa mengubah apa pun yang terkait dengan kode bootloader.
Jika bootloader dan aplikasi disimpan bersama, maka kode bootloader perlu disalin ke RAM sebelum dapat berjalan, karena setiap pembaruan firmware akan menghapus kode bootloader di flash. Jika daya terputus dengan kode bootloader dalam RAM dan flash terhapus, perangkat akan mati.
sumber
main()
fungsinya sendiri. Saat menghidupkan kode bootloader berjalan dan memanggil bootloadermain()
. Program bootloader memeriksa program aplikasi yang valid dan kemudian melompat ke kode startup program aplikasi yang memanggil program aplikasimain()
. Setiap kode startup program menginisialisasi lingkungan run-time C untuk masing-masing program (yaitu menginisialisasi variabel, stack, dll.) Dan biasanya, tidak ada program yangmain()
pernah kembali ke kode startup.main
sama sekali.Sehingga proses loading dapat pulih dari kesalahan. Misalkan ada kesalahan komunikasi atau power terputus saat upgrade. Jika boot loader adalah bagian dari aplikasi yang Anda perbarui maka pengguna tidak akan dapat mencoba lagi tanpa menggunakan perangkat keras khusus untuk memantulkan kembali ke boot loader.
Beberapa mikrokontroler tidak dapat menjalankan kode dari RAM. Jika boot loader digabungkan dengan sisa perangkat lunak maka Anda sebenarnya tidak akan dapat memutakhirkan perangkat lunak Anda karena Anda tidak dapat menghapus halaman flash yang sedang Anda jalankan. Cara mengatasinya adalah pertama membakar kode baru ke bagian kedua dari flash, kemudian melompat ke sana. Kode baru kemudian menyalin dirinya sendiri ke bagian pertama flash. Tentu saja downside adalah bahwa membakar flash biasanya lambat dan sekarang Anda harus melakukannya dua kali proses pemuatan mungkin memakan waktu hingga dua kali lebih lama. Solusi ini juga membatasi ukuran aplikasi Anda menjadi tidak lebih besar dari setengah total flash Anda.
Pemuat boot yang ditulis dengan baik mencoba memverifikasi bahwa kode yang valid ada pada perangkat sebelum mencoba untuk mengeksekusinya. Jika boot loader dan kode lain dicampur bersama, lalu bagaimana Anda bisa yakin bahwa rutin validasi Anda akan berfungsi jika semua kode tidak dimuat?
Otentikasi. Loader boot yang aman mencoba memverifikasi bahwa aplikasi yang dimuat cocok dengan tanda tangan digital sebelum dieksekusi. Tetapi jika boot loader dan kode lainnya dicampur bersama maka Anda tidak dapat mengontrol apa yang berjalan pada perangkat karena sekali pengguna memuat kode baru Anda tidak dapat mengontrol apa yang terjadi pada saat startup.
sumber
Biasanya ada di sana untuk memungkinkan Anda memperbarui program aplikasi utama Anda.
Anda memerlukan beberapa kode yang tahu cara menghapus dan memprogram ulang beberapa flash internal, itu tidak bisa menjadi program utama seperti ketika itu terhapus sendiri itu tidak akan dapat memprogram ulang.
sumber
Bootloader memungkinkan MCU untuk berkomunikasi dengan sesuatu yang lain untuk menerima program baru, menyimpannya, dan menjalankannya setelah reset. Jika Anda tidak memiliki bootloader, maka Programmer diperlukan untuk mengakses memori dan menempatkan program pada tempatnya.
sumber
Selain jawaban yang benar lainnya tentang mengizinkan pemrograman ulang firmware utama dari bootloader, manfaat lain dari memisahkan bootloader adalah bahwa Anda dapat secara logis memisahkan tugas "lakukan sekali boot" dari kode yang Anda perlukan selama runtime. Kemudian, setelah bootloader menyelesaikan tugas konfigurasi awalnya, firmware utama dapat mengusir bootloader dengan semua kode yang tidak diperlukan lagi dari memori, menghemat ruang RAM yang signifikan. Mungkin untuk mencapai hal ini dengan cara lain, tetapi pemisahan bootloader / firmware membuatnya lebih mudah pada banyak arsitektur.
sumber
Jawaban singkatnya adalah karena perangkat lunaknya mengagumkan.
Anda dapat memiliki segalanya yang bootloader lakukan sebagai "perangkat keras murni". Tetapi jauh, jauh, jauh lebih mudah untuk memiliki tugas-tugas bootloader ditulis sebagai perangkat lunak, kemudian ditafsirkan oleh perangkat keras.
Tugas-tugas ini dapat melibatkan pengaturan perangkat keras untuk menjalankan perangkat lunak "nyata" (misalnya, pada Raspberry Pi (melalui @ErikF)), memiliki protokol untuk mengganti program "nyata" sebelum dijalankan (periksa pin, jika pin diatur kemudian reflash program yang sebenarnya), atau bahkan mengatur lingkungan perangkat lunak untuk program "nyata".
Pada perangkat lunak skala mikro yang lebih sedikit, ketika Anda menjalankan executable, pemuat pemuat aplikasi melakukan hal-hal seperti memuat bagian data Anda ke dalam memori, kadang-kadang memperbaiki alamat, mengatur argumen untuk hal-hal global utama atau lainnya, memutar pustaka yang disediakan OS Anda, dan kemudian melompat ke awal
_main
kode. Beberapa dari hal ini dapat dilakukan oleh bootloader.Dalam mikrokontroler, beberapa tugas yang dilakukan oleh bootloader dapat dibagi ke dalam program. Kompiler untuk platform Anda dapat secara otomatis menyuntikkan kode "pengaturan" ke setiap yang dapat dieksekusi.
Namun, memasukkannya ke dalam bootloader berarti bahwa kompiler yang sama dapat bekerja pada perangkat keras yang berbeda, karena bootloader dapat "menyembunyikan" perbedaan antara platform.
Ditambah lagi dengan fakta bahwa flash program utama tidak mengambil risiko bootloader (dan kemampuan untuk merombak program utama), dan memiliki bootloader non-sepele adalah hal yang cukup hebat.
sumber
Salah satu jawaban yang belum dibahas adalah perlunya pemisahan kekhawatiran karena keterbatasan bahasa C.
Umumnya bootloader ditulis dalam campuran Assembly dan C, dengan tahap boot awal di Assembly.
Ini dilakukan untuk mengatur hal-hal tertentu seperti:
Ini adalah perkiraan kasar dari langkah-langkah yang diambil dan saya menggambarkan proses boot ARM, berbeda lagi untuk x86 dan arsitektur lainnya.
Namun, alasan prinsipnya tetap sama: mengalokasikan C stack harus dilakukan dari perakitan.
sumber
Salah satu bagian dari pertanyaan yang belum dijawab sejauh ini adalah perbedaan antara bootloader pada mikrokontroler dan sistem mikroprosesor.
Mikrokontroler
Sebagian besar mikrokontroler memiliki memori ROM bawaan yang berisi kode program mereka. Mengubah kode ini biasanya memerlukan perangkat programmer yang terhubung ke antarmuka pemrograman mikrokontroler (misalnya ISP pada ATMega). Tetapi antarmuka pemrograman ini biasanya sering tidak nyaman digunakan, dibandingkan dengan antarmuka lain, karena mereka mungkin tidak tersedia dalam konteks yang diberikan. Jadi misalnya, sementara hampir setiap komputer memiliki port USB, antarmuka SPI yang diperlukan untuk ISP jauh lebih jarang, dan antarmuka lain seperti antarmuka PID yang digunakan pada ATXMega hanya didukung oleh perangkat keras pemrograman khusus.
Jadi, misalnya, jika Anda ingin memperbarui perangkat lunak dari komputer biasa tanpa perangkat keras eksternal, Anda dapat menggunakan bootloader yang membaca dari berbagai jenis antarmuka (misalnya RS232, USB atau RS232 melalui USB seperti pada Arduino) untuk memprogram perangkat lebih dari antarmuka umum.
Yang mengatakan, jika Anda tidak memerlukan fungsi ini, bootloader sepenuhnya opsional. Mikrokontroler masih dapat menjalankan kode sepenuhnya tanpa bootloader.
Mikroprosesor
Pada mikroprosesor hal-hal sedikit berbeda. Sementara sebagian besar mikroprosesor memiliki ROM yang cukup besar untuk bootloader, ROM tersebut hampir tidak cukup besar untuk menampung OS penuh. Jadi tujuan dari bootloader adalah untuk menginisialisasi perangkat keras, mencari OS yang dapat di-boot, memuatnya dan menjalankannya. Jadi bootloader sangat penting untuk setiap boot tunggal.
Pada sistem x86 / x64, bootloader ini adalah BIOS atau UEFI (pada dasarnya versi BIOS yang lebih baru).
Kadang-kadang Anda bahkan mungkin memiliki beberapa bootloader berjalan dalam sebuah rantai. Sebagai contoh jika Anda memiliki sistem dual-boot dengan Windows dan Linux Anda mungkin berakhir dengan yang berikut:
Jadi dalam hal ini ada tiga buah perangkat lunak yang dapat dianggap sebagai bootloader. GRUB dan Windows Bootloader sebagian besar ada di sana untuk memberi pengguna pilihan pilihan booting yang lebih nyaman daripada yang diberikan BIOS / UEFI. Hal ini juga memungkinkan beberapa OS diluncurkan dari hard drive yang sama atau bahkan dari partisi yang sama.
TLDR
Jadi sementara di kedua sistem, bootloader melakukan hal-hal yang agak mirip (membantu pengguna memilih kode untuk boot), keduanya sangat berbeda dalam hal bagaimana mereka mencapai itu dan apa yang mereka lakukan dengan tepat.
sumber