Jak uruchomić symulator VxSim
| Skopiować na komputer lokalny plik kss-lab.zip |
W archiwum znajduje się kilka przykładów programów w języku
C dla platformy VxWorks oraz pliki tornado oraz tlaunch
Wszystkie te pliki należy przesłać w trybie tekstowym na
swoje konto na komputerze nova.ia.agh.edu.pl (np.: za pomocą
WindowsCommandera) |
| Ustawić zmienne systemowe dla Tornado |
wydać komendę
source tornado
W pliku tornado ustawiane są następujące zmienne:
setenv WIND_BASE /usr/local/wind
setenv WIND_REGISTRY nova
setenv WIND_HOST_TYPE sun4-solaris2
setenv LD_LIBRARY_PATH /usr/local/wind/host/sun4-solaris2/lib
setenv PATH /usr/local/wind/host/sun4-solaris2/bin:/usr/openwin/bin:$PATH
|
| Uruchomić tornado
Dokładny opis procedury uruchamiani jest dostępny w wind-docs/getStart_unix.pdf |
/usr/local/wind/host/sun4-solaris2/bin/launch&
To samo polecenie jest wpisane do pliku tlaunch. |
| Stworzyć nowy projekt Peeker |
- W oknie Tornado-Launcher wybrać opcję Project
- Wybrać opcję Create downloadable application
- Zrealizować wszystkie kroki Wizarda
- Dodać plik peeker.c do projektu (Opcja Add Files)
|
| Zbudować plik wyjściowy (Peeker.out) |
Z menu kontekstowego opcja Build |
| Uruchomić symulator VxWorks |
- W oknie Tornado-Launcher wybrać opcję VxSim, następnie Confirm i
Launch w kolejnych oknach dialogowych
- Uruchomiany zostanie target server -- proces odpowiedzialny
za komunikację pomiędzy narzedziami Tornado i wykonywaną aplikacją
|
| Załadować skompilowany plik Peeker.out do symulatora |
Ustawic target na vxsim0@nova
i wybrac opcję Download z menu kontektowego w oknie projektu. Plik
Peeker.out zostanie dynamicznie skonsolidowany z symulatorem VxSim
|
| Uruchomic shell VxSim |
Wybrac przycisk WindSh w oknie Launcher.
Shell programu VxSim jet interpreterem języka C. Posługując
się nim można wywołac dowolna biblioteczną funkcję języka C, np.:
printf, lub własną funkcję zaimplementowaną w uprzednio załadowanym
module.
|
| Uruchomić funkcję inicjalizująca |
Funkcja inicjalizująca w module peeker.c nazywa się init.
Uruchamia ona zadanie peeker -- odczytujące wartości dwóch zmiennych.
int x=0;
int y=0;
void peeker()
{
for(;;)
{
printf("x=%d,y=%d\n",x,y);
taskDelay(200);
}
}
STATUS init()
{
int t_peeker;
t_peeker=taskSpawn("peeker",120,0,10000,(FUNCPTR)peeker,0,0,0,0,0,0,0,0,0,0);
return(OK);
}
Zadanie peeker rozpocznie działanie wypisując okresowo wartości
zmiennych x i y.
|
| Zmienić wartości zmiennych
|
W module zdefiniowano dodatkowo dwie funkcje
void pokeX(int _x)
{
x = _x;
}
void pokeY(int _y)
{
y = _y;
}
Wywołując je z shella możemy ustawić nowe wartości
zmiennych x i y
|
| W podobny sposób uruchomić inne programy... |
|
Peeker2.c
Program jest modyfikacją poprzedniego. Dodane zostało drugie zadanie poker,
które wpisuje kolejne wartości do zmiennych x i y
/*
------------------ includes ----------------- */
#include "vxWorks.h"
/*#include "msgQLib.h"*/
#include "taskLib.h"
#include <stdio.h>
/* ------------------ defines ------------------ */
/* ------------------ globals ------------------ */
/**
unprotected variables !
*/
int x=0;
int y=0;
/* ----------- forward declarations ------------ */
STATUS init();
void peeker();
void poker();
void pokeX(int _x);
void pokeY(int _y);
/* ************************************************************************ */
void peeker()
{
/* Local variables */
for(;;)
{
printf("x=%d,y=%d\n",x,y);
taskDelay(200);
}
}
/* ************************************************************************ */
void poker()
{
/* Local variables */
int i;
for(i=0;;i++,i%=200)
{
pokeX(i);
taskDelay(150);
pokeY(i);
taskDelay(150);
}
}
/* ------------------------------------------------------------------------ */
STATUS init()
{
int t_peeker;
int t_poker;
t_peeker=taskSpawn("peeker",120,0,10000,(FUNCPTR)peeker,0,0,0,0,0,0,0,0,0,0);
if (t_peeker==ERROR)
return(ERROR);
t_poker=taskSpawn("poker",120,0,10000,(FUNCPTR)poker,0,0,0,0,0,0,0,0,0,0);
if (t_poker==ERROR)
return(ERROR);
return(OK);
}
/* ------------------------------------------------------------------------ */
void pokeX(int _x)
{
x = _x;
}
void pokeY(int _y)
{
y = _y;
}
rw.c i rw2.c
Program pokazuje problem czytelników i pisarzy (w rw.c tylko jeden pisarz).
Funkcja writer jest uruchamiana jako zadanie "writer"
Funkcja reader jest uruchamiana pieciokrotnie jako kolejni czytelnicy.
/* ------------------ includes ----------------- */
#include "vxWorks.h"
/*#include "msgQLib.h"*/
#include "taskLib.h"
#include <stdio.h>
/* ------------------ defines ------------------ */
/* ------------------ globals ------------------ */
/**
unprotected variables !
*/
int x=0;
int y=0;
/* ----------- forward declarations ------------ */
STATUS init();
void reader(int num);
void writer();
void writeX(int _x);
void writeY(int _y);
/* ************************************************************************ */
void reader(int num)
{
/* Local variables */
for(;;)
{
printf("Reader#%d: x=%d,y=%d\n",num,x,y);
taskDelay(200);
}
}
/* ************************************************************************ */
void writer()
{
/* Local variables */
int i;
for(i=0;;i++,i%=200)
{
writeX(i);
printf("Writer.writeX(%d)\n",i);
taskDelay(75);
writeY(i);
printf("Writer.writeY(%d)\n",i);
taskDelay(75);
}
}
/* ------------------------------------------------------------------------ */
STATUS init()
{
int t_reader;
int t_writer;
int i;
t_writer=taskSpawn("writer",120,0,10000,(FUNCPTR)writer,0,0,0,0,0,0,0,0,0,0);
if (t_writer==ERROR)
return(ERROR);
for(i=0;i<5;i++){
t_reader=taskSpawn("reader",120,0,10000,(FUNCPTR)reader,i,0,0,0,0,0,0,0,0,0);
if (t_reader==ERROR)
return(ERROR);
}
return(OK);
}
/* ------------------------------------------------------------------------ */
void writeX(int _x)
{
x = _x;
}
void writeY(int _y)
{
y = _y;
}
r-s.c
W programie dwa zadania receiver i sender komunikują się
za pośrednictwem kolejki komunikatów.
/************************************************
LA4 to VxWorks translator - version 1.21 -
r-s.c
************************************************/
/* ------------------ includes ----------------- */
#include "vxWorks.h"
#include "msgQLib.h"
#include "taskLib.h"
#include <stdio.h>
/* ------------------ defines ------------------ */
#define reciver_OPT 0
#define reciver_STK 10000
#define sender_OPT 0
#define sender_STK 10000
/* ------------------ globals ------------------ */
/* #error Code Not Completed: lack of members of message structure */
typedef struct tagMSG_TYPE_receiver_mbx
{
/*char dummy;*/
long msg_no;
/* message structure declaration for mailbox receiver_mbx */
} MSG_TYPE_receiver_mbx;
MSG_Q_ID m_receiver_mbx;
int t_reciver;
int t_sender;
/* ----------- forward declarations ------------ */
void reciver();
STATUS receiver_init();
STATUS init();
void sender();
/* ************************************************************************ */
void reciver()
{
/* Local variables */
MSG_TYPE_receiver_mbx msgFrom_receiver_mbx_Mbx;
for(;;)
{
/* inserted */
printf("receiver: executes WAIT_ON_MBX msgQReceive()\n");
/* inserted */
if (msgQReceive(m_receiver_mbx, (char*)&msgFrom_receiver_mbx_Mbx,sizeof(msgFrom_receiver_mbx_Mbx),
WAIT_FOREVER)==ERROR)
taskSuspend(0);
/* inserted */
printf("receiver: message #%d was received\n",msgFrom_receiver_mbx_Mbx.msg_no);
/* inserted */
}
}
/* ------------------------------------------------------------------------ */
STATUS receiver_init()
{
m_receiver_mbx=msgQCreate(50, sizeof(MSG_TYPE_receiver_mbx), MSG_Q_FIFO);
if (m_receiver_mbx==NULL)
return(ERROR);
t_reciver=taskSpawn("reciver",100,reciver_OPT,reciver_STK,(FUNCPTR)reciver,0,0,0,0,0,0,0,0,0,0);
if (t_reciver==ERROR)
return(ERROR);
return(OK);
}
/* ------------------------------------------------------------------------ */
STATUS init()
{
receiver_init();
t_sender=taskSpawn("sender",120,sender_OPT,sender_STK,(FUNCPTR)sender,0,0,0,0,0,0,0,0,0,0);
if (t_sender==ERROR)
return(ERROR);
return(OK);
}
/* ------------------------------------------------------------------------ */
void sender()
{
/* Local variables */
MSG_TYPE_receiver_mbx msg;
msg.msg_no = 0;
for(;;)
{
msg.msg_no++;
printf("sender: willing to send message
#%ld\n",msg.msg_no);
if (msgQSend(m_receiver_mbx,(char*)&msg,sizeof(msg),WAIT_FOREVER,MSG_PRI_NORMAL)==ERROR)
taskSuspend(0);
/* inserted */
printf("sender: message #%ld was
sent\n",msg.msg_no);
taskDelay(200);
/* inserted */
}
}
/* ------------------------------------------------------------------------ */