www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Real Time operacijski sistem

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> AVR, LPC900, x51
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
PeterC
Član
Član



Pridružen-a: Tor 14 Dec 2004 20:22
Prispevkov: 204
Aktiv.: 0.86

PrispevekObjavljeno: Tor Okt 16, 2007 7:29 pm    Naslov sporočila:  Real Time operacijski sistem Odgovori s citatom

Ravno delam zelo preprost in okrnjen RTOS v asemblerju za Atmelov mega8 kontroler.

U bistvu sem naredil interrupt s timerjem, ki ob interruptu preklaplja med taski - time slice (časovno rezinenje).

Zadeva mi je jasna in logična, paziti je treba da ni task predolg, da ga interrupt ne povozi v naslednjem ciklu.

Poraja se mi vprašanje, kako se tega lotiti v C-ju, kjer ni takega nadzora nad prevedeno dolžino kode v asemblerju. Se uporablja enak način z malo bolj inteligentnim task managerjem ali čisto drug princip.

LP

Peter
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Glitch
Član
Član



Pridružen-a: Pet 07 Apr 2006 11:40
Prispevkov: 1477
Aktiv.: 6.32

PrispevekObjavljeno: Tor Okt 16, 2007 7:42 pm    Naslov sporočila:   Odgovori s citatom

RTOS je možno narediti v Cju, zakaj pa ne. Višji nivo ti omogoča skoraj dobesedno izživljanje pri kontroli. Metode so različne, odvisno od potreb. Tvoja je cooperative time-sliced round-robin. Poskusi s preemptive in dinamičnim dodeljevanjem časa Smile

Tudi nadzor nad prevedeno kodo je možen. Kar ostane v asemblerju je kontrola preklopa med taski, če se uporabljajo kakšni posebni triki.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
alessio
Član
Član



Pridružen-a: Pon 04 Dec 2006 8:39
Prispevkov: 363
Aktiv.: 1.61
Kraj: Ljubljana

PrispevekObjavljeno: Tor Okt 16, 2007 8:20 pm    Naslov sporočila:  Re: Real Time operacijski sistem Odgovori s citatom

PeterC je napisal/a:

Poraja se mi vprašanje, kako se tega lotiti v C-ju, kjer ni takega nadzora nad prevedeno dolžino kode v asemblerju. Se uporablja enak način z malo bolj inteligentnim task managerjem ali čisto drug princip.


Za idejo si lahko pogledaš www.freertos.org, ki ima port tudi za AVR familijo.
Na strani je tudi tutorial "How FreeRTOS works", ki razloži osnove RTOS-a v splošnem
in podrobneje opiše tudi preklaplanje med taski za AVR-je. Poučno.

Aleš
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.57

PrispevekObjavljeno: Tor Okt 16, 2007 8:42 pm    Naslov sporočila:  Re: Real Time operacijski sistem Odgovori s citatom

PeterC je napisal/a:
Zadeva mi je jasna in logična, paziti je treba da ni task predolg, da ga interrupt ne povozi v naslednjem ciklu.


Tole ne ne jasno, ne logicno - task scheduler ob vsakem preklopu popravi zadnji stack frame in to je to. Informacije se morajo shranjevati v tabeli za vsak task posebej ob vsakem preklopu (context switch).

V takem primeru je povsem nepomembno koliko ciklov je dolg katerikoli task, vsi bodo dobili enako ciklov (to lahko po potrebi scheduler tudi spremeni tako, da dobi vsak task arzlicno stevilo ciklov ...) in dokler noben task ne posega v delovanje timerja, ki poganja scheduler (tega na 8-bitnem MCUju ponavadi ni mogoce prepreciti in je potrebno na to paziti v kodi), je vse skupaj pre-emptive.

_________________
Ka ti bo pa torba ce si kupu kolo ?
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
PeterC
Član
Član



Pridružen-a: Tor 14 Dec 2004 20:22
Prispevkov: 204
Aktiv.: 0.86

PrispevekObjavljeno: Sre Okt 17, 2007 5:15 pm    Naslov sporočila:   Odgovori s citatom

Torej, če pravilno razumem, ob časovnih prekinitvah jedro operacijskega sistema sledi nekemu urniku (scheduler) - ki je lahko dinamičen ali fiksen.

Potem pa ostajajo opcije:

Moja varjanta v asemblerju - time-sliced round-robin - časovni interval taskov je enako dolg, task se mora zaključiti pred naslednjim interruptom.

Pre-emptive z dinamičnim dodeljevanjem časa - če si pravilno razlagam, lahko v tem primeru task z višjo prioriteto ustavi task z nižjo. Torej taski komunicirajo s kernelom in povejo kakšno je njihovo stanje.
Ali si lahko v tem primeru en task rezervira ves procesorski čas samo zase za kakšne kritične trenutke (recimo branje 1wire komunikacije na I/O pinu se mi zdi en izmed takih problemov)?
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.57

PrispevekObjavljeno: Sre Okt 17, 2007 5:55 pm    Naslov sporočila:   Odgovori s citatom

I/O izvaja kernel, taski samo komunicirajo z modulom, ki skrbi za dolocen del.

Tisto z omejevanjem dolzine taska da bo delovalo pravilno je bedarija. Imas seznam taskov, v katerem pise koliksen delez (oz. se lazje: koliko ciklov absolutno) naj doticni task dobi ter nekaj njegovih parametrov, ki so potrebni za rekonstrukcijo stack frame-a. Vsak novo zagnan task se mora vpisati v tabelo, vsak dokoncan task mora iz tabele izginiti.

En interrupt dovolj visoke prioritete (odvisno od drugih stvari, ki naj bi jih tvoj OS pocel - ce kernel skrbi za I/O, potem mora imeti I/O se visjo prioriteto), ki ga poganja timer, skrbi za preklop med taski in v njegovo delovanje ne sme (oz. na normalnih sistemih z zascito sistemskih sredstev preprosto niti ne more) posegati noben task.

Vsakic, ko se sprozi, pogleda kateri task se trenutno izvaja, s stacka pobere frame, katerega je CPU sestavil ob sprozitvi interrupta, prepise relevantne podatke (vsaj return address, ce ne se cesa drugega, odvisno od izvedbe ... zraven bodo najbrz vsaj se registri) v tabelo, pogleda v tabeli kateri task je naslednji na vrsti, iz tabele prebere relevantne podatke in zgradi nov stack frame, popravi stevilo ciklov do ponovne sprozitve interrupta (ce se le-to razlikuje med taski, torej da nima vsak enako procesorskega casa) in zapusti interrupt handler.

Od tukaj se naprej izvaja drugi task, dokler se interrupt spet ne sprozi in pride do naslednjega context switcha, kjer se postopek ponovi, in tako naprej v neskoncnost ... nobene potrebe ni za omejevanje dolizne taska; bo pac potrebnih vec sliceov za njegovo izvedbo, nic tragicnega, tako delujejo vsi programi, katere pravkar poganjas na svojem namiznem racunalu.

_________________
Ka ti bo pa torba ce si kupu kolo ?
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> AVR, LPC900, x51 Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 493 dni


Powered by phpBB © 2001, 2005 phpBB Group