Bisakah seseorang tolong jelaskan bagaimana bootloader Arduino bekerja? Saya tidak mencari jawaban tingkat tinggi di sini, saya sudah membaca kode dan saya mendapatkan intinya. Saya juga membaca posting lain ini (saya bahkan pernah menjadi salah satu responden).
Ada banyak interaksi protokol yang terjadi antara Arduino IDE dan kode bootloader, yang akhirnya menghasilkan sejumlah instruksi perakitan inline yang memprogram sendiri flash dengan program yang ditransmisikan melalui antarmuka serial.
Yang saya tidak jelas adalah pada saluran 270:
void (*app_start)(void) = 0x0000;
... yang saya kenali sebagai deklarasi, dan inisialisasi ke NULL, dari sebuah pointer fungsi. Ada panggilan berikutnya ke app_start di tempat-tempat di mana bootloader dimaksudkan untuk mendelegasikan eksekusi kode yang dimuat pengguna.
Tentunya, bagaimanapun juga app_start
perlu mendapatkan nilai non-NULL di beberapa titik agar semua ini bisa bersatu. Saya tidak melihat bahwa dalam kode bootloader ... apakah secara ajaib ditautkan oleh program yang dimuat oleh bootloader? Saya menduga bahwa utama dari bootloader adalah titik masuk ke dalam perangkat lunak setelah reset chip.
Dibungkus dalam 70 atau lebih jalur perakitan harus cincin dekoder rahasia yang memberitahu program utama di mana app_start sebenarnya? Atau mungkin itu beberapa pengetahuan implisit yang dimanfaatkan oleh IDE Arduino? Yang saya tahu adalah jika seseorang tidak mengubah app_start untuk menunjuk ke suatu tempat selain 0, kode bootloader akan berputar sendiri selamanya ... jadi apa masalahnya?
Pada catatan terpisah, mungkinkah kode bootloader mengandalkan interupsi atau apakah itu tidak boleh?
Edit
Saya tertarik mencoba port bootloader ke Tiny AVR (khususnya ATTiny44A) yang tidak memiliki ruang memori terpisah untuk kode boot loader. Karena menjadi jelas bagi saya bahwa kode bootloader bergantung pada pengaturan sekering dan dukungan chip tertentu, saya kira apa yang saya benar-benar tertarik untuk mengetahui adalah apa yang diperlukan untuk port bootloader ke chip yang tidak memiliki sekering dan perangkat keras dukungan (tetapi masih memiliki kemampuan pemrograman mandiri)?
Saya berpikir saya bisa menggunakan implementasi AVR307 untuk menggunakan USI sebagai UART setengah dupleks (menggunakan interupsi Timer0, dan interupsi pin-perubahan). Adakah yang bisa menawarkan panduan tentang cara menulis / porting kode bootloader untuk sebuah chip yang tidak memiliki dukungan perangkat keras untuk bootloader?
Saya kira saya akan meletakkan kode bootloader saya di lokasi normal untuk alamat utama (misalnya 0x029e atau di mana pun kompiler meletakkan utama). Saya kemudian akan membuatnya sehingga 'alamat' dalam kode bootloader menambahkan offset yang membuat saya hanya melewati akhir main, dan mengatur 'app_start' ke alamat itu. Apakah saya memikirkan ini dengan benar atau saya benar-benar kehilangan sesuatu? Terima kasih!
EDIT 2
FWIW, saya menemukan proses yang terdokumentasi untuk cara memuat sketsa Arduino ke ATTiny85 , yang mana saya awalnya akan dengan pertanyaan ini ... cukup rapi saya pikir