2012-02-16 17 views
5

İlk önce arka plan. Herhangi bir nedenden ötürü aygıt yazılımı çökerse (örn. Yığın taşması, bozuk işlev göstergesi ...), bir yere atlar ve bazı kodları çalıştırmaya başlar. Bu er ya da geç izleyici sıfırlamaya neden olur. MCU sıfırlanacak ve yola devam edeceğiz. Şüphesiz ...Kazara üretici yazılımın üzerine yazmadan önce

Flash'a yazan kod (ör., Önyükleyici) ne zaman? Şimdi, tüm çekleri atlayarak, yanlışlıkla flash yazma koduna doğrudan geçeceğimiz de olabilir. Watchdog havlamaya başlamadan önce, bozuk firmware ile sonuçlanacaksınız. Bana tam olarak ne oldu bu.

Şimdi bazı diyebilirsiniz - biz bile yazma koduna atladı olduğunu neden kök hatayı düzeltin. Eh, gelişirken sürekli olarak kodu değiştiriyorsunuz. Orada böyle bir hata olmasa bile, yarın olabilir. Ayrıca, hiçbir kod hata içermez - ya da en azından benim değil.

Şimdi bir çeşit çapraz kontrol yapıyorum. Her zamanki denetimlerden önce 0xa5 olarak belirlediğim 'wen' adlı bir değişkenim var (örneğin, hedefin geçerli olduğundan emin olmak için kontrol). Sonra gerçek silme veya yazma işleminden hemen önce 'wen' gerçekten 0xa5 olarak ayarlanmış olup olmadığını kontrol ediyorum. Aksi halde bu, bir şekilde yanlışlıkla yazılan kodun içine atladığımız anlamına gelir. Başarılı yazdıktan sonra 'wen' temizlendi. Bunu C'de yaptım ve işe yaradı. Fakat hala teorik bir şansın var olduğu yolsuzluk yaşanır, çünkü SPMCR siciline yazılana kadar 'wen' bu son kontrolünden birkaç talimat vardır.

Şimdi SPMCR için yazma ve spm talimat arasındaki, montaj içine bu çeki koyarak bu geliştirmek istiyorum.

__asm__ __volatile__ 
( 
    "lds __zero_reg__, %0\n\t" 
    "out %1, %2\n\t" 
    "ldi r25, %3\n\t" 
    "add __zero_reg__, r25\n\t" 
    "brne spm_fail\n\t" 
    "spm\n\t" 
    "rjmp spm_done\n\t" 
    "spm_fail: clr __zero_reg__\n\t" 
    "call __assert\n\t" 
    "spm_done:" 
    : 
    : "i" ((uint16_t)(&wen)), 
     "I" (_SFR_IO_ADDR(__SPM_REG)), 
     "r" ((uint8_t)(__BOOT_PAGE_ERASE)), 
     "M" ((uint8_t)(-ACK)), 
     "z" ((uint16_t)(adr)) 
    : "r25" 
); 

Kodu henüz denemediniz, bunu yarın yapacağız. Herhangi bir sorun görüyor musun? Böyle bir sorunu nasıl çözebilirdiniz? Flash yazma rutinleri izleme zaman aşımı çeşit tetikleyen veya işlemci sıfırlanır hemen bayt önce gördüğüm

cevap

3

tekniklerden biri emin olmaktır. Bu şekilde, flaş yazma işlevine giden ve sadece "işlevine" girerek rastgele veri yürütmek mümkün değildir.

Sen talimatları doğru yorumlanır emin olmak için reset önce bazı nops gerekebilir

. fonksiyon baştan çalıştırmak olduğunu doğrulamak

Sizin tekniği, sen yazma yaptık kez wen değişkeni temizlemek varsayarak iyi bir gibi görünüyor.

+0

Evet, wen başarılı yazılmasından sonra temizlenir. __assert'e yapılan bu çağrı, watchdog'u gerçekten başlatmayı tetikler (artı tetikleyenler hakkında bazı bilgileri günlüğe kaydeder). insanlar aslında böyle yaklaşımları :) – Stefan

