Sunteți pe pagina 1din 15

6.

EXECUTIV ÍN TIMP REAL DESTINAT CONDUCERII CU CALCULATOR


A PROCESELOR INSUDTRIALE

6.1. Prezentare generalá


Scrierea unui EXECUTIV multitasking ín timp real destinat administrárii software (SW) a
unei aplicaþii de conducere, are rolul de a degreva programatorul de unele activitáþi de rutiná,
comune tuturor aplicaþiilor cu opþiuni de timp real, permiþänd concentrarea atenþiei acestuia
exclusiv asupra organizárii ßi structurárii aplicaþiei ßi asupra scrierii programelor specifice. Ín acest
capitol se va prezenta structura unui astfel de EXECUTIV ín timp real dedicat aplicaþiilor de
conducere a proceselor industriale cu microcalculator de proces.
Schema bloc a acestui EXECUTIV este prezentatá ín Figura 6.1.

MONITOR EXECUTIV

NUCLEUL EXECUTIVULUI TABELE SISTEM


Iniþializare - Lista de taskuri
Planificator de taskuri - Lista variabilelor
tip eveniment (flaguri)
Directive
Subrutine utilitare

MODUL DE GESTIUNE A
INTRERUPERILOR DRIVERE PENTRU
(Sistem de íntreruperi 8259) PERIFERICE
- Subrutine pentru tratarea primará - Convertor A/N
a íntreruperilor
- NIS
- Subrutine pentru programarea
circuitelor 8259, 8253, 8251 - Display (CO)
- Tastaturá (CI)
MODUL DE GESTIUNE A - Imprimantá (LP)
TIMPULUI
(Ceas de timp real realizat cu 8253)
- Iniþializare Lista de date pentru
- Directive ceasul de timp real
- Subrutine utilitare

Figura 6.1.
Acest EXECUTIV are urmátoarele caracteristici:
- este implementabil, cu mici modificári, pe orice echipament numeric de conducere bazat
pe microprocesorul 80x86;
- este modularizat, oferind posibilitatea folosirii ín cadrul unei aplicaþii numai a modulelor
SW necesare, evitändu-se astfel íncárcarea nejustificatá a memoriei echipamentului;
- modulele executivului legate cu programele specifice aplicaþiei sunt complet rezidente ín
memoria calculatorului formänd aplicaþia "dedicatá";
- permite realizarea operaþiilor multitasking de sincronizare ßi excludere mutualá cu ajutorul
variabilelor tip eveniment (flaguri) care se ímpart ín douá categorii: flaguri pentru sincronizare ßi
flaguri pentru excludere mutualá;

6-1
ACTIV Planificatorul de taskuri funcþie de prioritáþi

Intrerupere sau ?DECLR

BLOCAT
?EXC
Expirare condiþie de timp
pe o condiþie
de timp
(?IRUN condit. din subrut. ?SETF + ?WAIT
GATA DE de tratare a íntr. de la ceas)

6-2
IN EXECUÞIE
EXECUÞIE
?RUN(neconditionat) pe un eveniment
+ ?CLEF exterior ?ABORT ?CAN
?RUN(conditionat)

?ABORT OPRIT
?EXIT

?INS

NEINSTALAT

Figura 6.2.
- permite realizarea comunicárii íntre taskuri prin intermediul zonelor de date comune;
- planificarea taskurilor pentru execuþie se poate face pe bazá de prioritáþi alocate taskurilor;
- comutarea stárii taskurilor se poate realiza atät prin íntreruperi cät ßi prin directive
apelabile din taskuri;
- pentru efectuarea calculelor implicate ín taskurile componente ale aplicaþiei poate fi
folositá orice biblioteca aritmeticá cu proceduri reentrante, fie ín virgulá fixá (mai rapidá), fie ín
virgulá mobilá (mai lentá), modulele bibliotecii legändu-se opþional ín cadrul aplicaþiei aláturi de
modulele scrise de utilizator;
- pentru ußurarea activitáþii de dezvoltare ßi de depanare a programului aferent aplicaþiei,
EXECUTIVUL poate fi ínsoþit de un MONITOR propriu care permite programatorului inspectarea
ßi modificarea tabelelor de taskuri ßi de flaguri.
Mecanismul multitasking pe care-l oferá EXECUTIVUL (stárile taskurilor ßi tranziþiile íntre
aceste stári) este prezentat ín diagrama din Figura 6.2.

6.2. Nucleul EXECUTIVULUI de timp real (modulul de gestiune al taskurilor -


TKMS)

EXECUTIVUL prezentat permite lucrul pseudoconcurent a maximum 63 de taskuri de


