Mikrodenetleyicilerde neden uygulama programımızdan ayrı bir bootloader'a ihtiyacımız var?


28

Neden bir mikrodenetleyicinin aynı flaş program hafızasında, özellikle bir bootloader denilen STM32F103'te ayrı bir programa ihtiyacımız var?

Ana uygulama programından ayrı tutmak için özel olan nedir?

Genel olarak konuşursak, mikroişlemci tabanlı bir sistemin önyükleyicisi (örneğin PowerPC MPC8270) mikrodenetleyici ile aynı işi yapar (diyelim ki ARM STM32F103) ya da birbirlerinden temel olarak farklı işler yapıyorlar ve her ikisi de 'önyükleyici' olarak adlandırılıyorlar. ?


2
Bireysel yongalara ve parçalara sahip olmanızın nedeni aynı, devasa bir monolitik yapı değil
Emobe

Sen değil. Programınıza bilgisayar konsolundaki anahtarlar ve ışıklarla girmeniz yeterlidir.
Hot Licks

1
Açıkçası, bir mikroişlemci üzerinde ayrı bir önyükleyici programına ihtiyacınız yoktur. Ancak, genellikle sunduğu ek yardımcı işlevlerden birine sahip olmayı seçiyoruz. Bu işlevler gerekli değilse, istenmiyorsa, önyükleyiciyi kaldırabilirsiniz. Mikrodenetleyici önyükleyici tipik olarak yeni bir programı flaşa yazmak için kullanılır. Bazen hata ayıklama işlevleri, bazı destek kesme noktaları ve diğer iyi olması gereken işlevler için kullanılabilir. Bir mikrobilgisayarda, tipik olarak bootloader programları toplu bellekten yükler ve orada gerekli olacaktır.
ghellquist

Yanıtlar:


55

Bir mikrodenetleyici üzerindeki bir önyükleyici, ana bellenimi programlama başlığından başka bir iletişim kanalı üzerinden güncellemekten sorumludur. Bu, sahadaki ürün yazılımını BLE, UART, I2C, SD kartlar, USB vb. Üzerinden güncellemek için kullanışlıdır. Müşterilerin, aygıtlarını yalnızca aygıtlarında güncellemek için programcı satın almalarını istemek son derece sakıncalıdır.

Bagaj yükleyicinin ayrı tutulmasının nedeni güvenilirlik içindir. Bootloader ve uygulama kodu, ayrı flash bölümlerine yerleştirilir, böylece uygulama kodu, bootloader koduyla ilgili hiçbir şey değiştirmeden bootloader tarafından silinebilir ve yeniden yazılabilir.

Bootloader ve uygulama bir arada tutulursa, herhangi bir bellenim güncellemesi flaşta bootloader kodunu sileceğinden, bootwareer kodunun çalıştırılmadan önce RAM'e kopyalanması gerekir. RAM'deki bootloader kodu ile güç kesilirse ve flaş silinirse, cihaz tuğlalanır.


3
Bizimki de aynı sebep. Aynı flaş içindeler ancak önyükleyici flaş silme-sınırlandırılmış ve yalnızca kendi adreslerinden daha yüksek olan flaşı silmek için yeterince akıllı.
Joshua,

3
Bazı durumlarda, mikroişlemcinin programlama başlığına, ürünün kasasını sökmek zorunda kalmadan erişilemeyebilir, bu nedenle ekstra donanım olmadan iletişim veriyolu üzerinden yeniden programlayabilmek güvenilirlik için anahtar bir faktördür.
John Go-Soco,

6
@ alt-rose Bootloader ve uygulama programı, her biri kendi başlangıç ​​koduna ve main()işlevine sahip olan ayrı ayrı derlenmiş programlardır . Açılışta bootloader başlangıç ​​kodu çalışır ve bootloader'ı çağırır main(). Bootloader programı geçerli bir uygulama programını kontrol eder ve daha sonra uygulama programını çağıran uygulama programının başlangıç ​​koduna atlar main(). Her programın başlangıç ​​kodu, ilgili program için C çalışma zamanı ortamını başlatır (örn. Değişkenleri, yığını vb. Başlatır) ve genellikle hiçbir program main()başlangıç ​​koduna geri dönmez.
kkrambo

1
@ alt-rose: CPU'nun bootloader'ın başlangıç ​​adresini aldığı gibi - bu olmaz. Bunun yerine CPU, önyükleyicinin başlangıç ​​adresi olarak ne kullanacağını belirtir ve önyükleyici de uygulama programının başlangıç ​​adresi olarak ne kullanacağını belirtir.
MSalters,

4
@kkrambo Genel olarak doğru olmakla birlikte, bir önyükleyicinin C veya C türetilmiş bir dilde veya hiç olmadığı bir şekilde yazılması şartı yoktur (ya da evrensel olarak doğrudur) main.
Yakk,

