Documente Academic
Documente Profesional
Documente Cultură
Curs 05
Curs 05
Proces 2
..............
Setez mod de lucru 1
Folosesc resursa pe mod 1
........................
..............
Setez mod de lucru 2
Folosesc resursa pe mod 2
........................
Exemple resurse
- citire AD
- iesire pe PWM
- citire/setare IN/OUT digitale
- o variabila din memorie (de orice tip)
- un numator
- un canal serial
etc
Reguli:
- o SC este executat de un singur task
- un task ateapt un timp finit nainte de o seciune critic
- n afara seciunii critice nu exist alte blocaje
Exemplu
P_T1 > P_T2 > P_T3. Se considera modul preemtiv.
Initial T1, T2 sunt blocate. T3 primeste procesorul si ocupa resursa R
Se debocheaza T1 si T2. T1 primeste procesorul, cere resursa R, nu o poate
primi, este blocata.
T2 primeste procesorul, il tine cat are nevoie, apoi cedeaza procesorul catre T3
T3 foloseste resursa, o elibereaza. Acum resursa poate fi folosita de T1.
T1 asteapta executia lui T2 care este mai putin prioritar!
Inferenta de prioritate: cand T1 cere acces la resursa R, T3 primeste
temporar prioritate lui T1:
Deadlock
Dou taskuri nu mai pot progresa, mpiedicndu-se reciproc s primeasc acces
la procesor
Ex: Task1 ocup Resursa R1, Task2 ocup resursa R2.
Task1 cere acces la resursa R1, Task2 cere acces la resursa R2
Task1
Task2
Resursa 1
Resursa 2
Soluia:
eliberarea resurselor ocupate nainte de a cere acces la alta
Task1
{
..........
Take R
.....// instructiuni ce folosesc resursa R
Give R
..............
}
Task2
{
..........
Take R
.....// instructiuni ce folosesc resursa R
Give R
..............
}
Exercitii
Mod preemtiv, P_T1>P_T2>P_T3. Alte situatii P_T3=P_T1>P_T2,
P_T3=P_T2>P_T1.
T1 se blocheaza
(temporizare)
T3 si T1 blocate
T2 ready
T2 foloseste Take R
Se deblocheaz T2
T2
T1T2
T2T1
T1
T1T2
T2T3
T2 foloseste GiveR
T1 este deblocat
(timeout nedepasit),
executa Take R, cateva
instructiuni specifice si
apoi Give R.
T3 I
T2
T2 se blocheaza
(temporizare)
Se deblocheaz T2
T3 se blocheaza
(temporizare)
T2
T1T2
T2
T1T2T3
T3I
T2
T2T3
T3 I
T2
T2 se blocheaza
(temporizare)
T1 este deblocat
(timeout depasit, R
nefolosit in T1)
T2 foloseste GiveR si intra
in blocare
T3 se deblocheaza
T2 foloseste
resursa
mod preemtiv
P_T1>P_T2>P_T3.
T1 si T2 blocate
T3 ready
T3 foloseste Take R
T1 se blocheaza
(temporizare)
T3
Se deblocheaza
T1, T2.
T1T2T3
T3T1
T1
T1T2
T2T3
T3 foloseste GiveR
T1 este deblocat
(timeout nedepasit)
T3 I
T2 primeste resursa
(timeout nedepasit), o
elibereaza, etc
T1 foloseste Give R,
T2 se deblocheaza (timeout
inca nedepasit), dar T2 nu
primeste procesorul
Probleme
Daca mai multe taskuri folosesc aceeasi resursa, pot exista probleme in
stabilirea timeout (mai ales daca exista si alte taskuri mai prioritare)
semafoarele binare sunt greu de gestionat daca sunt multe taskuri &
taskuri care partajeaza resursa
Exercitiu 1:
Schitati in pseudocod urmatoarele aplicatii, folosind semafoare binare:
T2 (prioritate 3) asigura alt joc de leduri: aprinde ledul 13 pentru 300 msec si
apoi il stinge pentru 300 msec. Sesiunea este reluata la fiecare 2 sec.
2. Numrare evenimente.
Iniial coada este goal, iar adancimea cozii = numrul evenimentelor ce
ateapt s fie procesate.
Sosirea unui eveniment corespunde unei operatii Give (scrie in coad).
Procesarea (folosirea) unui eveniment este nsoit de o operaie Take
(terge un mesaj din coad).
Exemplu: interpretarea rezultatelor unor achiziii de date, interpretarea unor
comenzi de la tastatur.
>> nu pot suprascrie date ce nu au fost interpretate inca (astept eliberare
spatiu in coada)
Poate aprea >> inversiunea de prioritate / pericol diminuat cu semafoare mutex
Exercitiul 2
Schitati in pseudocod urmatoarele aplicatii, folosind semafoare contor:
i) T1 (de prioritate 2) perioada 1 sec, T2 (de prioritate 3) perioada 2 sec si T3 (de
prioritate 4) perioada 1 sec cer ocuparea unui canal serial pentru transmitere unor
blocuri de date. Exista doar 2 canale seriale disponibile.
ii) Se considera un cluster de resurse de tip led (led 15, 14, 13, 12). Ocuparea se face
in aceasta ordine (prioritar se ocupa led 15; led 12 este ocupat doar cand nu exista
alte leduri libere)
T1 (de prioritate 2) perioada 1 sec, T2 (de prioritate 2) perioada 2 sec, T3 (de
prioritate 3) perioada 1 sec, T4 (de prioritate 3) perioada 2 sec, T5 (de prioritate
4) perioada 1 sec - cer ocuparea unui led (pentru o setare specifica): T1, T2 aprind
ledul ocupat, T3, T4, T5 il sting.
Indicati modul de ocupare a resurselor si de executie a taskurilor.
Mutex
= Semafor binar implementat cu inferen de prioritate
Dac un task (T1) care intr n blocare (atunci cnd cere acces la o resurs deja
ocupat) are prioritate mai mare dect taskul ce ocup resursa (T2), atunci T2 este
temporar crescut n prioritate, pentru a grbi execuia sa i eliberarea resursei.
Mutex recursiv
= un mutex ce accept cereri recursive de la acelai task
Un task poate trimite cereri suplimentare de ocupare a unei resurse, in timp ce este
deja proprietar pe ea. Pentru fiecare cerere de ocupare va exista o cerere de eliberare
pereche.
Resursa poate fi folosita de alte taskuri dupa rezolvarea tuturor acestor cereri de
ocupare (preluate de la taskul proprietar deja pe resursa).
T2 si T1 blocate
T3 ready
T3 foloseste Take R
T3
T3
T1T2
T1T2
T2T3
T2T3
T3T1
T3T1
T1
T1
T1 se blocheaza
(temporizare)
T1 T3
T1 T3
T3 I
T3 I
T3 foloseste GiveR
T1 este deblocat
(timeout nedepasit),
executa Take R, cateva
instructiuni specifice si
apoi Give R.
I
I
I
I
T3 se blocheaza
(temporizare)
T2 si T1 blocate
T3 ready
T3 foloseste Take R
T3
T2 se blocheaza
(temporizare)
T1 se blocheaza
(temporizare)
T1T3T1
T1
T1T2
T2
T2 T3
T3 foloseste GiveR
T1 este deblocat
(timeout nedepasit),
executa Take R, cateva
instructiuni specifice si
apoi Give R.
T3 I
T3 se blocheaza
(temporizare)
T2 si T1 blocate
T3 ready
T3 foloseste Take R
T3
T2 se blocheaza
(temporizare)
T1 se blocheaza
(temporizare)
T1T3T1
T1
T1T2
T2
T2 T3
T3 foloseste apeluri
recursive, ultimul GiveR
deblocheaza (timeout
nedepasit), executa Take
R, cateva instructiuni
specifice si apoi Give R.
T3 I
T3 se blocheaza
(temporizare)
Exercitiul 3:
Exemplu:
xSemaphoreHandle xSemaphore;
void vATask( void * pvParameters ){
vSemaphoreCreateBinary( xSemaphore );
if( xSemaphore != NULL ) {
// semafor creat cu succes.
}
}
Exemplu:
void vATask( void * pvParameters ) {
xSemaphoreHandle xSemaphore;
xSemaphore = xSemaphoreCreateCounting( 10, 0 );
if( xSemaphore != NULL ) {
// semafor creat cu succes.
}
}
Exemplu
xSemaphoreHandle xMutex;
void vATask( void * pvParameters )
{
xMutex = xSemaphoreCreateRecursiveMutex();
if( xMutex != NULL )
{
// mutex creat cu succes.
}
}
)
pentru semafoare de tip binar, contor, mutex
xSemaphor
xBlockTime
Exemple
xSemaphoreHandle xSemaphore = NULL;
void vATask(void * pvParameters) {
xSemaphore = xSemaphoreCreateMutex();}
void vAnotherTask( void * pvParameters ) {
if( xSemaphore != NULL ) {
if( xSemaphoreTake(xSemaphore,(portTickType) 10 ) == pdTRUE ){
// ...foloseste resursa
xSemaphoreGive( xSemaphore );}
else {
// acces neprimit
}} }
<stdio.h>
"FreeRTOS.h"
"task.h"
"queue.h"
"croutine.h"
"partest.h"
#include "semphr.h"
void initPLL(void){
// Configure PLL prescaler, PLL postscaler, PLL divisor
PLLFBD = 41;
// M = 43 FRC
CLKDIVbits.PLLPOST=0;
// N1 = 2
CLKDIVbits.PLLPRE=0;
// N2 = 2
// Initiate Clock Switch to Internal FRC with PLL (NOSC = 0b001)
__builtin_write_OSCCONH(0x01);
// FRC
__builtin_write_OSCCONL(0x01);
// Wait for Clock switch to occur
while (OSCCONbits.COSC != 0b001);
// Wait for PLL to lock
while(OSCCONbits.LOCK!=1) {};}
// FRC
Situatii de discutat:
- cu/fara T3;
- cu timeout mai mic < del
- ce influenta poate avea valoarea lui del
#include
#include
#include
#include
#include
#include
#include
<stdio.h>
"FreeRTOS.h"
"task.h"
"queue.h"
"croutine.h"
"partest.h"
"semphr.h"
// FRC
}
void prvSetupHardware( void ){vParTestInitialise();initPLL();}