Bir önyükleyici nedir ve nasıl geliştirebilirim?


53

Bir AVR mikroişlemcisinin bir bootloader (Arduino gibi) ile kullandığı birçok projeyle tanıştım, ancak konsepti çok iyi anlamıyorum.

Bir önyükleyici nasıl yapabilirim (herhangi bir mikrodenetleyici için)?

Bootloader'ımı yazdıktan sonra, mikro denetleyiciye nasıl programlanır (AVR'nin flaşında yanmış herhangi bir .hex programı veya başka bir yöntem gibi)?


10
Sen onu etiketlenmiş bootloader Buna katlanmak okudun, etiketinin? Öyleyse, Arduino Bootloader , Arduino Bootloader Follow On , Arduino Bootloader , Bootloader'ın yapısını anlamak için iyi araçlar veya yöntemler ve Arduino Bootloader Details hakkındaki soruları okudunuz mu? Bunların hepsi ilk sorunuzun kısımlarını ele alıyor. Onu yeni şeylere kestim.
Kevin Vermeer


2
@KevinVermeer Bence sorusu daha kolay.
richieqianle

Yanıtlar:


103

Bir önyükleyici, programlanacak mikrodenetleyicide çalışan bir programdır. Bazı iletişim araçları aracılığıyla harici olarak yeni program bilgisi alır ve bu bilgiyi işlemcinin program hafızasına yazar.

Bu, programı mikro-denetleyiciye sokmanın normal yolunun aksinedir; PIC’lerde bu, SPI benzeri bir arayüzdür. Doğru hatırlıyorsam, AVR'ler Jtag kullanıyor veya en azından bir kısmı kullanıyor. Her iki durumda da, bilgileri program belleğine tam olarak yazmak için programlama pimlerini sıkıştıran bazı harici donanımlar gerekir. Program hafızasının içeriğini tanımlayan HEX dosyası genel amaçlı bir bilgisayara dayanmaktadır, bu nedenle bu donanım bir tarafındaki bilgisayara ve diğer taraftaki mikro özel programlama pimlerine bağlanmaktadır. Şirketim PIC programcılarını başka şeylerin yanı sıra bir çizgi çiziyor, bu yüzden PIC'lerde bu süreci çok iyi biliyorum.

Özel programlama yoluyla harici programlamanın önemli noktası, mevcut program belleği içeriğinden bağımsız olarak çalışmasıdır. Mikrodenetleyiciler silinmiş program belleği ile veya bilinmeyen bir durumda başlar, bu nedenle ilk programlama bir mikro programa girmenin tek yolu dış programlamadır.

Ürününüze yüklemek istediğiniz programdan eminseniz ve hacimleriniz yeterince yüksekse, üreticiye veya bir distribütör programına sizin için uygun fişler alabilirsiniz. Çip, diğer çipler gibi tahtaya lehimlenir ve ünite çalışmaya hazırdır. Bu, örneğin bir oyuncak gibi bir şey için uygun olabilir. Üretici yazılımı bir kez yapıldığında, hemen hemen yapılır ve büyük hacimlerde üretilir.

Birimleriniz daha düşükse veya daha da önemlisi, devam eden ürün yazılımı gelişimi ve hata düzeltmeleri beklenirse, önceden programlanmış fiş satın almak istemezsiniz. Bu durumda, tahtaya boş talaşlar monte edilir ve ürün yazılımının çip üzerine üretim işleminin bir parçası olarak yüklenmesi gerekir. Bu durumda, donanım programlama hatları bir şekilde kullanıma sunulmalıdır. Bu, açık bir konektör veya bir üretim testi fikstürü oluşturmak için istekli iseniz pogo pin pedleri aracılığıyla olabilir. Çoğu zaman bu tür ürünler yine de test edilmeli ve belki de kalibre edilmelidir, bu nedenle programı işlemciye yazmanın ek maliyeti genellikle asgari düzeydedir. Bazen küçük işlemciler kullanıldığında, ilk önce işlemciye özel bir üretim test yazılımı yüklenir. Bu, ünitenin test edilmesini ve kalibrasyonunu kolaylaştırmak için kullanılır, daha sonra, donanımın iyi olduğu bilindikten sonra gerçek ürün yazılımı yüklenir. Bu durumda, programlama işleminin çalışması için programlama hatlarına yeterince erişime izin vermek, ancak aynı zamanda devreyi çok fazla rahatsız etmemek için bazı devre tasarımı hususları vardır. Bununla ilgili daha fazla ayrıntı için benimdevre içi programlama yazması.

