Software projekti

Autor: Stevan Tošić

E-mail: office@mikroe.com

 

SEMAFORI

Pri realizaciji real-time aplikacija veoma važan zahtev je brza reakcija na određene događaje.U mikrokontroleru se događaj vezuje za pojavu prekida (interapta). Kod motorolinog kontrolera MC68HC11 postoji 22 izvora prekida i 18 prekidnih vektora. Ako se u aplikaciji koristi više prekidnih linija tada je od velike važnosti obezbediti skladan rad. U MCX11 je ugrađen mehanizam semafora koji može “poboljšati” rad celog sistema kada se koriste prekidi.

Reč semafor asocira na signa-lizaciju. U real-time i operati-vnim sistemima uopšte, semafor pre-dstavlja način sinhronizacije između više poslova u nekoj praktičnoj primeni. Više poslova koji sinhronizovano rade zahteva određeni stepen organizacije cele aplikacije. Ovde se pojmu semafora i mehanizmu rada pristupa posredno preko pojma prekida.

Prekidi (interapti)

Razumevanje mehanizma prekida je veoma važno u programiranju mikrokontrolerskih aplikacija. Svaki mikrokrokontroler “poznaje” skup događaja na koje se može reagovati preko prekida. Navode se konkretni prekidi kod MC68HC11 (jer je MCX11 namenjen za rad sa ovim kontrolerom):

  • serijska komunikacija (SCI – Serial Communication Interface)

  • sinhrona serijska komunikacija (SPI – Serial Peripheral Interface)

  • tajmeri (PA - Pulse Accumulator, OC - Output Compare, IC - Input Capture, RT - Real Time)

  • ostali (IRQ, XIRQ, SWI, IOT, COP, CMF, RESET).

Koji od njih će se koristiti zavisi od potreba same aplikacije. Korištenje mehanizma prekida zahteva sledeće:

  • pisanje konkretne rutine za obradu prekida (niz programskih instrukcija)

  • u tabeli prekida omogućiti povezivanje izvora prekida i programske rutine za obradu prekida

  • omogućiti konkretan prekid (također je potrebno je da su svi prekidi globalno omogućeni) i postaviti fleg indikator

  • prilikom ulaska u rutinu za obradu prekida mora se resetovati fleg indikator pojave prekida da bi se omogućilo sledeća obrada prekida (neki događaj).

Osnovna ideja i savet koji se daje programerima uopšte, bilo da se koristi MCX11 ili ne, je da rutina za obradu prekida bude što kraća. Što je obrada više opterećena programskim kodom, time je usporena reakcija procesora na ostale događaje. Kao posledica nekog događaja možda je potrebno izvršiti složenu obradu podataka - velik kod. Nije teško zaključititi kako to utiče na eventualnu obradu drugih događaja u sistemu. Drugim rečima, real-time operativni sistemi se koriste u uslovima složenijih zahteva odnosno kada u sistemu postoji “više” različitih događaja. Šta se podrazumeva pod rečju “više” je pomalo subjektivna stvar programera.

Pojam semafora

Posle kratkog opisa o prekida sledi pojašnjenje mehanizma semafora koje nije direktno vezano za prekide. MCX11 obezbeđuje korištenje semafora radi sinhronizacije. Sinhronizacija može biti između dva taska, rutine za obradu prekida i taska itd. Šta je semafor? Semafor je jednostavno 1 bajt koji se može nalaziti u jednom od tri stanja:

  • PENDING (nije se desio zahtevani događaj)

  • WAITING (nije se desio događaj i task čeka)

  • DONE (događaj se desio).

Protokol stanja prelaza (iz jednog stanja u drugo) je dat na Slici 1.

4b131.gif (2595 bytes)
Slika 1. Protokol prelaza stanja semafora


Ideju semafora, u određenoj meri, može pojasniti analogija sa semaforima na saobraćajnim raskrsnicama. Tada se može uspostaviti sledeća korespondencija ZELENO - DONE, CRVENO - WAITING, a ŽUTO - PENDING. Ovo je samo grubo uprošćavanje jer je smisao semafora u programiranju malo drugačiji. Stanje semafora menjaju semaforske primitive. Postoje tri semaforske primitive koje podržava MCX11:

  • .wait.

  • .signal.

  • .pend.

Pravila koja definišu prelaz iz jednog stanja u drugo kao posledica korištenja jedne od tri gornje funkcije:

1. .wait.:

  • ako se pokuša .wait. na semaforu koji se nalazi u stanju DONE, tada task nastavlja svoju aktivnost, a stanje semafora se menja u PENDING

  • ako se pokuša .wait. na semaforu koji se nalazi u stanju PENDING, tada se stanje semafora menja u WAITING (obustavlja svoju aktivnost)

  • ako se pokuša .wait. na semaforu koji već nalazi u stanju WAITING, tada je rezultat neodređen

