Arduino Bootloader Detayları


11

Birisi Arduino önyükleyicinin nasıl çalıştığını açıklayabilir mi? Burada üst düzey bir cevap aramıyorum, kodu okudum ve özünü aldım. Ayrıca bu diğer yazı okudum (hatta cevap verenlerden biri olmuştu).

Arduino IDE ve önyükleyici kodu arasında gerçekleşen bir grup protokol etkileşimi vardır, sonuçta seri seri üzerinden iletilen programla flaşı kendi kendine programlayan bir dizi satır içi montaj talimatı ile sonuçlanır.

Açık olmadığım şey 270. satırda:

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

... bir fonksiyon göstergesinin bildirimi ve NULL olarak başlatılması olarak tanıyorum. Önyükleyicinin kullanıcı tarafından yüklenen kodun yürütülmesine delege edeceği yerlerde app_start'a sonraki çağrılar yapılır.

Elbette, bir şekilde bunun bir araya app_startgelmesi için bir şekilde NULL olmayan bir değer alması gerekiyor. Bootloader kodunda görmüyorum ... sihirli bir bootloader tarafından yüklenen program tarafından bağlı mı? Ben önyükleyicinin ana çip sıfırlandıktan sonra yazılıma giriş noktası olduğunu düşünüyorum.

70 ya da daha fazla montaj hattına sarılmış, ana programa app_start'ın gerçekten nerede olduğunu söyleyen gizli dekoder halkası olmalı? Ya da belki Arduino IDE'den faydalanmak örtük bir bilgi birikimidir? Bildiğim tek şey, eğer birisi 0 dışında bir yere işaret etmek için app_start değiştirmezse, bootloader kodu sadece sonsuza dek kendi kendine dönecekti ... peki hile nedir?

Ayrı bir notta, bootloader kodunun kesintilere dayanması mümkün mü yoksa hayır mı?

Düzenle

Bootloader önyükleme yükleyici kodu için ayrı bir bellek alanı olmayan bir Tiny AVR (özellikle ATTiny44A) taşımak için çalışırken ilgileniyorum. Bootloader kodunun belirli sigorta ayarlarına ve çip desteğine dayandığı anlaşılır hale geldiğinde, gerçekten ilgilendiğim şeyin, bootloader'ı bu sigortalara ve donanıma sahip olmayan bir çipe taşımak için ne yapması gerektiğini tahmin ediyorum. destek (ama yine de kendi kendine programlama özelliği vardır)?

USI'yi yarı çift yönlü bir UART olarak kullanmak için AVR307 uygulamasını kullanabileceğimi düşünüyordum (Timer0 kesme ve pin değiştirme kesme kullanır). Herkes, bootloaderlar için donanım desteği olmayan bir yonga için bootloader kodunu yazma / taşıma hakkında nasıl rehberlik sunabilir?

Bootloader kodumu adres ana (örneğin 0x029e veya derleyici ana koyar) için normal konuma koymak istiyorum. Öyleyse, bootloader kodundaki 'adres', beni ana sonun sonundan geçmiş bir ofset ekledi ve bu adrese 'app_start' ayarladı. Bunu doğru düşünüyor muyum yoksa tamamen bir şey mi kaçırıyorum? Teşekkürler!

DÜZENLEME 2

FWIW, Arduino skeçlerini ATTiny85'e nasıl yükleyeceğime dair belgelenmiş bir süreç buldum , ki bu soruya ilk başta gittiğim yer ...


1
stackoverflow.com/questions/3652233/arduino-bootloader/… Cevabımın nereye gittiğini merak ediyordum ...
Nick T

Yanıtlar:


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

Bu bir BOŞ işaretçi değil. Bu gerçekten önyükleyicinin atladığı uygulama kodunun başlangıcının adresidir. Bağlayıcı, uygulama kodunuzun 0 adresinden başlamasını düzenler. ATMEGA168 veri sayfasındaki tablo 26-6'ya bakın.

Bootloader kodu flaşta daha yüksek başlar. Tam olarak bootloader sigortalarına bağlıdır.


bootloader ana kodu nerede yaşıyor ...
vicatcu

1
@Joby, ah tamam ... sorumun güncellemesine bakın - Bootloader'ı boot loader kodu için ayrı bellek alanı olmayan bir Tiny AVR'ye aktarmaya çalışmak istiyorum.
vicatcu

1
@Joby, böylece bootloader kodu "... Boot Reset Sigortası, sıfırlamadan sonra Reset Vector öğesinin Boot Flash başlangıç ​​adresini gösterecek şekilde programlanabilir. Bu durumda, bir resetlemeden sonra Boot Loader başlatılır. "
vicatcu

3
Arduino önyükleyicisini özellikle istiyor musunuz? Bir STK500 programlayıcısına öykünür ve bu nedenle biraz hantaldır. Bootcloader dizininde gcc-3 ile 1K'nin altında derlenen bir atmega8 sürümü var, ancak bu bile mevcut flaşta oldukça kısa kalıyor.
Peter Gibson

3
hatta gerçekten bir önyükleyici yükleyici ister misiniz? şüphesiz bir ATTiny için cihazı bir ICSP programcısı (usbTinyISP gibi) kullanarak programlama çabanız daha muhtemeldir
SingleNegationElimination
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.