Documente Academic
Documente Profesional
Documente Cultură
Introduccin a
VxWorks 6.6
Introduccin
VxWoks es un sistema operativo multitarea en tiempo real (RTOS) orientado a sistemas empotrados. Un RTOS
de altas prestaciones que proporciona multitud de servicios (multitarea, gestin memoria, sistemas de ficheros,
red, ) y que est disponible para mltiples arquitecturas de procesadores y computadores industriales.
Es un sistema operativo escalable, muy fiable y ampliamente utilizado en sectores muy especializados como
defense, industria aeroespacial, sistemas mdicos de precisin, comunicaciones, etc.
Despus de 25 aos en el mercado, VxWorks es un sistema maduro, muy robusto y profundamente depurado.
Arquitectura de VxWorks
Jmra 2008
Jmra 2008
Jmra 2008
Jmra 2008
Jmra 2008
Jmra 2008
VxSim arranca:
Jmra 2008
Jmra 2008
Workbench pregunta por el target concreto y el punto de entrada al mdulo (module entry point):
Jmra 2008
10
Run:
Jmra 2008
11
Jmra 2008
12
En el ejemplo anterior se ha llamado a las funciones sysClkRateGet y tickGet, dos funciones fundamentales que
nos informan del tick del sistema y del valor actual del contador de ticks. sysClkRateGet devuelve 60, es decir, el
tick del sistema es de 1/60 segundos.
En muchos kernel de tiempo real es comn utilizar un tick de 10 ms. Para modificar el tick existe la funcin
sysClkRateSet. Por su parte, para modificar el contador de ticks, existe la funcin tickSet.
Estas funciones se pueden llamar desde un programa:
Jmra 2008
13
VxWorks proporciona la librera timexLib para medida de tiempos de ejecucin. El ejemplo anterior podra
haber utilizado la funcin timex() de timexLib:
Jmra 2008
14
Veamos un ejemplo sencillo (en este ejemplo, adems, se demuestra como interactuar desde la shell):
Jmra 2008
15
Jmra 2008
16
17
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
"vxWorks.h"
/* Siempre este .h primero
"stdio.h"
"sysLib.h" /* sysClkRateSet, sysClkRateGet */
"tickLib.h"
/* tickSet, tickGet
"timexLib.h"
"taskLib.h"
"xbdBlkDev.h"
"virtualDiskLib.h"
"fsMonitor.h"
"dosFsLib.h"
#define NUM_ELEM_ARRAY
#define
#define
#define
#define
#define
*/
PRIOR_SIM_SENS
15
/* prioridad de tarea
PRIOR_SENSORS
20
/* prioridad de tarea
PRIOR_PRESRES
25
/* prioridad de tarea
BYTES_STACK 1000 /* tamao de stack
en bytes
PRIMER_PARAMETRO 10
/* ejemplo de paso de
int idSensor,idPresRes,idSimSens;
int
int
int
int
int
*/
(0=max)
*/
(0=max)
*/
(0=max)
*/
*/
parametro*/
*/
Temperat[NUM_ELEM_ARRAY];
/* almacena las adquisiciones mas recientes */
Humedad[NUM_ELEM_ARRAY];
VelViento[NUM_ELEM_ARRAY];
DirViento[NUM_ELEM_ARRAY];
TemMedia,HumMedia,VelMedia,DirMedia;
unsigned
unsigned
unsigned
unsigned
char
char
char
char
ADC_Temperatura;
ADC_Humedad;
ADC_Velocidad;
ADC_Direccion;
/********************************************************************************/
/* Task para simular la adquisicion de datos de los diferentes sensores
*/
/********************************************************************************/
int SimulaSensores()
{
while(1){
ADC_Temperatura = rand() % 255; /* simula lectura sensor */
ADC_Humedad = rand() % 255; /* simula lectura sensor */
ADC_Velocidad = rand() % 255; /* simula lectura sensor */
ADC_Direccion = rand() % 255; /* simula lectura sensor */
taskDelay(5);
/* simular adquisicion datos cada 50 ms
}
}
*/
/********************************************************************************/
/* Task para acondicionamiento y calculo de magnitudes fisicas
*/
/********************************************************************************/
Jmra 2008
18
int Sensores()
{
int k,numMedida=0;
while(1){
Temperat[numMedida]
Humedad[numMedida]
VelViento[numMedida]
DirViento[numMedida]
=
=
=
=
(int)ADC_Temperatura;
(int)ADC_Humedad;
(int)ADC_Velocidad;
(int)ADC_Direccion;
numMedida++;
if(numMedida==NUM_ELEM_ARRAY)
numMedida = 0;
TemMedia=0;
/* calcular media de las adquisiciones */
HumMedia=0;
VelMedia=0;
DirMedia=0;
for(k=0;k<NUM_ELEM_ARRAY;k++){
TemMedia += (int)Temperat[k];
HumMedia += (int)Humedad[k];
VelMedia += (int)VelViento[k];
DirMedia += (int)DirViento[k];
}
TemMedia /=NUM_ELEM_ARRAY*10;
HumMedia /=NUM_ELEM_ARRAY*10;
VelMedia /=NUM_ELEM_ARRAY*10;
DirMedia /=NUM_ELEM_ARRAY*10;
taskResume(idPresRes);
taskDelay(200);
/* reanuda presentacion
/* medias cada 2 s
*/
*/
}
}
/********************************************************************************/
/* Task para presentacion de datos meteorologicos
*/
/********************************************************************************/
int PresentaResultado()
{
while(1){
printf(" +++++
Estacion meteorologica VxWorks
+++++\n");
printf(" =================================================\n");
printf(" Temperatura Humedad
Veloc.Viento
Dir.Viento\n");
printf("
%3d
%3d
%3d
%3d\n",
TemMedia,HumMedia,VelMedia,DirMedia);
printf("\n\n");
taskSuspend(0);
}
}
/********************************************************************************/
/* Funcion de entrada al modulo VxWorks
*/
/********************************************************************************/
void mymain(void)
{
int k;
BLK_DEV * vdBlkDev;
device_t xbd;
STATUS status;
FILE * fd;
sysClkRateSet(100);
Jmra 2008
19
idSimSens = taskSpawn("simSens",PRIOR_SIM_SENS,0,BYTES_STACK,SimulaSensores,\
0,0,0,0,0,0,0,0,0,0);
idSensor = taskSpawn("Sensors",PRIOR_SENSORS,0,BYTES_STACK,Sensores,\
0,0,0,0,0,0,0,0,0,0);
idPresRes =taskSpawn("PresRes",PRIOR_PRESRES,0,BYTES_STACK,PresentaResultado,\
0,0,0,0,0,0,0,0,0,0);
/* si no hay nada, implicitamente se llama a taskExit()
*/
Ejercicio:
Modificar el ejemplo de estacin meteorolgica usando un buffer circular para el paso de datos desde la tarea
simulaSensores a la tarea sensores y una cola de mensajes para envo de resultados a la tarea de presentacin.
Jmra 2008
20
Adems de las tareas de la apliacin en ejecucin, se pueden ver las interrupciones del sistema. En el manual de
Vxsim se puede ver:
Table 3-4 :Interrupt Assignments (Windows Simulators)
Interrupt Vectors
Description
0x0000
0x0001
0x0002
21
Un ejemplo trivial es el que se muestra a continuacin (observar que ahora el tipo de proyecto es VxWorks 6.6
Image Project y no un Downloadable module). Simplemente se ejecuta un printf desde la rutina usrAppInit:
Una vez recompilada (rebuild) la imagen de VxWorks hay que indicarle a Vxsim la nueva imagen ejecutar.
En este ejemplo el workspace es el directorio \Jmra\VxWorks6.6 y el nombre del proyecto mii, as que la imagen
generada estar en \Jmra\VxWorks6.6\mii\default\vxWorks
El comando completo es:
Jmra 2008
22
Ms opciones de arranque de VxSim pueden consultarse en el apartado 2.4.1 del manual de vxsim.
usrAppInit.c
#include <vxWorks.h>
#if defined(PRJ_BUILD)
#include "prjParams.h"
#endif /* defined PRJ_BUILD */
#include <stdio.h>
#include
#include
#include
#include
#include
#include
<stdlib.h> /* srand()
<sysLib.h> /* sysClkRateSet, sysClkRateGet
<tickLib.h>
/* tickSet, tickGet
<timexLib.h>
<taskLib.h>
<semLib.h>
#define NUM_ELEM_ARRAY
#define
#define
#define
#define
#define
*/
PRIOR_SIM_SENS
15
/* prioridad de tarea
PRIOR_SENSORS
20
/* prioridad de tarea
PRIOR_PRESRES
25
/* prioridad de tarea
BYTES_STACK 1000
/* tamao de stack en bytes
PRIMER_PARAMETRO 10
/* ejemplo de paso de
int
idTskSensor,idTskPresRes,idTskSimSens;
SEM_ID idSemADCs;
int
int
int
int
int
*/
*/
(0=max)
(0=max)
(0=max)
*/
parametro
*/
*/
*/
*/
*/
23
unsigned
unsigned
unsigned
unsigned
char
char
char
char
ADC_Temperatura;
ADC_Humedad;
ADC_Velocidad;
ADC_Direccion;
/********************************************************************************/
/* Task para simular la adquisicion de datos de los diferentes sensores
*/
/********************************************************************************/
int SimulaSensores()
{
while(1){
semTake(idSemADCs,WAIT_FOREVER);
ADC_Temperatura = rand() % 255; /* simula lectura sensor */
ADC_Humedad = rand() % 255; /* simula lectura sensor */
ADC_Velocidad = rand() % 255; /* simula lectura sensor */
ADC_Direccion = rand() % 255; /* simula lectura sensor */
semGive(idSemADCs);
taskDelay(5);
*/
}
}
/********************************************************************************/
/* Task para acondicionamiento y calculo de magnitudes fisicas
*/
/********************************************************************************/
int Sensores()
{
int k,numMedida=0;
while(1){
semTake(idSemADCs,WAIT_FOREVER);
Temperat[numMedida] = (int)ADC_Temperatura;
Humedad[numMedida]
= (int)ADC_Humedad;
VelViento[numMedida] = (int)ADC_Velocidad;
DirViento[numMedida] = (int)ADC_Direccion;
semGive(idSemADCs);
numMedida++;
if(numMedida==NUM_ELEM_ARRAY)
numMedida = 0;
TemMedia=0;
/* calcular media de las adquisiciones */
HumMedia=0;
VelMedia=0;
DirMedia=0;
for(k=0;k<NUM_ELEM_ARRAY;k++){
TemMedia += (int)Temperat[k];
HumMedia += (int)Humedad[k];
VelMedia += (int)VelViento[k];
DirMedia += (int)DirViento[k];
}
TemMedia /=NUM_ELEM_ARRAY*10;
HumMedia /=NUM_ELEM_ARRAY*10;
VelMedia /=NUM_ELEM_ARRAY*10;
DirMedia /=NUM_ELEM_ARRAY*10;
taskResume(idTskPresRes); /* reanuda presentacion
taskDelay(200);
/* medias cada 2 s
*/
*/
}
}
/********************************************************************************/
/* Task para presentacion de datos meteorologicos
*/
/********************************************************************************/
Jmra 2008
24
int PresentaResultado()
{
while(1){
printf(" +++++
Estacion meteorologica VxWorks
+++++\n");
printf(" =================================================\n");
printf(" Temperatura Humedad
Veloc.Viento
Dir.Viento\n");
printf("
%3d
%3d
%3d
%3d\n",
TemMedia,HumMedia,VelMedia,DirMedia);
printf("\n\n");
taskSuspend(0);
}
}
/********************************************************************************/
/* Funcion de entrada al modulo VxWorks
*/
/********************************************************************************/
/******************************************************************************
*
* usrAppInit - initialize the users application
*/
void usrAppInit (void)
{
#ifdef USER_APPL_INIT
USER_APPL_INIT;
#endif
sysClkRateSet(100);
idSemADCs
= semMCreate(SEM_Q_PRIORITY);
idTskSimSens = taskSpawn("tskSimSens",PRIOR_SIM_SENS,0,BYTES_STACK,SimulaSensores,\
0,0,0,0,0,0,0,0,0,0);
idTskSensor = taskSpawn("tskSensors",PRIOR_SENSORS,0,BYTES_STACK,Sensores,\
0,0,0,0,0,0,0,0,0,0);
idTskPresRes = taskSpawn("tskPresrlt",PRIOR_PRESRES,0,BYTES_STACK,PresentaResultado,\
0,0,0,0,0,0,0,0,0,0);
taskSuspend(0);
/* si no hay nada, implicitamente se llama a taskExit()
*/
RESULTADO:
Jmra 2008
25
Una nueva imagen de VxWorks puede ser arrancada directamente desde el entorno Workbench. Para ello solo
hay que cambiar las propiedades del target simulado:
Jmra 2008
26
Jmra 2008
27
"vxWorks.h"
/* Siempre este .h primero
"stdio.h"
"sysLib.h"
/* sysClkRateSet, sysClkRateGet */
"tickLib.h"
/* tickSet, tickGet
"timexLib.h"
"taskLib.h"
"xbdBlkDev.h"
"virtualDiskLib.h"
"fsMonitor.h"
"dosFsLib.h"
*/
*/
/********************************************************************************/
/* Dos posibles funciones de entrada (entry points): jmdisk y jmfile
*/
/********************************************************************************/
void jmfile()
{
FILE * fd;
fd = fopen("/Q/Hola.txt", "w+");
fwrite ("Hola desde VxWorks\n\n",sizeof("Hola desde VxWorks\n\n"), 1, fd);
fclose (fd);
}
void jmdisk()
{
BLK_DEV * vdBlkDev;
device_t xbd;
STATUS status;
Jmra 2008
28
sysClkRateSet(100);
virtualDiskInit ();
vdBlkDev = virtualDiskCreate ("C:/JmDisk", 512, 32, 32*200);
fsmNameInstall("/Q:0", "/Q");
xbd = xbdBlkDevCreateSync(vdBlkDev, "/Q");
status = dosFsVolFormat("/Q", DOS_OPT_QUIET | DOS_OPT_BLANK, NULL);
}
Compilar (rebuild) ambos proyectos, arrancar la imagen de VxWorks que se acaba de generar, descargar el
mdulo cargable y ejecutarlo (primero con la entrada jmdisk para crear el disco y luego jmfile para crear el
fichero):
Checking License ...OK
Virtual Base Address: 0x10000000
Virtual Top Address: 0x50000000
Virtual Size: 0x40000000 (1024Mb)
Physical Base Address: 0x10000000
Physical Top Address: 0x12000000
Physical Size: 0x02000000 (32Mb)
Loading...
0x171b1c + 0x1cb48 + (0x17574)
Loading symbol table from host:C:/Jmra/VxWorks6.6/Exmp10/default/vxWorks.sym ...done
]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
]]]]]]]]]]] ]]]]
]]]]]]]]]]
]]
]]]]
(R)
]
]]]]]]]]] ]]]]]]
]]]]]]]]
]]
]]]]
]]
]]]]]]] ]]]]]]]]
]]]]]] ]
]]
]]]]
]]]
]]]]] ]
]]] ]
]]]] ]]]
]]]]]]]]] ]]]] ]] ]]]] ]]
]]]]]
]]]]
]]] ]]
] ]]]
]] ]]]]] ]]]]]]
]] ]]]]]]] ]]]] ]]
]]]]
]]]]]
] ]]]]
]]]]]
]]]]]]]] ]]]]
]] ]]]]
]]]]]]]
]]]]
]]]]]]
]]]]]
]]]]]]
] ]]]]] ]]]]
]] ]]]]
]]]]]]]]
]]]]
]]]]]]]
]]]]] ]
]]]]]] ]
]]]
]]]]
]] ]]]]
]]]] ]]]]
]]]]
]]]]]]]] ]]]]] ]]]
]]]]]]]
]
]]]]]]] ]]]]
]]]] ]]]] ]]]]]
]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
Development System
]]]]]]]]]]]]]]]]]]]]]]]]]]]]
]]]]]]]]]]]]]]]]]]]]]]]]]]]
VxWorks 6.6
]]]]]]]]]]]]]]]]]]]]]]]]]]
KERNEL: WIND version 2.11
]]]]]]]]]]]]]]]]]]]]]]]]]
Copyright Wind River Systems, Inc., 1984-2007
CPU: Windows 5.1 Service Pack 2. Processor #3.
Memory Size: 0x1f00000. BSP version 2.0/3.
Created: Apr 23 2008, 19:55:08
ED&R Policy Mode: Deployed
WDB Comm Type: WDB_COMM_PIPE
WDB: Ready.
-> Formatting /Q for DOSFS
Instantiating /Q as rawFs, device = 0x10001
Formatting...OK.
-> cmd
[vxWorks *]# set config
RTP_CREATE_STOP=off,RTP_CREATE_ATTACH=on,VXE_PATH=.;/romfs,RTP_CREATE_IO=off,LINE_EDIT_MODE=vi,LINE_LEN
GTH=256,STRING_FREE=manual,INTERPRETER=Cmd,EXC_PRINT=on,BP_PRINT=on,CPLUS_SYM_MATCH=off
[vxWorks *]# set config LINE_EDIT_MODE=emacs
[vxWorks *]# cd "/Q"
[vxWorks *]# ls
[vxWorks *]# i > dump.txt
[vxWorks *]# ls
dump.txt
[vxWorks *]# cat dump.txt
NAME
---------tJobTask
tExcTask
tLogTask
tNbioLog
tShell0
tWdbTask
tErfTask
tAioIoTask>
ENTRY
-----------1006b980
1006ac00
logTask
1006c630
shellTask
wdbTask
1002ff30
aioIoTask
TID
PRI
STATUS
PC
SP
ERRNO DELAY
-------- --- ---------- -------- -------- ------- ----103c7260
0 PEND
10101f50 105cffa8
0
0
101ab128
0 PEND
10101f50 101b4364
0
0
103cb1d8
0 PEND
100ffebd 1060ff24
0
0
103cf710
0 PEND
10101f50 1064ff54
0
0
10509a50
1 READY
10109210 1090ee24
0
0
10486000
3 PEND
10101f50 108bff4c
0
0
103ef498 10 PEND
10102602 1074ff98
0
0
103ea8d0 50 PEND
10102602 106cff8c
0
0
Jmra 2008
29
103edd00 50
104082d0 50
1040fb08 50
1046e388 50
1040c838 50
103e73b0 51
1040c1a8 100
PEND
PEND
PEND
PEND
READY
PEND
SUSPEND
10102602
10101f50
10102602
10101f50
10101cde
10101f50
101067aa
1070ff8c
1078ff74
1080fea0
1087ff90
109aff3c
1068ff18
1096ff74
0
0
0
6
3d0004
0
c40006
0
0
0
0
0
0
0
1 FAT12
2 FAT12
ROOT
DATA
En la consola de VxWorks:
Formatting /Q for DOSFS
Instantiating /Q as rawFs, device = 0x30001
Formatting...OK.
[vxWorks *]#
[vxWorks *]#
[vxWorks *]# cat "/Q/Hola.txt"
Jmra 2008
30
Jmra 2008
31