2

Neden bootloader'ınızda flaş yazmak için yazma yeteneğine sahip olmanız gerektiğini bilmiyorum. Bizim bootloader, çünkü uygulama programını seri port üzerinden güncelleyebilir. Bu nedenle, yükleyicinin, yanıp sönen bir kod içermediğinden emin olarak, istenmeyen yazma potansiyelini ortadan kaldırıyoruz. Bu kod indirilecek yazıyı içeren aynı pakette bir başlıktır. Tümleşik görüntü, saklanan programlama algoritmasının sağlama toplamına sahiptir ve çalıştırılmadan önce bunu doğrular.

dahili olarak oluşturulan şeyler yazıyorsanız, o zaman donanım ile ilgili kilitlerini bakmak istiyorum. Yalnızca belirli bir ayrık çıkış pimini daha önce ON konumuna getirdiyseniz, yalnızca yazabilir. "IP kontrollerden geçen atlarsa" problemine cevap vermek için? 2 kısımda yapabilirsin. İlk olarak algoritma için bazı kritik değişkenler ayarlayın. (örneğin yazılacak adres, geçersiz belleğe başlatılmış halde kalır ve sadece yazmadan önce yapılan ayrı bir çağrıda doğru şekilde ayarlanır. Ardından yazma işlevinin HW kilidini kontrol etmesini sağlayın. veya bir zamanlayıcıya yanıt olarak, sahte bir IP'niz varsa doğru sırada vurulması olası olmayan bir şey.IP gerçekten her yerde atlayabilir Eğer

, bir yanlışlıkla yazma önlemek için imkansız olabilir. Umabileceğin en iyi şey, oraya varmanın tek yolunun, başarılı bir yazı için gerekli olan herşeyi oluşturduğundan emin olman.

+0

Ben de aynı şeyi (UART üzerinden güncelleme) yapıyorum kullandığını öğrenmek için sevindim. Uygulamada ve bootloader'da kod yazılır. Böylece birbirlerini çapraz olarak güncelleyebilirler ve ayrıca bazı yapılandırmaları flaşta saklıyorum. Ne tür bir bilginiz olduğunu bilmiyorum, ancak sahip olduğum kod RAM'den yürütülemiyor, bu yüzden yazma için bir kod yüklemek bir seçenek değil. Eğer HW kilide sahip açıklandığı gibi Aslında benzer bir prosedür kullanıyorum. Bu ... Ben soruyu ayarladığınızda açıklamaya çalıştı budur ben kötü bir iş :) – Stefan

+0

@Stefan yaptığı gibi görünür: senin uygulamasından bootloader güncelleme dikkatli olun. Silme ve yazma arasındaki güç kaybında ne olur? Maalesef, önyükleyiciniz gitti ve cihazınızı tuğlalandırdınız. Bir Freescale HCS08 projesi olan bootloader aslında CPU yazmaçlarını üzerine yazılmasını engellemek için kullanır ve uygulamanın flaştaki sayfalara yazılması imkansızdır. Dikkatli ol. – tomlogic

+0

@tomlogic: 2 yazı kodum var - uygulamada ve bootloader'da - ve birbirlerini güncelleyebilirler. Varsayılan olarak uC, uygulama koduna girer. Önyükleyiciyi güncellemeyi başaramazsam, yine de uygulamaya başladım ve tekrar deneyebilirim. Ve bootloader bir numara kullanır. Uygulama kodunu en yüksek sayfadan en düşük değerine yazar. İlk önce (aslında en yüksek olan) sayfayı yazmadan önce, sayfa 0'a 'bootloader'a atla' yazıyor. Tek endişe, son sayfayı yazmamanın gerekmemesidir (sayfa 0). Bu yüzden şanslar, kurtarılamaz flaş ile son derece küçüktür. – Stefan

İlgili konular