Sanntidsprogrammering. Øving i Tornado og VxWorks.
Ole-Egil Hvitmyren
Reidar Brekken
Vi vil gjerne ha tilbakemelding på om dette er en grei og oversiktlig nok måte å
levere besvarelse på en labøving på (tror ikke jeg hadde greid å bruke ordet på
flere ganger i den setningen).
Oppgave 1: Enkel bruk av Tornado.
Gikk gjennom tutorial. Ting virket mer eller mindre som forventet, bortsett
fra det med upload til graf. Den så ut for å henge til uendelig tid med 100%
complete. Den ga aldri beskjed om å være ferdig.
Oppgave 2: Kontakt med målmaskin.
Fikk ikke kontakt med målmaskinen. Bruker simulator i stedet for target.
Opprettet et skall mot denne. Testet en kommando.
-> i
NAME ENTRY TID PRI STATUS PC SP ERRNO DELAY
---------- ------------ -------- --- ---------- -------- -------- ------- -----
tExcTask _excTask 4b49170 0 PEND 4276be 4b4908c d0003 0
tLogTask _logTask 4b44758 0 PEND 4276be 4b44670 d0003 0
tWdbTask 0x417cc4 4b40c08 3 READY 4276be 4b40ae4 d0003 0
value = 0 = 0x0
->
Oppgave 3: Enkel programmering for VxWorks, nedlasting til target.
Til programmet brukte vi en del deklarasjoner fra cobble.c, slettet alle
rutinene, og skrev inn:
void main(void) {
printf("Hello world\n");
}
startet programmet med:
-> main()
Hello world
value = 12 = 0xc
->
Dette programmet modifiserte vi til å skrive ut taskId slik:
void main(void) {
program = taskIdSelf();
printf("Hello world. I am 0x%x\n", program);
}
som ga oss:
-> main()
Hello world. I am 0x4b2e410
value = 1 = 0x1
->
Oppgave 4: Opprettelse og kontroll av flere oppgaver.
kildekode:
void lokke1() {
while(true) {
printf("Hello, World. I am: 0x%x\n",taskIdSelf());
taskDelay(70);
}
}
void lokke2() {
while(true) {
printf("Hello, World. I am 0x%x\n",taskIdSelf());
taskDelay(70);
}
}
resultat:
-> i
NAME ENTRY TID PRI STATUS PC SP ERRNO DELAY
---------- ------------ -------- --- ---------- -------- -------- ------- -----
tExcTask _excTask 4b49170 0 PEND 4276be 4b4908c 3d0001 0
tLogTask _logTask 4b44758 0 PEND 4276be 4b44670 d0003 0
tWdbTask 0x417cc4 4b40c08 3 READY 4276be 4b40ae4 3d0001 0
s1u3 lokke1(void) 4b3c960 100 DELAY 4276be 4b3c8c8 3d0001 6
s1u4 lokke2(void) 4b35898 100 DELAY 4276be 4b35800 3d0001 13
value = 0 = 0x0
-> taskSuspend(s1u3)
value = 0 = 0x0
-> i
NAME ENTRY TID PRI STATUS PC SP ERRNO DELAY
---------- ------------ -------- --- ---------- -------- -------- ------- -----
tExcTask _excTask 4b49170 0 PEND 4276be 4b4908c 3d0001 0
tLogTask _logTask 4b44758 0 PEND 4276be 4b44670 d0003 0
tWdbTask 0x417cc4 4b40c08 3 READY 4276be 4b40ae4 3d0001 0
s1u3 lokke1(void) 4b3c960 100 DELAY+S 4276be 4b3c8c8 3d0001 2
s1u4 lokke2(void) 4b35898 100 DELAY 4276be 4b35800 3d0001 9
value = 0 = 0x0
-> i
NAME ENTRY TID PRI STATUS PC SP ERRNO DELAY
---------- ------------ -------- --- ---------- -------- -------- ------- -----
tExcTask _excTask 4b49170 0 PEND 4276be 4b4908c 3d0001 0
tLogTask _logTask 4b44758 0 PEND 4276be 4b44670 d0003 0
tWdbTask 0x417cc4 4b40c08 3 READY 4276be 4b40ae4 3d0001 0
s1u3 lokke1(void) 4b3c960 100 SUSPEND 4276be 4b3c8c8 3d0001 0
s1u4 lokke2(void) 4b35898 100 DELAY 4276be 4b35800 3d0001 5
value = 0 = 0x0
-> taskResume(s1u3)
value = 0 = 0x0
-> i
NAME ENTRY TID PRI STATUS PC SP ERRNO DELAY
---------- ------------ -------- --- ---------- -------- -------- ------- -----
tExcTask _excTask 4b49170 0 PEND 4276be 4b4908c 3d0001 0
tLogTask _logTask 4b44758 0 PEND 4276be 4b44670 d0003 0
tWdbTask 0x417cc4 4b40c08 3 READY 4276be 4b40ae4 3d0001 0
s1u3 lokke1(void) 4b3c960 100 DELAY 4276be 4b3c8c8 3d0001 8
s1u4 lokke2(void) 4b35898 100 DELAY 4276be 4b35800 3d0001 31
value = 0 = 0x0
-> i
Ser at figuren ikke helt stemmer. Det mangler en boks, nemlig delayed suspended.
Når du suspender en delayed prosess går den inn i delayed suspended, og går først
over til å bli suspended etter at delay er gått ut.
Oppgave 5: Gjensidig utelukkelse.
Ser når vi kjører det at iblant skrives ut helt feil verdier. Dette fordi det umulig
å vite om programmet skriver ut var1 og var2 eller var1^var2 og var2 eller var1^var2
og var1. For å rette på dette legger vi til litt kode slik:
SEM_ID semafor = semMCreate(SEM_Q_FIFO);
void testTask1()
{
while(1)
{
semTake(semafor,WAIT_FOREVER);
var1 = var1^var2;
var2 = var1^var2;
var1 = var1^var2;
semGive(semafor);
}
}
void testTask2()
{
int count;
for(count=1;count<=100;count++)
{
semTake(semafor,WAIT_FOREVER);
printf("var1= %d, var2 = %d \n", var1, var2);
taskDelay(10);
semGive(semafor);
}
}
Oppgave 6: Meldinger.
#include
#include
#include
#include
#include
#define BUFFER_SIZE 24
MSG_Q_ID msgq;
void sender (void)
{
int teller;
msgq = msgQCreate (4, BUFFER_SIZE, MSG_Q_FIFO);
for (teller = 1; 1; teller++) {
char message[BUFFER_SIZE];
sprintf (message, "melding %d", teller);
printf ("Sender %s\n", message);
msgQSend (msgq, message, strlen (message) + 1, WAIT_FOREVER,
MSG_PRI_NORMAL);
taskDelay (20);
}
}
void mottaker (void)
{
while (1) {
char melding[BUFFER_SIZE];
msgQReceive (msgq, message, BUFFER_SIZE, WAIT_FOREVER);
printf ("Tok imot %s\n", message);
}
}
(
Og tilslutt, slik ser det ut når man downloader ny kode til simulatoren uten å stoppe
programmene som kjører (vi downloadet oppgave5 mens oppgave4 fortsatt kjørte):
Exception number 0: Task: 0x4b35898 (s1u4)
General Protection Fault
Program Counter: 0x0496eee4
Status Register: 0x00010297
Exception number 0: Task: 0x4b3c960 (s1u3)
General Protection Fault
Program Counter: 0x0496ee9a
Status Register: 0x00010206
42759b _vxTaskEntry +47 : _testTask2__Fv (0, 0, 0, 0, 0, 0, 0, 0, 0, 0)