Sie sind auf Seite 1von 99

Ing.

en Automtica y Electrnica
Industrial
ETSI de Bilbao
Dept. Ingeniera de Sistemas y Automtica
Isidro Calvo y Fabin Lpez

ISBN: 978-84-693-3720-2

Ejercicios de
programacin en

Departamento de Ingeniera de
Sistemas y Automtica

INDICE

1.

Variables y operadores bsicos

2.

Sentencias condicionales

3.

Sentencias repetitivas

4.

Funciones

10

5.

Arrays

14

6.

Punteros

18

7.

Cadenas

20

8.

Estructuras

25

9.

Ficheros

30

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica

Informtica Industrial

Ejercicios programacin en C - Variables y operadores bsicos

1 de 33

Variables y operadores bsicos

1. Programa que pida un valor en pesetas y lo convierta en euros y otro programa que
lleve a cabo la operacin inversa.
Nota 1 :

La solucin en euros deber tener 2 decimales.

Nota 2 : Utilizar #define para definir la relacin entre euros y pesetas (1 euro
= 166.386 pts)
2. Pedir un carcter por teclado y mostrar un mensaje que muestre el carcter
introducido as como su cdigo ASCII tanto en formato decimal como hexadecimal.
3. Programa que pida la temperatura en grados Celsius y la convierta a grados
Fahrenheit (y viceversa)
mostrando en pantalla un mensaje del tipo xxx.xx grados Celsius son yyy.yy grados
Fahrenheit

F 32 C
=
9
5
4. Crear un programa que pida el radio de una circunferencia y que calcule la longitud
de la misma as como el rea incluida dentro.
5. Crear un programa que calcule la fuerza de atraccin gravitacional entre dos masas,
M1 y M2 situadas a una distancia R.

M 1* M 2
( Nw)
R2
donde las masas se expresan en kilogramos y la distancia en metros y la constante
de gravitacin universal vale:
F =G

G = 6.67 x10 11 Nw * m 2 / Kg 2
Nota: Utilizar #define para definir la constante G.
6. Escribir un programa que pregunte el ao actual y la edad de una persona y calcule
la edad de esa persona en el ao 2010.
7. Escribir un programa que calcule el nmero de billetes de 10.000, 5.000, 1,000, as
como de monedas de 500, 100, 25, 5 y 1 pesetas para desglosar una cantidad, C, de
pesetas (menor de 2.147.483.647), de forma que se necesite la menor cantidad de
monedas y billetes de cada tipo.
8. Crear un programa que pida un numero real y muestre la tabla de multiplicar
correspondiente a dicho nmero de tal manera que tanto los valores de los factores
como del producto se presenten encolumnados y con una precisin de 2 dgitos.

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Ejercicios programacin en C - Variables y operadores bsicos

2 de 33

Ejemplo:
Programa que muestra la tabla de multiplicar de un nmero
Escribe un nmero: 5 (Valor introducido por el usuario)
TABLA DE MULTIPLICAR DEL NUMERO 5.00
5.00 *
5.00 *
...
5.00 *

1
2

=
=

5.00
10.00

10

50.00

9. Mostrar en forma de tabla, el cuadrado y el cubo de los 5 primeros nmeros enteros


que siguen a uno introducido por teclado.
Los datos deben aparecer ajustados a la derecha siguiendo el siguiente formato:
Numero
-----xxx

Cuadrado
-------xxxx

Cubo
---xxxxxx

Nota: Ejecutar el programa utilizando variables de tipo int e introduciendo el


nmero base 30 y utilizando variables de tipo unsigned int e introduciendo el
nmero base 40. Qu sucede? Cmo se puede explicar lo que sucede?

10. Crear un programa que muestre en pantalla el tamao en bytes (8 caracteres) de las
variables ms frecuentes: char, int, short int, long int, float y double.
(Nota: Para calcular el tamao de una variable se puede usar el operador sizeof.)
11. Escribir un programa que tras preguntar el nmero de almacn asociado a un
determinado tipo de pieza, la cantidad pedida de esa pieza y el precio por unidad,
efecte el clculo del precio total de las piezas pedidas. El programa deber escribir
toda la informacin de la pieza en la pantalla, adems del importe total del pedido.
12. Escribir un programa que lea el valor de un ngulo en radianes y muestre su valor en
grados, minutos y segundos
13. Programa que tras pedir por teclado un nmero lo multiplique por 4 y divida por 2
utilizando los operadores de rotacin.

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Ejercicios programacin en C Sentencias repetitivas

3 de 33

Sentencias condicionales

1. Ejecutar el siguiente cdigo fuente (Declarando valor_logico como entero y


luego declarndolo como float):
printf("Valores logicos de las siguientes expresiones\n");
valor_logico=(3>5);
printf(" (3 > 5) es %d\n", valor_logico);
valor_logico=(5 > 3);
printf(" (5 > 3) es %d\n", valor_logico);
valor_logico=(15 > 3*5);
printf(" (15 > 3*5) es %d\n", valor_logico);
valor_logico=!(5 == 3);
printf("!(5 == 3) es %d\n", valor_logico);

Nota: No confundir el operador == de comparacin (para comprobar si dos


valores son iguales) con el operador = de asignacin que escribe un valor en
una variable.

2. Escribir un programa que tras pedir 2 nmeros por la pantalla muestra cul es el
mayor nmero. (Hgase con la sentencia if y con el operador condicional:
expresin ? valor1 : valor2 )
3. Leer tres nmeros enteros y, si el primero de ellos es negativo, calcular el producto
de los tres, en caso contrario calcular la suma de ellos.
4. Crear un programa que calcule la cada de potencial producida por una resistencia
segn la ley de Ohm (V = I * R) a partir de la resistencia y la intensidad que pasa a
su travs.
Nota: El programa no debe aceptar resistencias negativas, dado que no tienen
sentido fsico, ni resistencias mayores que 1000 (requerimiento adicional
del problema). En ambos casos el programa debe escribir un mensaje de error
en pantalla diciendo que el valor de la resistencia est fuera de lmites
aceptables indicando la causa por la que dicho valor para la resistencia ha
sido rechazado.

5. Sea un sistema de ecuaciones de la forma:


a x+b y = c
d x+e y = f
que puede resolverse usando las siguientes frmulas:
ce bf
af cd
x=
y=
ae bd
ae bd

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Ejercicios programacin en C Sentencias repetitivas

4 de 33

Escribir un programa que lea los coeficientes (a, b, c, d, e, f) y resuelva el sistema. El


programa deber indicar los casos en los que el sistema de ecuaciones no tenga
solucin.
6. Escribir un programa que calcule las races, bien reales o imaginarias, de una
ecuacin de segundo grado.
El programa tambin debe ser capaz de operar con valores nulos para el coeficiente
de orden dos (es decir, deber de ser capaz de resolver ecuaciones de primer grado)
7. Dada la funcin U = f (x, y) tal que:
10

si

x*y<1

y2

si

x*y1

y dada la funcin V = f (x, y) tal que:


1

si

x*y<1

y2

si

x*y1

Escribir un programa que calcule los valores de las funciones U y V, una vez
conocidas las coordenadas de un punto (x, y).
8. Escribir un programa que pida un ao y diga si es bisiesto o no.
Nota: Un ao es bisiesto si es mltiplo de 4 salvo el caso en que sea mltiplo de
100, que no es bisiesto, y no sea mltiplo de 400. Por ejemplo, el ao 1900 no fue
bisiesto, el 2000 s y el 2100 no lo es.

9. La fecha de cualquier Domingo de Pascua se calcula de la siguiente forma:


Sea X el ao para el que se quiere calcular la fecha.
Sea A el resto de la divisin de X entre 19
Sea B el resto de la divisin de X entre 4
Sea C el resto de la divisin de X entre 7
Sea D el resto de la divisin de (19 * A + 24) entre 30
Sea E el resto de la divisin de (2 * B + 4 * C + 6 * D + 5) entre 7
La fecha para el Domingo de Pascua es el da (22 + D + E) de Marzo (obsrvese que
puede dar una fecha en mes de Abril)
Escribir un programa que pida como entrada un ao y saque por pantalla la fecha del
Domingo de Pascua para ese ao.

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Ejercicios programacin en C Sentencias repetitivas

5 de 33

10. Leer desde el teclado las coordenadas (x, y) de un punto y, mediante un men, elegir
una entre las siguientes opciones:

Comprobar si el punto pertenece a una circunferencia de radio 10 y centro


(0,0)
Averiguar el cuadrante en el que se encuentra el punto.
Pasar las coordenadas cartesianas (x, y) a polares (r, arg).

r
arg

X
11. Escribir un programa que permita efectuar el clculo del rea de un cuadrado, un
crculo o un tringulo equiltero segn la opcin seleccionada por el usuario a travs
de un men.

Crear una primera versin con la estructura de control if ... else


Y una segunda versin con la estructura de control switch... case...

12. Dada la longitud de una circunferencia, averiguar si dicha longitud corresponde, con
una determinada precisin, a una circunferencia de radio R.
El programa deber leer la longitud de la circunferencia, el radio y la precisin e
indicar si es cierto o no que esa circunferencia tiene ese valor del radio.
13. Escribir un programa que pida dos caracteres por pantalla, los ordene
alfabticamente, y los imprima ordenados.

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Ejercicios programacin en C Sentencias repetitivas

6 de 33

Sentencias repetitivas

1. Escribir un programa que escriba los nmeros del 1 al 100 en lneas de 10


nmeros. Despus de 100 el programa debe escribir Fin del programa en una
lnea nueva.
2. Programa que calcule el valor de elevar un nmero real, a, a un exponente
entero, b, ab, multiplicando b veces el nmero a.
Nota: Mejorar el programa para que compruebe que el exponente es mayor que
0 y si no lo es dar un mensaje de error y pedir otro exponente.

3. Programa que calcule el factorial ( n! ) de un nmero entero positivo ledo por


teclado.
Nota: Probar el programa con los nmeros 6, 7, 8, 9...

4. Crear un programa que pida un numero real y muestre la tabla de multiplicar


correspondiente a dicho nmero de manera que tanto los valores de los factores
como del producto se presenten encolumnados y con una precisin de 2 dgitos.
Ejemplo:
Programa que muestra la tabla de multiplicar de un nmero
Escribe un nmero: 5 (Valor introducido por el usuario)
TABLA DE MULTIPLICAR DEL NUMERO 5.00
5.00 *
1
=
5.00
...
5.00 *
10
=
50.00

5. Escribir un programa que calcule el sumatorio:


S

(1) * i
i

i =1

donde S es un nmero entero positivo introducido por teclado.


Solucin: El lmite de esa expresin cuando S tiende a infinito es: -0.822467.

6. Programa que escriba en pantalla una tabla con cuadrados y cubos a partir de un
nmero base hasta otro tope, ambos pedidos por teclado.
Nota: El programa utilizar slo variables de tipo short int y deber evitar
errores de overflow.

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Ejercicios programacin en C Sentencias repetitivas

7 de 33

Ejemplos de ejecucin:
Tabla de cuadrados y cubos

Tabla de cuadrados y cubos

Escribe el nmero menor: 30


el nmero mayor: 34

Escribe el nmero menor: 179


el nmero mayor: 183

Nmero
======
30
31
32
33
34

Cuadrado
========
900
961
1024
1089
1156

Cubo
========
27000
29791

Nmero
======
179
180
181
182
183

Cuadrado
========
32041
32400

Cubo
========

Nota: en negrita se han indicado los valores introducidos por el usuario durante
la ejecucin del programa.

7. Escribir un programa que ayude a aprender las tablas de multiplicar.


Para ello se ir pidiendo la tabla de multiplicar de un nmero (pedido por teclado
con anterioridad) y comprobando que los valores introducidos son correctos. Si
es as el programa escribir correcto y en caso contrario deber escribir Lo
siento, se ha equivocado. La respuesta correcta era nmero
La ltima lnea mostrar el nmero de aciertos.
A continuacin se muestra un ejemplo de ejecucin:
Programa para aprender las tablas de multiplicar
Con qu nmero quieres practicar? 5 (Introducido por
usuario)
5 * 1 = 5 (Introducido por el usuario)
Valor correcto
5 * 2 = 11 (Introducido por el usuario)
Lo siento se ha equivocado. La respuesta correcta era 10
...
Has acertado 9 veces de 10 nmeros.

8. Hacer un programa que lea caracteres desde teclado hasta que lea 10 veces la letra
'a'. Por cada carcter ledo que no sea una 'a' debe mostrar un mensaje indicndolo.
Cuando lea las 10 letras 'a' el programa terminar.
9. Hacer un programa que lea caracteres desde teclado y vaya contando las vocales
que aparecen. El programa terminar cuando lea el carcter # y entonces mostrar
un mensaje indicando cuntas vocales ha ledo (cuntas de cada una de ellas).
10. Repetir el ejercicio leyendo caracteres hasta que se lea el carcter final de fichero
EOF (^Z) en lugar del carcter #.

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Ejercicios programacin en C Sentencias repetitivas

8 de 33

11. Programa que simule que se deja caer una pelota desde un edificio de X metros
de altura (donde X se pide por teclado) mostrando en cada 0.1 segundos tanto la
altura de la pelota como su velocidad.
Mostrar para cada instante de tiempo (cada 0.1 segundos) una lnea del estilo:
t=xx.x distancia al suelo=xx.xx metros velocidad=xx.xx m/s

12. Programa que calcule los ns primos del 1 al 100 y los saque por pantalla.
13. Escribir un programa que primero pida por pantalla con cuntos nmeros se va a
trabajar digamos que sean X) y luego pida los X nmeros por pantalla.
Despus de introducir los X nmeros se mostrar un mensaje por pantalla
indicando cul es el mayor y menor valor introducido, as como el valor medio
de todos los nmeros introducidos.
14. Programa que pida nmeros de cuatro cifras e indique si los nmeros son
capicas o no. El programa deber ir pidiendo nmeros hasta que el usuario
introduce -1 por teclado. El nmero 1 indicar la finalizacin de la ejecucin
del programa.
Nota1: Un nmero capica es simtrico p.e. 1221 25752
Nota2: Cuando el nmero no es de cuatro cifras se deber mostrar un mensaje de
error por pantalla y se pedir otro nmero menor que 10000. En caso de
que el nmero sea menor de cuatro cifras se completar con ceros a la
izquierda.
Nota3: El nico nmero negativo que se aceptar es -1 que indicar la
finalizacin del programa. Cualquier otro nmero negativo, se mostrar
un mensaje de error.

15. Escribir un programa que calcule los nmeros perfectos entre 1 y 10000.
Nota: Un nmero perfecto es aqul tal que la suma de sus divisores menos el
propio nmero es el propio nmero.

Ejemplos:
6 Divisores(6) = {1, 2, 3, 6}

Suma = 1 + 2 + 3 + 6 6 = 6

N. Perfecto

10 Divisores(10) = {1, 2, 5, 10} Suma = 1 + 2 + 5 + 10 10 10 No perfecto


Solucin: 6, 28, 496, 8128

16. Escribir un programa que muestre el siguiente men y que permita pasar
magnitudes de grados a radianes y de radianes a grados.
1. Pasar de grados a radianes
2. Pasar de radianes a grados
Isidro Calvo y A. Fabin Lpez
Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Ejercicios programacin en C Sentencias repetitivas

9 de 33

3. Salir del programa

17. Escribir un programa que muestre una tabla con los caracteres ASCII mostrados
en decimal, octal y hexadecimal. El programa mostrar la informacin con el
siguiente formato:
Dec:

xx

Octal:

xx

Hex:

xx

Car:

El programa pedir el primer carcter y los ltimos caracteres que marcarn los
lmites de la tabla.
18. Escribir un programa que calcula el producto de los dgitos de un nmero entero
ledo desde teclado.

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Ejercicios programacin en C Funciones

10 de 33

Funciones

1. Escribir un programa que permita convertir grados Fahrenheit a Celsius y grados


Celsius a Fahrenheit.
El programa presentar el siguiente men:
1.
2.
0.

Conversin de Celsius a Fahrenheit


Conversin de Fahrenheit a Celsius
Salir del programa.

Nota: Cada conversin se efectuar por medio de funciones, una que convertir de
grados Celsius a grados Fahrenheit y otra que haga justo lo contrario.

2. Realizar un programa que escriba todos los nmeros enteros menores que un cierto
entero N y que a su vez sean mltiplos de dos nmeros enteros A y B introducidos
por teclado.
Utilizar para ello una funcin que admita dos parmetros I, J e indique si I es
mltiplo de J.
3. Escribir una funcin (con su correspondiente programa de prueba) que tome un
valor entero y devuelva el nmero con sus dgitos en reversa. Por ejemplo, dado el
nmero 7631 la funcin deber devolver 1367.
4. Escribir un programa que calcule masa radioactiva de carbono 14 que queda
despus de t aos. La frmula que determina la masa restante en el tiempo t es:
t

1h
Mt = m*
2

donde:
t
Mt
m
h

es el tiempo en aos
es la masa que permanece en el tiempo t
es la masa original
es la vida media en aos

Para el carbono 14 la vida media es de 5700 aos; si la masa original es de 300


gramos, imprimir una tabla de la masa para t=500, 1000, 1500, 2000, ..., 10000
aos.
Se deber utilizar un subprograma que permita evaluar la expresin (1/2)t/h para los
diferentes valores de t.
Nota: En TurboC existe la funcin double pow(double x, double y) que devuelve el
valor xy.

5. Escribir una funcin que escriba tantas lneas en blanco como se haya pedido con
anterioridad al usuario en el programa principal.

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Ejercicios programacin en C Funciones

11 de 33

6. Escribir una funcin que tome el tiempo introducido por el usuario en el formato
(horas:minutos:segundos) y lo convierta en segundos. El programa utilizar esta
funcin para calcular la diferencia en segundos entre dos tiempos introducidos por el
usuario.
7. Escribir un programa que calcule el nmero combinatorio
M!
M

=
N N ! ( M N )!

Utilizar para ello una funcin que calcule el factorial de un nmero.


Nota: La funcin para calcular el factorial de un nmero puede ser iterativa o
recursiva. (Una funcin recursiva es una funcin que se llama a s misma)

8. Escribir una funcin que calcule el factorial de un nmero y utilizar sta en un


programa que muestre el siguiente men.
1.
2.
3.
0.

Factorial de un nmero
Clculo de e
Clculo de e^x
Salir

Nota 1: El clculo de e debe hacerse con la siguiente expresin matemtica:


e = 1+

1 1 1
+ + + ...
1! 2! 3!

Nota 2: e x puede calcularse mediante la frmula:


ex =1+

x x2 x3
+
+
+ ...
1! 2! 3!

Nota 3: La precisin con la que se obtiene el resultado ( e o e x ) depende del ltimo


valor aadido en la correspondiente serie.

9. El desarrollo en serie de Taylor de la funcin coseno es:


cos ( x) = 1

x2 x4 x6
+

+...
2!
4!
6!

donde el ngulo x viene expresado en radianes.


Escribir un programa que calcule el valor aproximado de coseno (x), utilizando para
ello los N primeros trminos de la serie de Taylor. El nmero de trminos N de la
serie depender del valor del ltimo, es decir, se aadirn trminos a la serie hasta
que el valor absoluto del ltimo trmino aadido sea menor que 0.0005.
10. Se desea realizar un programa que permita hacer clculos con polinomios de
segundo grado.

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Ejercicios programacin en C Funciones

12 de 33

El programa deber presentar un men en pantalla que facilite las siguientes


opciones:
1.
2.
3.
4.
0.

Leer un polinomio
Escribir un polinomio en su forma habitual
Evaluar un polinomio en un punto
Calcular el polinomio derivado
Salir

Se debern utilizar los siguientes subprogramas:


LEER

mediante este subprograma se introducen los nmeros enteros que


representan los coeficientes del polinomio.

ESCRIBIR

es un subprograma que permite la escritura de un polinomio en la


forma: Ax^2 + Bx + C

Ejemplos vlidos:

5x^2+3x+5

Ejemplos no vlidos:

5x^2+ -3x+5

5x^2-3x+5

5x^2-5

5x^2-0x+5

EVALUAR

es un subprograma que retorna el valor de un polinomio para un


nmero real que es introducido como parmetro.

DERIVAR

es un subprograma que calcula el polinomio derivada de uno dado.

Nota: No est permitido el uso de variables globales.

11. Escribir un programa que realice la descomposicin en factores primos de un


nmero introducido por teclado.
El programa deber ir escribiendo la tabla de los factores primos, a medida que los
va calculando, tal como muestra el ejemplo siguiente:
Introduce un N entero ->
N
-84
42
21
7
1

|
|
|
|
|
|
|

84

Factores primos
--------------2
2
3
7

Ayuda: Se deber utilizar una funcin que nos diga si un nmero es primo o no.

12. Escribir un programa que cuente de un texto introducido por teclado:

N. de caracteres en blanco
N. de dgitos
N. de letras
N. de lneas
N. de otros caracteres

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Ejercicios programacin en C Funciones

13 de 33

Nota 1: Se deben crear sendas funciones para comprobar si un carcter es numrico


o alfanumrico.
Nota 2: La funcin getchar() permite leer un carcter de teclado.
Nota 3: Para marcar el final de lectura del texto, el usuario deber introducir un
carcter que marque fin de fichero. Este carcter es ^D en Linux y ^Z en DOS /
Windows.

13. Escribir un programa que lea dos nmeros complejos y permita realizar con ellos las
siguientes operaciones aritmticas: suma, resta, multiplicacin y divisin
Nota 1:

Se debe crear una funcin de permita leer un nmero complejo (su parte
real y su parte imaginaria).

Nota 2:

Se debe crear una funcin de permita pasar un nmero complejo en


forma parte real y parte imaginaria a mdulo y argumento.
Se debe crear una funcin que permita pasar un nmero complejo en
forma mdulo y argumento a parte real y parte imaginaria.

Nota 3:

La suma y resta de nmeros complejos se obtiene sumando, o restando,


las partes reales y las partes complejas.
El producto de dos nmeros complejos se obtiene multiplicando sus
mdulos y sumando sus argumentos.
El cociente de dos nmeros complejos se obtiene dividiendo sus mdulos
y restando sus argumentos.

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Ejercicios programacin en C - Arrays unidimensionales / multidimensionales

14 de 33

Arrays

1.

Escribir un programa que calcule el producto escalar y vectorial de dos vectores de


3 elementos cuyos valores se introducen por pantalla con el programa principal.

2.

Realizar un programa que lea 20 nmeros (entre el 1 y el 10) y muestre aquel o


aquellos que hayan aparecido ms veces.
El programa preguntar si se quieren introducir los 20 nmeros y en el caso en que
la respuesta sea negativa rellenar el array con nmeros aleatorios.
Nota: Para la generacin de los nmeros aleatorios, se debern utilizar las
funciones rand, srand, time y la constantes definida RAND_MAX.
int rand (void): retorna un valor pseudoaleatorio entre 0 y el valor de la

constante RAND_MAX.
3.

Escribir un programa que emplee un argumento de la lnea de comandos para


realizar una conversin decimal a hexadecimal; es decir, el nmero decimal se
introducir en la lnea de comandos, siguiendo al nombre del programa.
Ej:
C:> decihex 128 111
Deci= 128 Hex= 80
Deci= 111 Hex= 6F
C:>

Nota 1: Al igual que en el ejemplo, el programa deber ser capaz de convertir


varios nmeros en una llamada.
Nota 2: En caso de que el programa no reciba argumentos deber devolver un
mensaje de error.
Nota 3: La funcin atoi() convierte de cadenas a enteros.

4.

Escribir un programa que pida un array de caracteres por pantalla e invierta el orden
de los caracteres mostrndolo por pantalla. La inversin se har sin utilizar otro
array auxiliar.

5.

Escribir un programa que calcule los nmeros primos de 0 a 100 utilizando el


llamado mtodo de la criba de Eratstenes. Este mtodo consiste en definir e
inicializar con todos sus elementos a True un array de 100 elementos binarios e ir
tachando (pasando a False) en pasadas sucesivas todos los mltiplos de los
nmeros primos (2, 3, 5, 7...) hasta obtener slo los nmeros primos. Es decir:
1

8 9

10

11

12

13

14

15

...

En el ejemplo en gris claro se sealan los mltiplos de 2, mientras que en gris


oscuro los mltiplos de 3 (que no son mltiplos de 2).
Isidro Calvo y A. Fabin Lpez
Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Ejercicios programacin en C - Arrays unidimensionales / multidimensionales

15 de 33

Nota: Aumentar el lmite superior y comparar la velocidad de ejecucin con el


programa que calcula los nmeros primos de Sentencias Repetitivas.

6.

Realizar un programa que maneje un array de enteros a travs de un men con seis
opciones:
1.- Aadir un elemento al array (comprobando que el array no est lleno)
2.- Eliminar un elemento del array (comprobando que el array no est vaco)
3.- Listar el contenido del array
4.- Contar las apariciones de un nmero en el array
5.- Calcular la media y el mximo de los elementos del array
0.- Terminar

7.

Escribir un programa que permita guardar las cuentas de un banco con sus
respectivos saldos. Para ello se guardar la informacin en un array paralelo (dos
arrays unidimensionales, uno con los nmeros de cuenta y otro los saldos)
El programa deber mantener las cuentas ordenadas, de menor a mayor, por nmero
de cuenta para facilitar la bsqueda de una cuenta.
El programa mostrar un men con las siguientes opciones:
1.- Dar de alta una nueva cuenta (comprobando que el array no est lleno y
colocando la cuenta en la posicin correspondiente dentro del array)
2.- Eliminar una cuenta (comprobando que el array no est vaco y reposicionando
las cuentas en el array)
3.- Mostrar una cuenta (mostrar el nmero de cuenta y el saldo correspondiente)
4.- Mostrar informacin (Nmero de cuentas dadas de alta y dinero total de todas
ellas)
5.- Calcular el saldo medio, mximo y mnimo de las cuentas del array.
6.- Mostrar todas las cuentas (1 lnea por cuenta con su nmero y su saldo).
0.- Terminar

8.

Escribir un programa que rellene automticamente una matriz 4x7 con la suma de
sus ndices (Es decir, el elemento a11 = 1+1=2, a47 = 4+7=11). El programa
mostrar la matriz resultante por pantalla.

9.

Escribir un programa que pida una matriz de orden 3x3 y calcule y muestre por
pantalla su matriz traspuesta.

10. Crear un programa que permita reservar asientos de una sala de cine (8 filas x 20
columnas). La posicin de cada asiento se definir con una letra (A-H) para la fila y
un nmero (1-20) para la columna. El programa deber visualizar qu sitios estn
disponibles para que el cliente pueda decidir dnde sentarse. Antes de hacer la

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Ejercicios programacin en C - Arrays unidimensionales / multidimensionales

16 de 33

reserva, el programa deber comprobar que el asiento est libre, en caso contrario
devolver un mensaje de error.
Ej. de visualizacin:
1...5....0 1...5....0
_____________________
A
B
C
D
E
F
G
H

**
****
** ****
*** * **
***** ****
********
**
****
*******

***
** ****
*** ** ***
**
**
*** *
**
****
**
***

A
B
C
D
E
F
G
H

1...5....0 1...5....0

11. Un histograma es un grfico que muestra la frecuencia con que aparecen en una
array dado valores dentro de subintervalos especificados de su intervalo. Por
ejemplo, si un array unidimensional de enteros tiene elementos de tipo 0..9 y
contiene los siguientes valores:
6

Su histograma sera:
Frecuencia
Valor

4
3
2
1

*
1

*
2

*
3

*
*
*
*
4

*
*
5

*
*
*
6

*
7

*
*
9

Esto indica que los valores 0 y 8 no aparecen en el array, los valores 1, 2, 3 y 7


aparecen una vez, el valor 5 aparece dos veces, el valor 6 tres veces y el valor 4
aparece 4 veces.
Escribir un programa que, tras leer las notas de los alumnos en una asignatura,
genere y visualice el histograma de las notas redondeadas a valores enteros: 0, 1,
2,...10
Las notas ledas desde el teclado son valores de tipo real y el nmero de alumnos no
es fijo aunque siempre es menor de 300.
Nota: Para la realizacin del histograma se tendrn en cuenta las dimensiones de la
pantalla no permitindose ms de 22 filas, por tanto si la mxima frecuencia es
mayor de 22 se deber mostrar el histograma a escala.

12. Escribir un programa que rellene un array con nmeros aleatorios de tipo float. El
programa, primero pedir la cantidad de nmeros aleatorios (mximo 50) y el rango
de los nmeros aleatorios (valor_min .. valor_max) y posteriormente mostrar todos
los nmeros aleatorios en el orden en que se han generado y finalmente en orden de
menor a mayor.
Isidro Calvo y A. Fabin Lpez
Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Ejercicios programacin en C - Arrays unidimensionales / multidimensionales

17 de 33

Nota:
Para la generacin de los nmeros aleatorios, se debern utilizar las
funciones rand, srand, time y la constantes definida RAND_MAX.
Variacin 1:

Repetir el programa generando nmeros de tipo entero.

Variacin 2:
Repetir el programa recibiendo los valores (cantidad de nmeros,
valor_min y valor_max) como argumentos de la lnea de comandos.

13. Escribir un programa que calcule las suma de dos matrices A y B.


El programa preguntar por las dimensiones de las matrices (dimensiones mximas
5 x 5) y a continuacin, si se puede efectuar la suma, introducir los elementos de
ambas matrices y realizar la suma, mostrando finalmente el resultado.
14. Escribir un programa que calcule el producto de dos matrices A y B:
C = A x B
(m x p)

(m x n)

( p x n)

El programa leer las dimensiones y los elementos de cada una de las matrices
(dimensiones mximas 5 x 5) y a continuacin, si se puede efectuar el producto,
realizar lo calcular y mostrar el resultado en forma matricial.
Nota:

Los elementos de la matriz productos se obtienen de la siguiente forma:


p

cij = aik * bkj


k =1

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Ejercicios programacin en C Punteros

18 de 33

Punteros

1. Escribir un programa que efecte las siguientes operaciones.


a) Declarar las variables enteras largas value1 y value2 e inicializar value1 a
200000
b) Declarar la variable lPtr como apuntador a un objeto de tipo long.
c) Asignar la direccin de la variable value1 a la variable de apuntador lPtr.
d) Imprima el valor del objeto al que apunta lPtr.
e) Asgnele a la variable value2 el valor del objeto al que apunta lPtr.
f) Imprima el valor de value2.
g) Imprima la direccin de value1.
h) Imprima la direccin almacenada en lPtr. Es igual el valor impreso que la
direccin de value1?
Nota: %p muestra el valor de la variable como puntero

2. Crear un programa que calcule el valor de la intensidad que pasa a travs de una
resistencia dada, cuando se le aplica un voltaje determinado.
El programa deber estar dividido en las siguientes funciones:

explicar_programa ()

Esta funcin mostrar una introduccin del programa por la pantalla.

obtener_valores ()

Esta funcin pedir los valores para la resistencia y voltaje los cuales se
pasarn por referencia al programa principal.

calcular ()

Esta funcin efectuar el clculo de la intensidad a partir de la resistencia y el


voltaje aplicado.

imprimir_respuesta ()

Esta funcin se encargar de mostrar un mensaje con los resultados.


3. Crear una funcin que intercambie el contenido de dos variables. Para ello se
pasarn como parmetros las direcciones de las variables.
Para probar la funcin escribir un programa que pida los datos por pantalla y
muestre los contenidos despus de llamar a la funcin.
4. Crear un programa que lea un nmero determinado (<100) de nmeros reales
introducidos por teclado los almacene en un vector para mostrarlos luego en orden
inverso.

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Ejercicios programacin en C Punteros

19 de 33

Nota: Para recorrer el array se deber usar aritmtica de punteros en lugar de usar
los ndices del array.

5. Escribir una funcin que tras pedir un da de la semana (de 1 a 7) devuelva un


puntero a cadena con el nombre del da. La funcin contendr un array de
apuntadores a cadena.
Para probar la funcin se realizar un programa que pida un da de la semana en
nmero y escriba el da de la semana en letra.
6. Escribir un programa que inicialice una cadena con una palabra cualquiera. El
programa deber obtener la direccin de la primera letra de la cadena. Una vez
sabida esta direccin la mostrar por pantalla y realizar un bucle dando 3
oportunidades para que el usuario introduzca la direccin de la tercera letra de la
cadena. En caso de no introducirla bien despus de los 3 intentos, deber sacar un
mensaje indicando cul es la direccin correcta.

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Ejercicios programacin en C Cadenas

20 de 33

Cadenas
1.
1. Escribir un programa que pida una cadena de caracteres (de longitud mxima 80
caracteres) y devuelva la cadena escrita al revs.
Ayuda: Para saber la longitud de la cadena se puede usar la funcin strlen() de la
librera string.h.

2. Realizar un programa que lea una cadena de caracteres de una longitud menor de 80 y
visualice los caracteres de la siguiente forma:
primero, ltimo, segundo, penltimo, tercero, antepenltimo, ...
3. Escribir una funcin que cambie las letras maysculas de una cadena a minsculas
y viceversa. El programa principal pedir una cadena por pantalla y se la pasar a
dicha funcin esperando el resultado correcto que se mostrar por pantalla.
4. Escribir un programa que pida primero un carcter por teclado y que luego pida una
cadena. El programa calcular cuntos caracteres tiene la cadena hasta que lea el
carcter introducido primero. Se deber mostrar un mensaje en pantalla con el
nmero de caracteres introducidos hasta llegar al carcter primero.
5. Escribir un programa que cuente el nmero de letras, dgitos y signos comunes de
puntuacin de una cadena introducida por teclado.
Ayuda: Para saber si un carcter es numrico comparar que su valor es mayor que
0 y menor que 9, para saber si es alfabtico comprobar que est entre a y z y
considerar signos de puntuacin el resto de los caracteres.
Nota: No considerar ni la ni las letras acentuadas, ya que tienen cdigos ASCII
fuera del rango a-z

6. Realizar un programa que lea una cadena de caracteres con espacios en blanco
excesivos: elimine los espacios en blanco iniciales y finales y slo deje uno entre cada
dos palabras.
7. Crear un programa que pida una cadena de caracteres y devuelva otra sin signos de
puntuacin ni nmeros. La cadena devuelta debe tener todos los caracteres en
maysculas.
Ayuda:
Se pueden usar las siguientes funciones estndar de C: ispunct(), islower(), gets()
En TurboC tambin existe la funcin: strupr()

Cdigo ASCII de

A
a

65
97

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Ejercicios programacin en C Cadenas

21 de 33

8. Crear un programa que pida por pantalla una cadena de 80 caracteres de longitud
mxima y que calcule el nmero de veces que aparece otra cadena determinada,
tambin pedida por teclado.
Como salida el programa debe escribir un mensaje con el nmero de veces que
aparece la palabra dada.
Ayuda: Se pueden usar las funciones siguientes: strstr(), gets()

Escribir un programa que compruebe si una cadena pedida por teclado es un


palndromo o no. El programa no tendr en cuenta si la palabra est escrita con
maysculas o minsculas.
Nota: Un palndromo es una palabra que se lee igual al derecho que al revs.
Ej:

radar,

11011011, Ana, Otto

9. Escribir una funcin que compare 2 cadenas de caracteres devolviendo 1 si son


iguales y 0 si son distintas.
10. Escribir un programa que pida dos cadenas (de longitud mxima 10 caracteres) y
muestre por pantalla el resultado de las siguientes operaciones:

Obtener la longitud de ambas cadenas


Comparar alfabticamente ambas cadenas indicando si son iguales o bien cul es la
mayor y cul la menor.
Concatenar la segunda cadena al final de la primera, dejando un espacio blanco
entre ambas.
Copiar el contenido de la segunda cadena en la primera.

11. Escribir un programa con un men que permita las siguientes opciones:

Introducir una cadena de 40 caracteres de longitud mxima

Pasar a maysculas una cadena leda desde teclado. Para ello, escribir un
procedimiento que transforme caracteres de letras minsculas a maysculas
dejando como estn las letras maysculas.
Nota: Para llevar a cabo esta operacin tener en cuenta la representacin de los
caracteres en ASCII. (A 65, a 97)

Pasar a minsculas una cadena desde teclado. Para ello, escribir un


procedimiento que transforme caracteres de letras minsculas a maysculas.
Dejando como estn las letras minsculas.

Dada la cadena de caracteres introducida en el punto 1, obtener otra, de forma


que la cadena resultante tenga sus caracteres a una distancia d (en el cdigo
ASCII) de los caracteres de la cadena original. Se considerar el alfabeto
circular, es decir que tras la letra z viene la letra A. La distancia d se
introducir desde teclado.

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Ejercicios programacin en C Cadenas

