Mengapa kita perlu bootloader terpisah dari program aplikasi kita di mikrokontroler?


28

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' ?


2
alasan yang sama Anda memiliki chip dan bagian-bagian individual dan bukan satu struktur monolitik raksasa
Emobe

Kamu tidak. Cukup masukkan program Anda dengan sakelar dan lampu di konsol komputer.
Hot Licks

1
Sebenarnya Anda tidak perlu program bootloader terpisah pada mikrokontroler. Tetapi kita paling sering memilih untuk memilikinya untuk fungsi utilitas tambahan yang ditawarkannya. Jika fungsi-fungsi ini tidak diperlukan, tidak diinginkan, maka Anda dapat menghapus bootloader. Bootloader mikrokontroler biasanya digunakan untuk membakar program baru ke dalam flash. Kadang-kadang dapat digunakan untuk fungsi debugging, beberapa breakpoints dukungan dan fungsi menyenangkan lainnya. Pada komputer mikro, biasanya bootloader memuat program dari memori massal dan akan diperlukan di sana.
ghellquist

Jawaban:


55

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.


3
Alasan kita sama. Mereka berada dalam flash yang sama tetapi bootloader sejajar dengan flash erase-dan cukup pintar untuk hanya menghapus flash lebih tinggi dari alamatnya sendiri.
Yosua

3
Dalam beberapa kasus, header pemrograman mikroprosesor mungkin sebenarnya tidak dapat diakses tanpa harus membongkar sasis produk, sehingga dapat memprogram ulang melalui comms bus tanpa perangkat keras tambahan merupakan faktor kunci untuk keandalan.
John Go-Soco

6
@ alt-rose Bootloader dan program aplikasi adalah program yang dikompilasi secara terpisah, masing-masing dengan kode startup dan main()fungsinya sendiri. Saat menghidupkan kode bootloader berjalan dan memanggil bootloader main(). Program bootloader memeriksa program aplikasi yang valid dan kemudian melompat ke kode startup program aplikasi yang memanggil program aplikasi main(). Setiap kode startup program menginisialisasi lingkungan run-time C untuk masing-masing program (yaitu menginisialisasi variabel, stack, dll.) Dan biasanya, tidak ada program yang main()pernah kembali ke kode startup.
kkrambo

1
@ alt-rose: Dengan cara yang sama CPU mendapatkan alamat awal bootloader - tidak. Sebagai gantinya, CPU menentukan apa yang akan digunakan sebagai alamat awal bootloader, dan bootloader menentukan apa yang akan digunakan sebagai alamat awal dari program aplikasi.
MSalters

4
@kkrambo Meskipun secara umum benar, tidak ada persyaratan (atau fakta universal universal) bahwa bootloader ditulis dalam bahasa C atau bahasa yang diturunkan dengan huruf C mainsama sekali.
Yakk

26
  1. 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.

  2. 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.

  3. 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?

  4. 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.


4
Sebagai contoh poin 2, beberapa mikrokontroler mungkin bahkan tidak memiliki RAM yang dapat diakses saat startup: misalnya, Raspberry Pi menggunakan GPU-nya untuk memuat bootloader dari kartu SD, yang kemudian memungkinkan prosesor dan memori ARM.
ErikF

11

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.


9

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.


2
Cukup banyak. MCU hanya bisa mendapatkan kode melalui subsistem pemrograman khusus (seperti AVRICE atau JTAG) atau dengan sudah memiliki bootloader di flash. Ini adalah keputusan aplikasi seberapa kompleks bootloader, misalnya beberapa sistem dapat memuat kode dari WiFi. Pada MCU yang sangat rendah seperti ATTiny, bootloader (dan pin serial) adalah overhead yang besar, jadi Anda selalu menggunakan programmer.
Kaya

7

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.


