Reaaliaikasysteemit

RTOS

1.11.2008 Pekka/OH3GDO

RTOS nimilyhenne tarkoittaa Real Time Operating System
Mitä se sitten tarkoittaa?
Kaikki, jotka ovat tehneet sulauttetuja järjestelmiä puhuvat tästä, mutta vain harvat ovat kokeilleet.
Käyttöjärjestelmä tarjoaa käyttäjälle sovitut laitetason palvelut, kuten ohjelmien latauksen levyltä, näppäimistön käytön ja näyttönohjaukset.
Mutta eihän sulautetuissa järjestelmissä ole levyasemaa, useimmiten ei näppäimistöä, eikä näyttöä ainakaan perinteisessä merkityksessä !

Entä Real Time? Mitä se tarkoittaa? Onko vasteaika 0.001us vai 1 sekunti?
Real time tarkoittaa oikeastaan eräajon vastakohtaa eli laite toimii ympäristössä, jossa sen pitää toimia ulkoisten laitteiden kanssa niiden asettamilla vasteajoilla.

Ihmisen kanssa toimiessa vasteaika voi olla 50 ms käytettäessä näppäimistöä. PC:ssä on kaksi sulautettua järjestelmää hoitamassa näinkin yksinkertaista asiaa. Toinen itse näppäimistössä ja toinen PC:n vastapuolella.
Kun kameralta tulee jatkuvasti 30 MBittiä sekunnissa, reaaliaikaisen järjestelmän pitää pystyä käsittelemään sitäkin.
Vasteaika riippuu siis siitä mitä asiaa käsitellään. Data ei saa hävitä, jos laite toimii liian hitaasti.
VIC20:llä ja C64:lla ei ollut näppäimistöprosessoreita.
Kun tietoa liikkui levyasemalta, oli turha naputella, merkit hävisivät koska näissä laitteissa ei ollut tarpeeksi nopeaa palvelua merkkien lukemiseen. Siis näissä laitteissa ei ollut RTOS-järjestelmää.
Useimmissa PC:n laitetason sovittimissa on lisäksi oma muisti ja prosessori kuten Ethernet- ja sarjaliikennesovittimissa sekä kiintolevyissä.
Näissä on RTOS ohjelma.

Mitä ihmeellistä on RTOS:ssa?

Jokainen sulautettujen prosessorien kanssa ohjelmia tehnyt joutuu tekemään oman RTOS-järjestelmänsä. Niissä käyttäjä yleensä rakentaa ohjelman tapauskohtaisesti käyttäen laitteistoa joka kerta omalla tavallaan ottaen huomioon aikavasteet, keskeytykset ja ajastimien käytön.
Onko tämä huonompi tapa kuin ostaa kallis RTOS?
Hmm.. lue eteenpäin ja päättele itse.

Hyvät syyt

Useimmat kuvittelevat sen ratkaisevan prosessorin ja käyttäjän ajankäyttöongelmat, muistiongelmat, helpottavan ohjelmien kehitystä ja tekevän ohjelmista luonnostaan hyvin toimivia.
RTOS hoitaa moniajon automaattisesti.
Ei tarvitse käyttää yhteistä muistia.
Ei tarvita ajastinkäyttöä.

Jos kaikki on näin ruusuista, miksi kaikki eivät käytä RTOS-ohjelmia jatkuvasti joka projekteissaan?
Miksi sinä et käytä RTOS?

Huonot syyt:

- RTOS-ohjelmat ovat useimmiten kalliita. Niitä tekee vain harvat toimittajat.
- Oppiminen on monimutkaista.
- Niihin liittyy paksut käsikirjat, joihin pitää ensin tutustua. Kuukausi vierähtää helposti näiden kirjojen kanssa.
- Jos ohjelmalle löytyy kurssi, se kannattaa käydä.
- RTOS ei ole saatavissa kaikille prosessoreille.
- RTOS vie paljon muistia ja prosessoriaikaa.
- Huonot kokemukset RTOS käytöstä.
- Vanhat menetelmät, kuten tilakone, toimii hyvin.
- RTOS käyttää ajastinta, sinä et voi käyttää.
- RTOS käyttää yhteistä muistia tehtäville ja postilaatikoille, se on pois sinulta.

