jíva
moderátor+
Příspěvků: 138

|
 |
« kdy: 15.12.2009, 09:38:04 » |
|
Obsluha výpadku zdroje na procesorových deskách SmartBlock a SBPS-40 Ve standardních knihovnách Dynamic C je obsluha NMI po výpadku zdroje nefunkční, protože sám modul SmartBlock nemá přiveden signál kontroly napájecího napětí. Po poklesu napájecího napětí se vydá NMI, ale procedura powerlo() dává návratovou hodnotu trvale 1. Správnější obsluha NMI vypadá následujícím způsobem:
#JUMP_VEC NMI_VEC powerint root interrupt retn powerint() { if(nmipassed) return; nmipassed=1; if(nmiemgcy) return; // v tuto chvili program vykonava dulezite veci a nelze prerusit else nmiservice(); } nmiservice() { while(1) { if(!_powerlo()) break; } nmipassed=0; }
#asm _powerlo:: push bc ld bc,0A000H in a,(c) cpl and a,1 ld l,a ld h,0 pop bc ret #endasm
Část programu, kde je aplikováno blokování proti NMI .... nmiemgcy=1; // příznak ... Důležitá část programu - např. ukládání něčeho vícebytového někam, nesmí to však trvat déle než vypadne zdroj úplně, což je tak max. 2ms ... nmiemgcy=0; // konec nebezpecne casti if(nmipassed) nmiservice(); // bylo-li NMI, vyvola se proste cekaci procedura ... atd.
Protože Z180 nedisponuje funkcí "test and set", nedá se ten mechanismus semaforování udělat naprosto spolehlivě. Pro praktické použití to plně dostačuje.
Autor: mípa Přeneseno z původní sekce DOTAZY.
|