aplicaþie, un al 64-lea task fiind un task de aßteptare (WAITSYS) propriu nucleului. Acest task
menþine unitatea centralá a echipamentului ín starea HALT pe perioadele cänd toate celelalte
taskuri aferente aplicaþiei sunt blocate. S-a ales aceastá stare (HALT), deoarece din aceastá stare
microprocesorul poate servi o cerere de íntrerupere cu cea mai mare promptitudine. Taskurile
componente aplicaþiei, rezidente ín memoria echipamentului la adrese cunoscute, sunt aduse la
cunoßtinþa EXECUTIVULUI ßi, mai exact, a párþii sale componente cea mai importantá numitá
"planificatorul de taskuri" prin directiva de instalare.
Planificatorul de taskuri pástreazá o "listá" cu informaþii despre taskuri, aceastá listá avänd
un numár corespunzátor de "casete" (cäte o casetá pentru fiecare task). Fiecare casetá este formatá
din cäte 4 octeþi de memorie.
Aceastá listá fiind aßezatá ín aceeaßi paginá de memorie RAM limiteazá numárul maxim de
taskuri la 64 (256 : 4 = 64).
Informaþiile care se pástreazá ín casetele acestei liste sunt urmátoarele (Figura 6.3):

Adrese
low
SP Registrul
INDICATORILOR DE CONDIÞIE
octet 1 STARE ..
.
octet 2 ADRESÁ VÄRF
BL
octet 3 STIVÁ BH
octet 4 X AL
AH
X
Adrese X
high "Caseta a n-a"
ADRESA DE (RE)START
A TASKULUI

Stiva taskului
Figura 6.3.
- Primul octet pástreazá informaþii referitoare la starea taskului. Din punct de vedere al
planificatorului de taskuri, un task se poate afla ín stárile NEINSTALAT (planificatorul nu are nici
o informaþie despre task, deßi acesta este íncárcat ín memorie; taskul nu are rezervatá nici o casetá
6-3
ín lista taskurilor) ßi ACTIV, cu substárile prezentate ín Fig. 6.2 (taskul a fost instalat printr-o
comandá de monitor sau directivá de instalare ßi i s-a creat o casetá ín lista planificatorului). Octetul
de stare al casetei poate avea urmátoarele valori hexazecimale:
- 00h reprezentänd task OPRIT sau nivel liber;
- (01- 0FE)h reprezentänd task BLOCAT pe un flag al cárui numár se calculeazá cu
relaþia "numár flag = valoare octet stare - 1" (avem astfel la dispoziþie un numár de 254 flaguri-
eveniment a cáror valoare este cuprinsá íntre 00h ßi 0FDh, fiecare flag fiind reprezentat pe un octet
íntr-o listá sistem de flaguri);
- 0FFh reprezentänd task aflat ín substarea GATA DE EXECUÞIE;
- Octeþii 2 ßi 3 conþin adresa värfului stivei asociate taskului. Adresa bazei stivei se defineßte
la instalare ßi aceastá stivá va rámäne permanent sub administrarea unicá a taskului. Ín momentul
blocárii taskului, informaþiile despre el (adresa de continuare, conþinutul registrelor generale ßi al
indicatorilor de condiþie) sunt salvate ín aceastá stivá ín continuarea datelor utile. Astfel, la
revenirea ín execuþie a taskului, dupá refacerea contextului, stiva se va gási la fel ca ín momentul
blocárii taskului.
- Octetul 4 nu este folosit, fiind pástrat ín rezervá.
Deci, fiecárui task íi corespunde o astfel de casetá ín lista planificatorului. Ordinea acestor
casete ín listá este fixá ßi determiná totodatá ßi nivelul de prioritate al taskului. Rezultá cá taskurile
vor avea prioritáþi fixe, nivelurile de prioritate fiind numerotate de la 0 la dimensiunea maximá a
listei de taskuri. Nivelul cel mai prioritar este nivelul 0 ßi pe fiecare nivel de prioritate se poate
instala cel mult un task.
La iniþializarea sistemului, taskul de aßteptare WAITSYS este automat instalat pe nivelul cu
prioritatea cea mai micá (ultima casetá din listá) ßi este trecut ín substarea gata de execuþie.
Planificatorul de taskuri va verifica lista taskurilor pornind de la nivelul de prioritate 0, va continua
verificarea listei de taskuri päná la nivelul de prioritate minimá pe care se va afla taskul WAITSYS.
Ín caz cá nici un task al aplicaþiei nu este gata de execuþie, planificatorul va gási totußi taskul
WAITSYS ín starea GATA DE EXECUÞIE ßi va aduce unitatea centralá ín HALT, urmänd sá fie
scoasá din aceastá stare printr-o íntrerupere (eventual de la ceasul de timp real).
Pentru realizarea operaþiilor multitasking de sincronizare, excludere mutualá ßi comunicare
íntre taskuri, programatorul are la dispoziþie un numár de 254 flaguri (variabile tip eveniment) care
pot lua doar douá valori: RESET (flagul are valoarea 00h) ßi SET (flagul are valoarea 0FFh) ßi care
sunt memorate pe un octet íntr-o listá specialá de flaguri a nucleului. Asupra acestor flaguri
utilizatorul poate acþiona numai prin intermediul unor directive specializate de tip declanßazá,
consumá, citeßte, aßteaptá, directive care vor fi prezentate ín continuare. De regulá, primele 16
flaguri sunt la dispoziþia sistemului (se folosesc ín drivere) ßi nu se recomandá utilizarea lor de cátre
programator.
Ín vederea obþinerii cu succes a operaþiei de excludere mutualá (de simulare a primitivelor P
ßi V), pentru flagurile íncepänd de la o anumitá valoare (selectabilá la generarea sistemului),
directivele de aßteptare ßi consumare a unui eveniment se executá succesiv íntr-o secvenþá
neíntreruptibilá (simularea primitivei P). Primitiva V este realizatá de directiva de declanßare a
evenimentului.

