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
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
PC

Simplu

Parte II Multitasking = taskuri (+corutine) +ISR SO de timp real - FreeRTOS Planificare taskuri
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
Placa dezvoltare cu
DsPIC33

Complexitate medie

taskuri Partajare resurse intre taskuri si ISR: MPLAB C FreeRTOS Placa dezvoltare cu DsPIC33 Complexitate medie

Partea I: Aplicatii monotasking ce gestionează intreruperi

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

2. Accesarea dispozitivelor periferice 8253, 8259

3. Facilitati C. Tehnici de programare in intreruperi

C SO BIOS 8253 8259 PC
C
SO
BIOS
8253
8259
PC
de programare in intreruperi C SO BIOS 8253 8259 PC C SO BIOS 8253 8259 PC
C SO BIOS 8253 8259 PC C SO BIOS 8253 8259 PC C SO BIOS
C
SO
BIOS
8253
8259
PC
C
SO
BIOS
8253
8259
PC
C
SO
BIOS
8253
8259
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

MINIMUM

MODE

MODE

GND

1

GND 1 40   Vcc

40

 

Vcc

AD14

   

AD15

AD13

   

A16,S3

 
   

AD12

   

A17,S4

   

AD11

   

A18,S5

   

AD10

   

A19,S6

   

AD9

   

/BHE,S7

   

AD8

   

MN,/MX

   

AD7

   

/RD

   

AD6

   

/RQ,/GT0

HOLD

   

8086

 

AD5

     

/RQ,/GT1

HLDA

   

AD4

   

/LOCK

/WR

   

AD3

   

/S2

IO/M

   

AD2

   

/S1

DT/R

   

AD1

   

/S0

/DEN

   
     

QS0

ALE

   
   

QS1

/INTA
/INTA
 
AD0 NMI INTR
AD0
NMI
INTR
 

/TEST

 

CLK

 

READY

   

GND

 

20

 

21

 
 
RESET
RESET
 
 

Mod minim (monoprocesor)-

- semnalelede control magistrala sunt

generate direct de 8086

- magistrala poate fi patajata cu DMA prin HOLD/HLDA

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 foloseşte decrementarea (de la adrese mari la adrese mici, de la dreapta la stânga) TF=1 – procesorul execută o instrucţiune de depanare după fiecare instrucţiune IF=1 sunt recunoscute cereri de întrerupere mascabile

Gestionare memorie:

- până la 1MB (2^20)

- paginată pe segmente continue de 64kB (2^16)

Adrese fizice

- se folosesc regiştri pe 16b

adr_segment: adr_deplasament

adr_segment 2

4

+

adr_deplasament

mai multe variante pentru a adresa aceeaşi 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 răspuns al procesorului la o comportare anormală fara generare întrerupere de către utilizator prin apel explicit INT x INT 0 împărţ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 intrări Intrare / vector interupere = adr_segment (2B) şi adr_depl (2B) pentru rutina de tratare

1kB …… Adr_segment (2B) Adr_deplas (2B) 4x …… 0
1kB
……
Adr_segment (2B)
Adr_deplas (2B)
4x
……
0

vector intrerupere pentru INT x (4 octeti)

rutina de tratare 1kB …… Adr_segment (2B) Adr_deplas (2B) 4x …… 0 vector intrerupere pentru INT

Intreruperi

externe/hardware

Intrerupere interna & software

Tipul este depistat

intern Tipul este 2
intern
Tipul este 2
& software Tipul este depistat intern Tipul este 2 N M I INTR (cu IF=1) Vectorul

NMI

INTR

(cu IF=1)

Vectorul de

intrerupere esteintern Tipul este 2 N M I INTR (cu IF=1) Vectorul de format cu ajutorul 8259

format cu ajutorul

8259

2 N M I INTR (cu IF=1) Vectorul de intrerupere este format cu ajutorul 8259 Construieste

Construieste

vectorul de

intrerupere

Executie instructiune INT x

- Salvează reg indicatori in stivă

- TF0, IF←←←←0

- 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ă

1kB

4x

0

OBS:

CS

1kB 4x 0 OBS: CS Adr_segment (2B) Adr_deplas (2B) IP indicatori CS IP intrerupe re stiva

Adr_segment (2B)

Adr_deplas (2B)

IP

1kB 4x 0 OBS: CS Adr_segment (2B) Adr_deplas (2B) IP indicatori CS IP intrerupe re stiva
1kB 4x 0 OBS: CS Adr_segment (2B) Adr_deplas (2B) IP indicatori CS IP intrerupe re stiva

indicatori

0 OBS: CS Adr_segment (2B) Adr_deplas (2B) IP indicatori CS IP intrerupe re stiva Rutina de

CS

IP

intrerupe re

