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 ( :D ) , 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.