Directivele nucleului EXECUTIVULUI


Directivele nucleului executivului sunt subrutine de sistem prin intermediul cárora este
permis accesul taskurilor utilizator la listele interne ale sistemului, producänd modificári ín ele ßi,
implicit, modificári ale stárilor taskurilor.
Directivele EXECUTIVULUI se pot ímpárþi ín douá categorii:
- directive explicite apelate de utilizator ín cadrul taskurilor;
- directive implicite care sunt apelate prin intermediul directivelor din prima categorie.
6-4
De asemenea, directivele, dupá necesitáþi, pot declara eveniment semnificativ la apelarea lor
(ceea ce va determina transferul controlului cátre planificatorul de taskuri) sau pot returna controlul
taskului apelant, dupá efectuarea serviciului cerut (nu declará eveniment semnificativ).
Transferul de parametri cátre ßi dinspre directive se face prin intermediul registrelor
microprocesorului. Pe timpul lucrului directivelor, deoarece se fac modificári ín tabelele de sistem,
sistemul de íntreruperi al microprocesorului trebuie dezactivat pentru a impiedica apariþia unor
situaþii nedorite. Din acest motiv, toate directivele explicite "sensibile" se prezintá ín douá variante,
apelabile astfel:
?nume ßi ?Inume
Funcþia lor este identicá, ínsá din punct de vedere al íntreruperilor situaþia se prezintá astfel:
- prima varianta (?nume) se foloseßte pentru apel din task ßi
?nume conþine ín corpul ei instrucþiuni de dezactivare ßi apoi de
activare a sistemului de íntreruperi;
Dezactiveazá íntreruperile - a doua variantá se foloseßte fie ca apel direct din íntreruperi
(poate fi consideratá ca o subrutiná de tratare a íntreruperii), fie
?Inume ca apel din task ín condiþiile ín care sistemul de íntreruperi era
deja dezactivat.
Activeazá íntreruperile Ca parametru de stare al directivelor se foloseßte indicatorul
CF cu urmátoarea semnificaþie: dacá directiva nu se executá cu
Figura 6.4 succes CF = 1; ín caz contrar CF = 0.

Directivele ?INS / ?IINS


- Sunt directive explicite de "instalare" a taskurilor folosite la comunicarea unor informaþii
despre task cátre planificator;
- Parametri:
- intrare: (AX) - nivel de prioritate al taskului;
(DX) - adresa de start a taskului;
(BP) - adresa bazei stivei asociate taskului.
- ießire: -
- Directivele nu declará eveniment semnificativ.
Structura directivei ?IINS este prezentatá ín Figura 6.5.

Directiva ?SCINI
- Este o directivá explicitá de iniþializare, care umple cu zero íntreaga zoná de date sistem
(aflatá íntre modulul FRAM = ínceputul zonei de date sistem ßi modulul LRAM = sfärßitul zonei de
date sistem);
- Reseteazá toate flagurile;
- Dezactiveazá sistemul de íntreruperi;
- Instaleazá pe ultimul nivel de prioritate considerat, taskul WAITSYS care este trecut ín
starea gata de execuþie;
- Nu necesitá parametri;
- Nu declará eveniment semnificativ.

Directiva ?DECLR
- Directivá atät explicitá cät ßi implicitá care are ca efect declararea unui eveniment
semnificativ ín sistem. Ín urma apelarii acestei directive de cátre taskul aflat ín execuþie, controlul
se transferá planificatorului de taskuri care va baleia lista de taskuri ßi va aduce ín execuþie taskul
gata de execuþie cu prioritatea cea mai mare;
6-5
? IINS

Verificá dacá nivelul solicitat


este liber ín lista planificatorului NU
(codul 00h ín octetul de stare al casetei ?)
CF = 1
DA
Marcheazá adresa värfului stivei RET
ín caseta corespunzátoare din lista planificatorului
(adresa bazei stivei - 22)

Zona registrelor din stivá este iniþializatá cu zero

Marcheazá ín stivá adresa de start a taskului

CF = 0

Figura 6.5
RET

- Nu necesitá parametri;
- Are urmátorul conþinut:
call ? MONI
jmp ? SC