stiva

Rutina de tratare

x

------------

IRET

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!!!!!

1kB

4x

0

ţ ie: refacere vector întrerupere vechi!!!!! 1kB 4x 0 Modifica vector intrerupere Rutina noua de tratare

Modifica vector intrerupere

Rutina noua de tratare

intrerupe re

x

Asigurare servicii vechi

noua de tratare intrerupe re x Asigurare servicii vechi Adr_segment (2B) Adr_deplas (2B) Rutina veche de

Adr_segment (2B)

Adr_deplas (2B)

Rutina veche de tratare

intrerupe re

x

(2B) Adr_deplas (2B) Rutina veche de tratare intrerupe re x Probl. de reentran ţă !!! –

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– împărţire cu depăşire INT 1 – S/BIOS – trasare pas cu pas INT 3 – S/BIOS - breakpoint INT 4 – S/BIOS - depăşire 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

– disc flexibil INT 0FH – IRQ7_8259_I – BIOS – LPT INT 70H – IRQ0_8259_II –

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

INT 74H – IRQ4_8259_II – BIOS – rezervata INT 75H – IRQ5_8259_II – BIOS – rezervata INT 76H – IRQ6_8259_II – BIOS – disc dur INT 77H – IRQ7_8259_II – BIOS – rezervata

– disc dur INT 77H – IRQ7_8259_II – BIOS – rezervata Aceste tipuri rezulta din cuvintele

Aceste tipuri rezulta din cuvintele de initializare trimise catre 8259_I si 8259_II

8259_I şi 8259_II iniţializate de BIOS. Se pot schimba priorităţile prin programare -> nerecomandat.

8086 8259_I 8259_II IRQ7 IRQ7 . . INTR INT . IRQ2 . INT IRQ1 IRQ0
8086
8259_I
8259_II
IRQ7
IRQ7
.
.
INTR
INT
.
IRQ2
.
INT
IRQ1
IRQ0
IRQ0
Controller
Out canal 0,
tastatura
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 – depăşire limite super/infer intr-un bloc de date Bound Range Exceed INT 05H – BIOS – realizează print screen De aceea, când depăşirea este atinsă print screen

Exceed INT 05H – BIOS – realizeaz ă print screen De aceea, când dep ăş irea

Prioritati:

scade

ăş irea este atins ă → print screen Prioritati: scade INT interne/soft (fara INT 1), cu

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)

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 opreşte 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ă:

Citeşte 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) începând cu 0000:041E H Pointerul la poziţia curentă este la adresa 0000:041C H La salvare:

OH

cod SCAN

OL

cod ASCII

- pentru funcţionale:

OH

cod ASCII extins

OL

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

Aceşti octeţi pot fi citiţi şi cu INT 16H Dacă s-a apăsat 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 următoare ş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 periferice

= 1 disable

Secvenţa de reiniţializare controller tastatura:

- obligatorie Citeşte 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 - tipareşte 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 coprocesor

 

imprimante

seriale

 

floppy

video

 

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 numărul funcţiei se înscrie în DL – număr 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

= numărul 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

= numărul 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 = numărul funcţiei

DX = 0 sau 1 (nr port COM)

returneaza: AL = caracter, AH=stare funcţia 03H: citire stare Înainte de generarea întreruperii:

AH

= numărul funcţiei

DX

= 0 sau 1 (nr port COM)

returneaza: AX=stare

INT 15H – diverse (ex: joystick, determinare disponibil memorie extended)

INT16H – interfată tastatura

- foloseşte informaţiile înscrise de INT09H în coada tampon tastatura sau la octeţii de stare tastatura Înainte de generarea întrerurperii: se înscrie AH cu numărul funcţiei

funcţia 00H: aşteaptă cod tasta apăsată şi citeşte 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: tipărire caracter

înainte de generarea întreruperii:

AH

= numărul funcţiei

DX

= 0 , 1, 2 (nr port LPT)

AL

= caracter de tipărit

returneaza: AH=stare port funcţia 01H: iniţializare port

Înainte de generarea întreruperii:

AH

= numărul funcţiei

DX

= 0 , 1, 2 (nr port LPT)

returneaza: AH- stare port funcţia 02H: citire stare port

Înainte de generarea întreruperii:

AH

= numărul funcţiei

DX

= 0 , 1, 2 (nr port LPT)

returneaza: AH- stare port

INT 18H, 19H – interpretor ROM BASIC – pentru încărcare SO

INT 1AH

- acces la ceas CMOS: actualizat fără 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

margine inferioara pe ecran

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 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 citeşte din port de adresa 71H scrie in port de adresǎ 70H octetul 15H citeşte din port de adresa 71H octetul_low scrie in port de adresǎ 70H octetul 16H citeşte 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