22 de 33

Nota: Antes de traducir la cadena se convertir en una cadena de letras


minsculas, tal y como se hace en el punto 2.

Salir del programa

Nota comn: En todos los casos si se intenta efectuar alguna operacin antes de
introducir la cadena se deber mostrar un mensaje de error comunicando al usuario
que la cadena est vaca.

12. Julio Cesar enviaba mensajes a sus legiones encriptando los mensajes mediante el
siguiente algoritmo:
Se escoga un nmero n como clave y se sumaba a cada letra en el alfabeto n
posiciones. As, si la clave escogida fuese 5, la a pasara a ser la f, mientras que
la f pasara a ser la k. Para las ltimas letras del abecedario se seguira desde el
principio. As, con la clave de 5 la y pasara a ser la d.
Se pide crear un programa que encripte una frase mediante este algoritmo.
13. Construir un programa que implemente una calculadora para nmeros enteros:
El programa pedir primero la operacin y luego los operandos.
Las operaciones vlidas sern: sumar, restar, multiplicar, dividir, salir.
Si la operacin es distinta de salir se pedirn los operandos y luego se mostrar el
resultado.
Si la orden es distinta de las anteriores se mostrar un error diciendo que se trata de
una orden desconocida.
Los operandos se recogern como cadenas de caracteres y se convertirn en
nmeros enteros con la funcin atoi()
Otras funciones que se pueden usar sern: gets() y strcmp().
14. Realizar un programa que permita calcular el NIF., conocido el DNI. de una
persona.
El programa deber leer, sobre una cadena de caracteres, el nmero del DNI. del
interesado. Seguidamente deber averiguar si es un valor vlido (todos los caracteres
deben ser numricos y representar un valor entre 100.000 y 99.999.999). Si la
entrada es vlida se deber calcular el NIF. y representar el nmero completo con los
puntos de millares y millones en las posiciones correspondientes, as como la letra
del NIF al final de la cadena de caracteres separada por un espacio en blanco.

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Ejercicios programacin en C Cadenas

23 de 33

Clculo de la letra del NIF:

Se obtiene el resto de la divisin del nmero del DNI, entre 23, y en funcin del
resultado se asigna un carcter segn la siguiente tabla:
0 = T
1 = R
2 = W
3 = A
4 = G
5 = M
6 = Y

7 = F
8 = P
9 = D
10 = X
11 = B
12 = N
13 = J

14 = Z
15 = S
16 = Q
17 = V
18 = H
19 = L
20 = C

21 = K
23 = E

15. Tal vez el esquema de codificacin ms famoso de todos es el cdigo Morse,


desarrollado por Samuel Morse en 1832 para el sistema telegrfico. El cdigo Morse
asigna una serie de puntos y rayas a cada letra del abecedario, a cada dgito y a
algunos caracteres especiales (punto, coma, dos puntos y punto y coma). Ver tabla
adjunta.
Escribir un programa que lea una frase y la codifique en cdigo Morse. Tambin escriba
un programa que lea una frase en cdigo Morse y la convierta en su equivalente en
castellano. La separacin entre letras se indicar mediante un espacio, mientras que la
separacin entre palabras se indicar mediante 3 espacios.
Carcter
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S

Cdigo
.-..
-.-.
-..
.
..-.
--.
.
..
.---..-..
--.
--.--.
--..-.

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Carcter

Cdigo

T
U
V
W
X
Y
Z

......--..-.---..

Dgitos
1
2
3
4
5
6
7
8
9
0

.---..--...-.........
-....
--...
---..
----.
----Informtica Industrial

Ejercicios programacin en C Cadenas

24 de 33

16. Escribir un programa que permita al usuario realizar las siguientes operaciones:
1.
2.
3.
4.
5.

Mostrar la fecha y hora por pantalla


Sacar por pantalla el contenido de un fichero ASCII.
Sacar por pantalla el contenido de un directorio
Limpiar la pantalla
Salir del programa

Para ello se har uso de los comandos del sistema operativo:


En Linux: date, cat, ls, clear
En DOS: date, time, type, dir, cls

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Ejercicios programacin en C - Estructuras y arrays de estructuras

25 de 33

Estructuras

1. Realizar un programa que permita realizar las operaciones bsicas (sumar, restar,
multiplicar y dividir) nmeros complejos.
El programa deber utilizar una variable que represente el nmero complejo en su
forma polar, con sus dos componentes mdulo y argumento.
2. Crear un programa que lea las siguientes variables proporcionadas desde teclado con
el siguiente formato:
Posicin de los caracteres
1-8
9-13
14-16
17-27
28-38
Ej:

Campo
Matricula
Cilindrada
Potencia
Modelo
Marca

BI6755CC1400 75FIESTA

FORD

Y las introduzca en la correspondiente estructura. El programa deber mostrar la


estructura obtenida para comprobar que la conversin ha sido correcta.
Nota: Construir una funcin que muestre por pantalla la estructura recibida. La
estructura deber pasarse por referencia para no malgastar espacio en la pila.

3. Disponemos de la informacin correspondiente a una jaula de un Zoo en una


variable de tipo registro con los siguientes campos:
Numero de jaula
Especie del animal
Nombre del animal
Edad
Peso
Kilogramos de comida diaria
Frecuencia de limpieza de jaula
Estado de la salud del animal
Descendencia
Peligroso

Entero
Cadena de caracteres
Cadena de caracteres
Entero
Real
Real
Entero
(veces al da)
Carcter
(B, R, M -> Buena, Regular
o Mala)
S o No
S o No

Por motivos de transferencia de informacin a otros organismos necesitamos


descomponer la informacin contenida en esa variable en dos variables diferentes:
Una va a contener los datos de mantenimiento de la jaula del animal:
Isidro Calvo y A. Fabin Lpez
Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Ejercicios programacin en C - Estructuras y arrays de estructuras

Numero de jaula
Kilogramos de comida diaria
Frecuencia de limpieza de jaula
Peligroso

26 de 33

Entero
Real
Entero
S o No

(veces al da)

Otra, los datos del animal:


Especie del animal
Nombre del animal
Edad
Peso
Estado de la salud del animal
Descendencia

Cadena de caracteres
Cadena de caracteres
Entero
Real
Carcter (B, R, M -> Buena, Regular o
Mala)
S o No

Escribir un programa que lea una variable de informacin global y la descompongan


en dos variables, una de informacin de mantenimiento y otra de informacin del
animal y visualice ambas variables.
Nota: Dentro de los subprogramas que considere necesarios deber haber uno,
llamado descomponer, que tome un registro y lo descomponga en dos.

4. Crear un programa que permita introducir cierta informacin relativa a los vuelos
diarios que parten de un aeropuerto en un array formado por registros. Cada registro
contendr la siguiente informacin sobre el vuelo correspondiente:
a) Nmero de vuelo (No tiene por qu coincidir con el ndice del array)
b) Hora de partida (En dos campos): 1. Hora:
0..23
2. Minutos: 0..59
c) Origen del vuelo: Cadena de caracteres
d) Destino del vuelo: Cadena de caracteres
e) Nmero de pasajeros: Entero
Una vez introducidos los datos de todos los vuelos se preguntar si se desea obtener
informacin de algn vuelo. En caso de que el usuario responda afirmativamente se
pedir el nmero de vuelo. El programa buscar el vuelo en al array y acceder a la
informacin que contiene a partir de su nmero de vuelo, mostrando por pantalla
todos sus datos.
El programa se ejecutar repetitivamente hasta que el usuario indique que no desea
obtener ms informacin de ningn vuelo.
Nota: Se deben disear las funciones que visualicen un vuelo, busquen un vuelo en
el array, introduzcan la informacin de un vuelo en el array, etc...

5. Una compaa utiliza aviones para fumigar las cosechas contra una gran variedad de
plagas. Lo que la compaa cobra a los granjeros depende de contra qu es lo que

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Ejercicios programacin en C - Estructuras y arrays de estructuras

27 de 33

desean fumigar, y de cuantos m2 de tierra quieren que se fumiguen de acuerdo con la


siguiente tabla:
Tipo1: Fumigacin contra malas hierbas
Tipo2: Fumigacin contra langostas
Tipo3: Fumigacin contra gusanos
Tipo4: Fumigacin contra todo lo anterior

18
36
54
90

/ m2
/ m2
/ m2
/ m2

Adems, si el rea a fumigar es mayor que 10.000 m2, el granjero goza de un


descuento del 7%.
Se trata de escribir un programa que lea los datos de un conjunto de granjeros y al
final calcule, para cada uno de ellos, la factura correspondiente. De cada granjero se
tendr la siguiente informacin:
Nombre
Tipo de fumigacin (cdigo entre 1 y 4)
Nmero de m2 que se van a fumigar.
Fecha de factura (a su vez, con los componentes: minutos, hora, da, mes
y ao)
Nota: Los componentes de la fecha de la factura deben ser ledos en el sistema
(utilizando funciones de la librera time.h)

6. Escriba un programa que genere un array de 50 nmeros enteros entre 1 y 1000 de


forma aleatoria. A continuacin, partiendo de ese array genere otro array de 50
estructuras tal que cada estructuras tenga un campo para el nmero y otro (cadena de
caracteres) para indicar si dicho nmero es primo o no. Por ejemplo:
203

672

23

319

426

........ 862

373

273

203

203

672

23

319

426

........ 862

373

273

203

NO

NO

SI

NO

NO

SI

........ NO

SI

NO

NO

Finalmente muestre en pantalla la suma de todos los nmeros del array que sean
primos.
7. Escribir un programa que cree una base de datos temporal sobre el personal de
agentes de polica. La base de datos almacenar cuatro datos acerca de cada persona:

Nombre (Array de caracteres)


Apellido (Array de caracteres)
Cdigo (Entero)
Categora (Entero: 0: detective, 1: ayudante, 2: director)

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Ejercicios programacin en C - Estructuras y arrays de estructuras

28 de 33

El programa preguntar acerca de cuntos datos se aadirn a la base de datos y


luego mostrar los datos de todos los agentes introducidos.

8. Programa que implemente una agenda.


Se guardarn los siguientes datos por persona:

Nombre:
Apellidos:
Sobrenombre:
Telfono:
Fecha de nacimiento:

