вот кусок кода:
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено goshka 06 июля 2003 г. 11:09
В ответ на: Немного теории с практикой. отправлено ValterG 06 июля 2003 г. 10:44


#pragma off (check_stack)

#define IRQ_EXIST 0xc0
#define CAPTURE_IRQ 0x80
#define TIMER_IRQ 0x40

volatile unsigned long altera_iobase;
volatile unsigned long rspeed[4];
extern FILE *out;
extern unsigned long r_tm; // registration time

volatile 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