2. .signal.:

  • ako se uradi .signal. semaforu koji je u stanju PENDING, stanje semafora se menja u DONE, a kao posledica nema promene u aktivnosti bilo kojeg taska

  • ako se uradi .signal. semaforu koji se nalazi u WAITING stanju, stanje semafora se menja u DONE i task koji čeka na signal postaje ponovo spreman (ako je većeg prioriteta od taska koji daje signal tada se nastavlja novi task, koji je čekao, a stanje semafora se menja u PENDING).

3. .pend.:

  • ako se uradi .pend. tada se stanje semafora menja u PENDING bezuslovno.

Pozivne sekvence za gornje tri funkcije su:

ldab #SEM_x
swi
FCB .wait.
.

ldab #SEM_x
swi
FCB .signal.
.
ldab #SEM_x
swi
FCB .pend.
.

Jedan praktičan primer (taster i displej)

Sledi primer koji ilustruje primenu semafora u jednoj jednostavnoj aplikaciji (Slika 2.). Na liniju IC1 je povezan taster koji se kontroliše pomoću prekida. Na svaki pritisak tastera se treba inkrementirati broj koji se prikazuje na 7 segmentnom displeju. Za ispis na displej se koristi SPI (Serial Peripheral Communications). Jednostavno se to može opisati kao : prekid (desio se neki događaj) – semafor (signalizira se pojava događaja unutar rutine za obradu prekida) – task (obrada događaja – ispis na displej, itd.). Ovaj trougao predstavlja drajver koji je zadužen za opsluživanje ovog događaja. Dakle, sama obrada događaja je “izbačena” u task, čime je izbegnuto pisanje dužeg programskog koda u rutini za obradu prekida. U tasku1 se ispisuje nova vrednost kada se pritisne taster. Ovo je obezbeđeno čekanjem na semaforu SEM1, a signal za novi ispis dolazi iz rutine za obradu prekida IC0. Podsetimo se da se obrada prekida sa linije IC0 dešava kao posledica uzlazne, silazne ili obe (toggle) ivice, što podešava programer. U našem slučaju se može odabrati jedan od prva dva načina rada.

4b132.gif (9284 bytes)
Slika 2. Šema primera

Ova jednostavna aplikacija daje jedan primer primene semafora. Naravno da za realizaciju ovakvog primera nije bila potrebna priča o semaforima. Primena mehanizma semafora (i real-time OS uopšte) dolazi do izražaja kod složenijih zahteva: komunikacija, više tastera, tastature, A/D konverzija, tajmerske funkcije itd..

Kod

Sledi deo programskog koda kojim se rešava navedeni problem pomoću mehanizma semafora. Prvo se navodi kod koji grubo skicira kako se u tasku1 čeka na semaforu SEM1, odnosno čeka se pritisak tastera:

task1 ldab #SEM1
swi
FCB .wait.
· ispisi na LCD zadani broj, a zatim ga uvećaj za jedan
jmp task1.

Dalje sledi veoma pojednostavljen deo koda (izostavljeni su neki detalji) koji opisuje kako se u rutini za obradu prekida (Isr_IC1) evidentira i signa-lizira dati događaj.

Isr_IC1 ldab #SEM1
jmp isrrtn.

Može se primetiti da u rutini nema .signal. i da nema rti. Signalizacija se dešava automatski ma koliko to čudno izgledalo.
Zaključak je sledeći:a) u rutini za obradu prekida, kada se želi signalizirati nekom semaforu, dovoljno je u akumulatorski registar B postaviti ime semafora. b) Kada se signalizacija vrši van rutine za obradu prekida tada se u registar B postavlja ime semafora, posle koga se obavezno navodi .signal.. Povratak iz rutine nije sa rti (return from interrupt) jer sam MCX11 to ne zahteva. Štaviše, povratak sa - jmp isrrtn - je nužan. Detaljnije objašnjenje zahteva dublje poznavanje samo jezgra OS i ovde se ne navodi.
Događaj koji se evidentira u rutini za obradu prekida (i dalje prosleđuje odgovarajućem tasku) je pritisak tastera (uzlazna ili silazna ivica, nikako ne oboje – toggle) koji je povezan na PA2 liniju (IC1). U multitasking okruženju prednost ovakvog mehnizma je da task1 ne zahteva vreme procesora odnosno dozvoljeno je ostalim taskovima (kojih ovde naravno nema, a kojih će biti kada aplikacija postaje složenija) da obave svoje aktivnosti. Na taj način se procesor posvećuje onom tasku za koji postoje neophodni uslovi za nastavak njegove aktivnosti.


Pročitajte više o ovoj temi
Vezni igrač
MCX11 MicroController eXecutive za 68HC11
Programiranje u MCX11
Tajmeri
cMCX11 Real Time operativni sistemi u programskom jeziku C

C o p y r i g h t  1998 mikroElektronika. All Right Reserved. Za sva pitanja obratite se redakciji