26
  1. Böylece yükleme işlemi hatalardan kurtulabilir. Yükseltme sırasında bir iletişim hatası olduğunu veya güç bağlantısının kesildiğini varsayalım. Önyükleyici yüklediğiniz uygulamanın bir parçası olsaydı, kullanıcı önyükleyiciye yeniden yönlendirmek için özel bir donanım kullanmadan tekrar deneyemezdi.

  2. Bazı mikrodenetleyiciler RAM'den kod yürütemez. Önyükleyici, yazılımın geri kalanıyla karıştırılmışsa, o zaman gerçekten uygulayacağınız flaş sayfalarını silemediğiniz için yazılımınızı yükseltemezsiniz. Çözüm, önce yeni kodu flaşın ikinci yarısına yakmak ve sonra üzerine atlamak. Yeni kod daha sonra kendini flaşın ilk yarısına kopyalar. Tabii ki olumsuz, yanma flaşının genellikle yavaş olması ve şimdi iki kez yapmanız gerekeceği için yükleme işleminin iki kat daha uzun sürmesidir. Ayrıca bu geçici çözüm uygulama boyutunuzu toplam flaşınızın yarısından büyük olmayacak şekilde sınırlar.

  3. İyi yazılmış önyükleyiciler, yürütmeyi denemeden önce cihazda geçerli kodun bulunduğunu doğrulamaya çalışır. Önyükleyici ve diğer kod birlikte karıştırılmışsa, tüm kod yüklenmediyse doğrulama yordamının işe yarayacağından nasıl emin olabilirsiniz?

  4. Doğrulama. Güvenli önyükleyici, yüklü uygulamanın yürütülmeden önce dijital bir imza ile eşleştiğini doğrulamaya çalışır. Ancak, önyükleyici ve diğer kod birbirine karışmışsa, cihazda neyin çalıştığını kontrol edemezsiniz, çünkü kullanıcı yeni bir kod yüklediğinde, başlangıçta ne olacağını kontrol edemezsiniz.


4
2. noktaya bir örnek olarak, bazı mikroişlemciler başlangıçta erişilebilir RAM'lere bile sahip olmayabilir : örneğin, Raspberry Pi , önyükleyiciyi bir SD karttan yüklemek için GPU'sunu kullanır ve bu da ARM işlemciyi ve belleği etkinleştirir.
ErikF

11

Ana uygulama programınızı güncellemenize izin vermek için genellikle oradalar.

Dahili flaşın bir kısmını nasıl silip yeniden programlayacağını bilen bir koda ihtiyacınız var, ana program bu olamaz, kendisi silindiğinde yeniden programlanamaz.


9

Önyükleyici, MCU’nun yeni bir programı kabul etmek, saklamak ve sıfırlama işleminden sonra çalıştırmak için başka bir şeyle iletişim kurmasını sağlar. Bir önyükleyiciniz yoksa, belleğe erişmek ve programı yerine koymak için bir Programlayıcı gerekir.


2
Hepsi bukadar. MCU yalnızca özel bir programlama altsistemi (AVRICE veya JTAG gibi) aracılığıyla veya zaten flaşlı bir önyükleyici bulunduğundan kod alabilir. Önyükleyicinin ne kadar karmaşık olduğuna dair bir uygulama kararıdır, örneğin bazı sistemler WiFi'den kod yükleyebilir. ATTiny gibi çok düşük uçlu MCU'larda, bir bootloader (ve seri pinler) büyük bir ek yük olduğundan, her zaman bir programlayıcı kullanırsınız.
Rich,

7

Ana ürün yazılımının önyükleyiciden yeniden programlanmasına izin verilmesine ilişkin diğer doğru cevaplara ek olarak, önyükleyicinin ayrı olmasını sağlamanın başka bir yararı, çalışma sırasında ihtiyacınız olan koddan "açılışta bir kez yap" görevlerini mantıksal olarak ayırabilmenizdir. Ardından, önyükleyici ilk yapılandırma görevlerini tamamladıktan sonra, ana ürün yazılımı, artık gerekli olmayan tüm koduyla önyükleyiciyi bellekten çıkarabilir ve böylece önemli RAM alanı tasarrufu sağlar. Bunu başka yollarla da yapmak mümkün, ancak bootloader / firmware split birçok mimaride bunu çok daha kolaylaştırıyor.


1
Bir mikro denetleyicide, kod büyük olasılıkla hiçbir zaman RAM’de değildir, bu nedenle tahliye edilemez. Bootloader'ın verilerini elbette RAM'den atabilirsiniz.
Ben Voigt

