|
#pragma off (check_stack)#define IRQ_EXIST 0xc0
#define CAPTURE_IRQ 0x80
#define TIMER_IRQ 0x40volatile unsigned long altera_iobase;
volatile unsigned long rspeed[4];
extern FILE *out;
extern unsigned long r_tm; // registration timevolatile pid_t pci_proxy=0;
volatile int pci_irqid=0;
extern volatile pid_t tm_proxy;
extern volatile int tm_irqid;
extern int pcl818_iobase;/*==============================================*/
pid_t __far irq_handler(void)
{static int addr, creg_adr, i;
static unsigned char cstate, lsr;
unsigned long v;
double t1,b,d,r; // если переменные объявлены static или volatile то os падает печатая dump на первом обращении к ним
static unsigned long tm_val[4]={0x0fffffffL, 0x0fffffffL, 0x0fffffffL, 0x0fffffffL};
disable();
lsr= inp(altera_iobase +0x20) & 0x0f;
for(i=0, addr= altera_iobase; i < 4 ; i++, addr+=0x08)
{creg_adr=addr + 0x04;
if( (cstate= inp(creg_adr)) & IRQ_EXIST)
{if(cstate & CAPTURE_IRQ)
{if(lsr & (0x01 << i))
{rspeed[i]= tm_val[i] - inpd(addr);
t1= (double) rspeed[i];
t1/= 14318180.0;
b= 240.0 * t1 - 1/t1;
d= sqrt( pow(b,2.0) - 960.0) ;
r= (-b -d)/480.0;
r*= 14318180.0;
r+=r/10.0;
v= labs((unsigned long)(r));
tm_val[i]=v + 1000000L; // OS падает здесь
}
}
if(cstate & TIMER_IRQ)
{rspeed[i]=0x0fffffffL;
tm_val[i]=0x0fffffffL;}
outp (creg_adr, 0x00L);
outpd(addr , 0x00L);
outp (creg_adr, 0x18L);
outp (creg_adr, 0x3bL);
}
}
enable();
return pci_proxy;
}
E-mail: info@telesys.ru