Directiva ?MONI
- Este o directivá implicitá care nu necesitá parametri;
- Dezactiveazá íntreruperile (dacá la apelul acestei directive, sistemul de íntreruperi era deja
dezactivat, se face apelul: call ? MONI + 1);
- Salveazá ín stiva taskului apelant contextul momentului íntreruperii (conþinutul registrelor
microprocesorului precum ßi al indicatorilor de condiþie);
- Marcheazá ín caseta taskului (ín lista de taskuri) adresa värfului stivei taskului;
- Comutá pe o stivá monitor definitá iniþial la generarea sistemului (pentru a nu altera stiva
taskului).
Adresa de restart (reluare) a taskului íntrerupt se salveazá ín stiva taskului ín momentul
apelului unei directive, care la rändul ei va apela ?MONI, ínscriind ín stiva taskului alþi 2 octeþi care
nu vor avea nici o utilitate, deoarece din ?MONI nu se mai revine prin instrucþiunea RET (deoarece
SP-ul a fost comutat de pe stiva taskului pe stiva monitor) ci printr-o tehnicá specialá (vezi listingul
programului - la aplicaþii). Rezultá deci necesitatea prevederii celor 2 octeþi suplimentari (dupá
adresa de restart) ín stiva taskului (vezi Fig. 6.3) ßi faptul cá ei trebuie ignoraþi de cátre utilizator.

Directiva ?SC
- Este punctul de intrare ín planificatorul de taskuri;
- Determiná baleierea listei de taskuri ßi lanseazá ín execuþie taskul gata de execuþie cu
prioritatea cea mai mare;
- Structura planificatorului de taskuri este datá ín Figura 6.6;

6-6
- Lansarea planificatorului este precedatá de directiva ?MONI care salveazá ín stivá
informaþiile despre task conþinute ín registre, necesare ín cazul reluárii execuþiei taskului.

?SC

Adresa de ínceput a listei de taskuri

DA
NU Task OPRIT? Se trece la urmátorul
(00h ín octul de stare al casetei ?) task din listá
Task GATA DE EXEC ? NU
(0FFh ín octetul de stare
al casetei taskului ?)
Citeßte flagul corespunzátor din lista de
DA flaguri (numár flag = STARE - 1)

NU
Ínscrie ín ?ATCTA Flag resetat ?
adresa casetei taskului DA DA
Este un falg pentru excludere Seteazá flagul
mutualá ?
?SCEXI NU

Trece taskul ín starea READY

Figura 6.6

?ATCTA
Este adresa unei locaþii de memorie unde se pástreazá, pe 2 octeþi, adresa de ínceput a
casetei taskului aflat ín execuþie. Aceastá adresá este permanent ímprospátatá de cátre planificator
ßi conþinutul ei este folosit de alte directive.

Directiva ?SCEXI
- Este o directivá implicitá (ín cazul de faþá, partea finalá a planificatorului de taskuri);
- Nu necesitá parametri;
- Preia adresa värfului stivei asociate taskului care are adresa casetei ín ?ATCTA;
- Reface din stivá toate registrele taskului;
- Activeazá sistemul de íntreruperi;
- Dá controlul taskului lansändu-l ín execuþie.

Directivele ?RUN / ?IRUN


- Sunt directive explicite de trecere a unui task ín starea GATA DE EXECUÞIE (ínscriu ín
octetul de stare al casetei taskului codul 0FFh).
- Parametri: la apelul acestor directive, registrul AL trebuie sá conþiná urmátoarele
informaþii:
(AL) = <Mod> <Nivel de prioritate>
- biþii A5-A0 ai acumulatorului AL conþin nivelul de prioritate al taskului ce
trebuie activat, nivel cuprins íntre (00h - 3Fh);

6-7
- bitul A6 = 0;
- bitul A7 este bitul <Mod> care indicá dacá trecerea ín starea GATA DE
EXECUÞIE a taskului specificat prin nivelul sáu de prioritate se va face "necondiþionat", adicá
indiferent de starea ín care se aflá, caz ín care MOD = 1 sau "condiþionat", adicá numai ín cazul ín
care taskul era ín substarea OPRIT, caz ín care MOD = 0;
- Ín prima variantá (?RUN), directiva declará eveniment semnificativ (vezi Figura 6.7.a), iar
ín a doua variantá (?IRUN) returneazá controlul taskului apelant;
- Structura directivei ?IRUN este prezentatá ín Figura 6.7.b.

?RUN

Dezactiveazá íntreruperile
(a)
?IRUN

?DECLR

?IRUN

Trece taskul ín starea GATA DE


NU
EXECUTIE, ín mod necondiþionat ?
(MOD = 1) ?

Trece taskul ín starea DA Taskul se aflá ín substarea


GATA DE EXECUTIE DA OPRIT
(cod 00h ín octetul de
(ínscrie codul 0FFh ín octetul stare al casetei) ?
de stare al casetei)
NU
(b) CF = 0
CF = 0
RET
RET

Figura 6.7

Directivele ?ABORT / ?IABORT


