Rincian Bootloader Arduino

11

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_startperlu 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

vicatcu
sumber
1
stackoverflow.com/questions/3652233/arduino-bootloader/... Bertanya-tanya ke mana jawaban saya pergi ...
Nick T

Jawaban:

12
void (*app_start)(void) = 0x0000; 

Ini bukan pointer NULL. Ini benar-benar alamat awal kode aplikasi, yang menjadi tujuan bootloader. Linker mengatur kode aplikasi Anda untuk mulai di alamat 0. Lihat tabel 26-6 di lembar data ATMEGA168.

Kode bootloader mulai lebih tinggi dalam flash. Di mana tepatnya tergantung pada sekering bootloader.

Toby Jaffey
sumber
di mana kode utama bootloader berada kemudian ...
vicatcu
1
@Joby, ah ok ... lihat pembaruan untuk pertanyaan saya - Saya tertarik mencoba port bootloader ke Tiny AVR yang tidak memiliki ruang memori terpisah untuk kode boot loader.
vicatcu
1
@Joby, jadi kode bootloader bergantung pada "... Boot Reset Fuse dapat diprogram sehingga Reset Vector menunjuk ke alamat mulai Boot Flash setelah reset. Dalam hal ini, Boot Loader dimulai setelah reset. "
vicatcu
3
Apakah Anda secara khusus menginginkan bootloader Arduino? Ini mengemulasi programmer STK500 dan karena itu agak besar. Ada versi atmega8 di dir bootloader yang mengkompilasi di bawah 1K dengan gcc-3, tetapi bahkan itu akan membuat Anda cukup kekurangan pada flash yang tersedia.
Peter Gibson
3
apakah Anda benar-benar ingin boot loader sama sekali? tentunya untuk ATTiny, itu lebih mungkin sebanding dengan usaha Anda untuk memprogram perangkat menggunakan programmer ICSP (seperti usbTinyISP)
SingleNegationElimination