Stránka 1 z 1
AVR a lockbity pri rušení EMI
Napsal: 09 kvě 2013, 08:58
od Ivan_Ryger
Dobrý deň páni, mám nasledovnú otázku. Budem mať mikrokontrolér s programom bežiacim v EMI zarušenom prostredí. Trocha sa obávam, aby pri nejakom náhodnom impulze na napájacej vetve sa nepremazal program vo FLASH pamäti. Pomôže tomu aktivovať v mikrokontroléry lockbit pre zákaz zápisu do pamäti?
Ďalšia otázka je, či pri aktivovaní lockbitu pre zákaz čítania programovej pamäti a ponechaní neaktívneho lockbitu zákazu zápisu do prog. pamäti sa bude dať verifikovať nahratý program?
Ďakujem.
Ivan.
Napsal: 09 kvě 2013, 10:07
od ZdenekHQ
Puls, kterej teoreticky přepíše FLASH je už určitě za hranicí provozních podmínek, takže v prvé řadě ošetřit všechny ohrožené vstupy filtry (odpory,zenerkami atd.) a napájení transily (stačí běžnej 5V8).
Napsal: 09 kvě 2013, 10:42
od Ivan_Ryger
Zdeňku, s tým som už počítal, takže nemusím zatiaľ riešiť ochranu proti prepisu.
Otázkou zostáva, či sa po zapísaní lockbitu na čítanie bude dať verifikovať prepísaný obsah FLASH.
Napsal: 09 kvě 2013, 10:45
od Panda38
Nebude. Verifikace znamená možnost zpětného čtení, což při lockbitu nelze. Tedy - samozřejmě při programování lze, protože lockbit se nahodí až po ukončení verifikace, ale později už nelze.
Napsal: 09 kvě 2013, 11:00
od Ivan_Ryger
Ďakujem, toto som potreboval počuť. Pre mňa to teda znamená, že sa procesor síce bude dať naprogramovať ale spätná verifikácia sa už nebude dať uskutočniť.
Napsal: 09 kvě 2013, 11:11
od Panda38
Program by měl umět hlásit zpět svou verzi a kontrolovat CRC kódu v paměti (po zapnutí a příp. i občas za provozu) - a při chybě se zablokovat.
Napsal: 09 kvě 2013, 12:20
od Ivan_Ryger
Toto je výborný nápad, no neviem zatiaľ, ako zrealizovať kontrolu CRC.
Napsal: 09 kvě 2013, 12:41
od Panda38
Pro výpočet je dobrý 16-bitový CRC-CCITT (např. XModem varianta), protože na něj je známý dostatečně rychlý výpočet bez nutnosti tabulky a je poměrně dost spolehlivý:
Kód: Vybrat vše
u16 crcCCITT1(u16 crc, u8 data)
{
crc = (crc >> 8) | (crc << 8);
crc ^= data;
crc ^= (crc & 0xff) >> 4;
crc ^= crc << 12;
crc ^= (crc & 0xff) << 5;
return crc;
}
#define CRCCCITT_XMODEM_INIT 0
u16 crcCCITT_XModem(const void* buf, int len)
{
u16 crc = CRCCCITT_XMODEM_INIT;
const u8* s = (const u8*)buf;
for (; len > 0; len--)
{
crc = crcCCITT1(crc, *s++);
}
return crc;
}
Úplně na konec programu (jako poslední položku v datových konstantách) doplnit konstantu pro uložení CRC, ukazatel na ni uložit za tabulku vektorů. Pro výpočet CRC si napsat konzolovou utilitku, která po překladu vezme binár, přečte si z něj offset CRC a vypočítá CRC bináru po tento offset, CRC na tu pozici zapíše. Program v MCU obdobně vypočítá CRC (opět po CRC) a zkontroluje CRC, když se neshoduje, tak se sekne (příp. bude někde indikovat chybu).
Napsal: 09 kvě 2013, 17:27
od ZdenekHQ
Já jsem před časem navrhoval mašinu, kde při oživování dostávaly procesory pěkně zabrat, kolem samá silovka a jiskry (

) , programy se kousaly jedna radost (testoval jsem bez WD), ale nikdy se mě nepodařilo sejmout FLASH.
Nejhorší jsou zemní smyčky, pokud se všechno oddělí a rozdělí, dá se v klidu spát.
Napsal: 09 kvě 2013, 20:40
od Ivan_Ryger
Zdeňku, ďakujem.
Panda38: ak som tomu správne pochopil, na konci hexadecimálneho súboru dva byte mám rezervovať pre CRC16?
V programovej pamäti AVR bude teda rutina, ktorá prejde celý obsah programovej pamäti až po adresu danú pointerom na CRC, spočíta byte po byte CRC tohoto obsahu a následne porovná s hodnotou uloženou na adrese pointeru.
Pravdu povediac, nikdy pred tým som sa nezaoberal detekčnými a samoopravnými kódmi.
Napsal: 10 kvě 2013, 10:21
od ZdenekHQ
Není na to náhodou nějakej "unifikovanej" algoritmus ? Mě to totiž nabízí samotný programátor, že mě vygeneruje CRC a uloží na konec paměti.