- Sunt directive explicite de trecere forþatá a unui task (altul decät taskul apelant) ín
substarea OPRIT;
- Directivele vor ínscrie ín octetul de stare al casetei taskului codul 00h;
- Parametri: la apelul acestor directive, registrul AL trebuie sá conþiná nivel de prioritate al
taskului ce trebuie terminat forþat;
- Directiva declará eveniment semnificativ doar ín prima variantá ?ABORT, asemánátor
schemei din Figura 6.7.a, pe cänd varianta ?IABORT returneazá controlul taskului apelant;
- Directiva ?IABORT calculeazá, pe baza nivelului de prioritate specificat, adresa casetei
taskului (ce se cere a fi terminat forþat) ßi ínscrie ín octetul de stare al acestei casete codul 00h
corespunzátor substárii OPRIT.

6-8
Directiva ?EXIT
- Este o directivá explicitá de terminare logicá sau normalá a unui task;
- Nu necesitá parametri;
- Apeleazá directiva ?MONI pentru salvarea ín stiva taskului apelant a stárii taskului
(conþinutul registrelor);
- Pentru cazul ín care se va face un nou apel de intrare ín execuþie a acestui task este absolut
necesar ca ín task, dupá directiva ?EXIT sá existe o instrucþiune de salt la prima instrucþiune a
taskului sau la un alt punct din task, pentru ca reluarea execuþiei sá se facá corect;
- Directiva preia de la locaþia ?ATCTA adresa casetei taskului ce trebuie terminat sau
relansat ín execuþie ßi ínscrie ín octetul de stare al casetei lui codul 00h;
- Transferá controlul planificatorului de taskuri (declará eveniment semnificativ).

Directiva ?WAIT
- Este o directivá explicitá care are ca efect punerea taskului apelant ín aßteptare pe un flag
(blocarea taskului pe un flag);
- Parametru: la apelul acestei directive, registrul AL trebuie sá conþiná numárul flagului pe
care va fi blocat taskul;
- Dezactiveazá íntreruperile;
- Salveazá starea taskului apeländ directiva ?MONI;
- Preia din ?ATCTA adresa casetei taskului ce trebuie pus ín aßteptare ßi ínscrie ín octetul de
stare al casetei codul corespunzátor (format din numárul flagului specificat + 1);
- Transferá controlul planificatorului de taskuri (declará eveniment semnificativ).
Ín momentul ßtergerii flagului, sau dacá flagul era deja ßters, taskul trece ín starea GATA
DE EXECUÞIE, iar atunci cänd prioritatea íi va permite íßi va continua execuþia cu instrucþiunea
urmátoare acestei directive. Dacá flagul este din categoria celor pentru excludere mutualá el va fi
imediat setat de cátre planificator (vezi structura planificatorului din Figura 6.6).

Directivele ?SETF / ?ISETF


- Sunt directive explicite care au ca efect setarea unui flag (specificat ca parametru ín
directivá);
- Parametru: la apelul acestor directive, registrul AL trebuie sá conþiná numárul flagului care
va fi setat;
- Prima variantá (?SETF) declará eveniment semnificativ (asemánátor schemei din Figura
6.7.a), iar cea de-a doua variantá (?ISETF) returneazá controlul taskului apelant;
- Directiva ?ISETF intrá ín lista de flaguri a sistemului ßi ín octetul corespunzátor flagului
ce trebuie setat ínscrie codul 0FFh.

Directivele ?CLEF / ?ICLEF


- Sunt directive explicite care au ca efect resetarea (ßtergerea) unui flag (specificat ca
parametru ín directivá);
- Parametru: la apelul acestor directive, registrul AL trebuie sá conþiná numárul flagului care
va fi resetat;
- Directivele ?CLEF / ?ICLEF au aceleaßi caracteristici ca ßi directivele ?SETF / ?ISETF, cu
observaþia cá ín lista de flaguri, ín octetul corespunzátor flagului specificat, directiva ?ICLEF va
trece codul 00h.

Directiva ?GETF
- Este o directivá explicitá care permite citirea stárii unui flag;

6-9
- Parametru: la apelul acestor directive, registrul AL
?GETF trebuie sá conþiná numárul flagului care va fi citit;
- Starea flagului este comunicatá prin poziþionarea
Intrare ín lista de flaguri ßi indicatorului CF astfel:
poziþionare pe locaþia
CF = 0 - flag resetat;
flagului specificat
CF = 1 - flag setat;
DA NU - Nu declará eveniment semnificativ;
Flag resetat ?
- Structura directivei este arátatá ín Figura 6.8.
CF = 0 CF = 1
Figura 6.8

RET

Directiva ?GTSK
- Este o directivá explicitá care permite citirea nivelului de prioritare pe care este instalat
taskul apelant;
- Nu necesitá parametri;
- Citeßte adresa casetei taskului din ?ATCTA ßi calculeazá, pe baza acestei adrese, nivelul
de prioritate al taskului;
- Returneazá valoarea nivelului de prioritate ín acumulator (AL);
- Nu declará eveniment semnificativ.

Nucleul EXECUTIVULUI oferá pe längá directivele menþionate ßi o serie de subrutine


