Sunteți pe pagina 1din 9

UNIVERSITATEA PETROL SI GAZE PLOIESTI

FACULTATEA TEHNOLOGIA PETROLULUI SI PETROCHIMIE

SPECIALIZAREA INFORMATICA INDUSTRIALA

PROIECT DE SEMESTRU

CONDUCEREA IN TIMP REAL A PROCESELOR CHIMICE

PLOIESTI 2020
Studiu de documentare şi aplicaţii practice privind
utilizarea funcţiilor condiţionate aferente cutiilor postale
în cadrul executivului RTK

1. Obiectivele lucrării

Lucrarea de faţă îşi propune să atingă următoarele obiective:


 Cunoaşterea executivului de timp real - RTK
 Gestionarea cutiilor poştale
 Funcţiile unei cutii poştale

2. Breviar teoretic

RTK este un sistem multitasking în timp real care creează facilităţi de lucru
pentru sistemul de operare DOS.
RTK este o bibliotecă ce poate fi accesată în aplicaţii programate, oferă un
număr de funcţii care coordonează taskuri, semafoare, cutii poştale, etc., acestea
fiind instrumente puse la dispoziţia programatorului cu ajutorul sistemului de
operare în timp real. Executivul de timp real – RTK, rulează sub MS-DOS şi
creează acestuia facilităţi de lucru pseudo-paralele.
RTK este un sistem multitasking în timp real care creează facilităţi de lucru
pentru sistemul de operare DOS.
Caracteristici RTK:

- poate gestiona un număr de task-uri nelimitate;


- fiecărui task i se asociază o prioritate între 1 şi 64, deci 2 sau mai multe
task-uri pot avea aceeaşi prioritate;
- executivul permite schimburi de date între task-uri şi tranziţii, între stări şi
substări prin implicarea sistemului de întreruperi;
- comutarea unui task din starea de aşteptare in cea de execuţie poate avea
loc la orice moment de timp;
- pentru realizarea operaţiilor de multitasking executivul oferă: semafoare,
cutii poştale şi mesaje de trecere;
- executivul oferă drivere pentru ecran, tastatură, portul serial, pararel, şi
reţea Novell.

Gestionarea cutiilor poştale

O cutie poştală (Mailbox) reprezintă o zonă de memorie (buffer de date)


care poate stoca un număr prefixat de mesaje. În RTKernel mesajele pot avea
orice dimensiune în condiţiile configurării unei cutii poştale până la maximum 64
KB.
Taskurile pot depune mesaje în sau pot extrage mesaje din cutii poştale
în condiţii reglementate prin funcţii RTK. Aceste funcţii tratează cutia poştală ca
fiind organizată ca o coadă (queue) şi în consecinţă administrată potrivit strategiei
FIFO.
Taskul în care se execută o funcţie de depunere într-o cutie poştală care
este plină se blochează până când se creează spaţiu. De asemenea se blochează
taskul în care se execută o funcţie de extragere a unui mesaj dintr-o cutie poştală
goală.
Nu sunt limitări în ceea ce priveşte numărul de cutii poştale care pot fi
utilizate de către un task şi nici a numărului de taskuri în care se poate utiliza o
cutie poştală.
MAILBOX.FUNCŢII

FUNCTIA DE CREARE SI INITIALIZARE A CUTIILOR


POSTALE

Întoarce o valoare de tip mailbox Mailbox RTKCreate Mailbox(unsigned


DataLen,unsigned Slots,char * Name).
 Parametrul Datalen reprezintă lungimea mesajelor în bytes.
 Parametrul slots este numărul maxim de mesaje pe care o cutie poştală le
poate stoca.Produsul dintre Datalen şi slots nu trebuie să depăşească 64 K
(doar câţiva bytes peste).

 Parametrul Name este un pointer la numele cutiei poştale.


Funcţia RTKCreateMailbox întoarce o valoare într-o variabilă de tip
Mailbox cu ajutorul căreia va putea fi referită noua cutie poştală.

Ex: Mailbox CP ;
:

:
CP=RTKCreate Mailbox(2,8, ’’CP’’);

FUNCTIA DE STERGERE A CONTINUTULUI UNEI


CUTII POSTALE

Şterge conţinutul cutiei poştale nominalizate.


Void RTKClear Mailbox(Mailbox Box)
RTKClear Mailbox (CP);
FUNCTIA CARE RETURNEAZA NR.DE MSJ. DINTR-O
CUTIE POSTALA

Unsigned RTK Messages (Mailbox Box);


Ex: Mailbox CP1;
Unsigned nr_mes;......nr_mes=RTK Messages(CP1);

FUNCTIA DE DEPUNERE SI EXTRAGERE(condiţionate)

FUNCTIA DE DEPUNERE: asigură depunerea unui mesaj într-o cutie


poştală, numai dacă există spaţiu disponibil.

Bool->variabilă de tip logic (2 valori TRUE; FALSE)


