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)