Şimdiye kadar çok iyi ve hiçbir önyükleyici gerekli. Ancak, alanın yükseltilmesini istediğiniz veya son müşterinin yükseltmesine izin vermesini istediğiniz nispeten karmaşık bellenime sahip bir ürünü düşünün. Son müşteriden bir programcı gadget'ı olmasını ya da bir tane sağlamış olsanız bile nasıl doğru kullanacağını bilmesini bekleyemezsiniz. Aslında müşterilerimden biri bunu yapıyor. Özel alan özelleştirme seçeneklerini satın alırsanız, ürün programcılarımdan birini ürünle birlikte alırsınız.

Ancak, çoğu durumda sadece müşterinin bir bilgisayarda PC üzerinde bir program çalıştırmasını ve yazılımın sihirli bir şekilde güncellenmesini istiyorsunuz. Burası, özellikle ürününüzde USB, RS-232 veya ethernet gibi bir PC ile kolayca arayüzeyebilen bir iletişim portuna sahipse bir önyükleyicinin girdiği yerdir. Müşteri zaten mikroda bulunan önyükleyici ile konuşan bir bilgisayar programı çalıştırıyor. Bu, yeni ikili dosyayı program belleğine yazan ve ardından yeni kodun çalışmasına neden olan bootloader'a gönderir.

Kulağa basit geliyor, ama değil, en azından bu sürecin sağlam olmasını istiyorsan. Bir iletişim hatası meydana gelirse ve yeni üretici yazılımı bootloader'a ulaştığında bozulmuşsa ne olur? Önyükleme işlemi sırasında güç kesilirse ne olur? Önyükleyicide bir böcek varsa ve kendi kendine barbaz olursa ne olur?

Basit bir senaryo, bootloader'ın daima sıfırlamadan çalışmasıdır. Ev sahibi ile iletişim kurmaya çalışır. Ana bilgisayar yanıt verirse, ya önyükleyiciye yeni hiçbir şeyi olmadığını söyler ya da yeni bir kod gönderir. Yeni kod geldiğinde, eski kodun üzerine yazılır. Her zaman yüklenen kod içeren bir sağlama toplamı eklersiniz, böylece bootloader yeni uygulamanın sağlam olup olmadığını söyleyebilir. Değilse, geçerli bir sağlama toplamı olan bir şey belleğe yükleninceye kadar sürekli olarak bir yükleme isteğinde bulunur. Bu, her zaman bağlı olan ve muhtemelen önyükleyici isteklerine yanıt veren ana bilgisayarda bir arka plan görevinin çalıştığı bir cihaz için kabul edilebilir. Bu şema, büyük ölçüde özerk olan ve yalnızca zaman zaman bir ana bilgisayara bağlanan birimler için iyi değildir.

