Sunteți pe pagina 1din 36

Programarea aplicatiilor de timp real

Obiectiv disciplin:
Elaborarea aplica iilor multitasking

Parte I Monotasking = main +ISR


Hardware disponibil: 8086, 8253, 8259 BIOS, facilitati C Scriere rutine proprii de tratare a INT Partajare variabile globale
C SO BIOS 8253 8259

Parte II Multitasking = taskuri (+corutine) +ISR


SO de timp real - FreeRTOS Planificare taskuri Comunicare intre taskuri Partajare resurse intre taskuri si ISR:
MPLAB C FreeRTOS

PC

Placa dezvoltare cu DsPIC33

Simplu

Complexitate medie

Partea I: Aplicatii monotasking ce gestioneaz intreruperi


C SO

1. Caracteristicile arhitecturii IBM-PC (relevante pentru gestionarea intreruperilor)

BIOS 8253 8259

PC

2. Accesarea dispozitivelor periferice 8253, 8259


PC

C SO BIOS 8253 8259

3. Facilitati C. Tehnici de programare in intreruperi


C SO BIOS 8253 8259

C SO BIOS 8253 8259

PC

PC

I. 1. Caracteristicile ahitecturii IBM-PC, importante pentru gestionarea intreruperilor


I. 1. 1. Microprocesorul INTEL 8086
[http://pdos.csail.mit.edu/6.828/2006/readings/i386/toc.htm] Magistrala adrese: magistrala adrese IO: 16b (cei mai nesemnificativi) mag adrese: 20b

MAXIMUM MODE GND AD14 AD13 AD12 AD11 AD10 AD9 AD8 AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0 NMI INTR CLK GND
20 21 1 40

MINIMUM MODE

Vcc AD15 A16,S3 A17,S4 A18,S5 A19,S6 /BHE,S7 MN,/MX /RD

Mod minim (monoprocesor)- semnalelede control magistrala sunt generate direct de 8086 - magistrala poate fi patajata cu DMA prin HOLD/HLDA

8086

/RQ,/GT0 /RQ,/GT1 /LOCK /S2 /S1 /S0 QS0 QS1 /TEST READY RESET

HOLD HLDA /WR IO/M DT/R /DEN ALE /INTA

Mod maxim (multiprocessor sau cu coprocessor matematic) - semnalele de control magistrala sunt produse de un controller special (8288) - RQ/GT0 si RQ/GT1 - accesare magistrala de catre procesoare; LOCK blocare acces la magistrala - QS0 si QS1 pentru monitorizarea starii cozii de instructiuni

Registri: generali: de date 16b:AX,BX,CX,DX; 8b: AL,AH, etc de pointer i index: SP, BP, SI, DI segment: CS, DS, ES, SS pointer de instruc iuni: IP (adresa instr. CS:IP) indicatori de control i stare: 6 indicatori stare (CF, AF, ZF, SF, OF, PF) i 3 indicatori de control: DF=1 la instr pe iruri se folosete decrementarea (de la adrese mari la adrese mici, de la dreapta la stnga) TF=1 procesorul execut o instruc iune de depanare dup fiecare instruc iune IF=1 sunt recunoscute cereri de ntrerupere mascabile

Gestionare memorie: - pn la 1MB (2^20) - paginat pe segmente continue de 64kB (2^16) Adrese fizice - se folosesc regitri pe 16b adr_segment: adr_deplasament
adr_segment 2 4 + adr_deplasament

mai multe variante pentru a adresa aceeai loca ie Ex: (H ) F000:FFF0 FFFF:0 FF00:FF0
(F0000+FFF0=FFFF0+0=FF000+FF0=FFFF0)

OBS: 1 paragraf = 16B (2^4) Memoria organizata pe 2 bankuri: adrese pare >> magistrala date D0-D7, adrese impare >> magistrala date D8-D15

Sistem ntreruperi: (INT tip)


Externe: conex RESET, NMI, INTR RESET: CSFFFF; IP,DS,ES, SS0 tratat diferit, nu ca INT obisnuit NMI: recunoscut IF INT 2 INTR: recunoscute dac IF=1 tip gestionat de 8259 >> pot fi trap Interne + software generate implicit sau de instructiuni INT x o Exceptii - primesc controlul n anumite situatii, automat ca rspuns al procesorului la o comportare anormal fara generare ntrerupere de ctre utilizator prin apel explicit INT x INT 0 mpr ire la 0 (OF=1) INT 1 execu ie pas cu pas (TF=1) INT 3 breakpoint poate fi i trap INT 4 overflow- apelat de INT 0 Dac OF=1 se execut INT 4 Dac OF=0, NOP o Software cu rutine specializate, ce pot fi rescrise de utilizator INTx >> pot fi trap

Tabela vectori ntreruperi: primul kB de memorie = 256 intrri Intrare / vector interupere = adr_segment (2B) i adr_depl (2B) pentru rutina de tratare

1kB

... Adr_segment (2B) Adr_deplas (2B) vector intrerupere pentru INT x (4 octeti)

4x ..

Intrerupere interna & software

Tipul este depistat intern

Construieste vectorul de intrerupere

NMI

Tipul este 2

Intreruperi externe/hardware

INTR (cu IF=1)

Vectorul de intrerupere este format cu ajutorul 8259

Executie instructiune INT x - Salveaz reg indicatori in stiv - TF0, IF0 - Salveaz CS n stiv, salveaz IP n stiv - nscrie CS i IP cu vectorul de ntrerupere de la adresa fizic 4x Urmeaz salt la rutina de tratare Rutina se termin cu IRET care asigur refacerea par ial a contextului i revenire corect n program: Reface reg indicatori salvat n stiv Reface CS i IP cu valorile salvate n stiv

indicatori CS IP 1kB CS Adr_segment (2B) Adr_deplas (2B) 4x 0 IP Rutina de tratare intrerupe re x -----------IRET

stiva

OBS:

Diferit de CALL +RET IP sau far CALL +RET CS i IP Intreruperi hard: salvare toti registrii refacere completa context

Partajare vectori intrerupere !!! Unii vectori de intreruperi nu sunt acesibili programatorului exceptii
salveaz vector ntrerupere vechi scrie noul vector de ntrerupere daca este cazul, asigura executie servicii vechi In totalitate: prin apel veche rutina la sfarsit aplica ie: refacere vector ntrerupere vechi!!!!!

Modifica vector intrerupere 1kB Adr_segment (2B) Adr_deplas (2B) 4x 0

Rutina noua de tratare intrerupe re x Asigurare servicii vechi

Rutina veche de tratare intrerupe re x

Probl. de reentran !!! marcare sectiune critica (SC) i for are IF=0 pe durata SC!!

I. 1. 2 Configuratia intreruperilor la sisteme IBM PC


Software: Exceptii: INT 0 S/BIOS mpr ire cu depire INT 1 S/BIOS trasare pas cu pas INT 3 S/BIOS - breakpoint INT 4 S/BIOS - depire OF=1 Hardware: INT 2 NMI BIOS eroare paritate de memorie sau pentru coprocesor ACCES NEPERMIS UTILIZATORILOR!!
INT 08H IRQ0_8259_I BIOS ceas de timp real (implicit nemascat de 8259) INT 09H IRQ1_8259_I BIOS tastatura (implicit nemascat de 8259) INT 0AH IRQ2_8259_I - rezervata

INT 0BH IRQ3_8259_I BIOS COM (implicit mascat de 8259) INT 0CH IRQ4_8259_I BIOS COM (implicit mascat de 8259) INT 0DH IRQ5_8259_I BIOS LPT, disc INT 0EH IRQ6_8259_I BIOS disc flexibil INT 0FH IRQ7_8259_I BIOS LPT INT 70H IRQ0_8259_II BIOS ceas CMOS INT 71H IRQ1_8259_II BIOS redirectata spre INT0AH /cascadare INT 72H IRQ2_8259_II BIOS rezervata INT 73H IRQ3_8259_II BIOS rezervata Aceste tipuri rezulta din INT 74H IRQ4_8259_II BIOS rezervata cuvintele de initializare trimise INT 75H IRQ5_8259_II BIOS rezervata catre 8259_I si 8259_II INT 76H IRQ6_8259_II BIOS disc dur INT 77H IRQ7_8259_II BIOS rezervata 8259_I i 8259_II ini ializate de BIOS. Se pot schimba priorit ile prin programare -> nerecomandat.

8086 8259_II
IRQ7

8259_I
IRQ7 . . .

INT

INTR

. . . IRQ0

IRQ2 INT IRQ1 IRQ0

Controller tastatura

Out canal 0, 8253

OBS: In rutina de tratare a unei intreruperi hard se poate genera o intrerupere soft (INT 08H INT 1CH) SO pot desconsidera sugestiile INTEL INT 05H INTEL depire limite super/infer intr-un bloc de date Bound Range Exceed INT 05H BIOS realizeaz print screen De aceea, cnd depirea este atins print screen

Prioritati:
INT interne/soft (fara INT 1), cu INT i mai prioritar ca INT j, dac 4 < i < j NMI INTR (mascabile) INT 1 diferit la 80386 (pas cu pas)

scade

I. 1. 3 BIOS
BIOS = ansamblu de rutine de tratare a unor ntreruperi ce asigur servicii de baz (pentru un hardware func ional) = interfat SO hardware

Zona de lucru rezervat:


ncepe de la adresa 0000:0400 H - rezervarea se face la ini ializarea calculatorului - structura de date este pentru configura ia maxim permisa - unele date sunt ini ializate la pornirea calc

Ex: 0000:0400 H, 2B adresa COM1 0000:0408 H, 2B adresa LPT1 0000:041C H, 2B pointer pozitie curenta in coada tampon a tastaturii 0000:0440 H, 1B contor ce indic ce interval timp mai trebuie men inut pornit motorul unit ii floppy (motor oprit cand contorul este 0) 0000:04F0 H, 16B zon de comunica ie ntre aplica ii

ntreruperi BIOS
5, 8, 9, 10-1C, 4A, 70 1D, 1E, 1F, 41, 46 vectori de ntrerupere ce pointeaza spre tabele BIOS Se vor utiliza in acest curs INT08H, INT09H.

INT 08H ceas pentru aplicatii de timp real /implicit nemascata de 8259 IRQ0 _8259I Cererea de ntrerupere apare de la canal 0 / 8253 - implicit la fiecare 55msec (de 18.2 ori pe sec) Pe programarea implicit 8259 ntreruperea de nivel prioritar Rutina de tratare asigur: Incrementeaz contorul de la adresa 0000:046C H; dac valoarea acestuia indic scurgerea a 24 ore, atunci acesta devine 0 i se pozi ioneaza indicatorul de la adresa 0000:0470 citeste contorul de la adresa 0000:0440 daca valoarea este 0 oprete motorul la floppy i pozi ioneaz indicatorul de la 000:043F altfel decrementeaza contorul genereaza intrerupere utilizator INT 1CH rutina de tratare este implicit IRET achit ntrerurperea la 8259

INT 09H tastatura /implicit nemascata de 8259 IRQ1 _8259I Cererea de ntrerupere apare la fiecare apasare i eliberare de tast Pe programarea implicit 8259 ntreruperea de nivel prioritar maxim dup INT08H Rutina de tratare asigur: Citete cod scan al tastei (din port de adresa 60H); Determina codul ASCII Salveaz codul scan i ASCII ntr-o coad circular a tastaturii Coda tampon are 32 octe i (spa iu pentru 16 taste) ncepnd cu 0000:041E H Pointerul la pozi ia curent este la adresa 0000:041C H La salvare: OH OL

cod SCAN cod ASCII - pentru func ionale: OH OL cod ASCII extins 0

Dac au fost apasate tastele ALT, sau CTRL sau Shift sau INS sau CAPS se actualizeaza octetii de stare de la adresele 0000:0417 si 0000:0418 Aceti octe i pot fi citi i i cu INT 16H Dac s-a apsat CTR+ALT+DEL se nscrie 1234H la adresa 0000:0472 i se pred controlul rutinei de ini ializare n toate situa iile se reini ializeaz controlerul de tastatura pentru a se putea citi tasta urmtoare i se achita intreruperea la 8259 pentru o func ionare corecta!!!!!. Porturile 60H si 61H sunt folosite pentru comunicarea cu tastatura - citire 60H pentru aflare cod scan tasta (bit D7=0 la apasare si 1 la eliberare) - port 61H D7 D6 D5 D4 D3 D2 D1 D0 = 0 enable Pentru alte dispozitive = 1 disable periferice

Secven a de reini ializare controller tastatura: - obligatorie Citete octet_1 de la port 61H Pozi ioneaza in octetul citit bitul D7 pe 1 i scrie rezultatul n port 61H Scrie octet_1 (nemodificat) la portul 61H Sugestie rutina proprie de testare daca o tasta a fost apasata: Citeste port 60H Verifica daca este codul scan al tastei cautate Daca da executa serviciile suplimentare dorite Asigura servicii vechi ale rutinei (apel veche rutina) - servicii obligatorii: reinitializare controler tastatura i achitare intrerupere la 8259

Alte rutine BIOS:


INT 5H - tiparete continutul ecranului la imprimant dac se apas Shift + PrintScreen INT 10 H servicii video INT 11H determinarea configura iei calculatorului Rutina de tratare asigur nscrierea lui AX cu informa iile luate de la 0000:0410H D15 D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 Nr Nr porturi Nr unit Mod =1 : Exista imprimante seriale floppy video coprocesor initial

INT 12H determin dimensiunea memoriei pentru DOS i aplica ii Valoarea este tiut de la initializare / testul de memorie Rutina de tratare asigur nscrierea lui AX cu informa iile luate de la 0000:0413H INT 13H servicii disc pachet de func ii ce permit acces la nivel de sector nainte de generarea ntreruperii: se nscrie AH cu numrul func iei se nscrie n DL numr unitate Exemple: func ia 00H: pozi ionare la 0 a controlerului de disc + calibrare func ia 01H: citire stare dup ultima opera ie efectuat (n AL se returneaz un cod de eroare) func ia 02H: citire sectoare func ia 03H: scriere sectoare Tabele parametri: disc floppy 0000:0078H; disc dur 0000:0104H

INT 14H servicii porturi seriale desi n zona BIOS este spa iu rezervat pentru 4 porturi COM, numai 2 sunt ini ializate implicit la pornirea calc func ia 00H: ini ializare nainte de generarea ntreruperii: AH = numrul func iei DX = 0 sau 1 (nr port COM) AL = parametri initializare returneaza: AX- stare func ia 01H: emitere caracter nainte de generarea ntreruperii: AH = numrul func iei DX = 0 sau 1 (nr port COM) AL = caracter returneaza: AX=stare func ia 02H: recep ie caracter nainte de generarea ntreruperii: AH = numrul func iei

DX = 0 sau 1 (nr port COM) returneaza: AL = caracter, AH=stare func ia 03H: citire stare nainte de generarea ntreruperii: AH = numrul func iei DX = 0 sau 1 (nr port COM) returneaza: AX=stare INT 15H diverse (ex: joystick, determinare disponibil memorie extended)

INT16H interfat tastatura - folosete informa iile nscrise de INT09H n coada tampon tastatura sau la octe ii de stare tastatura nainte de generarea ntrerurperii: se nscrie AH cu numrul func iei func ia 00H: ateapt cod tasta apsat i citete codul func ia 10H: idem pentru taste extinse func ia 01H: verific dac este un cod disponibil de tasta apasat returneaz: ZF=0 cod disponibil; n AL cod ASCII, n AH cod scan ZF=1 cod nedisponibil func ia 02H: citire stare
AL = shift status bits 0 = right shift key depressed 1 = left shift key depressed 2 = CTRL depressed 3 = ALT depressed 4 = SCROLL LOCK active 5 = NUM LOCK active 6 = CAPS LOCK active 7 = INSERT state active

INT 17H servicii port paralel func ia 00H: tiprire caracter nainte de generarea ntreruperii: AH = numrul func iei DX = 0 , 1, 2 (nr port LPT) AL = caracter de tiprit returneaza: AH=stare port func ia 01H: ini ializare port nainte de generarea ntreruperii: AH = numrul func iei DX = 0 , 1, 2 (nr port LPT) returneaza: AH- stare port func ia 02H: citire stare port nainte de generarea ntreruperii: AH = numrul func iei DX = 0 , 1, 2 (nr port LPT) returneaza: AH- stare port

INT 18H, 19H interpretor ROM BASIC pentru ncrcare SO INT 1AH - acces la ceas CMOS: actualizat fr interven ia CPU - acces la contor zona BIOS (tick count): actualizat de 18.2 ori pe secunda (valori: o ora:65543; 1 zi:1573040) de INT08H

- citire/scriere data (func ii 4/5) sau ora CMOS (func ii 2/3) - inscriere/anulare alarm: func ia 6: setare alarma la ora precizat se va executa rutina utilizator INT 4AH atentie: returneaza cod de eroare daca ceasul nu este functional!! sau alarma era deja setata functia 7: reset alarma pentru modificare ora alarma: reset alarma veche, apoi setare ora noua - citeste/scrie contor tick (functii 0/1) INT 1BH tratare Ctrl +BREAK - se execut daca se apas CTRL+BREAK - implicit: IRET; preluata de DOS

INT 1CH rutina ceas utilizator - generat de INT08H - implicit: IRET INT 4AH alarma utilizator - generat de INT 70H - implicit: IRET

INT 70H ceas CMOS pe IRQ0-8259II /implicit mascata la 8259 si CMOS - cererea de ntrerupere (dupa activare generare periodica in CMOS) apare de 1024 ori pe sec - dac ora_CMOS = ora_alarma, se genereaza INT 4AH

Tabele de parametri
INT 1DH tabel parametri video INT 1EH tabel parametri floppy (10B) folosita de INT 13H Ex: timp salt la alta pista, timp pozi ionare cap, dimensiune sector, numar sectoare etc INT 41H Tabel parametri disc dur (16B) folosita de INT 13H INT 46H Tabel parametri al doilea disc dur (16B) folosita de INT 13H INT 1FH Tabel cararactere ACSII set extins - folosita n mod grafic, coduri 128 255 (pentru coduri 0-127 in ROM la adresa F000: FA6E H) - la initializare pointerul este F000:0000, dar caracterele - nedisponibile; pot fi inscrise de SO. 1 caracter = 8B

1 1 1 1 1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1

1 1 1 1 1 1 1

1 1 1 1 1 1

1 1 margine inferioara pe ecran 1 1 1 1

margine inferioara superioara

Informa ii despre memorie


- dimensiune memorie de baz : n kB la CMOS 15H, CMOS 16H: Accesare CMOS la citire: scrie in port de adres 70H - adresa CMOS citete din port de adresa 71H scrie in port de adres 70H octetul 15H citete din port de adresa 71H octetul_low scrie in port de adres 70H octetul 16H citete din port de adresa 71H octetul_high size=octetul_low+256*octetul_high [kB] - dimensiune memorie extins : n kB la CMOS 17H, CMOS 18H - dimensiune memorie de baz disponibil pentru DOS i aplica ii la AdrPSP:0002H n paragrafe la 0000:0413H (BIOS) n kB folosind INT12H in AX n kB

- dimensiune memorie pentru aplica ie limita superioara (SUP) de la AdrPSP:0002H SUP-AdrPSP=memorie alocat n paragrafe - f r header MCBZ i mediu

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