1
Pada mikrokontroler, kode kemungkinan besar tidak pernah ada dalam RAM, sehingga tidak dapat digusur. Tentu saja Anda dapat membuang data bootloader dari RAM.
Ben Voigt

@ BenVoigt, itu tergantung pada mikrokontroler. Beberapa (terutama yang dengan flash NOR) akan membiarkan Anda mengeksekusi langsung dari flash, tetapi yang lain (biasanya dengan flash NAND, yang menjadi lebih umum) mengharuskan Anda untuk mengeksekusi dari RAM. Kadang-kadang bahkan tidak ada flash on-board, dan Anda harus menyalin kode dari chip flash eksternal ke SRAM lokal sebelum Anda dapat menjalankan apa pun.
Nate S - Pasang kembali Monica

2

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 _mainkode. 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.


-1

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:

  • mengalokasikan tumpukan C
  • membaca stack pointer ke register
  • membaca penghitung program ke dalam register
  • mendeklarasikan ulang vektor
  • memuat tahap kedua (initramfs) ke dalam RAM.

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.


Mengapa downvote? Ini relevan dan akurat.
BitShift

-1

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:

  • BIOS / UEFI melakukan booting dan menemukan GRUB terpasang. Itu kemudian memuat GRUB (= Grand Unified Bootloader)
  • GRUB menemukan beberapa jenis Linux dan Windows Bootloader. Pengguna memilih Bootloader Windows.
  • Bootloader Windows mulai dan menemukan Windows 7 dan Windows 10 diinstal. Pengguna memilih Windows 10.
  • Windows 10 akhirnya melakukan booting.

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.


Meskipun berguna untuk membedakan sistem dengan penyimpanan acak (ROM atau flash) akses-acak yang cukup untuk menahan seluruh program dari yang perlu menjalankan kode dari RAM, ada mikrokontroler dari kedua jenis dan mikroprosesor dari kedua jenis.
supercat

Tentu saja perbedaan antara mikrokontroler dan mikroprosesor bukanlah batas yang keras dan beberapa mikrokontroler berperilaku lebih seperti mikroprosesor dan sebaliknya. Itu sebabnya saya mengambil AtMega / Arduino dan x86 / x64 sebagai contoh, karena mereka berperilaku seperti itu.
Dakkaron

"mikroprosesor memiliki ROM yang cukup besar untuk sebuah bootloader ... Pada sistem x86 / x64, bootloader ini adalah BIOS atau UEFI" Tidak. BIOS atau UEFI disimpan dalam memori flash off-chip. ROM on-chip bahkan untuk fungsi level yang lebih rendah, seperti inisialisasi mikrokode.
Ben Voigt

@ Dakkaron: Saya akan menarik garis antara mikroprosesor dan mikrokontroler berdasarkan apakah chip dirancang untuk dapat digunakan untuk tujuan non-sepele tanpa hal lain di bus alamat. The 8031 ​​tidak akan memenuhi syarat kecuali bahwa itu secara fungsional 8051 (yang jelas merupakan mikrokontroler) yang tidak ditentukan memiliki sesuatu yang berguna dalam ROM internal, tetapi sebaliknya akan dirancang untuk dapat digunakan sepenuhnya dari penyimpanan internal). Sesuatu seperti RCA / CDP 1802 tidak akan memenuhi syarat meskipun dapat digunakan untuk menggerakkan kartu nama LED ...
supercat

... tanpa RAM dan ROM eksternal, karena desain RAMless / ROMless terbatas pada tugas-tugas sepele. Sesuatu seperti TMS 32050 yang jika saya ingat memiliki bootloader dan beberapa ribu kata kata-kata 16-bit RAM secara internal akan memenuhi syarat sebagai mikrokontroler; walaupun banyak aplikasi akan membutuhkan lebih banyak menambahkan lebih banyak RAM, jika terhubung melalui UART ke sistem lain itu dapat melayani banyak tujuan tanpa apa-apa di bus memorinya.
supercat
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.