Øving 5 Øving i Tornado og VxWorks Innledning Denne øvingen går ut på å programmere for et målsystem som benytter sanntidsoperativsystemet VxWorks. Til dette benyttes utviklingssystemet Tornado fra WindRiver. Utviklingen vil foregå på en vertsmaskin som kjører Windows NT. Som målsystem benyttes en CPU32-basert maskin. Hardware Som målsystem benyttes et CPU32 basert kort. Dette kortet er montert inne i en metallboks (Det skal ligge én slik boks på hver arbeidsplass.) Under utvikling kobles målsystemet opp mot datamaskinen der utviklingssystemet ligger. Spenningskilde 5V Serieport på arbeidsstasjon Target Litteratur Bøker som omhandler bruk av Tornado og programmering for VxWorks: WindRiver Systems: Tornado Users Guide WindRiver Systems: VxWorks Reference Manual WindRiver Systems: VxWorks Programmer s Guide Disse bøkene skal ligge på sanntidslabben, og bør brukes under øvingen. 1
Oppgaver Det er mulig å gå igjennom øvingen som om det er en kokebok. Dette er ikke meningen. Forsøk å bruke det dere lærer fra de første oppgavene på de senere oppgavene. Prøv gjerne ut flere funksjoner og verktøy enn de som gjennomgås i øvingen. Oppgave 1: Enkel bruk av Tornado Til dette øvingssettet er det lagt ved en tutorial til bruk av utviklingsverktøyet Tornado. Til denne tutorialen kreves ikke noe ekstra hardware. Utfør denne tutorialen! Oppgave 2: Kontakt med målmaskin (target) For å kunne kommunisere med målsystemet, må det settes opp en target server i Tornado. Denne serveren vil kommunisere med en target agent som kjører på målsystemet. HOST TARGET Tornado VxWorks Shell Debugger Browser Target Server Kommunikasjonslinje Target Agent Sett opp boksen med målsystem som vist i figuren under Hardware. Pass på at du benytter riktig spenning. Start opp configure target server fra menyen. (tools->target server->configure) Sett opp serveren slik at serielinjen blir benyttet til kommunikasjon. Pass på at baudraten er riktig (19200) og at riktig COM-port er brukt NB! Dersom dere ikke får til å bruke target i de neste oppgavene, kan dere bruke simulatoren (som i oppgave 1) Åpne et skall som jobber mot målsystemet (-> på knapperaden) Merk: dette skallet vil kjøre på vertsmaskinen! Dette betyr at skallkommandoer vil bli kjørt på vertsmaskinen, mens kjøring av målprogramvare vil foregå på målsystemet. Viktige kommandoer er: cd katalog : Forandre katalog på vertsmaskinen ld<modul.o: Laste ned modul.o til målsystemet sp oppgave Start en oppgave som ligger på målsystemet. i Vis systeminformasjon l oppgave Disassemblér oppgave. Andre kommandoer som kan brukes er oppgitt i kap. 6 i Tornado Users Guide 2
Oppgave 3: Enkel programmering for VxWorks, nedlasting til target Start et nytt prosjekt. Lag en Hallo verden! rutine (dvs. et program som skriver ut en hilsen) for målsystemet. Legg merke til at i printf() hører inn under fiolib. Last ned programmet og test det ut. Utvid programmet, slik at det leser inn ID en til oppgaven som kjører rutinen (se beskrivelse av tasklib og taskidself() for hvordan dette kan gjøres.) Legg denne informasjonen inn i hilsenen. Legg merke til at en oppgave kan kjøres ved å skrive inn funksjonskallet til oppgaven i skallet, for eksempel ->minoppgave( test,8) Det er også mulig å starte en oppgave ved hjelp av sp eller taskspawn: ->sp minoppgave, test,8 ->taskspawn oppgave,120,0,2000,minoppgave, test,8 Ved bruk av sp vil navn, prioritet og stakkstørrelse på den nye oppgaven gis standardverdier. For å kjøre en oppgave flere ganger kan du bruke period eller repeat: ->repeat 4,minOppgave, test,8 ->period 1,minOppgave, test,8 Legg merke til at den første verdien vil være antall ganger oppgaven skal kjøres i repeat, eller periodetid (i sekunder) i period. 3
Oppgave 4: Opprettelse og kontroll av flere oppgaver Programmer noen små rutiner som kjører evig (bruk f.eks en evig løkke med det utvidede hallo verden!! programmet, men legg inn en taskdelay() rutine, slik at andre kommer til.) Last dem ned til målsystemet. Start opp noen rutiner ved hjelp av sp eller taskspawn Bruk funksjonene i, tt og liknende for å se hvordan oppgavene kjører i systemet. Bruk funksjonene tasksuspend(), taskresume(), taskpriorityset() og taskdelay() på de forskjellige oppgavene, og se hvordan informasjonen forandrer seg. Sammenlign med figuren nedenfor.. semgive() / msgqsend() expired delay PENDED READY DELAYED semtake() / msgqrecieve() taskdelay() taskresume() tasksuspend() tasksuspend() taskresume() / taskactivate() taskresume() tasksuspend() SUSPENDED Forsøk også å lage et program som starter og kontrollerer flere oppgaver (se beskrivelsen funksjonene taskspawn(), sp(), repeat() og period() for hvordan nye oppgaver opprettes) 4
Oppgave 5: Gjensidig utelukkelse Lag følgende program: #include vxworks.h #include tasklib.h #include fiolib.h int var1=40; int var2=50; void testtask1() while(1) var1=var1^var2; var2=var1^var2; var1=var1^var2; void testtask2() int count; for(count=1;count<=100;count++) printf("var1= %d, var2= %d \n",var1,var2); taskdelay(10); Rutinen testtask1 bytter om verdiene på de to globale variablene var1 og var2(^ betyr xor). Rutinen testtask2 skriver ut verdien av de to globale variablene. Last ned og start oppgavene med -> taskspawn "task1",200,0,2000,testtask1 -> testtask2 Hva skrives ut? Hvorfor? Prøv nå å beskytte tilgangen på de globale variablene ved hjelp av en mutex, slik at bare én av rutinene kan forandre på de globale variablene av gangen, så utskrift av variablene ikke kan skje mellom xor-setningene i ombyttingsrutinen. Se beskrivelse av semlib, semmcreate(), semgive() og semtake() for hvordan dette kan gjøres. Kompiler opp de nye rutinene, last ned, initialiser mutexen og start rutinene som ovenfor. Hva skrives ut nå? 5
Oppgave 6: Meldinger Lag et program som oppretter en meldingskø og to oppgaver, en sender og en mottaker. La senderen oppdatere en variabel (lag for eksempel en teller), deretter sende den til meldingskøen og så sove (bruk taskdelay()) i noen sekunder. La så mottakeren lese ut variabelen fra køen, og skrive den til skjermen. Se beskrivelse av msgqlib, msgqcreate(), msgqsend() og msgqreceive() for hvordan en meldingskø lages. 6