Mximo 15 caracteres.
Mximo 35 caracteres.
Mximo 10 caracteres.
Mximo 10 caracteres.
8 caracteres (con el formato dd/mm/aa, pudiendo
ser espacios los dgitos del ao

Se crear un men con las siguientes opciones:


1.
2.
3.
4.
5.
0.

Alta de una nueva persona a la agenda con los correspondientes datos.


Eliminar a una persona de la agenda.
Bsqueda de un nombre en particular
(La bsqueda se har por
sobrenombre)
Listado de todas las personas empezando por la primera introducida (Para
pasar a la siguiente se deber pulsar intro).
Guardar agenda en disco.
Salir

9. Se deber escribir un programa que permita introducir y consultar la tabla peridica


de los elementos qumicos. Para ello, se construir un men con las siguientes
opciones:
1. Introducir elementos de la tabla peridica
2. Listar todos los elementos de tabla peridica
3. Mostrar elemento de la tabla peridica por nmero
atmico
4. Mostrar elemento de la tabla peridica por smbolo
5. Salir

La opcin 1 preguntar cuntos elementos de la tabla peridica se quieren


introducir e ir preguntando sucesivamente por ellos.
Evidentemente, no es necesario rellenar el array con todos los elementos de la
tabla peridica.
La opcin 2 listar la informacin acerca de todos los elementos qumicos
introducidos ordenados por nmero atmico.
La opcin 3 pedir el nmero atmico del elemento que se quiere consultar y
mostrar por pantalla la informacin correspondiente a dicho elemento.

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Ejercicios programacin en C - Estructuras y arrays de estructuras

29 de 33

La opcin 4 pedir el smbolo del elemento que se quiere consultar y mostrar


por pantalla la informacin correspondiente a dicho elemento.
Se guardar la siguiente informacin sobre cada elemento.
1. Smbolo del elemento
2. Nombre completo
3. Peso Atmico

El nmero atmico vendr indicado por la posicin en el array de elementos


que representa la tabla peridica, y por tanto no ser necesario almacenar esta
informacin en el registro correspondiente.
Nota: Se puede mejorar el programa aadiendo una opcin que permita
guardar los datos en un fichero de disco.

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Ejercicios programacin en C Ficheros

30 de 33

Ficheros

1. Crear un programa que abra un fichero y escriba nmeros enteros y otro programa calcule
el valor mximo (si hay varios basta con uno de ello) y la media de todos los nmeros
contenidos en el fichero anterior:
Ayuda: Utilcense las funciones fprintf y fscanf.

2. Leer completamente un fichero de texto, carcter a carcter (o en cantidades mayores, para


que sea ms rpido). El programa debe contar las vocales, los caracteres alfabticos y los
dgitos que hay en el fichero.
3. Crear un programa que abra un fichero y escriba en l dos cadenas, cada una acabada con
el carcter de nueva lnea y otro programa que lea la segunda cadena escrita en el mismo
fichero.
Comprobar que el fichero existe y visualizar su contenido con un editor de textos (p.e. el
Block de Notas de Windows)
Nota: Escribir una cadena con espacios intercalados.
Ayuda: Utilcense las funciones fputs y fgets. Consultar la ayuda.

4. Escribir un programa que tome caracteres de teclado y, de uno en uno, los escriba en un
fichero cuyo nombre es previamente pedido por pantalla.
5. Escribir un programa que saque por pantalla el contenido de un fichero cuyo nombre es
pedido por pantalla.
Nota: El nombre del fichero debe proporcionarse mediante la lnea de argumentos al
llamar al fichero. Es decir:
C:> MostrFic fichero.txt

6. Escribir un programa que comprueba que un fichero de cdigo contiene el mismo nmero
de { que de } en su cdigo. En caso de que no sea as el programa mostrar un
mensaje indicando que el nmero de { es distinto que el nmero de }.
7. Escribir un programa que use dos ficheros: uno de lectura y otro de escritura. El programa
leer los caracteres de un fichero, y tras una operacin de cambio de maysculas a
minsculas y viceversa, escogida por el usuario, los escribir en un segundo fichero.
8. Escribir el cdigo necesario en el programa de la agenda de la leccin de estructuras
(Ejercicio 8) para que se aadan cuatro opciones ms. De esta forma, el men quedar de
la siguiente manera:

A. Fabin Lpez Valencia


Dpto. Ingeniera de Sistemas y Automtica

Informtica Industrial

Ejercicios programacin en C Ficheros

31 de 33

1. Alta de una nueva persona a la agenda con los correspondientes datos.


2. Eliminar a una persona de la agenda.
3. Bsqueda de un nombre en particular

(La bsqueda se har por sobrenombre)

4. Listado de todas las personas empezando por la primera introducida (Para pasar a la
siguiente se deber pulsar intro).
5. Leer la agenda desde el disco (formato binario). El nombre del fichero ser
agenda.bin.
6. Guardar la agenda en el disco (formato binario). El nombre del fichero ser
agenda.bin.
7. Guardar la agenda en el disco para imprimir (en modo texto). El nombre del fichero
ser agenda.txt.
8. Guardar en un fichero de texto informacin de las personas que cumplen aos en un
determinado mes (cuyo nmero se leer desde teclado). El nombre del fichero ser el
nmero del mes seguido de la extensin txt.

Se guardar la fecha de nacimiento, el sobrenombre y el telfono, ocupando la


informacin de cada persona una lnea. La informacin deber estar encolumnada
debajo de una cabecera, tal como se muestra en el ejemplo:
FECHA DE NACIMIENTO
13/12/85
09/12/90

SOBRENOMBRE
Koldo
Ana

TELEFONO
946478383
653765432

0. Salir

9. Escribir un programa que permita visualizar el contenido de un fichero pasado desde la


lnea de comando en formatos hexadecimal y carcter, siguiendo el esquema del ejemplo:
C:> Ver Fichero.txt
48 6F 6C 61 2C 20 73 6F-79 20 75 6E 61 20 63 61
64 65 6E 61 0D 0A 59 20-79 6F 20 6F 74 72 61 0D
0A EB 11 80 3E AF D2 00-74 03 E8 B2 E8 E8 FC E6

Hola, soy una ca


dena..Y yo otra.
....>...t.......

Ayuda: Para averiguar si un carcter se puede imprimir existe la funcin isprint().

10. Escribir un programa que pida el nombre de un fichero y lo borre de disco.


Ayuda: Usar la funcin remove().

11. Crear una base de datos almacenada en un fichero para personal universitario. Cada
elemento de la base de datos constar de 3 campos: Nombre, apellido y edad.
Adicionalmente, ser necesario crear otro programa que lea los registros de la base de
datos y los muestre secuencialmente por pantalla.
12. Escribir un programa que haga una conversin de un tipo de formato de fichero a otro. El
formato de partida ser el siguiente:

A. Fabin Lpez Valencia


Dpto. Ingeniera de Sistemas y Automtica

Informtica Industrial

Ejercicios programacin en C Ficheros

Posicin de los caracteres


1-9
9-14
14-17
17-28
28-38

Ej:

32 de 33

Campo
Matricula
Cilindrada
Potencia
Modelo
Marca

BI6755CC1400 75FIESTA

FORD

y el formato de destino sern las correspondientes estructuras, es decir:


Matrcula
Cilindrada
Potencia
Modelo
Marca

8 caracteres
entero
entero
10 caracteres
10 caracteres

Nota: Los datos de partida pueden introducirse con el programa 2.

13. Una entidad bancaria posee en un fichero la siguiente informacin para un conjunto de
personas:
Nombre.
Nmero de cuenta.
Crdito solicitado.

El programa funcionar basndose en un men con las siguientes operaciones:


1.- Aadir un crdito al archivo
2.- Visualizar en pantalla la informacin correspondiente al crdito mayor
3.- Copiar en otro fichero el conjunto de personas que hayan solicitado un crdito
superior a cierta cantidad establecida por el banco (la cual deber ser introducida
por teclado).
4.- Visualizar todo el contenido de un archivo
14. Se necesita construir un programa que a partir de la frmula de un compuesto qumico
(supuestamente puro) y su peso en gramos obtenga la cantidad que dicho compuesto
contiene de cada uno de los elementos qumicos que lo forman.
Para ello se escribirn dos programas:
El primero de ellos escribir en disco la tabla peridica. Por cada elemento de la tabla
peridica se guardar la siguiente informacin:
Smbolo del elemento
A. Fabin Lpez Valencia
Dpto. Ingeniera de Sistemas y Automtica

Informtica Industrial

Ejercicios programacin en C Ficheros

33 de 33

Nombre completo
Peso Atmico

El nmero atmico de cada elemento vendr representado por su posicin en la tabla


peridica.
El segundo de ellos leer el fichero con la tabla peridica introducido con el programa
anterior y presentar un men con las siguientes opciones.
1.
2.
3.
0.

Listar tabla peridica


Mostrar elemento de la tabla peridica
Obtener la composicin de un compuesto qumico
Salir

La opcin 1 mostrar un listado con todos los elementos de la tabla peridica, parando la
ejecucin cuando se llene una pantalla para permitir verlos todos.
La opcin 2 pedir el smbolo de un elemento qumico, lo buscar en la tabla peridica y
mostrar toda la informacin relativa. Es decir, su nmero atmico, el smbolo del mismo,
su nombre completo y su peso atmico.
La opcin 3 permitir introducir la frmula del compuesto qumico. Para ello ir
preguntar primero por el nmero de tomos constitutivos y luego por el nombre y
nmero de tomos del elemento en el compuesto. Posteriormente, se pedir el peso en
gramos del compuesto a analizar.
Una vez calculada con la tabla peridica, a partir de las proporciones obtenidas de la
frmula, la cantidad en gramos de cada uno de los elementos se mostrar el informe con la
composicin en gramos del compuesto.
Finalmente, la opcin 4 permite salir del programa.

A. Fabin Lpez Valencia


Dpto. Ingeniera de Sistemas y Automtica

Informtica Industrial

Introduccin a Tornado

Informtica Industrial
(Ingeniera en Electrnica y Automtica)

Departamento de Ingeniera de Sistemas y


Automtica

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

INDICE

1.

Introduccin .............................................................................................................. 1

2.

Ejecutar Tornado ...................................................................................................... 2

3.

Crear un proyecto descargable para VxWorks ......................................................... 3

4.

Aadir cdigo fuente al proyecto ............................................................................. 6

5.

Generar el mdulo objeto del proyecto .................................................................... 7

6.

Descargar el mdulo objeto del proyecto en el Simulador del target de VxWorks . 9

7.

Ejecutar el mdulo objeto desde la Shell de Tornado ............................................ 11


7.1

Algunos comandos de la Shell de Tornado .................................................... 14

8.

Explorador de objetos del sistema: Browser .......................................................... 17

9.

Descripcin de una sesin de depuracin ............................................................... 19

10. Crear una imagen de VxWorks configurada o customizada .................................. 22


10.1

Aadir cdigo fuente al proyecto ................................................................... 24

10.2

Configurar los componentes de VxWorks...................................................... 24

11. Examinar la actividad de las tareas......................................................................... 27

Isidro Calvo y A. Fabin Lpez


Dpto. de Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Introduccin a Tornado

1 de 30

2. Introduccin
Tornado es un entorno integrado para el desarrollo cruzado de software. Proporciona un modo
muy eficiente para el desarrollo de aplicaciones, o mdulos objeto, de tiempo real embebidas,
con mnima intrusin en el target. Tornado incluye los siguientes elementos:

VxWorks, un sistema operativo de tiempo real de alto rendimiento.

Herramientas de desarrollo de aplicaciones (compiladores y programas asociados).

Un entorno integrado de desarrollo (IDE) que facilita la gestin y el desarrollo de


proyectos, estableciendo y gestionando la comunicacin entre el host y el target y
la ejecucin, depuracin y monitorizacin de aplicaciones VxWorks.

Las caractersticas principales del IDE son:

Editor de cdigo fuente integrado.

Facilidades para la gestin de proyectos.

Compiladores integrados de C y C++ y make.

Browser: coleccin de visualizaciones que ayudan a monitorizar el target.

CrossWind: depurador grfico a nivel de cdigo.

WindSh: shell de comandos en lenguaje C que controla el target.

VxSim: versin integrada de un simulador de target VxWorks.

Versin integrada de WindView, el analizador lgico para el target.

Opciones de configuracin para muchas de las caractersticas, incluyendo


integracin de editor alternativo y de herramientas de gestin de la configuracin
(CM), as como todo el GUI de Tornado.

El entorno de Tornado est diseado para suministrar el rango completo de caractersticas,


independientemente de si los recursos del target son muchos o pocos. Las principales
capacidades se ejecutan principalmente en un host con acceso compartido a una tabla de
smbolos del sistema target remoto. La Figura muestra las relaciones entre los principales
componentes interactivos de Tornado en el host y en el sistema target. La comunicacin entre
las herramientas del host y VxWorks est arbitrada por el server target y el target agent.
HOST SYSTEM

TARGET SYSTEM

Shell
Application
Editor

Debugger
Target
Server

Project

Browser
VxWorks
Target
Agent

WindView

VxWorks
Agent
Simulator

Isidro Calvo y A. Fabin Lpez


Dpto. de Ingeniera de Sistemas y Automtica UPV/EHU

Target Agent

Informtica Industrial

Introduccin a Tornado

2 de 30

Con Tornado, el ciclo entre el desarrollo de una idea y la posibilidad de observar su


implementacin es extremadamente corto. Se pueden efectuar descargas incrementales del
cdigo objeto de los mdulos que son enlazadas dinmicamente con el sistema operativo
VxWorks en un tiempo mnimo.
El lenguaje de macros, llamado Tcl, proporciona un medio consistente para la configuracin
de todo el entorno de las herramientas de Tornado.

3. Ejecutar Tornado
Para ejecutar Tornado basta con hacer clic sobre el icono de la aplicacin, mediante la
secuencia: botn Inicio > Programas > Tornado2 > Tornado

NOTA:

Se puede mover las barras de herramientas y situarlas donde queramos: en los


lados, arriba o abajo (o una junto a otra).

Si, durante el arranque, Tornado no se ha podido conectar al registro de Tornado, preguntar


si se quiere ejecutar el registro.
Al ejecutar Tornado por primera vez, aparece abierta la caja de dialogo Create Project,
existiendo la posibilidad de crear dos tipos de aplicaciones o proyectos:
o Donwlable application

Un mdulo objeto descargable, o downlable, consiste en uno o ms mdulos


objetos relocalizables, que pueden ser descargados y enlazados dinmicamente
al sistema operativo VxWorks, y despus se pueden ejecutar desde la shell o
desde el debugger de Tornado. Una caracterstica nueva del entorno de
desarrollo de Tornado es la carga dinmica, que permite cargar objetos en un
sistema en ejecucin. Esto proporciona ciclos de depuracin mucho ms
rpidos, comparndolos con el proceso de tener que volver a generar y
reenlazar el sistema operativo completo. Un mdulo objeto descargable puede
consistir en un nico fichero, conteniendo una simple rutina hola mundo, o
una aplicacin compleja consistente en muchos ficheros y mdulos que estn
parcialmente enlazados como un nico objeto (que es creado automticamente
Isidro Calvo y A. Fabin Lpez
Dpto. de Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Introduccin a Tornado

3 de 30

por la herramienta de proyectos). El mdulo objeto tendr el mismo nombre


que el proyecto, y la extensin out, tal como se describe en este documento.
o Bootable application

Una aplicacin arrancable, o bootable, consiste en un modulo objeto enlazado


a un kernel, o imagen, de VxWorks. La imagen VxWorks se puede configurar
para incluir o excluir componentes del sistema operativo, mediante la
activacin/desactivacin de parmetros del sistema operativo. Una aplicacin
arrancable comienza su ejecucin cuando el target es arrancado.

4. Crear un proyecto descargable para VxWorks


Si la caja de dialogo de Create Project in New/Existing Workspace no est abierta se puede
abrir mediante la secuencia de opciones de men: File > New Project.

Al seleccionar la opcin: Create downloadable applications for VxWorks, se lanza el


asistente (Wizard), que nos ayuda a seguir los pasos necesarios para crear un nuevo proyecto.
En el primer paso nos pregunta:

Nombre del proyecto

Camino y nombre del directorio que se quiere utilizar para guardar el proyecto

Una descripcin del proyecto (es opcional)

El nombre y la localizacin del fichero del workspace, el cual contiene informacin


acerca de espacio de trabajo, incluyendo los proyectos que pertenecen a l.

Un proyecto consiste en cdigo fuente, la configuracin de la generacin del mdulo objeto


(Building settings) y los archivos binarios que se utilizan para generarlo.
Un espacio de trabajo, o workspace, es simplemente la agrupacin de uno o ms proyectos.
Esto proporciona una forma muy til de trabajar con material relacionado, compartir cdigo
entre proyectos y asociar mdulos objeto relacionados. Una vez que se ha creado un proyecto
en un worksapce, la ventana del workspace muestra informacin de todos los proyectos que
contiene.
Se puede utilizar el directorio y los nombres por defecto indicados por el asistente, pero es
preferible situarlos en un directorio que no est colgado del rbol de directorios de la
instalacin de Tornado (para que no se borren si se desinstala Tornado).
Isidro Calvo y A. Fabin Lpez
Dpto. de Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Introduccin a Tornado

NOTA:

4 de 30

El directorio base para el proyecto y el directorio para el workspace deben existir


antes de crear los ficheros del proyecto y de workspace.

En el segundo paso se presenta una caja de dialogo en la que se debe indicar la toolchain que
construir el mdulo objeto.
Una toolchain es un conjunto de herramientas de desarrollo cruzado, que permiten construir
mdulos objeto para un target especfico. Las toolchain suministradas con Tornado estn
basadas en el preprocesador, compilador, ensamblador y enlazador de GNU. Los nombres por
defecto de las toolchain para simuladores de target tienen la forma SIMhostOSgnu (por
ejemplo SIMNTgnu).

Isidro Calvo y A. Fabin Lpez


Dpto. de Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Introduccin a Tornado

5 de 30

En nuestro caso seleccionaremos la toolchain SIMNTgnu y pulsaremos el botn Next para


continuar. Tras ello, se muestran las opciones seleccionadas en los pasos anteriores, para que
sean confirmadas:

Tras lo cual aparece la ventana del workspace. El ttulo de la ventana incluye el nombre del
workspace y la ventana contiene una carpeta para cada uno de los proyectos del workspace.

NOTA:

El men contextual correspondiente a un objeto se muestra pulsando el botn


derecho del ratn, despus de haber seleccionado dicho objeto. Nos permite acceder
a todos los comando que se pueden utilizar sobre el objeto seleccionado.

Isidro Calvo y A. Fabin Lpez


Dpto. de Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Introduccin a Tornado

6 de 30

5. Aadir cdigo fuente al proyecto


Programa fuente:
El programa ejemplo que se va a utilizar
crea una array de nmeros enteros, los
ordena y luego crea otro array de
estructuras con dos campos. Uno de los
campos de la estructura contiene el
nmero correspondiente del array de
nmeros y en el otro campo una cadena
de caracteres que indica si dicho nmero
es primo o no.
Si tenemos el cdigo fuente ya editado, con un
editor del tipo ASCII puro, para aadir el cdigo,
basta con seleccionar Add Files desde el men
contextual en la vista File del workspace y
seleccionar dicho fichero.

Tras seleccionar el archivo Arr_num.c y


podemos abrir la carpeta de Object Modules, en
la vista de Files, para mostrar los nombres de los
ficheros fuente y de los ficheros objeto que se
van a crear a partir de ellos.
Al crear un proyecto, Tornado facilita la creacin
automtica del fichero projectName.out como un
nico mdulo, parcialmente enlazado.
El fichero projectName.out, comprende todos los
mdulos objeto individuales del proyecto de la
aplicacin descargable y facilita la descarga de
todos ellos en el target de manera simultnea.

NOTA: Tambin se puede crear el


fichero del cdigo fuente,
utilizando
el
editor
integrado en Tornado.
Para ello habra que
seleccionar el submen
New, del men Files, o el
; tras lo cual se
icono
abrira una nueva ventana
donde escribir el cdigo
del nuevo archivo.

Isidro Calvo y A. Fabin Lpez


Dpto. de Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Introduccin a Tornado

7 de 30

6. Generar el mdulo objeto del proyecto


Para revisar la configuracin que se va a utilizar para generar el mdulo objeto, debemos
seleccionar la hoja Builds de la ventana del workspace. Seguidamente se debe abrir en ella la
carpeta Ejemplo_Vx Builds y hacer doble-click sobre el nombre por defecto del generador del
mdulo objeto (SIMNTgnu).
Mediante el men contextual de Properties... se pueden ver, y modificar, las reglas del
makefile y las macros, as como las opciones que van a utilizar el compilador, el ensamblador
y el enlazador para generar el mdulo objeto.
NOTA:

Durante el proceso de desarrollo de un proyecto, es importante seleccionar la


opcin de incluir informacin para la depuracin (include debug info, en la hoja
C/C++ compiler).

Para generar el proyecto hay


seleccionar, en el men contextual:

que

Build 'Ejemplo_Vx.out'

La opcin Build 'Ejemplo_Vx.out' genera la


aplicacin, con todos los mdulos del
proyecto como un nico y parcialmente
enlazado mdulo que est optimizado para
descargarlo al target.
Antes de generar la aplicacin se muestra la
caja de dialogo Dependencies, en el que se
indican los ficheros fuente relacionados con
la aplicacin.

Isidro Calvo y A. Fabin Lpez


Dpto. de Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Introduccin a Tornado

8 de 30

En el ejemplo, antes de
generar el mdulo objeto, la
caja de dialogo Dependencies
nos informa de que las
dependencias para el fichero
makefile todava no han sido
calculadas
para
Ejemplo_Vx.c.
Tras pulsar el botn de OK, Tornado calcula las dependencias para el fichero makefile, y
procede a generar el mdulo objeto del proyecto. Si se encuentra alguna dependencia externa,
se incluye automticamente en el proyecto y es listada en la carpeta External Dependencies,
en la hoja Files de la ventana del workspace.

La ventana Build Output muestra los errores y los avisos. En este caso el compilador ha
detectado una extraa variable, longitud, que se define pero que no se utiliza posteriormente.
Haciendo doble-click sobre la lnea del mensaje de error o de aviso se abre, en el editor de
Tornado, el fichero del cdigo fuente con un puntero sealando la lnea origen del mensaje:

Isidro Calvo y A. Fabin Lpez


Dpto. de Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Introduccin a Tornado

9 de 30

Tras eliminar la definicin de la variable longitud se debe salvar el fichero, pulsando


CTRL+S o mediante la opcin del men File > Save, y volver a generar el mdulo objeto.
El editor de Tornado es un editor orientado a lenguaje (por ejemplo, dispone del
reconocimiento y coloreado de los diversos elementos sintcticos) e incluye las capacidades
estndar de Windows para la manipulacin de texto.
Finalmente se debe cerrar la ventana Build Output.

7. Descargar el mdulo objeto del proyecto en el Simulador del


target de VxWorks
En este punto, desde la hoja Files de la ventana
de workspace, se puede, descargar el mdulo
objeto y lanzar el simulador integrado, todo ello
como parte del mismo proceso.
Se debe seleccionar la carpeta con el nombre del
proyecto y en el men contextual (mostrado con
el botn derecho de ratn) elegir la opcin
Download 'Ejemplo_Vx.out'.

Tornado pregunta si se quiere


comenzar a ejecutar el simulador:

Al pulsar el botn de Yes para


continuar, aparecer la caja de
dialogo de VxSIM-Lite Launch:

Isidro Calvo y A. Fabin Lpez


Dpto. de Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Introduccin a Tornado

10 de 30

Se debe dejar seleccionado el Standard Simulator y pulsar OK para continuar.


La ventana del simulador de target (VxWorks Simulator for Windows) se abre, y Tornado
pregunta si se quiere ejecutar el target server. Pulsando OK, en la caja de dialogo del
VxSIM-Lite Launch, se contina con el proceso.

NOTA:

En cada instante, slo se puede ejecutar una instancia del simulador integrado del
target VxWorks,(VxSim-Lite (Para terminar la simulacin bastar con cerrar la
ventana del VxWorksSimulator).

Un target server gestiona todas las comunicaciones entre las herramientas del host Tornado,
tales como la shell o el debugger, y el target. La convencin para los nombres del
server target es targetName@hostName. En el ejemplo el nombre del target es vxsim (el
nombre por defecto del simulador integrado) y el nombre del PC host es badger.
El nombre del target server se muestra en la barra de herramientas de Tornado:
Browser

Shell

Debugger

WindView

Simulator

Wind
Navitagor

Triggering

La barra de herramientas incluye botones para ejecutar las herramientas de Tornado tales
como Browser, Shell y Debugger. Los botones se activan cuando se lanza la ejecucin del
target server.
NOTA:

Tanto el botn del Browse como el de la Shell tienen la letra i en ellos, lo cual
puede llevar a confusin. La i en el botn de la Shell va seguido del indicador de la
Shell: ->

Isidro Calvo y A. Fabin Lpez


Dpto. de Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Introduccin a Tornado

11 de 30

8. Ejecutar el mdulo objeto desde la Shell de Tornado


Antes de ejecutar el mdulo objeto, es til configurar y ejecutar el depurador de Tornado, de
tal forma que el depurador pueda responder automticamente a cualquier excepcin del
programa.
El depurador o debugger de Tornado (CrossWind) combina caractersticas de los depuradores
con interfaz grfica y los de interfaz de lnea de comandos. Las operaciones ms comunes
tales como visualizar la traza y otros objetos del programa, poner puntos de ruptura
(breakpoints) y controlar la ejecucin de la aplicacin estn disponibles desde la barra de
herramientas de depuracin:

Para configurar el depurador o debugger hay que seleccionar la opcin de men


Tools > Options > Debugger desde la ventana principal de Tornado. En la caja de dialogo que
aparece se debe seleccionar Always en la caracterstica Auto attach to tasks, para que el
depurador se acople automticamente a la tarea cuando ocurra una excepcin.

en la barra de herramientas comienza la ejecucin del depurador. Tras


Pulsando el botn
unos segundos, la lnea de estado, en el pie de la ventana principal, anunciar que el
depurador se est ejecutando:

La shell de Tornado (conocida como WindSh) es un intrprete de comandos de lenguaje C que


permite invocar, desde la lnea de comandos de la shell, cualquier rutina que haya sido
cargada en el target. La shell tambin incluye su propio conjunto de comandos para
manipular tareas, acceder a la informacin del sistemas, depurar, ...
Isidro Calvo y A. Fabin Lpez
Dpto. de Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Introduccin a Tornado

Para comenzar una shell hay que hacer clic en el botn:

12 de 30

Cuando se abra la ventana de la shell, para ejecutar el programa bastar con poner en la lnea
de comandos el nombre de la rutina principal del programa (ej. main) o de cualquier otro
subprograma o tarea de los mdulos cargados.

Desde la shell, se puede llamar a rutinas para mostrar datos en la salida estndar, o para
aceptar datos desde la entrada estndar. Por defecto, la salida estndar y la entrada estndar se
dirigen a la ventana de la Shell de Tornado.
-> printf("Hello World\n")
Hello World!
value = 13 = 0xd
->

Este comportamiento se puede modificar dinmicamente, utilizando el procedimiento


shConfig, tal como se ve en el siguiente ejemplo:
-> ?shConfig SH_GET_TASK_IO off
->
-> printf("Hello World!\n")
value = 13 = 0xd
->

La shell muestra el resultado del comando printf( ), indicando que ha mostrado 13


caracteres. La salida, sin embargo, ha sido redirigida a la salida estndar del target, no
a la shell.
La shell muestra los datos de tipo entero y los de tipo carcter en formato decimal y
hexadecimal, y si es posible, como una constante carcter o una direccin simblica ms un
offset.
-> 68
value = 68 = 0x44 = 'D'
-> 0xf5de
value = 62942 = 0xf5de = _init + 0x52
-> 's'
value = 115 = 0x73 = 's'
Isidro Calvo y A. Fabin Lpez
Dpto. de Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Introduccin a Tornado

13 de 30

Se pueden utilizar casi todos los operadores de C para realizar clculos, e incluso el operador
parntesis para forzar el orden de precedencia.
-> (14 * 9) / 3
value = 42 = 0x2a = '*'

Al asignar, mediante una sentencia de asignacin, un valor a un identificador no definido (uno


que no est ya en la tabla de smbolos) la shell crea automticamente un nueva variable. La
shell reserva espacio para la nueva variable, le asigna el valor indicado en la expresin de la
derecha (de la sentencia de asignacin) y muestra un mensaje indicando que se ha creado una
nueva variable y se le ha asignado el valor que se especifica. El tipo de la variable creada es el
correspondiente al tipo del valor asignado.
-> x = 100
new symbol "x" added to symbol table.
x = 0x49aefec: value = 100 = 0x64 = 'd'
->
-> saludo = "Hello world"
new symbol " saludo" added to symbol table.
saludo = 0x49aefac: value = 77262772 = 0x49aefb4 = saludo + 0x8
->

Ejemplo de uso de la shell como intrprete de comandos de C:


Crear dos variables, iUno e iDos, asignarles un valor (11 y 22 respectivamente) y utilizar
la funcin IntercambiarEnteros, del mdulo objeto cargado, para intercambiar sus
valores:
-> iUno = 11
/* crear variable y asignarle valor */
new symbol "iUno" added to symbol table.
iUno = 0x49aeff4: value = 11 = 0xb
-> iDos = 22
/* crear variable y asignarle valor */
new symbol "iDos" added to symbol table.
iDos = 0x49aefec: value = 22 = 0x16
-> iUno
/* mostrar el valor de la variable
iUno = 0x49aeff4: value = 11 = 0xb

*/

-> iDos
/* mostrar el valor de la variable
iDos = 0x49aefec: value = 22 = 0x16

*/

-> IntercambiarEnteros (&iUno, &iDos)


value = 77262828 = 0x49aefec = iDos

/* llamar a la funcin */

-> iUno
/* mostrar el valor de la variable
iUno = 0x49aeff4: value = 22 = 0x16

*/

-> iDos
/* mostrar el valor de la variable
iDos = 0x49aefec: value = 11 = 0xb
->

*/

Para finalizar la ejecucin de la shell se puede ejecutar el comando quit o bien cerrar la
ventana de la shell.

Isidro Calvo y A. Fabin Lpez


Dpto. de Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Introduccin a Tornado

14 de 30

Algunos comandos de la Shell de Tornado


help

Muestra una sinopsis de algunos comandos.


HTML Help
Escribiendo cualquier nombre de comando, un espacio, y CTRL+W se abre el
browser y se muestra la pgina HTML de referencia de dicho comando.
-> i [CTRL+W]

quit o exit

Cierra la shell (WindSh).

reboot

Rearranca el target y el servidor se conecta de nuevo con l. Al cabo de


un segundo se reinicia la shell.

version

Muestra informacin de la version de VxWorks.

h [size]

Muestra el histrico de la shell o modifica su tamao.


El valor inicial de size es 20.

pwd

Muestra el directorio por defecto actual.

cd "path"

Cambia el directorio por defecto.

ls ["path"[, long] ] Lista el contenido del directorio (1 listado largo y 0 listado corto).
lkup "substr"

Lista smbolos.
Lista todos los smbolos, de la tabla de smbolos del sistema, cuyos nombres
contienen la subcadena indicada en la lnea de comandos, substr. Si substr es una
cadena vaca (""), se muestran todos los smbolos de la tabla de smbolos.

period secs, funct, args Crea y arranca una tarea que ejecuta una funcin peridicamente.
Crea y arranca una tarea que repetidamente llama a una determinada funcin, funct,
residente en el target, a la que se le pueden pasar hasta 8 parmetros (arg1, arg2,
arg3,), con un retardo, entre llamadas, igual al nmero de segundos indicado en la
lnea de comandos, secs.
-> period 2, main

repeat n, funct, args,

Crea y arranca una tarea que ejecuta una funcin repetidamente.

Crea y arranca una tarea que llama a una determinada funcin, funct, residente en el
target, un nmero determinado de veces, n. A la funcin functr se le pueden pasar
hasta 8 parmetros (arg1, arg2, arg3,). Si n es 0, la funcin se ejecuta
continuamente o hasta que la tarea sea eliminada.
-> repeat 2, main
-> repeat 1, IntercambiarEnteros, &iUno, &iDos

i [task]
ti [task]

Muestra un resumen del TCB de cada una de las tareas.


Muestra la informacin completa del TCB de cada una de las tareas.
Estos comandos (y el siguiente) muestran informacin de todas las tareas del sistema,
o de la tarea especificada en la lnea de comando.

Isidro Calvo y A. Fabin Lpez


Dpto. de Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Introduccin a Tornado

15 de 30

Muestra un resumen del TCB de cada una de las tareas, tomada como
en una instantnea.

iStrict [task]

El resultado de la ejecucin de este comando es idntico al del comando i, pero se


garantiza la consistencia de los datos al tomarse todos los datos en una nica
transaccin del target.
Estos comandos (i, ti, iStrict) se deberan utilizar nicamente como ayuda a la
depuracin, puesto que la informacin ya es obsoleta en el instante de ser mostrada.
-> i
NAME
---------tExcTask
tLogTask
tRlogind
tTelnetd
tNetTask
value = 57

NOTA:

ENTRY
TID
PRI
---------- -------- --_excTask
20fcb00
0
_logTask
20fb5b8
0
_rlogind
20f3f90
2
_telnetd
20f2124
2
_netTask
20f7398 50
= 0x39 = '9'

STATUS
--------PEND
PEND
PEND
PEND
PEND

PC
SP
ERRNO DELAY
------- -------- ----- -200c5fc 20fca6c
0 0
200c5fc 20fb520
0 0
2038614 20f3db0
0 0
2038614 20f2070
0 0
2038614 20f7340
0 0

Los argumentos especificados como task pueden ser tanto el nombre como el ID de
la tarea.

Cargada slo la imagen de VxWorks

Cargado el debugger y el mdulo o aplicacin main

sp funct, args, Crea y lanza una tarea, con parmetros por defecto.
sps funct, args, Crea y lanza una tarea, con parmetros por defecto, y la deja suspendida.
Este comando crea y lanza una determinada tarea (que ejecuta una funcin, funct) con
los siguiente valores por defecto:
Prioridad:

100

Tamao de la pila o stack:

20,000 bytes

Identificador de la tarea (taskID): el nmero ms alto de los no utilizados


Opciones de la tarea:

VX_FP_TASK ( ejecuta con soporte para el


coprocesador de punto flotante)

Nombre de la tarea:

El nombre es de la forma sXuN, donde X es el


nmero de la shell y N un numero entero que se
incrementa para cada tarea creada. Por tanto los
nombres de las tareas sern: s1u1, s1u2, s5u3, etc.

El identificador de la tarea (task ID) es mostrado tras crearse y lanzarse la tarea.


-> sp main
-> sp IntercambiarEnteros, &iUno, &iDos
Isidro Calvo y A. Fabin Lpez
Dpto. de Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Introduccin a Tornado

16 de 30

td task

Elimina una tarea.

tr task

Reactiva una tarea.

ts task

Suspende una tarea.


NOTA:

? shConfig

Los argumentos especificados como task pueden ser tanto el nombre como el ID de
la tarea.

Muestra o cambia el comportamiento de una sesin especfica de la shell


Mostrar la configuracin actual de la shell:
-> ? shConfig
DSM_HEX_MODE = off
LD_CALL_XTORS = target
LD_COMMON_MATCH_ALL = on
LD_PATH = .
LD_SEND_MODULES = on
SH_GET_TASK_IO = on

Mostrar la configuracin actual de un parmetro:


-> ?shConfig SH_GET_TASK_IO
SH_GET_TASK_IO = on

Cambiar la salida y la entrada. Poner la entrada y salida estndar del target, en lugar de que sea
la shell:
-> ? shConfig SH_GET_TASK_IO off

Isidro Calvo y A. Fabin Lpez


Dpto. de Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Introduccin a Tornado

17 de 30

9. Explorador de objetos del sistema: Browser


El Borwser es un visor de objetos del sistema. Es un componente grfico de la shell que
proporciona facilidades para monitorizar el estado del target, incluyendo resmenes de las
tareas activas del sistema y de la aplicacin, asignacin y uso de la memoria, resumen del
actual mapeo de la memoria del target,
Utilizando el browser tambin se puede examinar:

Informacin detallada de las tareas

Semforos

Colas de mensajes

Particiones de la memoria

Timers de tipo Watchdog

Uso de la pila por parte de todas las tareas del target

Uso de la CPU del target por parte de las tareas

Informacin de los mdulos: estructura y smbolos

Vectores de interrupcin

Hay dos formas de ejecutar el browser: Desde el icono


desde la opcin Browser del men Tools.

de la barra de herramientas o

Cuando se abre la ventana del browse, se debe seleccionar, en la lista desplegable, la


informacin que se desea mostrar (Memory Usage, Target Information, ). La informacin
mostrada se obtiene en un instante determinado y nico, pero se puede actualizar
interactivamente, pulsando el botn

, o se puede configurar el browser, pulsando el botn

, para que la informacin mostrada automticamente se actualice en intervalos


determinados. Para que la informacin se refresque automticamente o interactivamente basta
con pulsar el botn
Memory Usage:

Isidro Calvo y A. Fabin Lpez


Dpto. de Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Introduccin a Tornado

Target Information

18 de 30

Stack Check

Spy Chart

Module Information:

Tasks

Isidro Calvo y A. Fabin Lpez


Dpto. de Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Introduccin a Tornado

19 de 30

10. Descripcin de una sesin de depuracin


Para comenzar un sesin de depuracin, en primer lugar hay que descargar el modulo que se
quiere depurar, tal como se ha descrito en el apartado 6, Descargar el mdulo objeto del
proyecto en el Simulador del target de VxWorks.
Seguidamente se debe comenzar la ejecucin del depurador o debugger desde el men
Debbug > Run (F6) o desde el botn
del depurador:

. Tras lo cual se activa la barra de herramientas

Terminar la ejecucin de la actual


subrutina.

Ejecutar una rutina bajo el control


del depurador.
Parar el depurador.
Poner/quitar punto de ruptura
(Toggle breakpoint).
Interrumpir la ejecucin del
mdulo.

Ejecutar hasta la lnea actual del


cdigo fuente (donde se coloca el
cursor):
mediante men contextual
Watch. Mostrar el valor de una
variable determinada.
Mostrar todas las variables locales.

Continuar con la ejecucin.


Mostrar los registros del target.
Ejecutar la siguiente lnea de
cdigo. Si es la llamada a una
subrutina pasa a ejecutar la primera
lnea de la misma.
Ejecutar la siguiente lnea de
cdigo. Si es la llamada a una
subrutina la ejecuta por completo.

Mostrar la traza del programa,


desde el mdulo inicial hasta la
subrutina actual (muestra la
informacin de la pila).
Mostrar la memoria del target.

se muestra
Al pulsar el botn
el cuadro de dialogo para seleccionar
la rutina que se quiere depurar (por
ejemplo main).
NOTA: Se debe activar la opcin
de que se detenga la
ejecucin al inicio de la
misma.
Isidro Calvo y A. Fabin Lpez
Dpto. de Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Introduccin a Tornado

20 de 30

Seguidamente se muestra el cdigo del mdulo:

Siguiente lnea del mdulo


que se ejecutar

Se puede abrir la ventana de la traza del programa pulsando el botn

Y la ventana de las variables locales, pulsando

Isidro Calvo y A. Fabin Lpez


Dpto. de Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Introduccin a Tornado

21 de 30

Por ejemplo, se pueden poner puntos de ruptura al inicio de cada llamada a subprograma para
ir viendo la ejecucin del mismo, as como los valores que van tomando las variables locales
a main:

Puntos de ruptura

En el ejemplo, la variacin de los valores de las variables locales a main en los sucesivos
puntos de ruptura:
Al inicio de la ejecucin:

Tras la llamada a
LlenarListaNumeros:

Tras la llamada a
OrdenarListaNumeros:

Isidro Calvo y A. Fabin Lpez


Dpto. de Ingeniera de Sistemas y Automtica UPV/EHU

Tras la llamada a
LlenarListaEstructuras:

Informtica Industrial

Introduccin a Tornado

22 de 30

La traza del programa en el instante en que se comienza a ejecutar el subprograma


LlenarListaNumeros es:

En la ventana del simulador de target (VxWorks Simulator for Windows) se puede ir viendo el
resultado de la ejecucin del programa (simula la consola del target1):

11. Crear una imagen de VxWorks configurada o customizada

Si la caja de dialogo de Create Project


in New/Existing Workspace no est
abierta se puede abrir mediante la
secuencia de opciones de men:
File > New Project.

Se ejecuta entonces el asistente de Tornado, que nos ayuda a seguir los pasos necesarios.

Para redireccionar la salida a la consola se debe ejecutar el comando:? shConfig SH_GET_TASK_IO off

Isidro Calvo y A. Fabin Lpez


Dpto. de Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Introduccin a Tornado

Isidro Calvo y A. Fabin Lpez


Dpto. de Ingeniera de Sistemas y Automtica UPV/EHU

23 de 30

Informtica Industrial

Introduccin a Tornado

24 de 30

Aadir cdigo fuente al proyecto


Se aade el cdigo fuente al proyecto, tal como se
describe en el apartado 4 Aadir cdigo fuente al
proyecto
Pero, en este caso, al seleccionar la hoja Files de la
ventana del workspace, automticamente se han
aadido una serie de ficheros relacionados con la
imagen de VxWorks.

Configurar los componentes de VxWorks


Al seleccionar la hoja VxWorks de la
ventana del workspace se muestran todos los
componentes de VxWorks disponibles para
este target.

Los nombres de los componentes que


estn seleccionados para su inclusin
aparecen en negrita.

Los nombres de los componentes que


estn excluidos aparecen en texto
plano.

Los nombres de los componentes que


no han sido instalados aparecen en
cursiva.

Los nombres de las carpetas


aparecen en negrita si alguno (no
necesariamente todos) de sus
componentes estn incluidos.

Desplegando los componentes:


operating system components
ANSI C components (libc)

Se puede seleccionar un componente directamente (o buscarlo mediante el men contextual) y


tras ello incluirlo, excluirlo, configurarlo, ...

Isidro Calvo y A. Fabin Lpez


Dpto. de Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Introduccin a Tornado

25 de 30

Eliminando la librera POSIX clocks:

Se nos informa de que se va a excluir otro/s


componentes:

Aadiendo la librera POSIX semaphores:

Se nos informa de que se va a incluir otro/s


componentes:

Isidro Calvo y A. Fabin Lpez


Dpto. de Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Introduccin a Tornado

26 de 30

Si
se
incluyen
componentes
que
potencialmente presentan un conflicto entre
ellos, Tornado informa de ello mostrando un
mensaje e iluminando el camino completo
hasta la fuente del conflicto.
Ejemplo:
En:

development tool components


symbol table components

1 incluimos: built-in symbol table


2 incluimos: downloaded symbol

Seleccionando el
nombre del
proyecto, en
cualquiera de las
vistas del
workspace, y
seleccionando
Properties, en el
men contextual,
se puede ver el
tamao total de
los componentes
del kernel, o
imagen, de
VxWorks.

Posteriormente se
debe seleccionar
el tipo de kernel,
o imagen,
VxWorks que se
desea:
vxWorks
vxWorks-rom
vxWorks-

romCompress
vxWorks-

romResident
Isidro Calvo y A. Fabin Lpez
Dpto. de Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Introduccin a Tornado

27 de 30

Finalmente se genera el mdulo objeto, del mismo


modo que las aplicaciones descargables (tal como se
ha descrito en el apartado 5, Generar el mdulo
objeto del proyecto), mediante la opcin
correspondiente del men contextual.

12. Examinar la actividad de las tareas


WindView es un analizador de Tornado para aplicaciones de Tiempo Real. Es una
herramienta de visualizacin dinmica que suministra informacin de los cambios de contexto
y los eventos que los originan, as como informacin de objetos tales como semforos, colas
de mensajes y watchdog times.

Para mostrar la actividad de las tareas se va a utilizar el programa cobble.c que est situado en
el directorio: c:\tornado\target\src\demo\start y que contiene rutinas tales como progStart
(que lanza la ejecucin de 4 tareas: tCosmos, tSchlep, tMonitor, tCrunch), progStop, ...

Tras descargar en el simulador el cdigo y una vez lanzada la ejecucin de la rutina progStart
Isidro Calvo y A. Fabin Lpez
Dpto. de Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Introduccin a Tornado

28 de 30

, en la
Basta con pulsar el botn de WindView
barra de Tornado, para abrir la ventana de control de
WindView:

Se puede seleccionar los eventos que se desean capturar para posteriormente mostrarlos:

Pulsando botn GO
, en la ventana de
control de WindView, se comienza a guardar
datos.
Tras unos segundos, se debe pulsar el botn de
actualizar,
mostrada:

, para actualizar la informacin

Una vez alcanzado aproximadamente un porcentaje del 50%, se pulsa el botn de STOP
para detener el almacenamiento de datos.
Antes de cargar los datos de WindView desde el simulador del target al host, hay que parar el
programa, ejecutando progStop en la lnea de comandos de la Shell.

Isidro Calvo y A. Fabin Lpez


Dpto. de Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Introduccin a Tornado

29 de 30

Finalmente, mediante el botn


para se cargan los datos en WindView. Cuando la carga se
haya completado se mostrar una ventana grfica similar a la siguiente:

Se activa, entonces, la barra de tareas de WindView:


Zoom in

Zoom out

Zoom 100%

Factor de Zoom
Analyze

Filter events

Hide nonexecuting status

Se puede filtrar la informacin mostrada,

realizar anlisis del uso de la CPU o del memoria,


aumentar o disminuir el tamao de lo mostrado,
instantes,

Track incoming events

, realizar bsquedas de eventos,

, utilizar los botones de zoom para


, realizar mediciones entre

Se puede configurar WindView (por


ejemplo el color del fondo, mediante la
secuencia de opciones de men:
Tools > WindView > Option

Isidro Calvo y A. Fabin Lpez


Dpto. de Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

Introduccin a Tornado

30 de 30

Por ejemplo, seleccionando como eventos a capturar Task State Transition, configurando el
fondo de la pantalla como blanco, Tools > WindView > Option > White Background, y
aumentado el zoom

Los eventos se muestran mediante


smbolos. Por ejemplo las banderas
indican los semforos, las lneas el
estado de ejecucin de las tareas...
Para obtener informacin acerca
del significado de los iconos de
WindView se debe seleccionar la
opcin de men:
Help > WindView Help > Legend

Isidro Calvo y A. Fabin Lpez


Dpto. de Ingeniera de Sistemas y Automtica UPV/EHU

Informtica Industrial

-I-

Sockets UDP
Informtica Industrial
(Ingeniera en Electrnica y Automtica)

Departamento de Ingeniera de Sistemas y


Automtica

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica

Informtica Industrial

- II -

INDICE

1.

Prctica final ............................................................................................................. 1


1.1.

Introduccin ...................................................................................................... 1

1.2.

Objetivos........................................................................................................... 2

1.3.
Se pide: ............................................................................................................. 3
1.3.1.
Empezar a registrar datos ......................................................................... 3
1.3.2.
Parar de registrar datos ............................................................................. 3
1.3.3.
Estado del sistema .................................................................................... 4
1.3.4.
Anlisis de los datos ................................................................................. 4
1.3.5.
Visualizar fichero de alarmas ................................................................... 4
1.3.6.
Cambiar la hora del sistema...................................................................... 4
1.3.7.
Salir........................................................................................................... 4
2.

Apndices ................................................................................................................. 5
2.1

Estructura para enviar los datagramas .............................................................. 5

2.2

Cdigo del servidor .......................................................................................... 5

2.3

Conceptos de sockets ........................................................................................ 6

2.4
Funciones a utilizar........................................................................................... 8
2.4.1
Funciones relacionadas con comunicaciones ........................................... 8
2.4.2.
Funciones relacionadas con tareas.......................................................... 10
2.4.3.
Funciones relacionadas con ficheros ...................................................... 11
2.4.4.
Funciones relacionadas con el tiempo .................................................... 11

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica

Informtica Industrial

Comunicaciones en VxWorks Sockets UDP

1 de 12

13. Prctica final


Introduccin
En la presente prctica se va a implementar un sistema de adquisicin de datos compuesto por
varios ordenadores. Uno de ellos, el concentrador, acta como servidor de una serie datos que
se recogen, con tarjetas de adquisicin de datos, de una planta qumica de dinmica lenta. Los
datos recogidos de la planta se distribuyen a travs de una red Ethernet en la que, cada uno de
los ordenadores de los alumnos de prcticas acta como un registrador de datos. Estos datos
se guardan en un fichero que se utilizar para su posterior anlisis con paquetes del tipo
MATLAB o EXCEL.
El siguiente dibujo ilustra el proceso seguido para analizar los datos.
TCP/IP sobre Ethernet

Planta:
Generacin de
datos
Servidor: Enva los
datagramas UDP

Cliente: Registra los datos


recibidos como datagramas
en un fichero de disquete.

Fichero de texto con los datos


Anlisis de los datos con
paquetes MATLAB / EXCEL

Un ejemplo simplificado del cdigo que ejecuta el servidor encargado de distribuir los datos
recogidos puede encontrarse al final del guin en el apndice correspondiente (Seccin 2.2).
Los datos obtenidos por el servidor se envan a travs de una red Ethernet habindose
escogido el protocolo UDP de TCP/IP para distribuirlos. Las razones por las que en esta
prctica se ha escogido el protocolo UDP, basado en datagramas, frente al protocolo TCP,
orientado a conexin, hay que buscarlas en que el rendimiento es mejor, ya que no exige el
mantenimiento de circuitos virtuales (como en el caso del protocolo TCP) adems de que es
ms sencillo de utilizar. Por otro lado, este protocolo puede ocasionar la prdida de algn
paquete sin que ningn nodo sea notificado de ello. Sin embargo, en caso de que as suceda, el
funcionamiento del sistema es aceptable ya que al tratarse de un sistema de dinmica lenta, las
variaciones de los datos del sistema sern lentas con lo que la prdida de algn paquete no
afectar de forma substancial al anlisis de los datos.

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica

Informtica Industrial

Comunicaciones en VxWorks Sockets UDP

2 de 12

Los datagramas que se enviarn consistirn la siguiente estructura que habr que definir en el
fichero udp.h:
struct trgDato {
long int
float
float
};

lNumSec ;
rTemp ;
rPresion ;

/* Numero de secuencia */
/* Valor de la temperatura */
/* Valor de la presin
*/

Los datos recibidos por el cliente se guardarn en un fichero de texto cuyo nombre se pedir
previamente por teclado con el formato:
Numero Secuencia

Fecha Hora

Temp. Presin

Donde:
El nmero de secuencia xxxxxxxx
La fecha tendr el formato dd/mm/aa
La hora tendr el formato hh:mm:ss
La temperatura tendr el formato xx.xxx
La presin tendr el formato xxxx.x
Cuando el programa registre una temperatura mayor de 50 grados o una presin mayor que
2000 milibares, se producir una alarma. Los mensajes de alarma se registrarn en el fichero
alarmas.txt y consistirn en un mensaje que contendr la siguiente informacin:
Tipo Alarma

Fecha Hora

Temp. Presin

El tipo de alarma consistir en una de los siguientes magnitudes.


1-> Alarma de temperatura
2-> Alarma de presin

La fecha tendr el formato dd/mm/aa


La hora tendr el formato hh:mm:ss
La temperatura tendr el formato xx.xxx
La presin tendr el formato xxxx.x
Nota: Aunque puede haber varios ficheros con los datos recogidos con diferentes nombres, el
fichero de alarmas ser nico, alarmas.txt.

Objetivos
Los objetivos principales de esta prctica son los siguientes:

Poner en funcionamiento un sistema simplificado de adquisicin de datos.

Ilustrar cmo usar las comunicaciones con los protocolos TCP/IP.

Escribir datos en ficheros bajo el S.O. VxWorks

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica

Informtica Industrial

Comunicaciones en VxWorks Sockets UDP

3 de 12

Utilizar las funciones de hora del sistema

Se pide:
Desarrollar el programa que ejecutar en ordenador cliente. Este programa deber disponer de
un men con las siguientes opciones:
1)
2)
3)
4)
5)
6)
7)