Valinta

Joskus pitää valita RTOS, koska se on ainoa saatavilla oleva kehitysympäristö.
Jos esimiehet valitsevat RTOS, ei auta muu kuin hyväksyä tosiasia.

Edulliset RTOS ohjelmat

FORT on perinteisesti ollut ilmainen ohjelmaympäristö, josta löytyy myös RTOS/FORT
CCS:n PCWH kääntäjä sisältää RTOS-tuen. RTOS tulee ilmaiseksi kääntäjän ohella. Tosin kääntäjä maksaa.
Tietysti DOS/WIN:llä, Linuxilla, Amigalla ja Applella on omat reaaliaikajärjestelmänsä, mutta puhutaan nyt vain sulautettujen järjestelmien RTOS.

Kalliit RTOS-ohjelmat

Intelillä on oma RTOS järjestelmänsä jota se myy prosessoriensa tueksi .
1985 tein Linnavuoren moottoritehtaalle ensimmäisen FMS-vauhtipyörävalmistussolun.
Laitteisto oli Nokia 1000 niminen kehikko ja siinä oli Intel 186-pohjaiset EURO2 kortit. Koodi oli 8080 tyyppistä 16-bittisellä prosessorilla. Laitteessa oli nelikanavainen sarjaliikennekortti, levyasemaohjain, keskusyksikkökortti, teholähdekortti ja levyasemat. Laite taisi olla ensimmäinen ja viimeinen tuotantokäyttöön tehty Nokia 1000 järjestelmä.
Kehitysympäristö oli Intelin reaaliaikajärjestelmä RTX, jossa oli C-kääntäjä. Käsikirjoja oli monta mapillista. Kaikki rutiinit piti tehdä itse, mitään kirjastokomponenttia ei ollut käytettävissä. Tämähän oli laite #1.
Kääntäminen tehtiin samassa laitteessa c-kielellä, siinä oli kaksi levyasemaa. Ohjelmat kuitenkin poltettiin EPROMille omalla EPROM-laitteella. Hidas ja hankala menetelmä. Debuggaus oli tuskaa.

Oliko järjestelmä hyvä?
Sillä saatiin tehtyä toimiva järjestelmä, mutta ohjelman kehitys oli hankalaa. Ongelmiakin oli, ohjelman toiminta keskeytyi sattumanvaraisesti ja joskus ohjelmaa ei saanut käyntiin ensimmäisellä kerralla. Vika löytyi tällä kertaa hardwaresta. Yksi käyttämätön sarjaliikennekeskeytys oli ilman jumpperia. Vian etsintää hankaloitti se, että laitteesta ei ollut kytkentäkaavioita.
Vauhtipyöräsolu valmistui kuitenkin ja vietiin Hannoverin FMS-messuille ja sen jälkeen on tehnyt paljon vauhtipyöriä Linnavuoren moottoritehtaalla. Minä en ehtinyt Hannoveriin, koska samaan aikaan oli Moskovassa tärkeät Sklada-eli varastomessut. Siellä esiteltiin FMS-vihivaunuja venäläisille.
Vihivaunusakin on RTOS
Samana vuonna PC kloonit olivat paljon kätevämpiä käyttää ja niillä tehtiin samanlaisia ohjelmia. PC kuulosti kuitenkin kotitietokoneelta ja sellaista ei PDP:n ja Vaxiin tottuneet ihmiset voineet mitenkään hyväksyä.
Olihan kysymys tärkeästä järjestelmästä. PDP11 tehtiin vielä muutama FMS-järjestelmä

VAX, PDP

Samaan hengenvetoon voi puhua PDP11:n RSX11 oli käyttöjärjestelmästä. Jos tein sillä yksin ohjelmaa, se toimi kohtuullisen hyvin, mutta jos samalle koneelle tuli toinen tai kolmas käyttäjä, oli parempi lähteä jonnekin muualle. Koneessa oli niin vähän RAM-muistia, että levyasema alkoi surrata koko ajan kun se heitteli RAM-muistia levylle ja takaisin. Ohjelmakehitykseen oli vain Fortran77 kääntäjä ja assembleri. Sarjaliikenteellä toimivat ANSI-päätteet toimivat sarjaliikenteellä. Yllätyin kun huomasin, että PDP11:n sarjaliikennekortissa on neljä tavallista Intel 8051 prosessoria, yksi jokaista sarjaliikennekanavaa varten. Koneessa oli yksi 10MB vaihdettava levyasemapakka. Levykopiointi oli aika raskasta pakkojen vaihtoa monessa erässä aivan kuin Commodore C64 levyaseman kanssa, mutta hitaampaa.

