Am un sistem embedded cu un linux pe el, cu kernel 2.4.21 şi procesor
StrongARM-1110. La sistemul ăsta am conectate nişte plăci de achiziţie
analog/digitale cu care încerc să măsor nişte tensiuni şi curenţi de la
reţea (50Hz adicătelea).
Trebuie să iau 32 de eşantioane pe fiecare alternanţă (la fiecare 625
microsecunde), după care fac eu p'acolo FFT-uri, nebunii, alea, alea.
Pentru prelevarea eşantioanelor am setat un timer aşa cum se vede în
progrămelul de mai jos (scuze de lungimea postului), numai că
rezultatul e dezastruos: dacă măsor o tensiune costantă, rezultatul
întors e corect cu o precizie mai mult decât mulţumitoare, dacă măsor o
tensiune alternativă, am pus-o! Şi asta din cauza timer-ului care numai
la 625us nu bate şi când aplic prelucrările numerice asupra
eşantioanelor, iese o poezie!
Nu se pune problema vitezei de eşantionare a plăcilor de achiziţie, alea
merg lejer la 200k măsurători/sec.
Cum aş putea rezolva cât de cât problema asta cu timerul?
Am încercat "nice" da' linuxul de la sistemul ăsta n-a auzit de aşa
ceva.
***********************cut here*****************************
#include <diverse rahaturi>
static int dovalue=0;
void sig_handler(int sig)
{
//ceva activitati aici
EnableTimer(625);
}
int main()
{
slot_signal_t sig;
static struct sigaction act, act_old;
/* set action for signal */
act.sa_handler = sig_handler;
sigemptyset(&act.sa_mask);
sigaddset(&act.sa_mask, SIGALRM);
if (sigaction(SIGALRM, &act, &act_old)) {
Close_Slot(SLOT0);
Close_Slot(SLOT1);
puts("La culcare, belele!");
return FAILURE;
}
/* signal condiction */
if(setSignal(SLOT0,SIGALRM,getpid())){
Close_Slot(SLOT0);
Close_Slot(SLOT1);
sigaction(SIGALRM, &act_old, NULL);
puts("La culcare, belele!");
return FAILURE;
}
EnableTimer(625);
//alte acţiuni
DisableTimer();
sigaction(SIGALRM, &act_old, NULL);
return SUCCESS;
}
***********************cut here*****************************
--
Dragos P
126296 luser
"La revedere. Drum bun"
_______________________________________________
RLUG mailing list
[email protected]
http://lists.lug.ro/mailman/listinfo/rlug