Empezar a registrar datos


Parar de registrar datos
Estado del sistema
Anlisis de los datos
Visualizar alarmas
Cambiar la hora del sistema
Salir

A continuacin se pasar a definir qu se deber hacer en cada una de las opciones:


1.3.1

Empezar a registrar datos

Este es el apartado ms extenso del men.


Primero, se escoger el nombre que se utilizar para guardar los datos recogidos. Si el fichero
existe dar un mensaje de error diciendo que ya existe.
Adems, lanzar la tarea udpCliente (con taskSpawn) que har lo siguiente:

Rellenar la estructura sockaddr_in con los datos de la direccin local. (Nota:


Previamente a rellenar la estructura es conveniente rellenarla con ceros usando la
funcin bzero)

Se crear el socket UDP

Se har el correspondiente bind con los datos de la estructura sockaddr_in rellenada


previamente.

Se montar la disquetera para poder escribir ficheros en el disquete.

Se abrir un archivo para escritura en modo texto con el nombre especificado


previamente.

Se abrir el archivo de alarmas para escribir alarmas en caso de que tenga lugar alguna
alarma.

Se leern los datagramas recibidos del concentrador por el correspondiente puerto,


hasta que el usuario seleccione la opcin 2 (Parar de registrar temperaturas). Para
recibir los datagramas se utilizar la funcin recvfrom.