scrise pentru uzul EXECUTIVULUI, dar care sunt accesibile ßi utilizatorului, cum ar fi:
- subrutiná de umplere cu zero a unei zone de date din memorie, ?ZERO;
- subrutiná care calculeazá adresa casetei unui task plecänd de la nivelul lui de prioritate,
?POZ;
- subrutiná pentru modificarea indicatorului CF íntr-un task oprit (modificarea se face ín
stiva taskului, acolo unde sunt salvaþi indicatorii de condiþie ai taskului), ?MODCF;
- subrutiná pentru íncárcarea ín registrul BP a adresei värfului stivei asociate taskului ce are
adresa casetei ínscrisá ín ?ATCTA, ?HLSPU etc.

Nucleul EXECUTIVULUI utilizeazá, prin intermediul planificatorului de taskuri, o zoná de


memorie RAM rezervatá pentru organizarea tabelelor sistem (lista de taskului, lista de flaguri,
anumite locaþii speciale, ca de exemplu ?ATCTA etc.). Este indicat ca lungimea acestei zone sá fie
cät mai micá avänd ín vedere cá la majoritatea microcalculatoarelor de conducere a proceselor,
dimensiunea memoriei este criticá. Valorile maxime limitá pentru numárul de taskuri (64), numárul
de flaguri (254) rezultá din condiþia necesitáþii plasárii fiecarei liste íntr-o aceeaßi paginá de RAM.

Tabelele de sistem se pot genera ín limitele acestor dimensiuni prin intermediul urmátorelor
simboluri:
?NOT = numárul total de taskuri din listá (Observaþie: ?NOTmax = 64 = ?NOTT);
?TCT = adresa de ínceput a listei de taskuri a planificatorului (lungimea maximá a listei va
fi (?NOTT x 4) octeþi);
?NOF = numárul de flaguri din listá;
?NOPF = numárul de unde íncep flagurile pentru excludere mutualá;
?FLAG = ínceputul listei de flaguri;
?FRAM / ?LRAM = ínceputul ßi sfärßitul zonei RAM de date sistem.
6 - 10
Definirea unor macroinstrucþiuni specifice nucleului executivului
Macroinstrucþiuni pentru instalarea unui task
INS macro NIVEL, START, STIVA
; NIVEL - nivelul de prioritate al taskului
; START - adresa de ínceput a taskului
; STIVA - adresa bazei stivei asociate taskului
mov ax, NIVEL
mov dx, START
mov bp, STIVA
call ?INS
endm
IINS macro NIVEL, START, STIVA
mov ax, NIVEL
mov dx, START
mov bp, STIVA
call ?IINS
endm
Observaþie: Macroinstrucþiunea IINS poate fi apelatá din íntreruperi

Macroinstrucþiuni pentru trecerea unui task ín starea READY


RUN macro NIVEL
mov al, NIVEL
call ?RUN
endm
Observaþie: Macroinstrucþiunea RUN declará eveniment semnificativ
IRUN macro NIVEL
mov al, NIVEL
call ?IRUN
endm
Observaþie: Macroinstrucþiunea IRUN nu declará eveniment semnificativ

Macroinstrucþiuni pentru declararea unui eveniment semnificativ


DECLR macro
call ?DECLR
endm

Macroinstrucþiuni pentru setarea unui flag


SETF macro FLAG
; FLAG - flagul pentru sincronizare sau pentru excludere mutualá
mov al, FLAG
call ?SETF
endm
Observaþie: Macroinstrucþiunea SETF declará eveniment semnificativ
ISETF macro FLAG
mov al, FLAG
call ?ISETF
6 - 11
endm
Observaþie: Macroinstrucþiunea ISETF nu declará eveniment semnificativ

Macroinstrucþiuni pentru resetarea unui flag


CLEF macro FLAG
mov al, FLAG
call ?CLEF
endm
Observaþie: Macroinstrucþiunea CLEF declará eveniment semnificativ
ICLEF macro FLAG
mov al, FLAG
call ?ICLEF
endm
Observaþie: Macroinstrucþiunea ICLEF nu declará eveniment semnificativ

Macroinstrucþiuni pentru blocarea unui task pe un flag


WAIT macro FLAG
mov al, FLAG
call ?WAIT
endm
Observaþie: Macroinstrucþiunea WAIT declará eveniment semnificativ

Macroinstrucþiuni pentru terminarea logicá (normalá) a unui task


EXIT macro
call ?EXIT
endm
Observaþie: Macroinstrucþiunea EXIT declará eveniment semnificativ

Exemplul1. Activarea unui task din alt task