Entä VAX (VAX=Virtual Address eXtension, 32 bittinen prosessori)?
Sehän oli laaja ja hieno kone? Sillä pystyi lähettämään viestilappuja Tampereen ja Linnavuoren välillä, mutta CAD työskentely yksinäänkin oli tuskaa. 4.7 MHz PC ja 1985 vuoden AutoCad oli monta kertaa nopeampi ja parempi. Cad-ohjelma oli norjalainen, koska sen piti sopia suomalaiseen ympäristöön. Kun ohjelma oli ostettu paljastui, että alkuaan amarikkailisesssa ohjelmassa ä ja ö olivat ylivoimaisen vaikeita. Pian tämä norjalainen yhtiö meni konkurssiin, joten valittaakaan ei voinut.

Torstaisin ei voinut tehdä lainkaan töitä, sillä silloin tehtiin varmuuskopiointiajoja, joilla tuhottiin käyttäjien kaikki vanhemmat tiedostot. Talossa oli vain viisi kasettia, joten varmuuskopioinnista ei ollut mitään hyötyä. Mitään yli viiden viikon vanhaa tietoa ei välttämättä löytynyt.
Asiaan kuului myös, että käyttäjä ei saanut itse missään tapauksessa tallettaa ohjelmiaan muualle, ne voivat joutua vääriin käsiin. Vaxista tuhottiin kaikki ohjelmat joita ei oltu käytetty määrättyyn aikaan. VAXissa oli vain yksi 10MB levy kahdellesadalle käyttäjälle. Huolto tehtiin modeemilla Pariisista. VAXin käyttöjärjestelmän nimi oli VMX ja se oli sen ajan huippua, mutta ei täyttänyt RTOS määritelmää.

Kerran tarvitsin työstökoneen antaman Control/C merkin tunnistuksen. Ensin hain varastosta kaksi päivää ja viisi autonkuormallista käsikirjoja, joita kukaan ei ollut avannut aikaisemmin. Tämän pienen asian selvittäminen onnistui, mutta kovalla työllä. VAXissa ei ollut muita kääntäjiä kuin Fortran 77, siis vuosimalli 1977. Eihän ohjelmia kukaan tee, ne ostetaan. No periaatteessa kaikki ohjelmointikielet ovat samantapaisia, kirjastokomponentit ja vianhaku ovat erilaisia.

Muutamia vuosia sitten kävin entisessä työpaikassani ja katsoin VAXissa pyöriviä tehtäviä. Siellä näkyi,että tämä minun tekemäni ohjelma oli edelleen käytössä kahdenkymmenen vuoden jälkeenkin. Koska se oli tallessa, sitä on käytetty koko ajan ainakin viiden viikon välein. Sen avulla Linnavuoressa oleva työstökoneen käyttäjä käytti FANUC 11:lla Tampereella olevaa VAX11 konetta etäpäätteenään. Käyttäjä tietysti luuli, että kaikki uudet ohjelmat tulevat itsestään hänen koneeseensa.

RTOS ominaisuudet

RTOS varaa tehtäville ( taskeille) omat resurssit: RAM-muisti, keskeytykset , etuoikeudet ( prioriteetti).
Tehtävät keskustelevat vain omien laitteidensa kanssa. Muiden tehtävien kanssa keskustellaan lippujen (semaphore) ja postilaatikkojen (postbox) kanssa. Postilaatikkoon voi laittaa enemmän tietoa kuin merkkilippuun.

Ensin tehtävät pitää luoda eli varata niille sopiva määrä muistia, asettaa etuoikeudet ja vähimmäistoiminta-ajat .
Samoin pitää luoda liput ja merkkijonot sanomien välitystä varten.

Tässä vaiheessa mikään tehtävä ei ole käynnissä, joten seuraavaksi ne pitää käynnistää oikeassa järjestyksessä.