Dentro del lazo se escribirn los datos en el fichero determinado

En caso de que se mida una temperatura mayor de 50 grados o la presin supere los
2000 milibares, se escribir en el fichero de alarmas el correspondiente mensaje de
alarma, tal y como se describe en la introduccin.

Tipo Alarma

1.3.2

Fecha Hora

Temp. Presin

Al pulsar la opcin 2 se cerrarn los ficheros y sockets abiertos.

Parar de registrar datos

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica

Informtica Industrial

Comunicaciones en VxWorks Sockets UDP

4 de 12

Esta opcin parar el registro de datos de forma controlada.


1.3.3

Estado del sistema

Esta opcin indicar si el sistema est actualmente registrando datos o no. Para ello tendr que
comprobar si se est ejecutando la tarea de registro de datos.
1.3.4

Anlisis de los datos

A pesar de que el anlisis exhaustivo de los datos se llevar a cabo off-line esta opcin
permite hacer un anlisis mnimo.
Por cada fichero a procesar esta opcin debe mostrar un informe con las temperaturas y
presiones mximas, mnimas y medias. Para ello, se pedir el nombre del fichero a procesar y
tras comprobar previamente que el fichero no est en uso, procesar el fichero para obtener
los datos mnimos, mximos y medios, as como la fecha y hora de inicio de registro de los
datos y de fin de datos.
1.3.5

Visualizar fichero de alarmas

Esta opcin permite visualizar off-line las alarmas producidas. No se permitir ver las alarmas
mientras se estn registrando temperaturas.
Se permitir filtrar las alarmas por tipo, mostrando slo las alarmas de temperatura, presin o
todas.
1.3.6

Cambiar la hora del sistema

Esta opcin permitir visualizar la hora del sistema y cambiar la hora del sistema en caso de
que as se desee. No se podr ejecutar mientras se estn recogiendo datos.
1.3.7

Salir

Permitir salir del programa de control de la aplicacin. En caso de que la tarea de registrar
datos se est ejecutando se mostrar un mensaje indicando que primero es necesario parar de
registrar temperaturas.

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica

Informtica Industrial

Comunicaciones en VxWorks Sockets UDP

5 de 12

14. Apndices
Estructura para enviar los datagramas
#define PUERTO_SERVIDOR 5002
#define TAMANO_MAX_MENSAJE 1024

/* Estructura enviada en los datagramas */


struct trgTemp {
long int lNumSec;
/* Numero de secuencia */
float rTemp;
/* Valor de la temperatura */
float rPresion;
/* Valor de la presion */
};

Cdigo del servidor


/*
*udpServidor.c
*
*Envia datagramas a traves del puerto determinado en el udp.h
*a un ordenador especifico pasado como argumento
*Los datagramas seran una estructura con un numero de secuencia
*y un valor de temperatura.
*
*DEVUELVE: OK si todo bien o ERROR si ha habido problemas.
*/
/* includes */
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

"vxWorks.h"
"sockLib.h"
"inetLib.h"
"stdioLib.h"
"strLib.h"
"hostLib.h"
"ioLib.h"
"taskLib.h"
"sysLib.h"
"udp.h"

/* Variables globales */
int giContinuar;
STATUS udpServidor (char * sDireccionCliente)
/* direccion IP del cliente */
{
struct trgTemp rgTemp;
/* Estructura trgTemp definida en "udp.h"
con los valores a enviar en el datagrama */
struct sockaddr_in rgClienteAddr; /* Estructura sockaddr con la direccion del
cliente */
int
iSockAddrSize; /* Tamanyo de la estructura sockaddr_in */
int
sFd;
/* Descriptor del socket */
/* Crea el socket UDP en el cliente */
/* AF_INET hace referencia a los protocolos de Internet. Otros valores: AF_ISO...*/
/* SOCK_DGRAM indica que se enviaran DATAGRAMAS a traves del socket. Otros valores:
SOCK_STREAM...*/
if ((sFd = socket (AF_INET, SOCK_DGRAM, 0)) == ERROR)
{
perror ("Error en la creacion del socket en la funcion \"udpServidor\"");
return (ERROR);
}

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica

Informtica Industrial

Comunicaciones en VxWorks Sockets UDP

6 de 12

/* No se requiere hacer bind cuando se envian datagramas, slo cuando se reciben */


/* Rellenado de la estructura que contiene la direccion del socket a la que se
envian datagramas*/
iSockAddrSize = sizeof (struct sockaddr_in);
bzero ((char *) &rgClienteAddr, iSockAddrSize);
rgClienteAddr.sin_family = AF_INET;
/* Cambia el formato del numero de puerto */
rgClienteAddr.sin_port = htons (PUERTO_SERVIDOR);
/* inet_addr convierte una direccion IP en un entero largo. P.e. convierte
"158.227.67.161" en 0x9EE343A1 */
/* hostGetByName convierte un nombre en un entero largo P.e. convierte
"bipz61.bi.ehu.es" en 0x9EE343A1 */
if (((rgClienteAddr.sin_addr.s_addr=inet_addr (sDireccionCliente)) == ERROR) &&
((rgClienteAddr.sin_addr.s_addr=hostGetByName (sDireccionCliente))==ERROR))
{
perror ("Error en \"udpServidor\": Direccion del cliente desconocida\n");
close (sFd);
return (ERROR);
}
/* giContinuar se cambia desde la funcion PararServidor */
giContinuar=-1;
while(giContinuar)
{
/* Rellena la estructura con las temperaturas adquiridas*/
rellenarDatos(&rgTemp);
/* Envia un dato al cliente */
if (sendto (sFd, (char *) &rgTemp, sizeof (rgTemp), 0,
(struct sockaddr *) &rgClienteAddr, iSockAddrSize) == ERROR)
{
perror ("Error en el sendto de \"udpServidor\"");
close (sFd);
return (ERROR);
}
printf("Mensaje %ld enviado\n", rgTemp.lNumSec);
taskDelay(sysClkRateGet()*10);
}
printf("Saliendo de \"udpServidor\"\n");
close (sFd);
return (OK);
}
/* Esta funcion para el lazo infinito para que el servidor deje de enviar
datagramas */
int PararServidor(void)
{
giContinuar=0;
}

Conceptos de sockets

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica

Informtica Industrial

Comunicaciones en VxWorks Sockets UDP

7 de 12

Los sockets son parte de los protocolos TCP / IP y originariamente se disearon para
posibilitar la comunicacin entre sistemas UNIX. VxWorks, hereda de UNIX el uso de los
sockets, de hecho, la forma de utilizarlos en VxWorks es totalmente paralela al mtodo
seguido en UNIX.
Para poder trabajar con sockets hay que conocer algunos conceptos relacionados con las capas
inferiores de TCP/IP. Estos conceptos son la familia o dominio de conexin, as como su tipo.

Familia: Agrupa los sockets que comparten una serie de caractersticas comunes como
convenios para formar direcciones de red o para nombrar los objetos de la red. Las
familias ms comunes en los sistemas Unix son:
o AF_UNIX: Utiliza protocolos internos de Unix. Se suele usar para comunicar
procesos que se ejecutan en una misma mquina ya que no realiza accesos a la
red.
o AF_INET: Que usa protocolos de Internet, como el TCP orientado a conexin
o UDP no orientado a conexin. Esta familia de sockets se usa para comunicar
procesos entre mquinas distintas a travs de la red.
o Otras familias: AF_CCITT, AF_NS, AF_SNA, AF_DECnet, AF_APPLETALK

Tipo de conexin: Se refiere al tipo de circuito que se establece entre los dos procesos
que se van a comunicar. Hay 2 tipos de circuitos.
o Virtual ( SOCK_STREAM ):

En la familia AF_INET usan el protocolo TCP.

Orientado a conexin: exigen una etapa previa a la conexin