Genellikle yukarıda açıklandığı gibi basit bootloader, güvenli bir arıza olmadığından kabul edilemez. Yeni bir uygulama görüntüsü bozulmamışsa, cihazın eski görüntüyü çalıştırmaya devam etmesini, başarılı bir yükleme gerçekleştirilinceye kadar ölmemesini istersiniz. Bu nedenle, genellikle bellenimde iki özel modül vardır, bir yükleyici ve bir önyükleyici. Yükleyici, ana uygulamanın bir parçasıdır. Ev sahibi ile düzenli iletişimin bir parçası olarak, yeni bir uygulama görüntüsü yüklenebilir. Bu, harici bir EEPROM gibi ana uygulama görüntüsünden ayrı bellek gerektirir veya daha büyük bir işlemci kullanır, böylece program belleği alanının yarısı yeni uygulama görüntüsünü depolamak için tahsis edilebilir. Yükleyici, alınan yeni uygulama resmini bir yere yazar, ancak yayınlamaz. İşlemci sıfırlandığında, bir yükleme işleminden sonra ana bilgisayardan komutta gerçekleşebilecek olan, bootloader çalışıyor. Bu şimdi harici iletişim kabiliyetine ihtiyaç duymayan tamamen bağımsız bir programdır. Geçerli ve yüklenen uygulama sürümlerini karşılaştırır, sağlama toplamlarını kontrol eder ve sürümler farklıysa ve yeni görüntü sağlama toplamı kontrolleri ise yeni görüntüyü uygulama alanına kopyalar. Yeni görüntü bozuksa, eski uygulamayı önceden olduğu gibi çalıştırır.

Çok fazla bootloader yaptım ve hiçbiri aynı değil. Mikrodenetleyici firmalarının bazılarının inanmanı istediklerine rağmen, genel amaçlı bir önyükleyici yok. Her cihazın, ana bilgisayarla ilgili olarak kendi gereksinimleri ve özel koşulları vardır. İşte kullandığım bazı bootloader ve bazen uploader yapılandırmaları:

  1. Temel önyükleyici Bu cihazın seri bir hattı vardı ve bir ana bilgisayara bağlanır ve gerektiği gibi açılır. Önyükleyici sıfırlandı ve ana bilgisayara birkaç yükleme isteği yanıtı gönderdi. Yükleme programı çalışıyorsa, yanıtlar ve yeni bir uygulama görüntüsü gönderirdi. 500 ms içinde cevap vermezse, bootloader vazgeçip mevcut uygulamayı çalıştırır. Bu nedenle, yazılımı güncellemek için önce ana bilgisayarda güncelleyici uygulamasını çalıştırmanız, ardından cihaza bağlanmanız ve açmanız gerekir.

  2. Program hafıza yükleyicisi. Burada iki kat fazla program hafızasına sahip olan bir sonraki boy PIC'yi kullandık. Program hafızası kabaca% 49 ana uygulamaya,% 49 yeni uygulama resmine ve% 2 önyükleyiciye bölündü. Önyükleyici sıfırlamadan çalıştırılır ve doğru koşullar altında yeni uygulama görüntüsünü geçerli uygulama görüntüsüne kopyalar.

  3. Harici EEPROM görüntüsü. Yeni uygulama görüntüsünü saklamak için harici bir EEPROM kullanılmış olması dışında # 2 gibi. Bu durumda daha fazla belleğe sahip işlemci fiziksel olarak daha büyük ve ihtiyaç duyduğumuz çevre birimlerinin karışımına sahip olmayan farklı bir alt ailede olurdu.

  4. TCP önyükleyici. Bu hepsinden daha karmaşıktı. Büyük bir PIC 18F kullanılmıştır. Belleğin son 1 / 4'ü, bir TCP ağ yığınının tam kopyası olan bootloader'ı düzenledi. Önyükleyici sıfırlandı ve önceden yapılandırılmış bir IP adresindeki bilinen bir bağlantı noktasındaki özel bir yükleme sunucusuna bağlanmaya çalıştı. Bu, her zaman tüm sistem için ayrı bir sunucu makinesi bulunan büyük tesisler içindi. Her küçük aygıta, sıfırlama işleminden sonra yükleme sunucusu kontrol edilir ve uygun şekilde yeni bir uygulama kopyası verilir. Önyükleyici mevcut uygulamanın üzerine yeni kopyayı yazar, ancak sağlama toplamı kontrol edildiğinde çalıştırılır. Olmazsa, yükleme sunucusuna geri döner ve tekrar deneyin.

    Önyükleyicinin kendisi tam bir TCP ağ yığını içeren karmaşık bir kod parçası olduğundan, aynı zamanda alan yükseltilebilir olması gerekiyordu. Bunu yaptığımız gibi, yükleme sunucusunun, tek amacı çalıştırıldıktan sonra önyükleyicinin üzerine yazmak olan özel bir uygulamayı beslemesini sağlamaktı, ardından makineyi sıfırlayın; böylece yeni önyükleyicinin çalışmasını sağlayacak şekilde yük sunucusunun göndermesini sağlayacaktı. En son ana uygulama görüntüsü. Teknik olarak birkaç milisaniye boyunca bir elektrik kesintisi, önyükleyici üzerine yeni bir görüntü kopyalamak için özel bir uygulama aldı ve onarılamaz bir hata olurdu. Uygulamada bu asla olmadı. Olası bir ihtimal olma ihtimali yoktu, çünkü bu cihazlar zaten sistemde bakım yapacak insanların bulunduğu büyük tesislerin parçalarıydı, bu da zaman zaman gömülü cihazları başka nedenlerle değiştirmek anlamına geliyordu.