RTKPutCond(MailBox Box,void(*Data);
Dacă in cutia poştală există spaţiu funcţia se execută(conţinutul lui C e
transferat in cutia poştală).Taskul continuă execuţia,iar în variabila de tip bool se
inscrie TRUE.Daca insă nu există spaţiu disponibil funcţia nu se execută,taskul nu
se blochează,iar in bool se inscrie valoarea FALSE.
Ex: bool ex_cond;
ex_cond=RTKPut Cond(CP1;&C);
FUNCTIA DE PRELUARE : permite preluarea unui mesaj dintr-o cutie
poştală, numai dacă un asemenea mesaj este disponibil.

bool RTKGet Cond(MailBox Box)void #Data);


Dacă există un mesaj,e preluat şi taskul continuă execuţia in bool->TRUE.
Dacă cutia poştală e goală funcţia nu se execută in bool->FALSE ,iar taskul
nu se blochează.
Ex: bool ex_cond;
Ex_cond=RTK GetCond(CP1,&d).

MAILBOX
RTKCreate Mailbox
RTKMessages-returnează nr. de mesaje dintr-o cutie poştală.
RTK Put-depunerii intr-o cutie poştală(Blocked Put)
RTKPutCond àbool ={TRUE,FALSE}
RTKPut Timed-Timed Put (TimeOut) àboolßTRUE(funcţie executată
RTK Get-BlockedGet
RTKGetCond à
RTKGetTimed-TimedGet à boolß FALSE(funcţia nu s-a executat).
Exemplu de utilizare a cutiilor poştale:
Ex. are 3 Taskuri

TASKUL MAIN – in care se realizează iniţializarea execuţiei RTK,a


driverului de consola a unei cutii poştale(BOX) şi a taskurilor A şi B.Se intră apoi
intr-un for infinit in care se tastează apăsarea unei taste.Dacă s-a apăsat tasta E se
iese din program(EXIT).Dacă se apasă orice altă tastă alfa numerică (literă,cifră)
codul acestei taste este transmis in cutia poştală BOX.
TASKUL A – realizează tipărirea datei şi orei.
TASKUL B – este blocat la cutia poştală BOX care iniţial este vidă.În
momentul in care BOX soseşte un mesaj acesta este preluat şi tipărit după care din
nou se blocheaza.

3. Mod de lucru

RTK este un sistem multitasking în timp real care creează facilităţi de lucru
pentru sistemul de operare DOS.
Se va implementa următorul program:
MAILBOX TEST:

#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <stdlib.h>
#include “rtkernel.h”
#include “rtkeybrd.h”
#define nr_mes 1
Mailbox Box;
struct date d;
struct time t;
//
afora()
{
get date(&d);
gettime(&t);
gotoxy(55,3);
cprintf(cprintf("%02d-%02d-%4d",d.da_day,d.da_mon,d.da_year”);
cprintf(“02d-%02d-%02d",t.ti_hour,t.ti_min,t.ti_sec”);
}
TASK A()
{
for(;;)
}
afora();
RTKDelay (18);
{{
TASK B()
char i;
for(;;)
}
gotoxy(5,10);
cprintf(“B asteapta la BOX”);
RTKGet (BOX,&i);
RTKDelay(18);
gotoxy(5,10);
cprintf(“|_| Sosit mesaj |_|_| %i|_|_|_|”,i);
RTKDelay(36);
}
{
//main()
}
char c;
RTKernelInit(3);
clrscr();
gotoxy(5,8);
cprintf(“Orice tasta/E-Mesaj;E-Exit”);
RTKeybrdInit();
Box=RTKCreateMailbox(2,nr_mes,”Box”);
RTKCreate Task(Task A,5,1024,”Task A”);
RTKCreateTask(Task B,2,1024,”Task B”);
for(;;)
{
gotoxy(5,9)
cprintf(“Transmis din main mesajul|_|_|_|_|”);
c=RTGetch();
gotoxy(41,9);
cprintf(“%c”,c);
if(c==’E’)exit(0);
RTKPut(Box,&c);
}
//for
//main

În acest exemplu se prezintă utilizarea unei cutii pentru realizarea


sincronizării taskurilor. Sistemul este constituit din taskurile TaskA, TaskB
şi main.
Taskul TaskA se execută în buclă infinită şi apelează cu periodicitate de o
secundă funcţia afordata.
Taskul TaskB este blocat pentru aşteptarea sosirii unui mesaj în cutia
poştală CP, iniţializată în taskul main. În momentul când din acest task se execută
asupra cutiei poştale CP o funcţie RTKPut referitoare la codul unei taste apăsate,
TaskB se deblochează.
După deblocare se execută o funcţie RTKGet prin care se preia mesajul
(care constă din codul unui caracter) din CP. Pentru vizualizarea caracterului
recepţionat, acesta se tipăreşte.
După această operaţie TaskB trece din nou în starea BlokedPut. De
asemenea pe ecran se afişează starea în care se găseşte TaskB, adică B aşteaptă la
CP respectiv Sosit mesaj.
Taskul main conţine o primă secţiune de declaraţii şi iniţializări şi o a doua
secţiune în buclă infinită destinată supravegherii tastaturii. La apăsarea oricărei
taste, alta decât E, se execută o funcţia RTKPut, prin care codul tastei apăsate este
depus în CP. În ceea ce priveşte apăsarea tastei E, această acţiune va determina
ieşirea din program. Acţionarea altei taste rămâne fără efect.

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