(transmisin de mensajes entre enmisor y receptor que garanticen el
xito de la comunicacin posterior de los datos.

Protocolo fiable: comprueba si existen errores en la transmisin


retransmitiendo aquellos mensajes incorrectos.

Con control de flujo: evita que un receptor lento quede desbordado con
la llegada de mensajes de un emisor ms rpido.

Permite circuitos virtuales: se conoce como STREAM o corriente de


datos.

o Datagrama ( SOCK_DGRAM ):

En la familia AF_INET usan el protocolo UDP

Orientado a no conexin: no exige ningn proceso previo a la


comunicacin.

Sin garanta de secuencia: los datos pueden llegar desordenados

Sin garanta de fiabilidad: los datos pueden contener errores o perderse

Sin control de flujo: no controla si el receptor es capaz de aceptar datos


a la misma velocidad que el emisor los enva

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica

Informtica Industrial

Comunicaciones en VxWorks Sockets UDP

8 de 12

Mejora las prestaciones del sistemas: la red est menos tiempo ocupada

Direcciones de red: Las direcciones de red distinguen biunvocamente a cada nodo de la


red. Para hacer referencia a los nodos origen y destino de la conexin, algunas llamadas
a los sockets necesitan usar un puntero a una estructura de direccin de socket. Esta
estructura depende de la familia, en el caso de la familia AF_INET (los protocolos de
Internet) sigue el siguiente formato:
o struct in_addr {
u_long s_addr ;
};
o struct sockaddr_in {
sin_family ;
short
u_short sin_port ;
in_addr sin_addr ;
sin_zero [8] ;
char
};

/*32 bits con la identificacin de la red */


/*y el host (en binario)*/

/* En este caso AF_INET*/


/*16 bits con el nmero de puerto */
/*id. red y host*/
/*8 bytes sin usar*/

Funciones a utilizar
Este apartado no pretende ser sustituir a los manuales de Tornado (disponibles en el entorno
de Tornado en versin electrnica desde la opcin de Men Help->Manual Index), sino que
slo pretende proporcionar una gua mnima con las funciones disponibles en VxWorks para
realizar la prctica. Se recomienda la consulta a los manuales de Tornado para ms
informacin sobre ellas.

Funciones relacionadas con comunicaciones

socket

Descripcin: Abre un descriptor para un socket.


Parmetros:
domain (int):

familia de protocolos. Ej: AF_INET para TCP/IP.


AF_ISO para ISO.

type (int):

Tipo de socket. Ej: SOCK_STREAM basado en


conexin, SOCK_DGRAM datagramas.

protocol (int):

Protocolo del socket (normalmente 0)

bind

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica

Informtica Industrial

Comunicaciones en VxWorks Sockets UDP

9 de 12

Descripcin: Asocia un nombre a un socket. Se utilizar una estructura de tipo sockaddr. Slo
es necesario utilizarla en las operaciones que involucran lecturas de datos a travs de un
socket y no en los envos.
Parmetros:
s (int):

Socket al que se le asociar una estructura


de tipo sockaddr.

name (struct sockaddr *): Estructura sockaddr con los datos del
socket, incluyendo direccin IP, puerto...
namelen (int):

Tamao de la estructura sockaddr.

sendto

Descripcin: Enva un mensaje a travs de un socket.


Parmetros:
s (int):

Socket al que se envan los datos.

buf (caddr_t):

Apuntador al buffer de datos.

bufLen (int):

Longitud del buffer de datos.

flags (int):

flags usados por protocolos de capas


inferiores.

to (struct sockaddr *):

Estructura sockaddr con la direccin del


receptor

tolen (int):

Tamao de la estructura sockaddr.

recvfrom

Descripcin: Recibe un mensaje de un socket.


Parmetros:
s (int):

Socket por el que se reciben los datos.

buf (caddr_t):

Apuntador al buffer de datos.

bufLen (int):

Longitud del buffer de datos.

flags (int):

flags usados por protocolos de capas


inferiores.

from (struct sockaddr *): Estructura sockaddr con la direccin del


emisor.
pFromLen (int):

Tamao de la estructura sockaddr.

close

Descripcin: En la prctica se usar para cerrar un socket.


Parmetros:
fd (int):

Identificador del socket a cerrar.

bzero

Descripcin: Pone a ceros un buffer de memoria.


Parmetros:
buffer (char *): Apuntador al buffer que se pondr a ceros.
Isidro Calvo y A. Fabin Lpez
Dpto. Ingeniera de Sistemas y Automtica

Informtica Industrial

Comunicaciones en VxWorks Sockets UDP

nbytes (int):

10 de 12

Nmero de bytes que contiene el buffer.

inet_addr

Descripcin: Convierte una direccin IP en un entero largo


Parmetros:
inetString (char *):

Cadena con la direccin IP. P.e. 158.227.67.63

hostGetByName

Descripcin: Busca una direccin en la tabla de hosts.


Parmetros:
inetString (char *):

Cadena con el nombre del host.


P.e. bipa63.bi.ehu.es

htons

Descripcin: Macro que cambia de formato un short para poder usarse en determinadas
funciones de comunicaciones.
Parmetros:
number (short):

Nmero cuyo formato ser cambiado.

2.4.2. Funciones relacionadas con tareas


2.4.2.1. taskSpawn

Descripcin: Lanza una tarea.


Parmetros:
name (char *):

Nombre de la nueva tarea.

prioriry (int):

Prioridad de la nueva tarea

options (int):

Opciones. Utilizar 0x100.

stackSize (int):

Tamao en bytes de la pila utilizada. Utilcese


2000 bytes.

entryPt (FUNCPTR):

Punto de entrada a la nueva tarea.

arg1 (int):

Primero de 10 argumentos que se pasarn a la tarea.

arg2 (int)

arg10 (int)

2.4.2.2. taskDelay

Descripcin: Suspende la ejecucin de una tarea durante un determinado nmero de ciclos


de reloj.
Parmetros:
ticks (int): Nmero de ticks que se retrasa una tarea.

2.4.2.3. sysClkRateGet
Isidro Calvo y A. Fabin Lpez
Dpto. Ingeniera de Sistemas y Automtica

Informtica Industrial

Comunicaciones en VxWorks Sockets UDP

11 de 12

Descripcin: Devuelve el nmero de ticks del reloj del sistema que hay en un segundo.
Parmetros:
No tiene.

2.4.3. Funciones relacionadas con ficheros


2.4.3.1. usrFdConfig

Descripcin: monta un sistema de archivos de DOS en un disquete


Parmetros:
drive (int):

Nmero de unidad de disquete (de 0 a 3)

type (int):

Tipo de disquete
0- 3.5 1.44MB
1- 5.25 1.2MB

fileName (char *):

Punto de montaje. En VxWorks para montar en la raz


del disquete este valor debe valer /fd0.

2.4.4. Funciones relacionadas con el tiempo


2.4.4.1. time()

Descripcin: Determina la hora del sistema en segundos desde el 1/1/1970 a las 00:00:00 en
Universal Time.
Parmetros:
time_t (long int): Numero de segundos devuelto desde el 1/1/1970 a las
00:00:00

2.4.4.2. localtime()

Descripcin: Convierte un entero largo con los segundos desde el 1/1/1970 a las 00:00:00 en
UTC (Universal Time Coordinated) en una estructura predefinida con el tiempo local:
struct tm {
int
tm_sec;
/* Segundos 0-59*/
int
tm_min;
/* Minutos 0:59*/
int
tm_hour;
/* Horas 0-23*/
int
tm_mday;
/* Da del mes 1-31*/
int
tm_mon;
/* Mes 0-11*/
int
tm_year;
/* Aos desde 1900*/
int
tm_wday;
/* Da de la semana 0-6*/
int
tm_yday;
/* Da del ao 0-365*/
int
tm_isdst;
/* Cambio horario*/
Parmetros:
time_t (long int): Numero de segundos devuelto desde el
1/1/1970 a las 00:00:00

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica

Informtica Industrial

-I-

Sockets TCP

Informtica Industrial
(Ingeniera en Electrnica y Automtica)

Departamento de Ingeniera de Sistemas y


Automtica

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica

Informtica Industrial

- II -

INDICE

1.

Introduccin .............................................................................................................. 1

2.

Objetivos................................................................................................................... 2

3.

Se pide: ..................................................................................................................... 2

4.

Apndices ................................................................................................................. 2
4.1.

Estructuras para enviar y recibir datos en las tramas TCP ............................... 3

4.2.

Algunos includes y defines a utilizar................................................................ 3

4.3.

Cdigo para montar la disquetera ..................................................................... 4

4.4.

Conceptos de sockets ........................................................................................ 5

4.5.
Funciones a utilizar........................................................................................... 7
4.5.1.
Funciones relacionadas con el manejo de direcciones (inetLib.h) ........... 7
4.5.2.
Funciones relacionadas con el manejo de sockets (sockLib.h) ................ 9
4.5.3.
Esquemas de comunicacin Cliente Servidor ........................................ 13
4.5.4.
Funciones relacionadas con tareas (taskLib.h) ....................................... 14
4.5.5.
Funciones relacionadas con ficheros ...................................................... 15
4.5.6.
Funciones relacionadas con el tiempo (time.h) ...................................... 15

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica

Informtica Industrial

1 de 16

Comunicaciones en VxWorks Sockets TCP

15. Introduccin
En la presente prctica se va a implementar un sistema de control distribuido compuesto por
varios ordenadores. Uno de ellos, el control de planta, acta como supervisor de los
controladores de clula. Los controladores de clula recogen, con tarjetas de adquisicin de
datos, una serie de valores que envan al supervisor de planta el cual retorna un nmero de
secuencia y una nueva referencia. Los datos de la planta se envan entre los diferentes
componentes del sistema distribuido, a travs de una red Ethernet basndose en el modelo
Cliente-Servidor.
Para un posterior anlisis de los datos, los controladores de clula registran, en un fichero de
texto, tanto los datos de los sensores como la nueva referencia recibida desde el controlador de
planta, junto con el instante en que se ha recibido la nueva referencia.
El siguiente dibujo ilustra el proceso seguido para analizar los datos.
TCP/IP sobre Ethernet

Servidor: Recibe datos


de los sensores, calcula
el valor de la nueva
referencia y lo enva al
cliente.

Cliente: Enva datos ledos


por sensores y recibe el
nuevos valor de referencia.

Cliente

Cliente

Registra en un fichero de
texto tanto unos como otros.

Fichero de texto con los datos

Fichero de texto con los datos

Fichero de texto con los datos

Anlisis de los datos

Tanto los datos de los controladores de clula (Cliente) como los del controlador de planta
(Servidor) se envan a travs de una red Ethernet habindose escogido el protocolo TCP/IP
para distribuirlos.
Para la realizacin de esta prctica se ha escogido el protocolo TCP, orientado a conexin, en
lugar del protocolo UDP, basado en datagramas, es por su mayor fiabilidad.
Los datos que se enviarn en las tramas TCP consistirn en las siguientes estructuras, que
habr que definir en el fichero DatosTCP.h:
typedef struct

{
int iDia, iMes, iAnyo, iHora, iMinutos, iSegundos ;
} t_rgFechaHora ;

typedef struct

{
t_rgFechaHora
rgInstante ;
long int
lNumSecEnv
short int
iSensor_1 ;
float
rSensor_2 ;
} trgDatoEnviado ;
{

typedef struct

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica

/* Numero de secuencia */

Informtica Industrial

2 de 16

Comunicaciones en VxWorks Sockets TCP

long int
lNumSecRec ;
/* Numero de secuencia */
float
rNuevaReferencia ;
} trgDatoRecibido ;
La informacin que el cliente (controlador de clula) guardar en un fichero de texto, cuyo
nombre se pedir previamente por teclado, tendrn el siguiente formato:
Fecha

Hora

n sec. Envio

Sensor1

Sensor2

Donde los formatos de cada uno de los datos son:

n sec. Rec.

Fecha
Hora
N de secuencia
Valores del sensor 1
Valores del sensor 2
Valores de la referencia

Referencia

dd/mm/aa
hh:mm:ss
xxxx
xx
xxx.xx
xxx.xxx

16. Objetivos
Los objetivos principales de esta prctica son los siguientes:

Simular el funcionamiento un sistema simplificado de control distribuido.

Ilustrar cmo usar las comunicaciones con los protocolos TCP/IP.

Escribir datos en ficheros bajo el S.O. VxWorks.

Utilizar las funciones de hora del sistema.

17. Se pide:
Desarrollar el programa que ejecutar en ordenador cliente.
El programa en primer lugar preguntara si se ha montado la disquetera y si la respuesta es
negativa proceder a montarla.
Seguidamente, preguntar el nombre del fichero donde guardar los datos.
Posteriormente, y de modo continuo, preguntar si se quiere recibir una nueva referencia:

Si la respuesta es afirmativa leer la fecha y la hora del sistema, leer los valores de
los sensores y enviar los datos al servidor. El nmero de secuencia es un nmero
entero que se va incrementando con cada envo
Nota: Para simular la lectura de las tarjetas de adquisicin de datos se generarn de
manera aleatoria el valor de los dos sensores (el rango de valores del
sensor 1 es entre 10 y 15, y el del sensor 2 entre 100.0 y 125.0).
Esperar la llegada de la trama de datos del servidor con el nuevo valor de referencia
Escribir los datos en el fichero, de acuerdo con el formato descrito anteriormente.

18.

Si la respuesta es negativa se finalizar la ejecucin del programa.

Apndices

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica

Informtica Industrial

3 de 16

Comunicaciones en VxWorks Sockets TCP

Estructuras para enviar y recibir datos en las tramas TCP


/************** Contenido del fichero DatosTCP.h ****************/
#define PUERTO_SERVIDOR
#define DIRECCION_SERVIDOR

5002
"158.227.64.52"

/* Estructura para almacenar la informacin temporal de un instante */


typedef struct
{
int iDia, iMes, iAnyo, iHora, iMinutos, iSegundos ;
} t_rgFechaHora ;
/* Estructura enviada desde los clientes */
typedef struct
{
t_rgFechaHora
rgInstante ;
long int
lNumSecEnv
; /* Numero de secuencia
short int
iSensor_1 ;
float
rSensor_2 ;
} trgDatoEnviado ;

*/

/* Estructura recibida desde el servidor */


typedef struct
{
long int
lNumSecRec ;
/* Numero de secuencia
float
rNuevaReferencia ;
} trgDatoRecibido ;

*/

Algunos includes y defines a utilizar


/******************************* includes ********************************/
#include "inetLib.h"
#include "ioLib.h"
#include "sockLib.h"
#include "stdioLib.h"
#include "strLib.h"
#include "sysLib.h"
#include "string.h"
#include "fioLib.h"
#include "taskLib.h"
#include "time.h"
#include "usrLib.h"
#include "vxWorks.h"
#include "DatosTCP.h"
/* Contiene la declaracion de estructuras de datos,
el PUERTO_SERVIDOR y DIRECCIN_SERVIDOR
*/
...
/*************** definiciones para la compilacion condicionada ************/
#define ESCRIBIR_EN_FICHERO
...

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica

Informtica Industrial

4 de 16

Comunicaciones en VxWorks Sockets TCP

/********************** definicion de constantes globales ****************/


#define TRUE
1
#define FALSE
0
#define MIN_SENSOR_1
10
#define MAX_SENSOR_1
15
#define MIN_SENSOR_2
100.0
#define MAX_SENSOR_2
125.0
#define DISQUETERA_A
"/fd0/"
#define EXTENSION_FICHEROS
".txt"
/* ejemplo de nombre fichero: "/fd0/datos.txt */

...

Cdigo para montar la disquetera

/*************************************************************************/
/* MontarDisco
*/
/*************************************************************************/
void MontarDisco (void)
{
printf("Montando Disco...") ;
/* Unidad 0, disquete 3,5",
montar en directorio raiz */
if ( usrFdConfig (0, 0, "/fd0") == ERROR )
{
perror ( "Error en funcion: \"MontarDisco\"" ) ;
perror ( "Error montando la disquetera" )
;
}
else
printf ( "...Disco montado\n" ) ;
} /* MontarDisco */

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica

Informtica Industrial

5 de 16

Comunicaciones en VxWorks Sockets TCP

Conceptos de sockets
Los sockets son parte de los protocolos TCP/IP y originariamente se disearon para posibilitar
la comunicacin entre sistemas UNIX. VxWorks, hereda de UNIX el uso de los sockets, de
hecho, la forma de utilizarlos en VxWorks es totalmente paralela al mtodo seguido en UNIX.
Para poder trabajar con sockets hay que conocer algunos conceptos relacionados con las capas
inferiores de TCP/IP. Estos conceptos son la familia o dominio de conexin, as como su tipo.

Familia: Agrupa los sockets que comparten una serie de caractersticas comunes como
convenios para formar direcciones de red o para nombrar los objetos de la red. Las
familias ms comunes en los sistemas UNIX son:
o

AF_UNIX: Utiliza protocolos internos de UNIX. Se suele usar para comunicar


procesos que se ejecutan en una misma mquina ya que no realiza
accesos a la red. Utilizan manejadores de ficheros.

AF_INET: Utiliza protocolo de Internet, como el TCP orientado a conexin o


UDP no orientado a conexin. Esta familia de sockets se usa para
comunicar procesos entre mquinas distintas a travs de la red.

Otras familias: AF_CCITT, AF_NS, AF_SNA, AF_DECnet, AF_APPLETALK

Tipo de conexin: Se refiere al tipo de circuito que se establece entre los dos procesos
que se van a comunicar.
o

Virtual ( SOCK_STREAM ):

En la familia AF_INET usan el protocolo TCP.

Orientado a conexin: exigen una etapa previa a la conexin (transmisin de


mensajes entre emisor y receptor que garanticen el xito de la comunicacin
posterior de los datos).

Protocolo fiable: comprueba si existen errores


retransmitiendo aquellos mensajes incorrectos.

Con control de flujo: evita que un receptor lento quede desbordado con la
llegada de mensajes de un emisor ms rpido.

Permite circuitos virtuales: se conoce como STREAM o corriente de datos.

en la

transmisin

Datagrama ( SOCK_DGRAM ):

En la familia AF_INET usan el protocolo UDP.

Orientado a no conexin: no exige ningn proceso previo a la comunicacin.

Sin garanta de secuencia: los datos pueden llegar desordenados.

Sin garanta de fiabilidad: los datos pueden contener errores o perderse.

Sin control de flujo: no controla si el receptor es capaz de aceptar datos a la


misma velocidad que el emisor los enva.

Mejora las prestaciones del sistema: la red est menos tiempo ocupada.

SOCK_SEQPAQUET, SOCK_RDM, SOCK_RAW

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica

Informtica Industrial

6 de 16

Comunicaciones en VxWorks Sockets TCP

Direcciones de red: Las direcciones de red distinguen biunvocamente a cada nodo de la


red. Para hacer referencia a los nodos origen y destino de la conexin, algunas llamadas a
los sockets necesitan usar un puntero a una estructura de direccin de socket.

Las estructuras de datos y las funciones a utilizar estn definidas en los ficheros de
cabecera:
#include "sockLib.h"
#include "inetLib.h"
#include "hostLib.h"

La mayora de las funciones suelen utilizar como parmetro una estructura genrica para
especificar los datos de un socket:
o struct sockaddr {
sa_family_t
char
};

as_family ;
sa_data [14] ;

/* familia de sockets */
/* hasta 14 bytes con la direccin */

Es tan genrica que sirve para cualquier tipo de socket, normalmente utilizaremos
estructuras especficas que ocupan el mismo nmero de bytes y que podremos forzar con
un cast o molde al tipo base struct sockaddr cuando tengamos que pasarla como
parmetro.
El primer campo, as_family, especifica la familia (AF_UNIX o AF_INET) y el segundo,
sa_data, la direccin adecuada para cada familia.
Las estructuras especficas dependen de la familia. En el caso de la familia AF_INET (los
protocolos de Internet) siguen el siguiente formato:
o struct in_addr {
u_long s_addr ;
};
o struct sockaddr_in {
short
sin_family ;
u_short sin_port
;
in_addr sin_addr ;
char
sin_zero [8] ;
};

/* 32 bits con la identificacin de la red */


/* y el host (en binario)
*/

/* en este caso AF_INET


*/
/* 16 bits con el nmero de puerto */
/* id. red y host direccin IP
*/
/* 8 bytes sin usar
*/

NOTA: Antes de rellenar la estructura sockaddr_in, con la informacin de la familia, la


direccin y el puerto, es aconsejable rellenarla con ceros usando la funcin bzero.
Ejemplo:
struct sockaddr_in
rgDatosSocket
;
int
iDatosSocketSize ;
...
iDatosSocketSize = sizeof (struct sockaddr_in)
;
bzero ( (char *) &rgDatosSocket, iDatosSocketSize) ;
Isidro Calvo y A. Fabin Lpez
Dpto. Ingeniera de Sistemas y Automtica

Informtica Industrial

7 de 16

Comunicaciones en VxWorks Sockets TCP

Funciones a utilizar
Este apartado no pretende ser sustituir a los manuales de Tornado (disponibles en el entorno de
Tornado en versin electrnica desde la opcin de Men Help->Manual Index o en el fichero
vxWorks reference's manual.pdf), sino que slo pretende proporcionar una gua mnima con las
funciones disponibles en VxWorks para realizar la prctica. Se recomienda la consulta a los
manuales de Tornado para ms informacin sobre ellas.
Funciones relacionadas con el manejo de direcciones (inetLib.h)

Conversin de direccin con formato IP a entero largo

u_long inet_addr (const char * inetString ) ;


inetString puntero a cadena con una direccin en formato IP. Por
ejemplo: 90.0.0.2

Descripcin: Retorna al direccin intenet como entero largo (por ejemplo,


0x5a000002) o la constante ERROR.
Conversin de entero largo a direccin con formato IP

char * inet_ntoa (struct in_addr inetAddress ) ;


inetAddress estructura con el valor de una direccin IP expresada como
entero largo. Por ejemplo: 0x5a000002

Descripcin: Retorna un puntero a una cadena de caracteres que


representan una direccin IP (por ejemplo, 90.0.0.2) o la
constante ERROR.
Ejemplo:
char
inetString [20] ;
struct in_addr inetAddress ;
...
iaddr.s_addr = 0x5a000002;
...
strcpy (inetString, inet_ntoa (inetAddress)) ;

Conversin de direcciones de host y nmeros de puerto a direcciones de red y viceversa

Cuando se programa una aplicacin distribuida debemos tener en cuenta que puede
correr sobre distintas mquinas, que puede codificar los nmeros de forma distinta:
algunos utilizan codificacin big-endian y otros little-endian. Para evitar los errores el
intercambio de datos numricos a travs de una red (entre ellos direcciones IP y
Isidro Calvo y A. Fabin Lpez
Dpto. Ingeniera de Sistemas y Automtica

Informtica Industrial

8 de 16

Comunicaciones en VxWorks Sockets TCP

puertos) es necesario utilizar una codificacin estndar. Esta codificacin se denomina


codificacin de red.
Hay cuatro macros que permiten la conversin entre diferentes formatos (long y short a codificacin de red y
viceversa):

htonl - Entero largo (direccin IP) a codificacin de red:


in_addr_t htonl (in_addr_t hostLong ) ;
htons - Entero corto (n de puerto) a codificacin de red:
in_port_t htons (in_port_t hostShort ) ;
ntonl - Codificacin de red a entero largo (direccin IP) :
in_addr_t ntohl (in_addr_t netLong ) ;
ntohs - Codificacin de red a entero corto (n de puerto):
in_addr_t ntohs (in_addr_t netLong ) ;

Ejemplo :
#define PUERTO_DEL_SERVIDOR
...

5002

El cliente TCP ( va a enviar el nmero de puerto ):

struct

sockaddr_in

datosSocket ;

/* declarar variable */

...

datosSocket.sin_port

/* rellenar el campo: nmero de puerto*/


= htons (PUERTO_DEL_SERVIDOR)

El servidor TCP ( va a recibir el nmero de puerto ):

int
struct
int

sockaddr_in

/* declarar
socketServidor, newSocket
datosSocketCliente
datosSocketSize

variables */
;
;
;

...

/* aceptar peticiones */
newSocket = accept (socketServidor,
(struct sockaddr *) &datosSocketCliente,
&datosSocketSize) ;
/*Recibido los datos de socket que ha establecido conexin*/
printf ("\Recibida peticion de conexion: \n\tdireccion: %s"
"y\n\t puerto: %d",
inet_ntoa (datosSocketCliente.sin_addr),
ntohs
(datosSocketCliente.sin_port)) ;

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica

Informtica Industrial

9 de 16

Comunicaciones en VxWorks Sockets TCP

Funciones relacionadas con el manejo de sockets (sockLib.h)

Creacin de un socket

int socket (int domain, int type, int protocol ) ;


domain familia o dominio de protocolos: AF_UNIX, AF_INET,
type
tipo de conexin: SOCK_STREAM, SOCK_DGRAM,
protocol protocolo que se desea utilizar. (0 por omisin)

Descripcin: Reserva memoria y realiza las inicializaciones necesarias


para el tipo de comunicacin especificada. Crea un punto
terminal para conectarse a un canal bidireccional,
devolviendo un manejador de tipo entero (similar a un
manejador de E/S estndar). El manejador identifica al socket
en el resto de funciones.
En caso de error devuelve el valor -1, y en la variable global
errno queda codificado el error producido

Asignar direccin y puerto al socket. Publicar la direccin

int bind (int sfd, struct sockaddr * name , int name_len) ;


sfd
name

name_len

descriptor del socket


puntero a la estructura que contiene los datos especficos del
socket (direccin, puerto, ). Si se utilizar una estructura
sockaddr_in se debe hacer un cast al tipo struct sockaddr *
tamao de la estructura name

Descripcin: Asocia el descriptor del socket sfd a la estructura name


(direccin IP, puerto especfico, ) y la hace pblica.
Si la operacin se realiza correctamente devuelve el valor 0.
En caso de error devuelve el valor -1, y en la variable global
errno queda codificado el error producido
Esta operacin solamente es necesario realizarla en el
servidor, debido a que toda comunicacin es iniciada por un
proceso cliente, por lo que el socket servidor es el nico que
debe ser pblico. En el cliente tambin se realiza pero de
manera automtica
cuando el cliente inicia una
comunicacin.

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica

Informtica Industrial

10 de 16

Comunicaciones en VxWorks Sockets TCP

Transmisin de informacin

Debemos distinguir entre sockets de tipo Datagrama o UDP y sockets de tipo Stream o TCP.

9 Transmisin de informacin en sockets de tipo Datagrama


El cliente inicia la transmisin enviando un mensaje al socket del servidor mediante la
funcin sendto, que tiene como parmetros la descripcin, direccin y puerto, del
socket destino (servidor).
El servidor espera pasivamente la recepcin de datos en su socket mediante la funcin
recvfrom. En el momento en que recibe un mensaje dicha funcin devuelve el control,
indicando el mensaje recibido y la descripcin del socket que lo ha enviado (socket
cliente). Por ello el servidor tambin puede responder, establecindose una
comunicacin bidireccional.
int sendto (int sfd, void * message, int messsage_len, int flags,
struct sockaddr * dest_name , int dest_name_len) ;
sfd
descriptor del socket
message
puntero al buffer que contiene los datos que se envan
message_len
tamao del buffer
flags
permite controlar ciertos aspectos de la comunicacin.
Normalmente se pone a 0.
dest_name
puntero a la estructura que contiene los datos especficos
del socket (direccin, puerto, ).
dest_name_len tamao de la estructura dest_name
Descripcin: Devuelve el nmero de bytes enviados, o -1 en caso de error.
(int sfd, char * message, int messsage_len, int flags,
struct sockaddr * orig _name , int * name_len) ;
sfd
descriptor del socket
message
puntero al buffer que contiene los datos que recibidos
message_len
tamao del buffer message
flags
permite controlar ciertos aspectos de la comunicacin.
Normalmente se pone a 0.
orig_name
puntero a la estructura que contiene los datos especficos
del socket (direccin, puerto, ) que ha enviado el
mensaje.
orig_name_len tamao de la estructura orig_name

int recvfrom

Descripcin: Devuelve el nmero de bytes recibidos, o -1 en caso de error.

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica

Informtica Industrial

11 de 16

Comunicaciones en VxWorks Sockets TCP

9 Transmisin de informacin en sockets de tipo Stream


Antes de comenzar la transmisin de datos es preciso establecer un canal virtual para la
conexin:
El servidor se queda a la escucha de peticiones de conexin. Mediante
listen especifica el tamao de la cola de espera para admitir peticiones de
conexin. Mediante accept se queda a la escucha de peticiones de
conexin (quedando el proceso en espera). A este socket se le denomina
socket de escucha.Cuando se establece la conexin, la funcin accept retorna el control
creando un nuevo socket (socket de dialogo) por el cual puede comenzar
la comunicacin de datos. Tambin devuelve la direccin del socket
cliente que solicit la conexin de forma que la transmisin pueda ser
bidireccional.
En el servidor, por tanto, existen ms de un socket: uno que acepta
conexiones (el que creamos nosotros) y otro que crea el sistema operativo
por cada conexin que se establece.
Se pueden aceptar tantas conexiones como se hayan indicado con la
funcin listen.
El cliente, mediante la funcin connet, se encarga de establecer la
conexin entre el socket creado y el especificado en la estructura name.
int listen

(int sfd, int max_conex) ;


sfd
max_conex

descriptor del socket


tamao de la cola de peticiones de conexin

Descripcin: Si funciona correctamente devuelve 0, y en caso de error -1.


int accept

(int sfd, struct sockaddr * client_name, int * client_name_len) ;


sfd
client_name

client_name_len

descriptor del socket


puntero a la estructura que contiene datos especficos
del socket (direccin, puerto, ). La funcin accept
rellena esta estructura con la direccin del socket
remoto que ha pedido la conexin.
tamao real de la estructura client_name leda

Descripcin: Si funciona correctamente devuelve el descriptor del nuevo


socket creado que corresponde al socket remoto aceptado. En
caso de error devuelve -1.

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica

Informtica Industrial

12 de 16

Comunicaciones en VxWorks Sockets TCP

int connect (int sfd, struct sockaddr * serv_name, int * serv_name_len) ;


sfd
serv_name

client _name_len

descriptor del socket


puntero a la estructura que contiene datos especficos
del socket remoto (direccin, puerto, ) con el que se
desea conectar
tamao real de la estructura serv_name leda

Descripcin: Intenta una conexin quedando la llamada bloqueada hasta


que se establece la conexin. Si funciona correctamente
devuelve un 0 y en caso contrario devuelve -1.
Una vez establecida la conexin ambos procesos pueden comenzar la comunicacin a travs del socket de
dilogo. En este caso, las funciones no precisan ms informacin que el identificador del socket ya que el resto
de datos estn asociados a la conexin.

Se pueden utilizar las funciones especficas recv y send, o las funciones genricas de
entrada/salida estndar write/read. Tambin se pueden utilizar las funciones recvfrom y
sendto utilizadas en los sockets de tipo datagrama aunque en este caso el parmetro que
especifica la direccin IP y el puerto no se utiliza.
En la comunicacin orientada a conexin se transmiten flujos de datos, por lo que la
lectura puede corresponder a slo una parte del mensaje enviado. Deberemos establecer
por tanto un bucle de lectura que itere hasta que no existan mas datos en stream o
hayamos ledo el nmero de bytes esperados.
int send (int sfd, const char * message, int messsage_len, int flags) ;
sfd
message
message_len
flags

descriptor del socket


puntero al buffer que contiene los datos que se envan
tamao del buffer
permite controlar ciertos aspectos de la comunicacin.
Normalmente se pone a 0.

Descripcin: Devuelve el nmero de bytes enviados, o -1 en caso de error.


int recv (int sfd, void * message, size_t messsage_len, int flags) ;
sfd
message
message_len
flags

descriptor del socket


puntero al buffer que contiene los datos que recibidos
tamao del buffer
permite controlar ciertos aspectos de la comunicacin.
Normalmente se pone a 0.

Descripcin: Devuelve el nmero de bytes recibidos, o -1 en caso de error.


int write (int sfd, char * message, size_t messsage_len) ;
sfd
message
message_len
flags

descriptor del socket


puntero al buffer que contiene los datos que se envan
tamao del buffer
permite controlar ciertos aspectos de la comunicacin.
Normalmente se pone a 0.

Descripcin: Devuelve el nmero de bytes enviados, o -1 en caso de error.


Isidro Calvo y A. Fabin Lpez
Dpto. Ingeniera de Sistemas y Automtica

Informtica Industrial

13 de 16

Comunicaciones en VxWorks Sockets TCP

int read (int sfd, char * message, size_t messsage_len) ;


sfd
message
message_len
flags

descriptor del socket


puntero al buffer que contiene los datos que recibidos
tamao mximo del buffer
permite controlar ciertos aspectos de la comunicacin.
Normalmente se pone a 0.

Descripcin: Devuelve el nmero de bytes recibidos, o -1 en caso de error.

Eliminacin del socket

STATUS shutdown (int sfd, int how) ;


descriptor del socket
Sentido del cierre: recepcin de datos (0) , envo de datos
(1) y en ambos sentidos (2)

sfd
how

Descripcin: Cierra el canal en un sentido o en ambos.


STATUS close (int sfd) ;
descriptor del socket

sfd

Descripcin: Cierra el canal en los dos sentidos (recepcin y envo).


Esquemas de comunicacin Cliente Servidor

Esquema Cliente-Servidor con sockets no orientados a conexin

Abrir canal

Asociar direccin

Servidor

Cliente

socket ( )

socket ( )

bind ( )

bind ( )
Pedir servicio
sendto ( )

revfrom ( )
Devolver respuesta
sendto ( )

revfrom ( )

shutdown ( )

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica

Cerrar canal

Informtica Industrial

14 de 16

Comunicaciones en VxWorks Sockets TCP

Esquema Cliente-Servidor con sockets orientados a conexin

Servidor
Abrir canal

Asociar y publicar
direccin

socket ( )

bind ( )

Disponerse a
aceptar peticiones

listen ( )

Aceptar peticiones

accept ( )

Cliente
socket ( )

Abrir canal

connect ( )

Pedir conexin

Establecer conexin

Pedir servicio
send ( )

recv ( )
Devolver respuesta
send ( )

recv ( )

close ( )

Cerrar canal

Funciones relacionadas con tareas (taskLib.h)

Crear y lanzar una tarea

int taskSpawn (const char * nombre, int prioridad, int opciones, int stacksize,
entryPt (FUNCPTR) nombreFuncin, int arg1, int arg2, int arg3, ...
, int arg10) ;
nombre de la nueva tarea (una cadena de caracteres ASCII).
prioridad (0-255). Siendo 0 la mxima prioridad y 255 la mnima
opciones. Es un valor hexadecimal o una constante predefinida:
VX_FP_TASK (0x0008),
VX_NO_STACK_FILL (0x0100),
VX_PRIVATE_ENV (0x0080),
VX_UNBREAKABLE (0x0002)
tamao de la pila o stacksize en bytes (int).
direccin o nombre de la rutina principal ejecutada por la tarea. Su tipo
debe ser FUNCPTR.
y 10 argumentos que se pasarn a la rutina principal como parmetros de arranque.

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica

Informtica Industrial

15 de 16

Comunicaciones en VxWorks Sockets TCP

Ejemplo:
int LanzarTarea (void)
{
int
t_taskID ;
char * sNombreTarea = "tTarea_1" ;

/* funcion que crea y lanza la tarea */


/* ID Identificador de la tarea
/* Nombre de la tarea

*/
*/

if ( (t_taskID = taskSpawn(sNombreTarea, 120, VX_NO_STACK_FILL,2000,


(FUNCPTR) NombreFuncion,0,0,0,0,0,0,0,0,0,0))
== ERROR )
{
printf ("\nNO SE HA PODIDO CREAR LA TAREA: %s\n", sNombreTarea) ;
exit (-1) ;
}
return (0) ;
} /* LanzarTarea */

void NombreFuncion (void)


{
...
}

/* funcin ejecutada por la tarea */

Funciones relacionadas con ficheros

Montar un sistema de archivo DOS en un disquete

int usrFdConfig

(int drive, int type, char * fileName) ;

drive
type (0-255)
fileName

Nmero de unidad de diquete (de 0 a 3)


Tipo de disquete:
0 - 3.5 1.44MB
1 - 5.25 1.2MB
Punto de montaje. En VxWorks para montar en la raz del
disquete este valor debe valer /fd0.

Descripcin: monta un sistema de archivos de DOS en un disquete


Ejemplo:

int usrFdConfig (0, 0, /fd0) ;

Funciones relacionadas con el tiempo (time.h)

Determinar la fecha y la hora del sistema

time_t time (time_t * timer) ;


Descripcin:

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica

Devuelve el nmero de segundos transcurridos desde las


00:00:00 GMT del da 1 de enero de 1970.

Informtica Industrial

16 de 16

Comunicaciones en VxWorks Sockets TCP

Ejemplo:
time_t t ;
t = time(NULL) ;

Convertir un nmero de segundos en la fecha y hora locales correspondientes

struct tm* localtime (const time_t * timer) ;


timer

Nmeros de segundos transcurridos desde


00:00:00 GMT horas del 1 de enero de 1970.

Descripcin:

Retorna un puntero a una estructura struct tm. Esta


estructura es esttica y es sobrescrita en cada llamada a
localtime.
struct tm {
int
int
int
int
int
int
int
int
int
};

tm_sec ;
tm_min ;
tm_hour ;
tm_may ;
tm_mon ;
tm_year ;
tm_wday ;
tm_yday ;
tm_isdst ;

/* Segundos 0-59*/
/* Minutos 0:59*/
/* Horas 0-23*/
/* Da del mes 1-31*/
/* Mes 0-11*/
/* Aos desde 1900*/
/* Da de la semana 0-6*/
/* Da del ao 0-365*/
/* Cambio horario */

Ejemplo:
time_t
struct
struct

Segundos ;
tm * puntFechaHora ;
tm
FechaHora ;

Segundos = time(NULL) ;
puntFechaHora = localtime (Segundos);
FechaHora

Isidro Calvo y A. Fabin Lpez


Dpto. Ingeniera de Sistemas y Automtica

las

= * puntFechaHora ;

Informtica Industrial