Kurşun geçirmez ürün yazılımı yükseltmeleri


16

Bir kullanıcının satış sonrası bir cihaz ürün yazılımı güvenli bir şekilde yükseltmesini sağlamak için ne tür teknikler kullanılır ? Bunu bir Cortex M3 / 4 mikrodenetleyici ile yapmak istiyorum, ama sanırım herhangi bir mikro için teknikler yapmalı.

Tercihen en az miktarda ekstra bileşen ile elbette.

Yanıtlar:


16

Kodunuz için ihtiyacınız olan Flash bellek miktarının iki katından fazla olan bir yonga kullanın. Bu şekilde yeni bellenimi, bir şeyler ters giderse eski bellekten çıkarırken bu belleğe alabilirsiniz.

Yeni bellenimdeki sağlama toplamlarının şifresini çözüp doğruladıktan sonra, bir önyükleyici bunu eski konumuna değiştirerek son konumuna kopyalayabilir. Bu bölüm sırasında bir şeyler ters giderse, donanım sıfırlaması yapıldıktan sonra önyükleyici yeni bellenimin geçerli olmadığını görmelidir (sağlama toplamını bir kez daha çalıştırarak) ve kopyalamayı yeniden deneyin.

Bu bildiğim en basit ve kusursuz yol. Ayrıca önyükleyicide çok az kod gerektirir ve ana program ile önyükleyici arasında herhangi bir işlevin çoğaltılmasını gerektirmez (önyükleyicide herhangi bir iletişim mantığına ihtiyacınız yoktur).


10
Bir elektronik kullanıcı olarak, yeni bir yazılımın doğru bir sağlama toplamı olması ancak yazılımın bir hatası olması durumunda, önyükleme sırasında eski bir yazılımın önyüklenmesini sağlayacak bir düğmeye sahip olmanın iyi olacağını ekleyebilirim.
Zan Lynx

4
Bu çözüm ile gördüğüm "Sorun" bir tür tehcir tablosu veya tam pozisyon bağımsız kod gerekir. Aksi takdirde kodunuz çalışmaz.
Nico Erfurth

2
@Masta - Ürün yazılımının son (normal) konumuna kopyalandığı kısmı anlamıyorsunuz.
Kevin Vermeer

3
@jpc - Bu tekniği işteki bazı şirket içi araçlarda harici seri Flash çipiyle kullanıyoruz. 8 pimli SOIC veya QFN parçası için yeriniz varsa, Flash'ın iki katından fazla bir mikro denetleyiciye sahip olmanız gerekmez. 1MB seri Flash bellekler bir dolardan daha azına sahip olabilir, bu nedenle bu rotaya gitmek bazı durumlarda mikro denetleyiciyi yükseltmekten daha ucuz olabilir!
Kevin Vermeer

@zan - Evet, bunu da kullanıyoruz. Bir endişe veya fayda, eski bellenimi yeniden kopyaladığınızda cihazın varsayılan değerlere sıfırlanmasıdır (mikro cihazımızda EEPROM'umuz yoktur; MAC adresi ve IP adresi gibi yapılandırma verilerini kendi yazdığı Flash'ta depolarız). Bizim için, bu, IP adresini unuttuğumuzda bir tahta bulmayı kolaylaştırır.
Kevin Vermeer

12

Bir önyükleyici ve birkaç KB ekstra flaş kullanın.

UART, USB, I2C veya başka bir protokol üzerinden bazı özel komutlar göndererek önyükleyici tarafından yükseltme yapılır. Yalnızca ana kod güncellenir - harici bir programlayıcı (yani PIC'ler için JTAG / PICkit vb.) Dışında bootloader koduna asla dokunulmaz.

Güncelleme başarısız olursa (güç arızası, bir kablo veya başka bir nedenden ötürü tetiklendi), widget çalışmaz, ancak yükseltme tekrar denenebilir.

Bazı baytlarda bir bayrak, tam olarak güncellenmediği için ana kodun yanlış çalışmasını engelleyen bir yere ayarlanabilir.


Ayrıca, önyükleme bir açılıştan kaynaklanıyorsa önyükleyiciyi çalışmaya zorlayabilirsiniz. Bu, hemen çöken kötü bir ürün yazılımına yüklerseniz yardımcı olur. Önyükleyicinin uygulamayı X saniye sonra çalıştırmak için bir zaman aşımına ihtiyacı olacaktır.
Robert

Basit bir protokol (asenkron seri, TTL veya 485 gibi) kullanabiliyorsanız iyi bir fikirdir. Daha fazla ilgili durumlar için (SD kartlar, GPRS, USB) Karmaşık destek kodunu (yükseltilemez) önyükleyiciye dahil etmem. Ethernet OTOH (ham UDP veya TFTP) bunun için yeterince basit.
jpc

3

Cihazınız nispeten pahalıysa ve maliyeti karşılayabiliyorsanız (ve müşterileriniz yükseltmelere önem verirseniz) bunu yapabilirsiniz ...

(genellikle bu teknik, harici depolama veya jtag'ın devasa kullanımını gerektirir.)

Sistemi durdurabilen ve yeniden programlayabilen sabit bir program mikro (küçük bir PIC gibi) bulundurun.

"yükseltme işlemcisi" sabit yazılımını değiştiremeyeceğiniz için, hiçbir zaman yanlış gidemez.

1) kullanıcı cihazı yükseltebilir

2) yükseltme başarısız olursa, her zaman tekrar deneyebilirler. Tuğla olamaz