Tarvittaessa tehtävä voidaan pysäyttää (suspend) tai kokonaan lopettaa ( kill) ja vapauttaa muisti.

RTOS kuuluu vielä laitteiden suojaus eri tehtävien yhtäaikaiselta käytöltä.
Kolmas esimerkki antaa tästä viitteitä.

Tässä on periaatteessa kaikki RTOS:sta!

Näin helppoa se olikin!

Ensimmäinen esimerkki PIC18F452:lle ja sarjaliikennetulostukselle

// RTOS esimerkki CCS v3.240 ja 4.1
// Pekka Ritamäki 1.11.2008

#include <18F452.h>
#use delay(clock=20000000)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)

#use rtos(timer=0,minor_cycle=100ms)
// rtos ohje kertoo kääntäjälle mitä timerin RTOS saa käyttää
// timer0 käytetään RTOS tarkoitukseen
// kaikki tehtävät pitää suorittaa 100 ms

#task(rate=1000ms,max=100ms)
kaikki tehtävät pitää tehdä vähintään kerran sekunnissa
Tehtävän maksimiaika pitää olla lyhyempi tai yhtäsuuri kuin taskin minor_cycle eli 100ms
// tehtävät suoritetaan kerran sekunnissa, yhden tehtävän maksimiaika on 100ms

// aloitustehtävä, tässä tapauksessa ei mitään erikoista tarvitse tehdä, vain tulostus sarjaliikenteelle
void The_first_rtos_task ( )
{
printf("1\n\r");
}

// 2. tehtävä tulostaa numeroa 2
#task(rate=500ms,max=100ms)
void The_second_rtos_task ( )
{
printf("\ttoka\n\r");
}

// 3. tehtävä tulostus

#task(rate=100ms,max=100ms)
void The_third_rtos_task ( )
{
printf("\tkolmas\n\r");
}

// main aloittaa ohjelma
void main ( )
{
// rtos aloittaa suorittamaan tehtäviä, niinkuin yllä on määritelty

rtos_run(); // käynnistä RTOS
}

Hex koodi edellisestä
ROM kulutus 1% ja RAM kulutus 2%

:020000040000FA
:1000000060EF00F0F76A140FF66E000EF722090099
:10001000F5501200310A0D00F76A280FF66E000E37
:10002000F7220900F55012000932210A0D00F76A83
:100030003E0FF66E000EF7220900F5501200090976
:10004000330A0D00F76A540FF66E000EF72209000E
:10005000F550120006000D0014001B6A1B50D2DF81
:10006000000905E01B2A9EA8FED7AD6EF7D75A0EF1
:100070000B6E000E0C6EC9EF00F0000C1C6A1C50D9
:10008000CBDF000905E01C2A9EA8FED7AD6EF7D78E
:100090007C0E126E000E136EC9EF00F0000C1D6A8C
:1000A0001D50C5DF000905E01D2A9EA8FED7AD6ED4
:1000B000F7D79E0E196E000E1A6EC9EF00F0000CF5
:1000C000F86AD09EEA6AE96A810EAF6E260EAC6EBF
:1000D000900EAB6EC180C182C184C196066A086A67
:1000E0000A0E076E0A6A010E096E5A0E0B6E000E9A
:1000F0000C6E0D6A0F6A050E0E6E116A106A7C0E88
:10010000126E000E136E146A166A010E156E186ACE
:10011000176A9E0E196E000E1A6E056A820ED56E53
:100120000B0ED76EDC0ED66EF294820ED56E0B0ED1
:10013000D76EDC0ED66EF294D8900534006E82DF56
:10014000026E010E00247EDF036E03C0EAFF02C0D0
:10015000E9FFEFCF02F0E92AEFCF00F0ECCF01F09A
:10016000EC2AEFCF03F002E1EC2AED52EC50015CF7
:1001700011E10050035C0EE1ED52ED52EE6AEE6AC1
:1001800002BE08D0EC52ECCFFAFFED52EFCFE8FF01
:10019000F96E0001052A030E055CCEE1056AD65012
:1001A000D7CF03F0F2B4C3D7FAD7FF0E056E030022
:00000001FF
;PIC18F452