@BenVoigt, mikrodenetleyiciye bağlıdır. Bazıları (öncelikle NOR flaşı olanları) doğrudan flaştan çalıştırmanıza izin verir, ancak diğerleri (genellikle NAND flaşı ile daha yaygın hale gelir) RAM'den çalıştırmanızı gerektirir. Bazen dahili flaş bile yoktur ve herhangi bir şey yapmadan önce harici flaş çipinden yerel SRAM'a kodu kopyalamanız gerekir.
Nate S - Monica'yı yeniden

2

Kısa cevap, yazılımın harika olmasından kaynaklanıyor.

Bootloader'ın "saf donanım" olabileceği her şeye sahip olabilirsiniz. Ancak, bootloader'ın yazılım olarak yazdığı ve sonra donanım tarafından yorumlandığı görevleri yapmak çok, çok, çok daha kolaydır.

Bu görevler, çalışacak "gerçek" yazılımın donanımını (örneğin, bir Raspberry Pi'de (@ErikF aracılığıyla)) çalıştırmayı ve "gerçek" programı çalıştırmadan önce değiştirecek bir protokolü içerebilir (eğer Bu pin ayarlandıktan sonra gerçek programı yeniden başlatır), hatta "gerçek" program için yazılım ortamını kurar.

Daha az mikro ölçekli bir yazılımda, bir çalıştırılabilir dosyayı çalıştırdığınızda uygulama yükleyici hareket eder, verilerinizin bölümlerini belleğe yüklemek gibi şeyler yapar, bazen adresleri düzeltir, ana ya da diğer genel öğelere argümanlar kurar, işletim sistemi tarafından sağlanan kitaplıkları döndürür ve daha sonra _mainkodun başına atlar . Bunlardan bazıları bir bootloader tarafından yapılabilir.

Bir mikro denetleyicide, bir önyükleyicinin yaptığı görevlerden bazıları programa ayrılabilir. Platformunuz için derleyici, "setup" kodunu her çalıştırılabilir dosyaya otomatik olarak enjekte edebilir.

Ancak, önyükleyicide bulundurmak, aynı derleyicinin farklı donanımlar üzerinde çalışabileceği anlamına gelir, çünkü önyükleyici platformlar arasındaki farkı "gizleyebilir".

Ana programın bir flaşının önyükleyiciyi (ve ana programı yeniden başlatma yeteneğini) riske atmadığı ve önemsiz olmayan bir önyükleyiciye sahip olması gerçeğini göz önünde bulundurun.


-1

Ele alınmayan bir cevap, C dilinin sınırlamaları nedeniyle endişelerin ayrılması gereğidir.

Genel olarak önyükleyiciler, Meclis'teki çok erken önyükleme aşaması ile Assembly ve C'nin bir karışımı halinde yazılır.

Bu gibi bazı şeyleri ayarlamak için yapılır:

  • C yığınının tahsis edilmesi
  • yığın göstergesinin register içine okunması
  • program sayacını sicile okumak
  • sıfırlama vektörleri bildirme
  • ikinci aşamayı (initramfs) RAM içine yerleştirmek.

Bu atılan adımların kabaca bir yaklaşımı ve ARM önyükleme işlemini açıklıyorum, x86 ve diğer mimariler için yine farklı.

Ancak, ilke nedeni aynı kalır: C yığınının tahsis edilmesi montajdan yapılmalıdır.


Neden aşağı oy? Bu hem alakalı hem de doğru.
BitShift

-1

Şu ana kadar cevaplanmayan sorunun bir kısmı, mikrodenetleyicilerdeki önyükleyiciler ve mikroişlemci sistemleri arasındaki fark.

Mikrodenetleyici

Çoğu mikrodenetleyici, program kodlarını içeren dahili ROM belleğine sahiptir. Bu kodun değiştirilmesi genellikle mikrodenetleyicinin programlama arabirimine bağlanan bir programlayıcı cihaz gerektirir (örneğin, ATMega üzerindeki ISS). Ancak, bu programlama arayüzleri, genellikle diğer bağlamlara kıyasla, kullanım açısından pek uygun değildir, çünkü verilen bağlamda hazır bulunmayabilirler. Örneğin, hemen hemen her bilgisayarda USB bağlantı noktaları bulunurken, ISS için gereken SPI arabirimi daha nadirdir ve ATXMega'da kullanılan PID arabirimi gibi diğer arabirimler yalnızca özel programlama donanımı tarafından desteklenir.

Örneğin, yazılımı herhangi bir harici donanım olmadan normal bir bilgisayardan güncellemek istiyorsanız, cihazı programlamak için farklı bir arabirimden (örn. Arduino'daki gibi USB üzerinden RS232, USB veya RS232) okuyan bir önyükleyici kullanabilirsiniz ortak arayüzler üzerinden.

Bununla birlikte, bu işlevselliğe ihtiyacınız yoksa, bootloader tamamen isteğe bağlıdır. Mikrodenetleyici hala kodunu bootloader olmadan tamamen çalıştırabilir.

mikroişlemci

Bir mikroişlemcide işler biraz farklıdır. Çoğu mikroişlemci, bir önyükleyici için yeterince büyük bir ROM'a sahip olsa da, bu ROM'lar tam bir işletim sistemine sahip olacak kadar büyük değildir. Öyleyse, önyükleyicinin amacı donanımı başlatmak, önyüklenebilir bir işletim sistemi aramak, yüklemek ve çalıştırmaktır. Bu yüzden bootloader her açılışta kritik öneme sahip.

X86 / x64 sistemlerinde bu önyükleyici ya BIOS ya da UEFI'dir (temel olarak BIOS'un daha yeni bir sürümü).

Bazen bir zincirde çalışan birden çok önyükleyici bile olabilir. Örneğin, Windows ve Linux işletim sistemli çift önyükleme sisteminiz varsa aşağıdakilerle sonuçlanabilir:

  • BIOS / UEFI önyükleme yapar ve yüklü GRUB'u bulur. Daha sonra GRUB (= Grand Unified Bootloader) yükler
  • GRUB bir çeşit Linux ve Windows Bootloader bulur. Kullanıcı Windows Önyükleyiciyi seçer.
  • Windows önyükleyici başlatılır ve Windows 7 ile Windows 10'un yüklü olduğunu bulur. Kullanıcı Windows 10'u seçer.
  • Windows 10 sonunda açılıyor.

Yani bu durumda, bir bootloader olarak kabul edilebilecek üç adet yazılım vardı. Hem GRUB hem de Windows Önyükleyici, kullanıcıya BIOS / UEFI'nın verdiğinden daha uygun bir önyükleme seçimi seçeneği sunmak için çoğunlukla oradadır. Aynı zamanda birden fazla işletim sisteminin aynı sabit sürücüden, hatta aynı bölümden başlatılmasını sağlar.

TLDR

Bu yüzden, her iki sistemde de bootloader benzer şeyler yapar (kullanıcının hangi kodu seçeceğini seçmesine yardımcı olur), bunu nasıl yaptıkları ve tam olarak ne yaptıkları konusunda büyük farklılıklar gösterir.


Tüm programı RAM'den kod çalıştırması gereken sistemlerden saklamak için yeterli rasgele erişimli geçici olmayan depolama (ROM veya flash) içeren sistemleri ayırt etmek yararlı olsa da, her iki türden de mikroişlemci ve her iki türden de mikroişlemciler vardır.
supercat,

Elbette bir mikroişlemci ile bir mikroişlemci arasındaki fark zor bir sınır değildir ve bazı mikroişlemciler bir mikroişlemci gibi davranır ve bunun tersi de geçerlidir. Bu yüzden AtMega / Arduino ve x86 / x64'ü örnek olarak aldım, çünkü onlar böyle davranıyorlar.
Dakkaron

"mikroişlemciler bir önyükleyici için yeterince büyük bir ROM'a sahiptir ... x86 / x64 sistemlerinde bu önyükleyici ya BIOS ya da UEFI" Nope'dir. BIOS veya UEFI yonga dışı flash bellekte saklanır. Çipte bulunan ROM, mikro kodun başlatılması gibi daha düşük seviyeli fonksiyonlar içindir.
Ben Voigt

@Dakkaron: Çipin adres veriyolunda başka bir şey olmadan önemsiz amaçlar için kullanılabilecek şekilde tasarlanıp tasarlanmadığına bağlı olarak bir mikroişlemci ve mikrodenetleyici arasındaki çizgiyi çizerim. 8031 , dahili ROM'da yararlı bir şeye sahip olmadığı belirtilen , ancak aksi takdirde tamamen dahili depolamadan kullanılabilecek şekilde tasarlanan , işlevsel olarak 8051 (kesinlikle bir mikro denetleyicidir) dışında kalifiye olmaz. RCA / CDP 1802 gibi bir şey, bir LED isim etiketini sürmek için kullanılsa bile kalifiye olmaz ...
supercat

... harici RAM ve ROM olmadan, çünkü RAMless / ROMless tasarımlar önemsiz görevlerle sınırlıdır. Bununla birlikte, bir önyükleyiciye sahip olduğum ve dahili olarak birkaç bin kelimelik 16-bit RAM kelimesini hatırladığımda mikrodenetleyici olarak nitelendirecek bir TMS 32050 gibi bir şey; birçok uygulama daha fazla RAM eklemeyi gerektirse de, UART aracılığıyla başka bir sisteme bağlıysa, bellek veriyolunda hiçbir şey olmadan birçok amaca hizmet edebilir.
supercat
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.