3) hedef cihazınız bir önyükleyiciyi desteklemiyor olsa bile (sadece önyüklemek ve çalıştırmak istiyor) yine de istediğinizi yapmasını sağlayabilirsiniz.

FPGA, DSP ve diğer oddball hedefleri için çalışır.

Gerçekten temiz bir kullanıcı arayüzü olabilir (hatta bir PIC bir web sunucusu çalıştırabilir ....)


2

Ürününüzün bir çeşit basit seri arabirime, tercihen EIA232'ye sahip olduğundan emin olun . DB-9 için yeriniz yoksa standart olmayan bir konektör sorun değildir. Örneğin, bir TRS konektörü TxD, RxD ve toprak için ihtiyacınız olan tek şeydir.

Cihazı ilk kez programlarken, önyükleyici . Bu mümkün olduğunca basit olmalıdır , çünkü er ya da geç yeni özelliklere ihtiyaç duyması durumunda önyükleyicinin kendisini yükseltmek istersiniz. (Muhtemelen edemez bile yükseltin)

Ardından TRS konnektörü. Bir konektör olduğunu algılayabilmeniz için anahtarlı bir jak kullanın. Sıfırlamanın hemen ardından kontrol edin ve fiş varsa önyükleyiciyi başlatın, aksi takdirde uygulamayı başlatın. Bu şekilde bootloader ve kullanıcı uygulama programı birbirinden ayrı kalır. (Kontrol aslında önyükleyicinin bir parçasıdır; uygulamanın sürümüne bakılmaksızın buna ihtiyacımız olacaktır, aksi takdirde önyükleyiciye giremeyiz!)


Neden hiç önyükleyiciyi yükseltmek istediniz? Yeni sürüme geçiş işleminin cihazı tuğla haline getirmeyeceğinden nasıl emin olabilirsiniz? Yapabilseydi, hangi yeni özellikler bu kadar ilgi çekici olurdu ki tuğlaları yükseltmek için risk altında olacaktınız?
Kevin Vermeer

5
@Kevin - Bence bootloader o kadar basit olmalı ki asla "yükseltmeyi" düşünmeyeceksin.
jpc

@jpc - Haklısın, yanlış yorumladın. Kabul ediyoruz!
Kevin Vermeer

1

'Yükseltici' hangi ekipmanlara sahip olacak? PC, USB bellek, mikro SD kart?

Bir yolu, uygulamanın çıkarılabilir bir öğeye sahip olması (usb stick, SD kart, vb.) Olacaktır. Çip, uygulamasını öğeden yükler. Yükselticiniz öğeyi değiştirir ve yeniden başlatır.

Tanıdığım ARM ve Cortex mikrodenetleyici yongalarının (NXP, Atmel) hepsinde yerleşik bir seri önyükleyici var, bu nedenle güncelleyiciniz bir PC ve seri kabloyla gelirse (ve bir COM bağlantı noktası arayüzü için düzenlediyseniz) Güncelleme.


Yani UART pinlerini bir porta bağlayarak, bir COM portuna ve bir PC'ye bağlıyken, mcu'da herhangi bir kod olmadan bellenimi flaş edebilirsiniz? Güzel ipucu.
Imbrondir

Veri sayfasını, 'bootloader' bölümünü kontrol edin. Bunu gerçekten 'eller kapalı' yapmak için çipi sıfırlamanın bir yoluna ihtiyacınız olacaktır; 2. önyükleyiciyi etkinleştirin (çip bir keratin pini kontrol eder). Bu, bir atlama teli ve (sıfırlama) anahtarı ile yapılabilir, ancak daha uygun bir yol (özellikle masanızda), 'hands-off' işlemini yapmak için iki el sıkışma çizgisi kullanmaktır. Çoğu PC indirme programı (örn. Flashmagic, lpc21isp) sizin için el sıkışma sihrini yapabilir (el sıkışma hatlarını doğru bağlarsanız).
Wouter van Ooijen
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.