Toinen esimerkki CCS RTOS

'==================================

// RTOS esimerkki 2
// Ensimmäinen tehtävä lähettää viestejä toiselle ja se tulostaa saapuneet viestit sarjaliikenteelle
// hardware PIC16F452 , 20MHz kide, sarjaliikenne
// CCS/PCWH v. 4.057

#include <18F452.h>
#use delay(clock=20000000)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
#use rtos(timer=0,minor_cycle=500ms)

int8 count; // apumuuttuja
// Esitellään tehtävät
// jokaiselle tehtävälle annetaan kahden byten jonomuisti
#task(rate=1000ms,max=100ms,queue=2)
void Ensimmainen_tehtava ( );

#task(rate=500ms,max=100ms,queue=2)
void Toinen_tehtava ( );

// tehtävätfunktiot

void Ensimmainen_tehtava ( ) {
//tulosta monta viestiä on tulossa, RTOS järjestelmästä
//jos ei sanomia, vapauta tehtävä
// kysele onko viestejä tulossa
if(rtos_msg_poll ( )>0){
// Lue RTOS:ltä tulevat sanomien määrä
printf("Viesti tehtävältä #1: %i\n\r",rtos_msg_read ( ));
// lähetä viesti tehtävälle Toinen_tehtava,

rtos_msg_send(Toinen_tehtava,count);
count++;
}
}

void Toinen_tehtava ( ) {
rtos_msg_send(Ensimmainen_tehtava,count);
if(rtos_msg_poll ( )>0){
printf("Sanomat vastaanotettu toiselta tehtävältä: %i\n\r",rtos_msg_read ( ));
count++;
}
}
// pääohjelma
void main ( ) {
count=0;
rtos_run(); // käynnistetään RTOS
}

== HEX ohjelma ROM 2% RAM 3%

:020000040000FA
:1000000066EF01F0F76A140FF66E000EF722090092
:10001000F55012005669657374692074656874E45C
:1000200076E46C74E42023313A2025690A0D00003F
:10003000F76A400FF66E000EF7220900F550120025
:1000400053616E6F6D6174207661737461616F745A
:100050006574747520746F6973656C746120746560
:100060006874E476E46C74E43A2025690A0D0000B3
:10007000F76A800FF66E000EF7220900F5501200A5
:10008000070013003350016A325C03E232C000F013
:100090000CD0006A080E346E323600363350005CE5
:1000A000D8B0006E0136342EF7D7000C200E2DA8E4
:1000B000300E2E6E2CC000F02CAE07D0001E002A91
:1000C00000C02CF02D0E2E6E2D8E01502CC032F063
:1000D000640E336ED7DF00C02CF0300E01242F6E7B
:1000E0002CC032F00A0E336ECDDF300E0024316E9C
:1000F000300E0124306E2EC000F02DA602D02DAEA1
:100100002D942DB80BD02DAE22D02DB420D000C010
:100110002FF02DB21CD000C030F019D0300E2F5C63
:1001200016E100C02FF0200E2E6E2DA604D02D94C7
:100130002D822DAE2D92300E305C09E100C030F0E2
:10014000200E2F6E2DA6F7D72D922DAE2D902DA41B
:1001500004D02E509EA8FED7AD6E2DA204D02F50F5
:100160009EA8FED7AD6E2DA004D030509EA8FED71D
:10017000AD6E31509EA8FED7AD6E000C0F500E5CD8
:1001800003E30F500E5C04D0030ED8800F540E24EE
:10019000000A41E00F500E5CFDE0100E0F24E96EE6
:1001A000EA6AD8B0EA2AEFCF01F00F2A0F5003080D
:1001B00001E10F6A01C01FF0206A205023DF202ACE
:1001C000006E00509EA8FED7AD6E160E205CF5E1C5
:1001D0001FC02CF01F0E2D6E69DF0A0E9EA8FED7E1
:1001E000AD6E0D0E9EA8FED7AD6E1C0E1A24E96EE4
:1001F000EA6AD8B0EA2A1A28006E030801E1006A08
:100200001B50005C02E1000E05D000C01AF006C0D1
:10021000EFFF010E062A7C0E0C6E010E0D6EC7EF6D
:1002200001F0000C100E0E24E96EEA6AD8B0EA2A3A
:100230000E28006E030801E1006A0F50005C02E125
:10024000000E05D000C00EF006C0EFFF010E1B50DF
:100250001A5C03E31B501A5C04D0030ED8801B54B5
:100260001A24000A2CE01B501A5CFDE01C0E1B2413
:10027000E96EEA6AD8B0EA2AEFCF01F01B2A1B50D8
:10028000030801E11B6A01C02AF02B6A2B50D0DE63
:100290002B2A006E00509EA8FED7AD6E2A0E2B5C56
:1002A000F5E12AC02CF01F0E2D6E00DF0A0E9EA86D
:1002B000FED7AD6E0D0E9EA8FED7AD6E062A240E9B
:1002C000186E020E196EC7EF01F0000CF86AD09E8E
:1002D000EA6AE96A810EAF6EA60EAC6E900EAB6E46
:1002E000C180C182C184C196066A076A096A020E8A
:1002F000086E0B6A0A6A0E6A0F6A7C0E0C6E010E9B
:100300000D6E136A156A010E146E176A166A1A6A60
:100310001B6A240E186E020E196E056A850ED56EC4
:10032000670ED76E6A0ED66EF294850ED56E670E86
:10033000D76E6A0ED66EF294D8900534006E98DEB1
:10034000026E010E002494DEEA6E02C0E9FFEFCFD8
:1003500002F0E92AEFCF00F0ECCF01F0EC2AEFCF6A
:1003600003F002E1EC2AED52EC50015C11E1005087
:10037000035C0EE1ED52ED52EE6AEE6A02BE08D069
:10038000EC52ECCFFAFFED52EFCFE8FFF96E00012F
:10039000052A020E055CD0E1056AD650D7CF03F0DE
:0C03A000F2B4C5D7FAD7FF0E056E0300BB
:020000040030CA
:0E00000000270E0E000181000FC00FE00F4020
:00000001FF
;PIC18F452
'=============================== RTOS =====

