İ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
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