Sunteți pe pagina 1din 6

SISTEME IN TIMP REAL Laborator 3

Nucleul in timp real MicroC/OS-II


Scopul laboratorului
n cadrul acestei lucrri se va prezenta pe scurt sistemul de operare in timp
real uC//OS-II i se va realiza prima aplicaie multi-tasking folosind acest nucleu.

1 Nucleul in timp real MicroC/OS-II


1.1 Prezentare general

MicroC/OS-II (termenii utilizai de obicei sunt C/OS-II sau uC/OS-II) repre-


zint un nucleu (kernel) n timp real multi-tasking preemptiv (preventiv -sistem n care
un task preia CPU-ul, pentru c a trecut un timp prea mare sau pentru c ea are prio-
ritate mai mare) bazat pe prioriti, specific microprocesoarelor in care se realizeaz
aplicaii scrise n limbajul de programare C. Acesta este n principal dedicat sisteme-
lor nglobate (embedded).
Abrevierea II este utilizat deoarece reprezint a doua generaie de nucleu, ce
a aprut iniial (cu codul surs) n articolul din 1992 al revistei Programarea Sisteme-
lor nglobate i n cartea C/OS The Real-Time Kernel de Jean J. Labrosse. Autorul
a dorit pentru nceput s descrie doar componentele interne ale sistemului de opera-
re portabil, ce a fost dezvoltat pentru utilizare proprie, dar totul a luat mai apoi o tur-
nur comercial.
uC/OS-II este n prezent susinut de Micrium Inc. (http://micrium.com) i poate
fi furnizat cu licen per produs sau pe linie de produse. Utilizarea sistemului de
operare este gratuit pentru scopuri necomerciale, adic educaionale. Supli-
mentar, Micrium ofer produse de software middleware, precum uC/OS-View,
uC/CAN, uC/TCP-IP, uC/FS, uC/GUI, uC/MOD-BUS, uC/LCD, uC/USB (dispozitiv de
stocare de mare capacitate i volum) i un sortiment mare de aplicaii uC/TCP-IP,
precum software de tip client pentru DHCP, POP3, SNTP, FTP, TFTP, DNS, SMTP
i TTCP. Software-ul de server include HTTP, FTP i TFTP. PPP este de asemenea
disponibil.

1.2 Caracteristici C/OS-II


1.2.1 Codul surs
Aa cum a fost menionat anterior, nucleul se prezint n continuare ALL, i
anume: codul surs pentru C/OS-II. Multe nuclee comerciale de timp real sunt furni-
zate sub forma de cod surs. Se consider n continuare c simpla furnizare de cod
surs nu este suficient. Trebuie s se cunoasc modul de lucru al codului, precum
i modul n care comunic diverse componente. Organizarea unui nucleu n timp real

1
SISTEME IN TIMP REAL Laborator 3

nu este ntotdeauna simplu de neles, doar din o scurt analiz a fiierelor surs ori
a miilor de linii de cod.

1.2.2 Portabil
Cea mai mare parte a nucleului uC/OS-II este scris n ANSI C de nivel nalt,
portabil, iar codul specific unui anumit tip de microprocesor scris n limbaj de asam-
blare. Limbajul de asamblare este realizat la un nivel minim, astfel nct s faciliteze
portarea C/OS II i pe alte procesoare. Precum C/OS, C/OS-II poate fi portat pe
un numr mare de microprocesoare, att timp ct microprocesorul furnizeaz un po-
inter de stiv (stack pointer), iar regitrii CPU pot fi salvai sau extrai din stiv. De
asemenea, compilatorul C ar trebui fie s ofere o extensie pentru introducerea de
cod in asamblare sau extensii pentru activarea sau dezactivarea ntreruperilor din C.
C/OS-II poate rula pe microprocesoare pe 8-bii, 16-bii, 32-bii sau chiar pe 64-bii
sau pe microcontrolere i DSP-uri.
Toate porturile (codul in asamblare specific unui procesor) ce exist n prezent
pentru C/OS pot fi uor convertite pentru C/OS-II, n aproximativ o or. De aseme-
nea, din cauza faptului c C/OS-II este compatibil cu C/OS, aplicaiile C/OS ar
trebui s ruleze pe C/OS-II cu puine schimbri sau fr nici o schimbare.

1.2.3 Capacitate ROM


C/OS-II a fost proiectat pentru aplicaiile nglobate (emdedded). Acest fapt
nseamn c dac se dispune de un compilator adecvat (de exemplu, compilatorul C
i linker-ul), se poate ngloba C/OS-II ca parte a unui produs.

1.2.4 Accesibilitate:
C/OS-II a fost proiectat astfel nct s se utilizeze doar serviciile necesare
n anumite aplicaii. Acest lucru nseamn c un produs poate avea doar cteva ser-
vicii ale C/OS-II, n timp ce alt produs poate avea setul ntreg de caracteristici. Acest
aspect va permite posibilitatea de reducere a cantitii de memorie (att RAM, ct i
ROM), necesare pentru C/OS-II in dezvoltarea unui produs. Accesibilitatea este n-
deplinit cu ajutorul utilizrii compilrii condiionale. Trebuie aadar s se specifice
clar (prin constante #define) ce caracteristici sunt necesare pentru anumite aplicaii
i/sau produse. S-a ncercat ct mai mult reducerea codului i a spaiului de date ne-
cesar pentru C/OS-II.

1.2.5 Caracteristica preemptiv


C/OS-II este un nucleu n timp real complet preemtiv. Acest lucru indic fap-
tul c C/OS-II execut ntotdeauna sarcina de lucru de cea mai mare prioritate, care
este pregtit (n starea ready). Majoritatea nucleelor comerciale sunt preemptive i
C/OS-II poate fi comparat n performan cu majoritatea dintre acestea.

1.2.6 Multi-tasking
C/OS-II poate gestiona pn la 64 de taskuri (fire de execuie); oricum, ver-
siunea curent a software-ului rezerv opt (8) din aceste taskuri pentru utilizarea sis-
temului. Acest aspect va lsa aplicaia cu pn la 56 de taskuri. Fiecare task prezint
o prioritate unic, ce i este asignat, fapt ce arat c C/OS-II nu poate realiza plani-
ficarea de tip round-robin. Exist aadar 64 niveluri de prioritate.

2
SISTEME IN TIMP REAL Laborator 3

1.2.7 Caracterul determinist:


Timpii de execuie ai funciilor i serviciilor C/OS-II au caracter determinist.
Acest lucru arat c ntotdeauna se poate cunoate durata de timp necesar C/OS-
II pentru a executa o funcie sau un serviciu. Mai mult, cu excepia unui singur servi-
ciu, celelalte serviciile C/OS-II nu depind de numrul de taskuri ce ruleaz pe o
anumit aplicaie.

1.2.8 Stivele asociate task-urilor


Fiecare task necesit propria stiv. Oricum, C/OS-II permite fiecrei task s
aib o stiv de dimensiune diferit. Acest lucru permite reducerea cantitii de RAM
necesar n anumite aplicaii. Prin caracteristice de verificare a stivei specifice
C/OS-II, se poate determina exact ct spaiu necesit fiecare task pentru stiv.

1.2.9 Servicii
C/OS-II ofer unele servicii de sistem, cum ar fi csuele de e-mail, cozile,
semafoarele, partiiile de memorii de dimensiuni fixe, funcii specifice timpului, etc.

1.2.10 Managementul (gestionarea) ntreruperilor


ntreruperile pot suspenda execuia unui task, iar dac un task de prioritate
mai mare este trezit (declanat) ca un rezultat al unei ntreruperi, taskul de prioritate
cea mai mare va rula imediat ce toate ntreruperile seriale sunt terminate (ndeplini-
te). ntreruperile pot fi seriale, pn la adncimi de 255 de niveluri.

1.2.11 Robustee i fiabilitate


C/OS-II se bazeaz pe C/OS, ce a fost utilizat n sute de aplicaii comercia-
le, ncepnd cu 1992. C/OS-II utilizeaz acelai nucleu (core) i funcii asemntoa-
re, n timp ce C/OS ofer totui mai multe caracteristici.

2 Prima aplicaie cu uC/OS-II

Primul pas l reprezint definirea serviciilor pe care le folosim din uC/OS-II:

#define OS_MAX_TASKS 6 // Numarul de taskuri pe care le poate


// crea sistemul, mai putin taskul IDLE

#define OS_TASK_CREATE_EN 0 // dezactiveaza crearea normala


//a task-urilor

#define OS_TASK_CREATE_EXT_EN 1 // dezactiveaza crearea extinsa


//a task-urilor

#define OS_TIME_DLY_HMSM_EN 1 // activeatz funcia OSTimeDlyHMSM

#define STACK_CNT_512 6 // numarul de stive 512 octeti

#use "ucos2.lib" // se include libraria care contine uC/OS -II

3
SISTEME IN TIMP REAL Laborator 3

Al doilea pas l reprezint definirea constantelor folosite de uC/OS-II (mrimea


stivei, ID-urile task-urilor, prioritile task-urilor). Prioritatea cea mai mare este repre-
zent de valoarea 0, iar cea mai mica 64.

#define TASK_STK_SIZE 512 // Marimea stivei

// definirea ID-urilor pentru fiecare task


#define TASK_START_ID 0
#define TASK_1_ID 1
#define TASK_2_ID 2
#define TASK_3_ID 3
#define TASK_4_ID 4
#define TASK_5_ID 5

// definirea prioritatilor pentru cele 6 task-uri


#define TASK_START_PRIO 10
#define TASK_1_PRIO 11
#define TASK_2_PRIO 12
#define TASK_3_PRIO 13
#define TASK_4_PRIO 14
#define TASK_5_PRIO 15

Urmtorul pas il reprezint definirea prototipurilor funciilor asociate fiecrui


task.

void TaskStart(void *data);


void Task1(void *data);
void Task2(void *data);
void Task3(void *data);
void Task4(void *data);
void Task5(void *data);

Se va realiza funcia main, funcie in care este iniializat sistemul de operare


uC/OS-II (prin apelarea funciei OSInit). In aceast funcie se apeleaz i funcia
OSTaskCreateExt pentru crearea primului task. Prototipul acestei funcii este:

INT8U OSTaskCreateExt(void (*task)(void *pd),


void *pdata,
INT8U prio,
INT16U id,
INT32U stk_size,
void *pext,
INT16U opt);
pd- funcia care este executat de task
pdata pointer ce poate fi transmis funciei executate de task
prio prioritatea task-ului
id- ID-ul task-ului
stk_size- mrimea stivei asociate task-ului
pext reprezint un pointer spre o locaie de memorie ce poate fi folosit ca o
extensie TCB. De exemplu, aceast memorie poate pstra coninutul
registrilor cu virgul mobil n timpul comutrii contextului, timpul de execuie
pentru fiecare task, etc.
opt conine opiunile specifice task-urilor. Cei mai puin semnificativi 8 bii
sunt rezervai de C/OS-II, dar se pot folosii ceilali 8 bii pentru opiuni speci-

4
SISTEME IN TIMP REAL Laborator 3

fice aplicaiei. Fiecare opiune este reprezentat de un bit, opiunea fiind seta-
t cnd bitul este pe 1. C/OS-II suport urmtoarele opiuni:
OS_TASK_OPT_STK_CHK specific dac este permis verificarea
stivei pentru task.
OS_TASK_OPT_STK_CLR - specific dac stiva trebuie curat.
OS_TASK_OPT_SAVE_FP - specific dac registri in virgul mobil
trebuie salvai la comutarea contextului.
La sfritul funciei main trebuie apelat funcia OSStart pentru pornirea sis-
temului de operare.
void main (void)
{
// Sterge ecranul
ClearScreen();

// initializeaz uC/OS-II
OSInit();

// creaza primul task


OSTaskCreateExt(TaskStart,
(void *)0,
TASK_START_PRIO,
TASK_START_ID,
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
// porneste uC/OS-II
OSStart();
}
Din task-ul TaskStart se pot crea si celelalte task-uri:

OSTaskCreateExt(Task1,
(void *)0,
TASK_1_PRIO,
TASK_1_ID,
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);

OSTaskCreateExt(Task2,
(void *)0,
TASK_2_PRIO,
TASK_2_ID,
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);

OSTaskCreateExt(Task3,
(void *)0,
TASK_3_PRIO,
TASK_3_ID,
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);

OSTaskCreateExt(Task4,
(void *)0,
TASK_4_PRIO,
TASK_4_ID,

5
SISTEME IN TIMP REAL Laborator 3

TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);

OSTaskCreateExt(Task5,
(void *)0,
TASK_5_PRIO,
TASK_5_ID,
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);

Forma tipic a unei funcii ataate unui task este prezentat in continuare
(OSTimeDlyHMSM realizeaz un delay, primul parametru reprezint numrul de ore,
al doilea numrul de minute, al treilea numrul de secunde i ultimul parametru mili-
secundele):

void Task2 (void *data)


{
data = data;
//bucla infinita
while(1)
{
//delay de 5 secunde
OSTimeDlyHMSM(0, 0, 5, 0);

//instructiuni
}
}

3 Desfurarea lucrrii:
Realizai o aplicaie care este format din 6 task-uri, fiecare task afind periodic
un anumit mesaj pe LCD (fierare task va avea asociat o por;iune de afiare de pe
LCD).