Varatut resurssit

/*
File: sema2.c
Pekka Ritamäki
1.11.2008
RTOS esimerkki lipuista eli semaphoreista ja jaettujen resurssien suojauksesta
Hardware: PICKIT2 Express edition/testikortti/CPU PIC16F917
LEDejä ohjaava kytkinpala kiinni

Kääntäjä: CCS/PCWH v 4.057
Esittely
RTOS-esimerkki:
Miten resursseja käytetään yhdessä, mutta vain yksi tehtävä kerrallaan.
Kun tehtävä varaa resurssin, se pidättää itselleen oikeuden tähän resusrssiin
Tässä tapauksessa resurssina on LED, jota useampi tehtävä haluaa käyttää yhtäaikaa
Varaus ilmaistaan lipulla jota kulutetaan ja lisätään tarpeen mukaan.

Ensimmäinen tehtävä käyttää lediä nopeasti 20ms *5 , toinen hitaasti
5* 100m.
Kuitenkin joka vilkutuksen välissä vapautetaan ohjema
käyttöjärjestelmälle. Koska resurssi on varattu, muut eivät kuitenkaan
voi käyttää sitä.
Huomaa fuseja ei ole määrilty, mutta ohjelma toimii!
Default fuset:
Sisäinen 8MHz RC kello
Ei suojausta,
Power Up Timer päällä on
Ei watchdogia
MCRL nasta on käytössä
Suuntarekistereitä ei ole määritelty, ohjelma hoitaan ne.

*/

#include <16F917.h>
#use delay(clock=8000000)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
// varataa timer1 RTOS varten , Timer0 ei käy tässä tapauksessa
#use rtos(timer=1,minor_cycle=100ms)

// lippu eli semaphore tarkoittaa jaettua muistipaikka tai tässä laitetta
// sem-muuttujabyte on lippu
int8 sem, count;
// Määritellään LEDit PICKIT2 Express edition (PIC16F917) kortilla
#define RED PIN_D0
#define LED2 PIN_D1
#define LED3 PIN_D2
#define LED4 PIN_D3
// esitellään tehtävä1, sen toiminnan väliaika 100ms ja arvioitu toimintaaika 20ms ja yleismuuttujien varaus
#task(rate=500ms,max=20ms,queue=2)
void Ekatehtava ( );
// esitellään tehtävä2, sen toiminnan väliaika ja arvioitu toimintaaika ja yleismuuttujien varaus
#task(rate=500ms,max=50ms,queue=2)
void Toka_tehtava( );

