MONITOR EXECUTIV
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
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.
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.
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
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
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
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.
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
Figura 6.7
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).
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.
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
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.