Documente Academic
Documente Profesional
Documente Cultură
Cuprins
Obiectivele unităţii de învăţare nr. 12
Conectarea semnalelor cu variatie continua la sistemul de calcul.
Citirea semnalelor cu variatie continua
Citirea semnalelor cu variatie continua prin pooling în sisteme multi‐
tasking
Citirea semnalelor cu variatie continua utilizând întreruperile în sisteme
multi‐tasking
Citirea semnalelor cu variatie continua utilizând transferul prin DMA
Citirea si procesarea semnalelor cu variatie continua utilizând procesoare de semnal (DSP-
uri)
Generarea semnalelor cu variatie continua
Răspunsuri şi comentarii la întrebările din testele de autoevaluare
4
DAC = digital‐analog converter = convertor digital‐analogic = convertor numeric‐analogic
Conectarea unui proces la sistemul de calcul. Functii de operare cu semnale continue
Fig. 4
5
Memoria analogică poate fi constituită dintr‐un condensator cu pierderi mici și de clasă de precizie foarte bună
Conectarea unui proces la sistemul de calcul. Functii de operare cu semnale continue
salvarea valorii numerice convertite din convertor în registrul de date
al interfeței;
Citirea valorii convertite de către procesor;
Prelucrarea numerică primară a valorii numerice citite.
Comanda operării acestui convertor este implementată în software printr‐un
algoritm ce execută următorii pași (vezi Fig. 5):
‐ Procesorul va selecta canalul analogic din
interfață pentru care se execută conversia, prin
înscrierea valorii canalului selectat în
multiplexor
‐ Pentru procesoare foarte rapide, se așteaptă
un timp (cât se poate de scurt) pentru ca
semnalul analogic de la intrarea
multiplexorului să se stabilizeze la intrarea
convertorului (timpii sunt de ordinul
microsecundelor)
‐ Activarea comenzii de eșantionare a
semnalului, concomitent cu pornirea
procesului de achiziție
‐ Se intră în așteptare, până când convertorul
analog‐numeric termină procesul de conversie;
‐ Cand procesul de conversie s‐a terminat,
procesorul va citii datele convertite din
registrul de date al convertorului.
Fig. 5
6
In schemele de evolutie sunt marcați timpul de execuție al echipamentului electronic tHW și timpul execuție al
programului pe procesor tSW
Conectarea unui proces la sistemul de calcul. Functii de operare cu semnale continue
În acest pas, procesorul execută instrucțiunea outportb(…), instrucțiune care
determină înscrierea în registrul de control al multiplexării (aflat la adresa
MUX_ADDR), din interfață, a canalului de multiplexare pentru care se realizează
conversia (CH). Se observă un timp ocupat de execuția instrucțiunii outportb și un
timp scurs pentru transferul datelor de la procesor până la selecția canalului.
‐ Pasul 2: Se așteaptă un timp până
când semnalul de la intrare se
stabilizează la intrarea în
convertorul ADC.
…..
outportb(MUX_ADDR, CH);
delay_us(2);
Fig. 7
Fig. 6
Conectarea unui proces la sistemul de calcul. Functii de operare cu semnale continue
fiecare este conectat pe câte o intrare, atunci prin algoritmul prezentat în Fig. 7, dacă
ne aflăm la eșantionul j (k=j), algortimul va determina achiziția semnalului
conectat pe intrarea CH_0 (corespunzător lui i=0), după achiziție și prelucrare
primară semnalul se va depune în locația s2[k=j][i=0], urmează după un timp
(determinat de întârzierile date de timpii de execuție ai programului din procesor)
achiziția eșantionului j pentru următorul canal, canalul i=1, conectat la intrarea
CH_1. După achiziție și prelucrare primară acesta se va depune în locația
s2[k=j][i=1]. După un alt interval de timp se va trece la achiziția eșantionului j
pentru canalul i=2, conectat la intrarea CH_2. După achiziție și prelucrare primară
valoarea preluată se va depune în locația s2[k=j][i=2]. Urmează achiziția
eșantionului j pentru semnalului de pa CH_3, cu indexul i=3. După achiziție și
prelucrare va fi salvată valoarea în locația s2[k=j][i=3]. În acest moment s‐au
achiziționat și prelucrat câte un eșantion (cu indexul j) pentru fiecare canal de
semnal. Algoritmul se va relua pentru următorul eșantion j+1, realizând conversia
și prelucrarea primară pentru fiecare canal.
‐ Acest algorimt se prezintă
evolutiv ca în figura de alături
…..
for(k=0; k<n; ++k) {
for(i=0; i<4; ++i) {
outportb(MUX_ADDR, i);
delay_us(2);
outportb(CTR_ADDR, \
ADCSTART);
while( ! inportb( STATUS_ADDR)\
& ADC_READY) ;
v2 = inportw(DATA_ADDR);
s2[k][i] = P1(v2);
};
};
….
Acest proces se realizează pentru “n” eșantioane de semnal, pentru fiecare semnal
analogic de intrare. Este de remarcat, faptul că, pe perioada achiziției și prelucrării
primare aplicația necesită încărcarea totală a procesorului.
Conectarea unui proces la sistemul de calcul. Functii de operare cu semnale continue
‐ După achiziția tuturor valorilor
se poate trece la analiza și
prelucrarea semnalelor
achzitionate pe baza algoritmilor
implementați.
…..
for(k=0; k<n; ++k) {
for(i=0; i<4; ++i) {
outportb(MUX_ADDR, i);
delay_us(2);
outportb(CTR_ADDR, \
ADCSTART);
while( ! inportb( STATUS_ADDR) & ADC_READY) ;
v2 = inportw(DATA_ADDR);
s2[k][i] = P1(v2);
};
};
P2(s2);
….
Procesul P2 este consumator de resurse de procesor, pentru calcule matematice,
logice și pentru algoritmi de reglaj.
Acest sistem poate consta ca sistem de bază pentru un echipament de
achiziții care funcționează tot timpul. Astfel algoritmul prezentat poate fi pus intr‐o
buclă infinită.
while(1) {
for(k=0; k<n; ++k) {
for(i=0; i<4; ++i) {
outportb(MUX_ADDR, i);
delay_us(2);
outportb(CTR_ADDR, \
ADCSTART);
while( ! inportb( STATUS_ADDR \
) & ADC_READY) ;
v2 = inportw(DATA_ADDR);
s2[k][i] = P1(v2);
};
};
P2(s2);
};
Algoritmul prezentat se numește mecanism de achiziție în pooling (în continuu).
Acest algoritm se remarcă prin simplitate, se preferă a fi utilizat la procese lent
Conectarea unui proces la sistemul de calcul. Functii de operare cu semnale continue
evolutive în timp, și care nu necesită
convertoare de viteză mare. De asemeni,
are un mare dezavantaj, acela că sunt
introduși timpi morți, prin așteptarea
semnalului de sfârșit de conversie (EOC)
–semnal generat de convertorul ADC‐.
Se remarcă o încărcare nejudicioasă a
procesorului, dată de execuția
instrucțiunilor:
while( ! inportb( STATUS_ADDR ) & ADC_READY) ;
pentru așteptarea semnalului de EOC.
Un alt dezavantaj al acestui algoritm îl constituie posibilitatea de ca sisitemul sse
blocheze în bucla de așteptare a semnalului de sfârșit de conversie, în cazul în care
apare o problemă cu placa de interfață. Astfel se poate bloca tot sistemul de
achiziție și control.
Această metodă de achiziție în pooling, se recomandă a fi folosită la semnale lent
variabile în timp, în cadrul sistemelor ieftine de comandă și control și în sisteme cu
microcontrollere. Ea este utilizată în sisteme mono‐task‐ing9.
O îmbunătățire a sistemului s‐ar putea realiza prin utilizarea unui sistem de
operare multitasking (cu cel puțin două task‐uri active), un task va realiza funcția
de achizție, iar cel de‐al doilea task va realiza operațiile matematice și logice, de
calcul, procesare și comandă (realizată de funcțiile P1(v2) și P2 (s2)). Cele două
task‐uri functionând în paralel și realizând o încărcare uniformă a procesorului
sistemului.
Fig. 8
Fig. 9
Task‐ul T1 va executa o buclă infinită, în care există două cicluri for. Primul
ciclu este un ciclu for care iterează indexul eșantionului convertit ( ),
cel de‐al doilea ciclul iterează indexul canalului de convertor ADC convertit
Conectarea unui proces la sistemul de calcul. Functii de operare cu semnale continue
( 0, 3). Interiorul ciclurilor cuprinde procesul de achiziție (vezi Fig. 9). După
realizarea procesului de achiziție se așteaptă ca task‐ul T2 să fie disponibil pentru
preluarea unei noi date pentru procesare (waitmessage(T2)); dacă s‐a primit mesaj
de la task‐ul T2, atunci task‐ul T1 poate continua și preia datele din convertor, le
salvează în memorie (la variabila v2) și de asemeni salvează indexul eșantionului și
al canalului în două variabile de memorie comune cu task‐ul T2 (variabila k1 și
respectiv i1). După realizarea transferului de date se transmite un mesaj către
task‐ul T2, pentru inițializarea procesului de calcul primar (sendmessage(T2)) și se
continuă cu preluarea următorului eșantion.
// Task T1
//
// n = numarul de esantioane
#define n 1000
global unsigned int i1; // indexul canalului de conversie pentru calcule
global unsigned int k1; // indexul eșantionului pentru calcule
global unsigned int v2; // valoarea curenta convertita
global unsigned int s2[n][4]; // array‐ul în care sunt stocate datele convertite
void main_t1( void)
{
unsigned int i; // indexul canalului de conversie pentru achizie
unsigned int k; // indexul eșantionului pentru achizitie
while(1) {
for(k=0; k<n; ++k) {
for(i=0; i<4; ++i) {
outportb(MUX_ADDR, i);
delay_us(2);
outportb(CTR_ADDR, ADCSTART);
while( ! inportb( STATUS_ADDR) & ADC_READY) ;
waitmessage( T2);
v2 = inportw(DATA_ADDR);
i1 = i; k1 = k;
sendmessage( T2);
};
};
};
Task‐ul T2 la inițializare va transmite un mesaj către task‐ul T1
(sendmessage(T1)) pentru a debloca task‐ul T1 la achiziția primului eșantion. În
continuare rulării lui, task‐ul T2 execută o buclă infinită. În corpul buclei acestui
task, se va aștepta în primul rând un mesaj de la task‐ul T1 (waitmessage(T1)),
mesaj ce indică faptul că un eșantion a fost achiziționat de către procesor de la
Conectarea unui proces la sistemul de calcul. Functii de operare cu semnale continue
convertorul ADC, după deblocarea task‐ului T2, se intră în procedura de calcul
primar pentru valoarea achiziționată. După execuția funcției de calcul (funcția
P1(v2)) se va stoca valoarea obținută într‐o arie de valori (s2[k][i]). Urmează
transmiterea unui mesaj către T1 (sendmessage(T1)), prin care se anunță faptul că
task‐ul T2 este gata să proceseze un nou eșantion. Înaintea închiderii corpului
buclei task‐ului T2, se va face o validare, dacă s‐au procesat toate eșantioanele și
matricea de valori de ieșire s‐a umplut, se va transmite un mesaj către task‐ul T3
(sendmessage( T3)), task care procesează datele de intrare și controlează procesul,
mesaj ce indică achiziția unui număr “n” de eșantioane.
// Task T2
//
#define n 1000
external unsigned int i1; // indexul canalului de conversie pentru calcule
external unsigned int k1; // indexul eșantionului pentru calcule
external unsigned int v2; // valoarea curenta convertita
external unsigned int s2[n][4]; // array‐ul în care sunt stocate datele convertite
void main_t2( void)
{
// trimit un mesaj către T1, pentru a debloca primul waitmessage(T2)
// din task‐ul T1
sendmessage( T1);
while(1) {
// astept ca prima conversie pe T1 să se termine
waitmessage( T1);
s2[k1][i1] = P1( v2);
// am terminat calculul, anunț T1 că datele achiziției curente se pot
// transfera în memoria de date și poate începe o nouă achiziție
sendmessage( T1);
if(( i1 ==3) && (k1==n)) {
// dacă s‐au terminat de calculat toate eșantionale
// se poate activa un nou proces de comandă și control
sendmessage( T3);
}
}
}
Task‐ul T3 este task‐ul care se ocupa cu algoritmii de control și comandă.
Acest task are o buclă principală. În corpul acestei bucle se așteaptă un mesaj ce
indică faptul că s‐au preluat datele pentru control și au fost procesate primar
(waitmessage(T2)); după debloare (la primirea mesajului de la task‐ul T2), se
Conectarea unui proces la sistemul de calcul. Functii de operare cu semnale continue
activează funcția de procesare a algortimului de control și comandă (funcția
P2(s2)).
// Task T3
//
#define n 1000
external unsigned int s2[n][4]; // array‐ul în care sunt stocate datele convertite
void main_t3( void)
{
while(1) {
// aștept mesaj de la T2, cu privire la primirea unui pachet de date
waitmessage( T2);
P2(s2);
}
}
Evoluția în timp a unui sistem de achiziție în pooling într‐un sistem de operare
multi‐tasking este prezentată mai jos:
‐ Pasul 1: inițializare celor două
cicluri
…..
for(k=0; k<n; ++k) {
for( i=0; i<3; ++i) {
În aces pas se inițializează cele două cicluri, unul pentru indexarea eșantionului
(k=0,n) și cel de‐al doilea pentru indexarea canalului de convertor (i=0,3).
Observăm un timp ocupat de execuția instrucțiunilor for.
‐ Pasul 2: selecția canalului de
conversie, în funcție de indexul
canalului (i)
…..
for(k=0; k<n; ++k) {
for( i=0; i<3; ++i) {
outportb(MUX_ADDR, i);
Conectarea unui proces la sistemul de calcul. Functii de operare cu semnale continue
În acest pas, procesorul execută instrucțiunea outportb(…), instrucțiune care
transferă înscrierea în registrul de control al multiplexării (aflat la adresa
MUX_ADDR), din interfață, a canalului de multiplexare pentru care se realizează
conversia (i). Se observă un timp ocupat de execuția instrucțiunii outportb și un
timp scurs pentru transferul datelor de la procesor până la selecția canalului.
‐ Pasul 3: Se așteaptă un timp până
când semnalul de la intrare se
stabilizează la intrarea în convertorul
ADC.
…..
for(k=0; k<n; ++k) {
for( i=0; i<3; ++i) {
outportb(MUX_ADDR, i);
delay_us(2);
Fig. 10
Conectarea unui proces la sistemul de calcul. Functii de operare cu semnale continue
Citirea semnalelor cu variatie continua utilizând întreruperile în sisteme multi-tasking
Mecanismul de achiziție în pooling în sistemele multitasking prezintă
principalul dezavantaj că ocupă timp la procesor pentru testarea semnalului de
sfârșit de conversie. Putem păstra structura organizatorică de multitasking cu un
proces de achiziție, cu un proces de calcul și un proces de control al sistemului
numeric.
Acest sistem presupune conectarea semnalului de sfârșit de conversie al
convertorului ADC la sistemul de întreruperi al calculatorului (operație realizată
prin cablarea internă a echipamentului). Astfel la generarea unui semnal de EOC
Fig. 11
Fig. 12
Fig. 13
// Task T1
//
// n = numarul de esantioane
#define n 1000
global unsigned int i1; // indexul canalului de conversie pentru calcule
global unsigned int k1; // indexul eșantionului pentru calcule
global unsigned int v2; // valoarea curenta convertita
global unsigned int s2[n][4]; // array‐ul în care sunt stocate datele convertite
void main_t1( void)
{
unsigned int i; // indexul canalului de conversie pentru achizie
unsigned int k; // indexul eșantionului pentru achizitie
attachinterrupt(EOC_INT, &main_t1);
while(1) {
for(k=0; k<n; ++k) {
for(i=0; i<4; ++i) {
outportb(MUX_ADDR, i);
delay_us(2);
outportb(CTR_ADDR, ADCSTART);
waitinterrupt( EOC_INT);
v2 = inportw(DATA_ADDR);
i1 = i; k1 = k;
sendmessage( T2);
};
};
};
Task‐ul T2 execută o buclă infinită. În corpul buclei acestui task, se va aștepta
în primul rând un mesaj de la task‐ul T1 (waitmessage(T1)), mesaj ce indică faptul
că un eșantion a fost achiziționat de către procesor de la convertorul ADC, după
deblocarea task‐ului T2, se intră în procedura de calcul primar pentru valoarea
achiziționată. După execuția funcției de calcul (funcția P1(v2)) se va stoca valoarea
obținută într‐o arie de valori (s2[k][i]). Datorită faptului că în perioada achiziției
task‐ul T1 este suspendat, timpul acces la procesor al task‐ului T2 crește de la 30%
la 50% (task‐ul T2 va împărții timpul de procesor numai cu task‐ul T3), timpul va fi
suficient pentru prelucrarea primară a semnalului, nemiafiind necesară anunțarea
task‐ului T1 despre terminarea procesului de calcul. Înaintea închiderii corpului
buclei task‐ului T2, se va face o validare, dacă s‐au procesat toate eșantioanele și
matricea de valori de ieșire s‐a umplut, se va transmite un mesaj către task‐ul T3
(sendmessage( T3)), task care procesează datele de intrare și controlează procesul,
mesaj ce indică achiziția unui număr “n” de eșantioane.
Conectarea unui proces la sistemul de calcul. Functii de operare cu semnale continue
// Task T2
//
#define n 1000
external unsigned int i1; // indexul canalului de conversie pentru calcule
external unsigned int k1; // indexul eșantionului pentru calcule
external unsigned int v2; // valoarea curenta convertita
external unsigned int s2[n][4]; // array‐ul în care sunt stocate datele convertite
void main_t2( void)
{
while(1) {
// astept ca prima conversie pe T1 să se termine
waitmessage( T1);
s2[k1][i1] = P1( v2);
if(( i1 ==3) && (k1==n)) {
// dacă s‐au terminat de calculat toate eșantionale
// se poate activa un nou proces de comandă și control
sendmessage( T3);
}
}
}
Task‐ul T3 este task‐ul care se ocupa cu algoritmii de control și comandă.
Acest task are o buclă principală. În corpul acestei bucle se așteaptă un mesaj ce
indică faptul că s‐au preluat datele pentru control și au fost procesate primar
(waitmessage(T2)); după debloare (la primirea mesajului de la task‐ul T2), se
activează funcția de procesare a algortimului de control și comandă (funcția
P2(s2)).
// Task T3
//
#define n 1000
external unsigned int s2[n][4]; // array‐ul în care sunt stocate datele convertite
void main_t3( void)
{
while(1) {
// aștept mesaj de la T2, cu privire la primirea unui pachet de date
waitmessage( T2);
P2(s2);
}
}
Conectarea unui proces la sistemul de calcul. Functii de operare cu semnale continue
Evoluția în timp a unui sistem de achiziție în pooling într‐un sistem de operare
multi‐tasking este prezentată mai jos:
‐ Pasul 1: inițializare
…..
attachinterrupt( EOC_INT, T1);
….
În aces pas se inițializează task‐ul T1, prin execuția funcției de atașare a funcției
atașate task‐ului T1 (main_t1) la întreruperea EOC_INT din sistemul de operare.
‐ Pasul 2: inițializare celor două
cicluri
…..
attachinterrupt( EOC_INT, T1);
…..
for(k=0; k<n; ++k) {
for( i=0; i<3; ++i) {
În aces pas se inițializează cele două cicluri, unul pentru indexarea eșantionului
(k=0, n) și cel de‐al doilea pentru indexarea canalului de convertor (i=0,3).
Observăm un timp ocupat de execuția instrucțiunilor for.
‐ Pasul 3: selecția canalului de
conversie, în funcție de indexul
canalului (i)
…..
attachinterrupt( EOC_INT, T1);
…..
for(k=0; k<n; ++k) {
for( i=0; i<3; ++i) {
outportb(MUX_ADDR, i);
12
SOC = Start of Convertion = începutul conversiei
Conectarea unui proces la sistemul de calcul. Functii de operare cu semnale continue
instrucțiunii la nivel de procesor, până când din registrul de control se generează
semnalul de SOC.
‐ Pasul 6: Convertorul ADC a intrat în regim
de conversie AD, intră în stare de
suspendare până la apariția semnalului
de EOC
…..
attachinterrupt( EOC_INT, T1);
…..
for(k=0; k<n; ++k) {
for( i=0; i<3; ++i) {
outportb(MUX_ADDR, i);
delay_us(2);
outportb(CTR_ADDR, ADCSTART);
waitinterrupt(EOC_INT);
Ne aflăm la nivelul pasului în care task‐ul T1 își suspendă activitatea până când
apare evenimentul EOC_IN. Procesorul între timp va executa în comun cu task‐urile
T2 și T3.
‐ Pasul 7: Convertorul ADC a terminat
conversia AD, transferă datele în registrul
de date și emite un semnal EOC
…..
attachinterrupt( EOC_INT, T1);
…..
for(k=0; k<n; ++k) {
for( i=0; i<3; ++i) {
outportb(MUX_ADDR, i);
delay_us(2);
outportb(CTR_ADDR, ADCSTART);
waitinterrupt(EOC_INT);
În acest pas task‐ul T1 este încă în regim de suspendare până apare semnalizarea
de EOC_INT. Sistemul execută task‐urile T2 și T3, este posibil ca până în acest
moment task‐ul T2 să fi terminat calculele.
Conectarea unui proces la sistemul de calcul. Functii de operare cu semnale continue
‐ Pasul 8: Semnalul EOC este generat de
interfața ADC către controllerul de
întreruperi, iar acesta (prin intermediul
procesorului) generează în sistemul de
operare semnalul EOC_INT.
…..
attachinterrupt( EOC_INT, T1);
…..
for(k=0; k<n; ++k) {
for( i=0; i<3; ++i) {
outportb(MUX_ADDR, i);
delay_us(2);
outportb(CTR_ADDR, ADCSTART);
waitinterrupt(EOC_INT);
Evenimentul EOC_INT ajunge la nivelul sistemului de operar, unde va fi gestionat
de către software.
‐ Pasul 9: Task‐ul T1 se deblochează și
intră‐n starea de execuție.
…..
attachinterrupt( EOC_INT, T1);
…..
for(k=0; k<n; ++k) {
for( i=0; i<3; ++i) {
outportb(MUX_ADDR, i);
delay_us(2);
outportb(CTR_ADDR, ADCSTART);
waitinterrupt(EOC_INT);
Task‐ul T1 se va debloca și intră în paralel în execuție cu task‐ul T3.
‐ Pasul 10: Se preiau datele din convertor
și sunt salvate în memorie.
…..
attachinterrupt( EOC_INT, T1);
…..
for(k=0; k<n; ++k) {
for( i=0; i<3; ++i) {
outportb(MUX_ADDR, i);
delay_us(2);
outportb(CTR_ADDR, ADCSTART);
waitinterrupt(EOC_INT);
v2 = inportw(ADC_DATA);
i1= i; k1=k;
Conectarea unui proces la sistemul de calcul. Functii de operare cu semnale continue
Task‐ul T1 preia datele din convertor și le salvează în locația v2, de asemeni va
salva indexul canalului pentru care s‐au preluat datele în locația i1, iar în locatia k1
va salva indexul eșantionului preluat.
‐ Pasul 11: Se transmite o semnalizare
către task‐ul T2, prin care anunță
terminarea procesului de conversie.
…..
attachinterrupt( EOC_INT, T1);
…..
for(k=0; k<n; ++k) {
for( i=0; i<3; ++i) {
outportb(MUX_ADDR, i);
delay_us(2);
outportb(CTR_ADDR, ADCSTART);
waitinterrupt(EOC_INT);
v2 = inportw(ADC_DATA);
i1= i; k1=k;
sendmessage( T2);
În acest punct task‐ul T1 a terminat achiziția și preluarea de date din convertorul
ADC și transmite un mesaj către task‐ul T2, deblocând acest task din starea de
așteptare.
‐ Pasul 12: Procesul task‐ului T1 se reia
pentru următorul eșantion
…..
attachinterrupt( EOC_INT, T1);
…..
for(k=0; k<n; ++k) {
for( i=0; i<3; ++i) {
outportb(MUX_ADDR, i);
delay_us(2);
outportb(CTR_ADDR, ADCSTART);
waitinterrupt(EOC_INT);
v2 = inportw(ADC_DATA);
i1= i; k1=k;
sendmessage( T2);
}
}
Task‐ul T1 reia procesul de la început pentru următorul eșation. Pentru task‐urile
T2 și T3 execuția continuă.
În paralel cu task‐ul T1 se execută și task‐ul T2, care task realizează calculele
primare pentru fiecare eșantion de semnal achiziționat în parte. Task‐ul este
paralelizat cu task‐ul T1, astfel încât dacă task‐ul T1 achizionează eșantionul j,
Conectarea unui proces la sistemul de calcul. Functii de operare cu semnale continue
pentru un canal c (c=1, 3), atunci T2 va executa calculele primare pentru
eșantionul j, pentru canalul c‐1; dacă task‐ul T1 achizionează eșantionul j, pentru
un canal 0, atunci T2 va executa calculele primare pentru eșantionul j‐1, pentru
canalul 3. Fazele execuției pentru task‐ul T2 sunt:
‐ Pasul 1: Task‐ul T2 așteaptă un
mesaj de la task‐ul T1, prin care este
anunțat că un eșantion a fost
achiziționat și transferat în memoria
de date (v2)
…..
waitmessage( T1);
Task‐ul T1 își execută algoritmul descris mai sus. La terminarea unei achiziții task‐
ul T1 va emite un mesaj către task‐ul T2. Când task‐ul T2 primește mesajul, acesta
este avertizat că task‐ul T1 a terminat o achiziție și poate începe calculele primare
pentru eșantionul achiziționat)
‐ Pasul 2: Task‐ul T2 realizează
calculele primare pentru eșantionul
achiziționat, după care salvează
rezultatul în memorie
…..
waitmessage( T1);
s2[i1][k1] = P1( v2);
Task‐ul T2 realizează calculul mărimii primare pentru eșantionul din v2, apelând
procedura P1(v2) și salvează valoarea în memorie în locația din matricea
s2[i1][k1], în paralel task‐ul T1 își continuă activitatea, iar task‐ul T3 rulează în
paralel cu T2 sau este în așteptare până când un nou pachet de date este pregătit
pentru prelucrare.
‐ Pasul 3: Dacă task‐ul T2 a ajuns la
ultimul eșantion, atunci task‐ul T2
va transmite un mesaj către task‐ul
T3, pe care‐l anunță că, s‐au
terminat calculele pentru toate
eșantionale.
…..
waitmessage( T1);
s2[i1][k1] = P1( v2);
sendmessage( T1);
if( i1==3 && k1==n)
sendmessage( T3);
Conectarea unui proces la sistemul de calcul. Functii de operare cu semnale continue
La acest nivel, dacă s‐au procesat toate eșantioanele pentru toate canalele, va
trebui să pornim task‐ul de comandă și control. După transmiterea mesajului, task‐
ul T3 se va debloca.
Task‐ul T2, va trece în așteptare până la venirea unei noi semnalizări de la task‐ul
T1.
Task‐ul T3 se execută în paralel cu taskurile T1 și T2. Execuția acestui task
determină controlul procesului. Fazele execuției task‐ului T3 sunt:
‐ Pasul 1: Task‐ul T3 așteaptă un
mesaj de la task‐ul T2, prin care este
anunțat că un bloc de date a fost
achizționat și prelucrat, datele se
regăsesc în matricea (s2)
…..
waitmessage( T2);
La primirea unui mesaj de la task‐ul T2, task‐ul T3 se va activa. Celelalte task‐uri
din sistem se vor executa în paralel.
‐ Pasul 2: Task‐ul T3 trece la execuția
funcției de procesare și control
…..
waitmessage( T2);
P2( s2);
Acest task execută funcția P2 de execuție și control a procesului, în timp ce
celelalte task‐uri îsi continua starea lor de execuție.
‐ Pasul 3: Task‐ul T3 a terminat de
executat funcția P2 și revine la pasul
de așteptare a unui nou bloc de date
…..
waitmessage( T2);
P2( s2);
Acest task execută funcția P2 de execuție și control a procesului, în timp ce
celelalte task‐uri îsi continua starea lor de execuție.
Sistemul de control al procesului utilizând
întreruperile, pe un sistem de operare multitask‐ing
poate realiza o încărcare a procesorului asemănătoare
cu cea din figura Fig. 14
Fig. 14
Conectarea unui proces la sistemul de calcul. Functii de operare cu semnale continue
Observăm că avantajul unui sistem de achiziție pe întreruperi constă în
faptul că, acest mod de programare aduce o folosire mai judicioasă a resurselor
procesorului.
Acest sistem de achiziție se pretează a fi folosit în procesele lent și mediu
evolutive în timp (timpii de răspuns sunt de la 1 sau câteva secunde, până la
intervale de ore sau zile). Prin acest mod de realizare a achiziției s‐au recuperat
timpii de așteptare la convertorul ADC și de asemeni se obține o încărcare mai
judicioasă a resurselor procesorului. În acest caz, modulele software ale task‐urilor
nu se mai blochează la așteptarea unui semnal de la un modul electronic (semnalul
de sfârșit de conversie). Principalul dezvantaj al acestui sistem, rămâne, faptul că
task‐ul de achiziție pierde timp cu gestionarea sistemului de achiziție.
Sistemul de achiziții utilizând întreruperile se recomandă în sistemele cu
costuri reduse, care utilizează microcontrolere și care utilizează multitasking‐ul cu
număr redus de task‐uri.
Acest sistem poate fi îmbunătățit prin utilizarea unui sistem mai complex,
care implică utilizarea unui echipament de transfer direc a informației din port în
memorie, anunțarea procesorului în momentul în care datele au fost preluate,
astfel toate funcțiile task‐ului de achiziție sunt preluata de hardware.
Conectarea unui proces la sistemul de calcul. Functii de operare cu semnale continue
Citirea semnalelor cu variatie continua utilizând transferul prin DMA în sisteme multi-
tasking
Mecanismul de achiziție care utilizează transferul prin DMA, oferă marele
avantaj al degrevării modulului de software de sarcina controlului achiziției.
Sarcina controlului procesului de achiziție este transferat unității de control
DMAC13 (DMA14 Controller). După terminarea sarcinii, controller‐ul de DMA
(DMAC) transmite o întrerupere (DMA_INT) controller‐ului de întreruperi (CINT).
Această întrerupere va fi interceptată de software; pentru program ea are
semnificația sfârșitului achiziției pentru un bloc de date. După recepția acestei
întreruperi software‐ul poate realiza procesarea datelor, iar în paralel un nou bloc
de date poate fi programat pentru a fi preluat.
Acest sistem presupune conectarea semnalului de sfârșit de conversie al
convertorului ADC la sistemul inițializare a transferului de DMA (operație realizată
prin cablarea internă a echipamentului). Astfel la generarea unui semnal de EOC
Fig. 15
_ ,
unde,
NDMA_DATA numărul de bytes transferați de controlerul DMA
Nch reprezintă numărul de canale de achiziție, iar
Nsamples este numărul de eșantioane pe un canal)
‐ adresa portului de la care se realizează transferul (de exemplu: 0x01Ac2);
‐ adresa de memorie15 la care se stochează datele
‐ dimensiunea unui cuvant de transfer (1 octet, 2 octeți sau 4 octeți).
‐ canalul de întrerupere DMA prin care se lucrează cu controler‐ul de
întreruperi.
Un factor important îl reprezintă alocarea de memorie pentru date, memoria
pentru date este alocată în zona “far heap”, adresa fizică a memoriei se va
transmite controlerului de DMA, iar adresa logică o va prelua programul pentru
operare.
Un algoritm evolutiv în timp se poate descrie:
Programarea interfetei, a canalului DMA de transfer a datelor si a
controller‐ului de intreruperi
Pornirea convertorului AD si a controller‐ului DMA (pentru a intializa
procesul)
Controller‐ul plăcii de achiziție va initializa procesul de achizitie,
controland placa de achizitii
Canalul de achizitie al placii, va fi controlat de catre un procesor aflat
pe placa de achzitii
15
Adresa memoriei la care se stochează datele se obține prin alocare din sistemul de operare. Este adresa fizică la care se
transfera datele.
Conectarea unui proces la sistemul de calcul. Functii de operare cu semnale continue
Dupa fiecare achizitie realizata, convertorul va transmite un DMA_RQ
catre DMAC
DMAC va initia un transfer de date din convertor in memorie
Dupa realizarea transferului DMAC va genera un semnal DMA_ACK
catre placa de achizitii
Dupa un numar de transferuri/dupa ce memoria a fost umpluta, se va
genera un semnal de intrerupere catre controller‐ul de intreruperi
CINT
CINT va genera o intrerupere, catre procesor. Anuntand sfarsitul
transferului de date
Procesorul va activa task‐ul de procesare a datelor
Acest task este responsabil cu:
preluarea datelor din memorie,
Restartarea procesului de achizitie
Incerperea prelucrarii datelor
// Task T1
//
// n = numarul de esantioane
#define n 1000
void main_t1( void)
{
….
init_adc( …);
init_dma(…);
init_cint();
attachinterrupt( DMA_INT, T1) ;
while( 1) {
waitinterrupt( DMA_INT) ;
P3(s2);
}
}
Acest mecanism prezentat este denumit mecanism de achiziție prin DMA.
Avantajul principal al acestui mecanism este acela că se poate adapta la orice tip de
proces (atât la cele rapide, cât și la cele medii sau lente). Acest mecanism oferă o
Conectarea unui proces la sistemul de calcul. Functii de operare cu semnale continue
încărcare judicioasă a sistemului de calcul; acesta fiind responsabil numai cu
partea de calcule. Dezavantajul este costul mai ridicat față de celelalte sisteme16.
Această metodă se recomandă în sisteme multitasking, cu încărcare mare a
volumului de calcule și în sisteme care procesează semnale cu variație rapidă în
timp.
Fig. 18
16
Un controler modern dispune de toate elementele transferului prin DMA încorporate la prețuri scăzute.
17
ASIC = Application Specific Integrated Circuit = Circuit electronic specializat.
Conectarea unui proces la sistemul de calcul. Functii de operare cu semnale continue
Schema algoritmului de conversie utilizând
echipamente de tip DSP este prezentată în Fig.
19. Sistemul de calcul inițializează
comunicatia cu modulul DSP și cu controlerul
de întreruperi. Task‐ul principal se va
conecta la întreruperea gestionată de către
echipamentul DSP. După procesul de
inițializare se execută bucla principală. În
acestă buclă procesul așteaptă întreruperea
emisă de către modulul DSP. După deblocarea
task‐ului se execută codul de procesare a Fig. 19
// Task T1
//
void main_t1( void)
{
….
init_dsp( …);
init_cint();
attachinterrupt( DSP_INT, T1) ;
while( 1) {
waitinterrupt( DSP_INT) ;
P3(s2);
}
}
Avantajul principal al acestui mecanism este acela că se poate adapta la orice tip de
proces (atât la cele rapide, cât și la cele medii sau lente). Acest mecanism oferă o
încărcare judicioasă a sistemului de calcul; acesta fiind responsabil numai cu
partea de calcule. Dezavantajul este costul ridicat față de celelalte sisteme.
Această metodă se recomandă în sisteme multitasking, cu încărcare mare a
volumului de calcule și în sisteme care procesează semnale cu variație rapidă în
timp, în sisteme care necesită o analiză complexă a semnalului.
Conectarea unui proces la sistemul de calcul. Functii de operare cu semnale continue
Generarea semnalelor cu variatie continua
Procesul de conversie a unui semnal numeric într‐un semnal analogic se
realizează utilizând un convertor DAC18 și transferul direct al datelor către
convertor.
Schema unui sistem
numeric de comandă și
control care poate genera
semnale analogice este
prezentată în Fig. 20. Placa
de conversie este
interconectată în
magistrala sistemului.
Programul care reluează pe
sistem comandă transferul
de valori către convertorul
DAC. Convertorul
comandând pe ieșire
semnalele analogice. Fig. 20
// Task T1
//
void main_t1( void)
{
….
while( 1) {
v = P();
outportw( DAC_ADDR, v);
}
}
18
DAC – Digital to Analog Convertor = Convertor numeric‐analogic.
Conectarea unui proces la sistemul de calcul. Functii de operare cu semnale continue
Această metodă se recomandă pentru conversia mărimilor numerice în semnale
analogice.
Conectarea unui proces la sistemul de calcul. Functii de operare cu semnale continue
De reţinut!
‐ Achizitia unui semnal analogic se realizeaza utilizând
un convertor analog/numeric
‐ Generarea unui semnal analogic se realizeaza utilizând
un convertor analog/numeric
‐ Metode de achiziție a unui semnal analogic
o Prin pooling
o Prin întreruperi
o Prin DMA
o Utilizând DSP‐uri
Test de autoevaluare
1. Care sunt elementele constituente ale unui sistem de achizitie
analog numeric în pooling
2. Care sunt elementele constituente ale unui sistem de achizitie
analog numeric pe întreruperi
3. Care sunt elementele constituente ale unui sistem de achizitie
analog numeric pe DMA
4. Care sunt elementele constituente ale unui sistem de achizitie
analog numeric utilizând DSP‐uri
5. Care sunt elementele constituente ale unui sistem de achizitie
numeric analogic
Bibliografie
Morgan, D. “Numerical Methods – Real Time and Embedded Systems
Programming”, M&T Books, 1992
Walls, C., “Embedded Software: The Works”, O’Relly Ed., 2006
Walls, C., “Real Time Concepts for Embedded Systems”, R&D Books,
2000
Ledin, J., “Embedded Control Systems in C/C++; An Introduction on
Software Developers Using Matlab”, CMP Books, 2004