void Ekatehtava ( ) {
int i;
// kun sem-lippu on >0, tämä tehtävä käynnistyy
// rtos_wait vähentää sem-lippua yhdellä, ja varaa LEDin omaan käyttöönsä
// koska lipun arvo on 0, eivät muut sem-lippua käyttävät tehtävät voi käynnistyä

rtos_wait(sem); // odotellaan kunnes > 0. Vähennä sitten sem-muuttujaa yhdellä
output_low(LED3); // LED3 pois
output_high(LED2); // LED2 päälle
for(i=0;i<5;i++){
output_low(RED); delay_ms(20); output_high(RED); // vilkutus
rtos_yield ( ); // vapauta tehtävän ajo, mutta älä anna käyttää LEDIä

}

// rtos_signal lisää sem-muuttujaa, jotta muut voivat käyttää tätä resurssia
//
rtos_signal(sem);

}

void Toka_tehtava( ) {
int i;
rtos_wait(sem); // odota kunnes sem-lippu nousee nollasta
output_low(LED2);
output_high(LED3); // merkite tehtävä käyttöön LED3:lla
for(i=0;i<5;i++){
output_high(RED); delay_ms(100); output_low(RED);// vilkuta hitaasti
rtos_yield ( ); // vapauta tehtävänajo, mutta älä anna käyttää LEDIä
}
// jos tehty 3 kertaa tämä tehtävä, anna siitä oma merkki, LED4
if(! count —) {
if(!input(LED4))
output_high(LED4); // 3 jakson jälkeen vaihda LED4 tila
else
output_low( LED4);
printf("\r Valmis"); // tulosta sarjaliikenteelle
count=3; // aloita lasku uudestaan

}

rtos_signal(sem); // lisää sem muuttujaa

}
// pääohjelma
void main ( ) {

sem=1; // vain yksi tehtävä saa käyttää Lediä kerrallaan
count=3; // kolmen tehtävä 2 laskenta
rtos_run(); // käynnistä RTOS
}

viitteet

[1] 8052-prosessorin sivuilta löytyy hyvä moniajoselvitys, josta selviää moniajon periaatteet hyvin.

[2] Samasta lähteestä löytyy pitkä keskustelu RTOS-aiheista. Välillä menee terminologiasaivartelun puolelle, mutta paljon hyviä näkemyksiä aiheesta.

oh3gdo vastaa:

Sillä näkyy olevan hirveä väittely mitä "Real time" tarkoittaa. Mitään asiaa valaisevaa omakohtaista näkemystä en huomannut, vain viittauksia eri sanakirjoihin. En tosin kaikkia jaksanut lukea.

Antakaa muutkin omia kokemuksianne ja näkemyksiänne asiasta. RTOS on ainankin mielenkiintoinen keskustelun aihe.

Yllä yritin jo kertoa oman näkemykseni. "Real time" tarkoittaa, että ohjelma ja laite ei saa kadottaa dataa vaikka se hoitaa montaa tehtävää näennäisesti yhtä aikaa. Tosiasiassa yhden prosessorin järjestelmät eivät voi tehdä kuin yhtä tehtävää kerrallaan. Jos aika ei riitä pitää ottaa apuun lisää prosessoreja kuten tuolla projektit 8*mux kohdassa yritän selittää
Kuva : Token2.jpg
"Operating system" mielestäni tarkoittaa tässä sitä, että ohjelma käyttää RTOS-tehtävään valmiita, etukäteen mietittyjä kutsuja ja menetelmiä, joilla monien tehtävien suorittaminen sopivasti lomittain on helpompaa kokemattomalle ohjelmoijalle. Saman järjestelmä avulla voidaan tarvittaessa tehdä laitteiden suojaus useaman ohjelman yhtäaikaiselta käytöltä. Esimerkisi, jos ohjelma #1 lukee keskeytyksellä uartilta dataa, ohjelma #2 ei voi lukea välistä yhtä byteä pois.

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License