Umarım, her biri kendine özgü risk, hız, maliyet, kullanım kolaylığı, duruş süresi vb. Gibi farklı olasılıkların olduğunu görebilirsiniz.


1
Xmega ailesi dışındaki tüm AVR'ler (yeni 2 kablolu arabirime sahip), sıfırlama sırasında tutulurken bir SPI arabirimi kullanır. Daha büyük olanlar da JTAG'a sahip, bazıları paralel programlamaya sahip ve küçük olanlar sıfırlama G / Ç olarak yeniden yapılandırılmışsa yüksek voltaj gerektirebilir. Paralaks Pervanesi ve Motorola / Freescale 68HC08 aileleri gibi bazı MCU'lar, minimum programlama donanımına değil ROM'daki önyükleyicilere sahiptir.
Yann Vernier

Geçerli ve yüklenen uygulama sürümlerini karşılaştırır, sağlama toplamlarını kontrol eder ve sürümler farklıysa ve yeni görüntü sağlama toplamı kontrolleri ise yeni görüntüyü uygulama alanına kopyalar. Evet, peki bu eylemin ortasında güç kesilirse, "uygulama alanında" bozuk bir görüntü olur. Yeni uygulamayı mcu flash'da yazan bir bootloader-failsafe uygulamasına sahip olmak daha iyi olabilir ve sağlama toplamı geçerliyse, aynı zamanda "yeni uygulamayı başlatmak için tamam" yazıyor. Bu yüzden başlangıçta, yeni uygulamayı başlatmanın uygun olup olmadığını kontrol eder, eğer çalışmaya devam etmiyorsa (başarısız uygulama)
Ervadac

@Erv: Yeni sürümü akıma kopyalamanın ortasında güç kesintisi olursa, güç geldiğinde ve önyükleyici yeniden çalıştığında mevcut sürüm sağlama toplamı başarısız olur. Genellikle sağlama toplamı kelimesini görüntünün en sonuna koyarım, böylece herhangi bir kısmi yazım sağlama toplamı için çok iyi bir şans olabilir.
Olin Lathrop

Selam. Size bootloader tip 5'i önerebilirim - TCP yığını yerine UDP uygulayabilirsiniz. Ardından güncellemeyi veya yerel protokolü indirmek için TFTP'yi kullanın.
i486

22

Bootloader kavramı nedir?

Bu senaryoyu hayal edin: Mikrodenetleyicinizde oldukça fazla miktarda depolama alanı var - birbirinden bağımsız 2-3 programı veya uygulamayı depolamak için yeterli. Cihazınızı önyüklerken hangisinin çalışacağını seçmek isteyebileceğinizi varsayalım. Peki, bunu desteklemek için neye ihtiyacınız var? Önyükleme sırasında diğerleri arasında seçim yapmanıza izin veren bir başlangıç ​​programına ihtiyacınız olacaktır.

Nasıl çalışır?