Se considerá 2 taskuri TA ßi TB care afißeazá anumite mesaje pe display. Considerám cá
afißarea pe display se face prin intermediul unei subrutine CO care nu lucreazá ín íntreruperi.
Taskul TA este instalat pe nivelul 2 de prioritate ßi activat prin comenzi de la tastaturá. Taskul TA
instaleazá, la rändul sáu, taskul TB pe nivelul 1 de prioritate ßi íl activeazá, dupá care tipáreßte un
mesaj pe display. Ín continuare, taskul TA apeleazá directiva ?DECLR, deci declará eveniment
semnificativ. Planificatorul de taskuri ?SC preia acum controlul ßi trece ín execuþie taskul TB care
tipáreßte un mesaj pe display ßi apoi apeleazá directiva ?EXIT (care declará eveniment
semnificativ). Planificatorul dá acum controlul taskului TA care íßi continuá execuþia afißänd al
doilea mesaj pe display ßi apoi íßi íncheie execuþia prin directiva ?EXIT.
Structura programului care implementeazá cele douá taskuri este urmátoarea:
EXTRN AFIS
TB equ ADR1 ; TB reprezintá adresa de start a taskului TB
STIVAB equ ADR2 ; STIVAB reprezintá adresa bazei stivei asociate taskului TB
TA: IINS 1, TB, STIVAB ; Macroinstrucþiunea IINS instaleazá taskul TB pe nivelul 1
; de prioritate
IRUN 1 ; Macroinstrucþiunea IRUN trece ín starea READY taskul
; TB instalat pe nivelul 1, fárá sá declare eveniment
; semnificativ
6 - 12
mov si, OFFSET mesaj1a
call AFIS
DECLR ; Macroinstrucþiunea DECLR declará eveniment
; semnificativ. Aceastá directivá íntrerupe taskul TA,
; salveazá cu ?MONI conþinutul registrelor
; microprocesorului ßi transferá controlul planificatorului
; de taskuri care va baleia lista de taskuri ßi va aduce ín
; execuþie taskul GATA DE EXECUÞIE cu prioritatea cea
; mai mare (ín cazul nostru, taskul TB)
mov si, OFFSET mesaj2a
call AFIS
EXIT ; Macroinstrucþiune pentru terminarea logicá (normalá) a
; taskului TA care declará eveniment semnificativ (dupá
; execuþie transferá controlul planificatorului de taskuri
; ?SC)
TB: mov si, OFFSET mesaj1b
call AFIS
EXIT
mesaj1a db CR, LF, 'Task TA activ ...', $
mesaj2a db CR, LF, 'Task TA activ din nou ...', $
mesaj1b db CR, LF, 'Task TB activ ...', $
CR equ odh
LF equ 0ah

; Subrutina pentru afißare


AFIS: mov dl, [si]
cmp dl, '$'
jz FIN
inc si
mov ah, 2
int 21h
jmp AFIS
FIN: ret
end
Dupá execuþia acestui program, pe ecran se vor afißa urmátoarele mesaje:
Task TA activ ...
Task TB activ ...
Task TA activ din nou ...
Se observá cá deßi taskul TB este mai prioritar, el nu primeßte controlul decät la declararea
unui eveniment semnificativ (ín urma apelului directivei ?DECLR).
Dacá taskul TB ar fi fost instalat pe un nivel mai puþin prioritar decät TA, de exemplu 3,
atunci, la declararea evenimentului semnificativ, s-ar fi dat controlul tot lui TA, deci ordinea
mesajelor afißate ar fi fost:
Task TA activ ...
Task TA activ din nou ...
Task TB activ ...
Sá presupunem acum cá nivele de prioritate alese sunt TA --> 2, TB --> 1, dar cá ín loc de
directiva ?IRUN, ín taskul TA se foloseßte directiva ?RUN care, spre deosebire de ?IRUN, declará

6 - 13
eveniment semnificativ. Ín aceastá situaþie, dupá instalarea taskului TB, la execuþia directivei
?RUN se va declara eveniment semnificativ ßi planificatorul va da controlul taskului TB (cel mai
prioritar ín acel moment) ßi deci secvenþa de mesaje afißate pe ecran va fi:
Task TB activ ...
Task TA activ ...
Task TA activ din nou ...
Cele trei situaþii expuse mai sus presupun cá un eveniment semnificativ poate apare numai
ín urma execþiei directivelor ?DECLR, ?EXIT, ?RUN.
Existá ínsá posibilitatea apariþiei unui eveniment semnificativ datoritá unei íntreruperi
externe (de exemplu, de la ceasul de timp real). Dacá se considerá o asignare a prioritáþilor de
forma TA --> 2, TB --> 1, iar pentru activarea lui TB se foloseßte directiva ?IRUN, apare ca foarte
probabilá urmátoarea situaþie: Taskul TA intrá ín execuþie, instaleazá ßi activeazá taskul TB ßi
íncepe afißarea caracterelor din mesaj1a. Dacá ín acest moment apare o íntrerupere de la ceas, se
declará eveniment semnificativ ßi planificatorul gáseßte taskul TB (cel mai prioritar) ín starea
READY ßi íi dá controlul. Dupá terminarea lui TB se va continua execuþia lui TA din punctul ín
care a fost íntrerupt, deci mesajele afißate pe display ar putea apare ín urmátoarea secvenþá:
Task T ; Taskul TA a fost íntrerupt
Task TB activ ... A activ ...
Task TA activ din nou ...
Aceastá situaþie necesitá ca cele douá taskuri sá se excludá reciproc pe durata afißárii mesajelor.

Exemplul 2. Sincronizarea taskurilor pe un eveniment


