Vítej, Host. Prosím přihlaš se nebo se zaregistruj.
28.02.2024, 19:26:40

Domů Nápověda Vyhledávání Přihlásit Registrovat
 
Fórum k produktům firmy ELSACO Kolín  

+  PROMOS fórum
|-+  Další firemní SW
| |-+  Ostatní
| | |-+  Dynamic C
0 uživatelů a 1 Host prohlíží toto téma. « předchozí další »
Stran: [1] Dolů Tisk
Autor Téma: Dynamic C  (Přečteno 4477 krát)
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.
Zaznamenáno

Stran: [1] Nahoru Tisk 
« předchozí další »
Skočit na:  


Poháněno MySQL Poháněno PHP Powered by SMF 1.1.21 | SMF © 2011, Simple Machines Validní XHTML 1.0! Validní CSS!