Bir bootloader bu programdır - diğer uygulamaları çalıştırmak ve bellekteki belirli yerlere (FLASH gibi ısrarcı veya RAM gibi uçucu) belirli yerlere yüklemek ve daha sonra oradan yürütmeyi devralacağı istenen programa atlamaktır. .

Bir avr bootloader'ı (veya herhangi bir mikrodenetleyici için) nasıl yapılır?

Asla bir bootloader yapmadım ama bu şekilde yapacağımı düşünüyorum: normalde yaptığınız gibi bir firmware programı yazmaya başlayın - ancak, her zaman çalıştırılacak ilk şey olduğu bir alana yerleştirildiğinden emin olun. cihaz önyüklenir. Başımın üstünde, bu küçük programdan çıkarmak istediğim bazı işlevsellikler: bellekte mevcut bir noktaya yeni bir program yükleme, önceden yüklenmiş bir programı silme, hangi programın çalışacağını seçme birincisi) ve diğer programların nerede olduğunu hatırlayabilmek ve bunlara atlayabilmek için bir çeşit depolama veri yapısına (yetiştirebilen atlama tablosu?) sahip olmak. Etkileşim, size çok basit bir terminal menüsü sunabileceği ve aynı kanal üzerinden firmware yükleyebildiği UART üzerinden yapılabilir.

Mikrodenetleyiciye nasıl programlanır (AVR'nin flaşında yanmış herhangi bir .hex programı veya başka bir yöntem gibi)?

Eğer kendisini güncelleyebilecek mevcut bir önyükleyici bulunmayan tamamen boş bir çip ise, o zaman başarmak için ne gerekiyorsa onu kullanarak (AVR durumunda ICSP) tanımladığınız gibi FLASH'a yanmanız gerekir.

Bu hiçbir şekilde "bootloaders" ın ne olduğu konusunda kapsamlı değildir. Birinden istediklerinize veya onlar için tasarlandıkları sisteme bağlı olarak, bir şeyi FLASH yerine RAM'de belirtilen bir konuma yüklemek için tasarım tasarlayabilir ve istediğiniz herhangi bir bellek konumunda yürütmeye başlayabilirsiniz. Veya belki de, bilgisayarınız önyüklendiğinde hangi işletim sistemini yükleyeceğini seçebilecek birini istiyorsunuz ( örneğin gruba bakınız ). 8 bitlik mikrodenetleyiciler için önyükleyiciler çok basit olma eğilimindedir.

Arduino hakkında bir not: Bu bootloader sadece bir program AFAIK'i yönetiyor, aynı zamanda firmware yüklemesini ve diğer şeyleri yönetmek için seri portu kullanıyor .


Bilginize, cevap şimdi düzenlenmiş orijinal mermi noktalarını ele almak için yazılmıştır.
Jon L

3

Bir "önyükleme" yükleyici kavramı, bir pompayı "hazırlama" kavramına benzer. Başka bir deyişle, bir programı belirli bir adrese yükleyen "bir şeye" ihtiyacınız vardır ve ardından programı belirtilen adreste yürütmeye başlarsınız. Bu bir şey, önyükleyici. En basit durumda, önyükleyici, CPU'nun belirlenmiş başlangıç ​​adresinde (sıfır) büyük olasılıkla "görünür", programı istenen bellek bölümüne yükler, kontrolü ona aktarır ve "kaybolur". Görünüm ve kaybolma "harici" donanım tarafından kontrol edilir. Olası bir uygulama, "donanım" sıfırlaması ile etkinleştirilen ve "yazılım" sıfırlaması ile devre dışı bırakılan bir ROM kullanmaktır. ROM'daki yükleyici, gerektiği kadar basit veya karmaşık olabilir, ve belirli bir CPU'nun anladığı ikili biçimde yazılmalıdır. ROM tarafından kullanılan adres alanı gerekli değilse, ROM devre dışı bırakılması gerekmeyecektir. Açıkçası, ROM yerine EEPROM, ePROM, flash PROM vb. Kullanılabilir.

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.