Considerám 2 taskuri T1 ßi T2 care, la un moment dat, trebuie sá schimbe date íntre ele.
Taskul T1 preia o valoare dintr-un buffer, BUFT2 al taskului T2, dupá ce T2 a pregátit aceste
valori. T2 semnaleazá cá datele sunt disponibile prin resetarea unui flag, FLG, flag pe care aßteaptá
T1 ca datele sá deviná disponibile. Se foloseßte un task de iniþializare T0 care instaleazá T1 ßi T2 ßi
seteazá flagul de sincronizare.
Structura programului este urmátoarea:
EXTRN AFIS, PRELUCRARE, GENERARE
STIVA1 equ ADR1 ; STIVA1 reprezintá adresa bazei stivei asociate taskului T1
STIVA2 equ ADR2 ; STIVA2 reprezintá adresa bazei stivei asociate taskului T2
BUFT2 dw ? ; Pentru bufferul BUFT2 se rezervá 2 octeþi íncepänd de la adresa
; BUFT2
T0: IINS 1, T1, STIVA1 ; Se instaleazá taskul T1 cu adresa de ínceput T1 pe nivelul
; de prioritate 1
IRUN 1 ; Taskul T1 este trecut ín starea READY
IINS 2, T2, STIVA2 ; Se instaleazá taskul T2 cu adresa de ínceput T2 pe nivelul
; de prioritate 2
IRUN 2 ; Taskul T2 este trecut ín starea READY
SETF FLG ; Macroinstrucþiunea SETF seteazá flagul FLG ßi declará
; eveniment semnificativ, deci va da controlul
; planificatorului
EXIT ; Terminare normalá a taskului T0 cu declarare de
; eveniment semnificativ
T1: mov si, OFFSET mesaj1
call AFIS ; Afißeazá mesajul mesaj1
WAIT FLG ; Macroinstrucþiunea WAIT blocheazá taskul T1 pe flagul
; FLG ín aßteptarea pregátirii datelor de cátre taskul T2.
6 - 14
; Directiva salveazá ín stivá starea taskului T1, apoi
; transferá controlul planificatorului de taskuri.
mov bx, BUFT2 ; Íncarcá BX cu datele de la adresa (BUFT2+1, BUFT2)
call PRELUCRARE ; PRELUCRARE este o subrutiná externá destinatá
; prelucrárii datelor preluate din BUFT2
mov si, OFFSET mesaj2
call AFIS ; Afißeazá mesajul mesaj2
EXIT ; Terminare normalá a taskului T1
T2: call GENERARE ; GENERARE este o subrutiná externá destinatá generárii
mov BUFT2, bx ; unor date care vor fi depuse ín BUFT2
mov si, OFFSET mesaj3
call AFIS ; Afißeazá mesajul mesaj3
CLEF FLG ; Macroinstrucþiunea CLEF reseteazá flagul FLG,
; semnaländ astfel taskului T1 cá datele sunt disponibile ßi
; dá controlul planificatorului de taskuri
mov si, OFFSET mesaj4
call AFIS ; Afißeazá mesajul mesaj4
EXIT ; Terminare normalá a taskului T2
mesaj1 db CR, LF, 'Task T1: Aßtept date ...', $
mesaj2 db CR, LF, 'Task T1: Am preluat datele ...', $
mesaj3 db CR, LF, 'Task T2: Date disponibile ...', $
mesaj4 db CR, LF, 'Task T2: Exit ...', $
CR equ odh
LF equ 0ah
FLG equ 32
; Subrutina pentru afißare
AFIS: mov dl, [si]
cmp dl, '$'
jz FIN
inc si
mov ah, 2
int 21h
jmp AFIS
FIN: ret
end
Acest program funcþioneazá astfel: Taskul T1 intrá ín execuþie, afißeazá mesajul mesaj1 ßi
gásind flagul FLG setat se blocheazá. Ín acest moment se dá controlul taskului T2 (deoarece
directiva ?WAIT declará eveniment semnificativ) care pregáteßte datele ßi le depune ín bufferul
BUFT2, afißeazá apoi mesajul mesaj3, dupá care, prin ?CLEF, reseteazá flagul FLG cu declarare de
eveniment semnificativ. Planificatorul analizeazá starea taskului T1 (mai prioritar) ßi íl gáseßte
blocat pe fagul FLG, dar íntrucät acesta fusese ßters ín taskul T2, taskul T1 va fi trecut ín READY
ßi va primi controlul. Acesta va continua din punctul ín care a fost íntrerupt (blocat). Astfel, T1
preia ßi prelucreazá datele, afißeazá apoi mesajul mesaj2 ßi íßi íncheie execuþia. Se dá apoi controlul
taskului T2 care afißeazá mesajul mesaj4 dupá care íßi íncheie execuþia. Rezultá cá succesiunea
mesajelor afißate pe ecran va fi:
Task T1: Aßtept date ...
Task T2: Date disponibile ...
Task T1: Am preluat datele ...
Task T2: Exit ...
6 - 15

S-ar putea să vă placă și