PDF de programación - PTR-TEMA3

Imágen de pdf PTR-TEMA3

PTR-TEMA3gráfica de visualizaciones

Publicado el 14 de Enero del 2017
604 visualizaciones desde el 14 de Enero del 2017
234,9 KB
38 paginas
Creado hace 9a (05/05/2014)
UNIVERSIDAD
DE CANTABRIA

Plataformas de Tiempo Real:
Dispositivos y Drivers
Tema 3. Programación avanzada de E/S en Linux
• Operaciones de control en el driver
• Sincronización
• Temporización
• Acceso al hardware
• Interrupciones
• Threads del kernel
• Drivers en RT-Linux

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS
8

© J. Javier Gutiérrez, Michael González

5/ma/14

1

UNIVERSIDAD
DE CANTABRIA

Operaciones de control en el driver
Las operaciones de control sobre el dispositivo se hacen a través
del punto de entrada ioctl:
• establecer ciertos parámetros del dispositivo
• obtener información sobre el estado del mismo
La orden de control al dispositivo consta de dos parámetros:
• cmd es la orden
• arg es un argumento para ejecutar la orden
En Linux los comandos se pueden definir de acuerdo a unos
criterios que codifican los números mágicos:
• cuatro grupos de bits: tipo, número, dirección y tamaño
• una serie de macros para construirlos y consultarlos

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

© J. Javier Gutiérrez, Michael González

5/ma/14

2

Operaciones de control en el driver
(cont.)
En cualquier caso los comandos y los argumentos que éstos
necesitan son un compromiso entre el driver y el programa de
aplicación
La implementación del ioctl es normalmente una instrucción
switch basada en el número del comando
El valor de retorno:
• si el número de comando no es válido algunas funciones

devuelven -EINVAL (argumento inválido)

UNIVERSIDAD
DE CANTABRIA

• POSIX establece que se devuelva -ENOTTY (comando

inapropiado para dispositivo)

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

© J. Javier Gutiérrez, Michael González

5/ma/14

3

Acceso al argumento del ioctl

UNIVERSIDAD
DE CANTABRIA

Como para las operaciones de lectura y escritura es necesario
intercambiar información con la memoria de usuario
• se pueden utilizar copy_from_user y copy_to_user
• para intercambio de datos pequeños (uno, dos, cuatro y ocho
bytes) se pueden utilizar otras macros definidas en <asm/
uaccess.h>:


put_user(dato, puntero);

get_user(local, puntero);

- escribe el dato al puntero del espacio de usuario y viceversa
- el tamaño del dato depende del tipo del puntero
- devuelve un cero si va bien o -EFAULT si falla; se llama

internamente a access_ok que chequea si el puntero es válido

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

© J. Javier Gutiérrez, Michael González

5/ma/14

4

UNIVERSIDAD
DE CANTABRIA

Ejemplo: iocontrol
Definición de las constantes de control

// ioconst.h

// comandos de ioctl

#define CAMBIAR_MODO 10
#define LEER_MODO 100

// modos de operación para el argumento

#define IO_MODO1 1
#define IO_MODO2 2

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

© J. Javier Gutiérrez, Michael González

5/ma/14

5

Ejemplo: iocontrol (cont.)

UNIVERSIDAD
DE CANTABRIA

// iocontrol.h

int iocontrol_open(struct inode *inodep, struct file *filp);

int iocontrol_release(struct inode *inodep, struct file *filp);

ssize_t iocontrol_read (struct file *filp, char *buff,
size_t count, loff_t *offp);

ssize_t iocontrol_write (struct file *filp, const char *buff,

size_t count, loff_t *offp);

int iocontrol_ioctl(struct inode *inodep, struct file *filp,

unsigned int cmd, unsigned long arg);

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

© J. Javier Gutiérrez, Michael González

5/ma/14

6

Iocontrol: includes y variables globales

UNIVERSIDAD
DE CANTABRIA

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <asm/uaccess.h>
#include "iocontrol.h"
#include "ioconst.h"

MODULE_LICENSE("GPL");

struct iodatos {
struct cdev *cdev; // Character device structure
dev_t dev; // informacion con el numero mayor y menor
int modo; // registro del modo de operación
};

static struct iodatos datos;

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

© J. Javier Gutiérrez, Michael González

5/ma/14

7

Iocontrol: inicialización de puntos de
entrada y modo

UNIVERSIDAD
DE CANTABRIA

static struct file_operations iocontrol_fops = {
THIS_MODULE, // owner
..., // todo nulos
};

static int modulo_instalacion(void) {

...

// ponemos los puntos de entrada y el modo
iocontrol_fops.open=iocontrol_open;
iocontrol_fops.release=iocontrol_release;
iocontrol_fops.write=iocontrol_write;
iocontrol_fops.read=iocontrol_read;
iocontrol_fops.ioctl=iocontrol_ioctl;
datos.modo = IO_MODO1;

...
}

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

© J. Javier Gutiérrez, Michael González

5/ma/14

8

Iocontrol: operaciones de lectura
Solamente informan del estado que implementan

UNIVERSIDAD
DE CANTABRIA

ssize_t iocontrol_read (struct file *filp, char *buff,

size_t count, loff_t *offp)

{
printk(KERN_INFO "iocontrol> (read) estoy en MODO 1\n");
return 0;
}

ssize_t iocontrol_read2 (struct file *filp, char *buff,

size_t count, loff_t *offp)

{
printk(KERN_INFO "iocontrol> (read) estoy en MODO 2\n");
return 0;
}

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

© J. Javier Gutiérrez, Michael González

5/ma/14

9

Iocontrol: operaciones de escritura
Solamente informan del estado que implementan

UNIVERSIDAD
DE CANTABRIA

ssize_t iocontrol_write (struct file *filp, const char *buff,

size_t count, loff_t *offp)

{
printk(KERN_INFO "iocontrol> (write) estoy en MODO 1\n");
return count;
}

ssize_t iocontrol_write2 (struct file *filp, const char *buff,

size_t count, loff_t *offp)

{
printk(KERN_INFO "iocontrol> (write) estoy en MODO 2\n");
return count;
}

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

© J. Javier Gutiérrez, Michael González

5/ma/14

10

Iocontrol: ioctl

UNIVERSIDAD
DE CANTABRIA

int iocontrol_ioctl (struct inode *inodep, struct file *filp,
unsigned int cmd, unsigned long arg)
{
int modo;

switch (cmd) {
case CAMBIAR_MODO:
// capturamos el modo que llega en arg
if (get_user(modo,(int *)arg)) {
printk(KERN_ERR "iocontrol> (ioctl) puntero erroneo\n");
return -EFAULT;
}
printk(KERN_INFO "iocontrol> (ioctl) el modo es =%d\n",mo-
do);

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

© J. Javier Gutiérrez, Michael González

5/ma/14

11

Iocontrol: ioctl (cont.)

UNIVERSIDAD
DE CANTABRIA

// cambiamos de modo
switch (modo) {
case IO_MODO1:
filp->f_op->read=iocontrol_read;
filp->f_op->write=iocontrol_write;
datos.modo=modo;
break;
case IO_MODO2:
filp->f_op->read=iocontrol_read2;
filp->f_op->write=iocontrol_write2;
datos.modo=modo;
break;

default:
printk(KERN_ERR "iocontrol> (ioctl) modo %d no valido\n",modo);
return -EINVAL;
}
break; // fin de CAMBIAR_MODO

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

© J. Javier Gutiérrez, Michael González

5/ma/14

12

Iocontrol: ioctl (cont.)

UNIVERSIDAD
DE CANTABRIA

case LEER_MODO:
if (put_user(datos.modo,(int *)arg)) {
printk(KERN_ERR "iocontrol> (ioctl) puntero erroneo\n");
return -EFAULT;
}
break;

default:
printk(KERN_ERR "iocontrol> (ioctl) comando %d no vali-
do\n",cmd);
return -EINVAL;
}
printk(KERN_INFO "iocontrol> (ioctl) nuevo modo =%d\n",da-
tos.modo);
return 0;
}

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

© J. Javier Gutiérrez, Michael González

5/ma/14

13

Prueba de iocontrol

UNIVERSIDAD
DE CANTABRIA

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include "ioconst.h"

int main() {

int fd;
int modo;
char *mistring="Hola yo soy un mensaje";
char strleido[100];
ssize_t leidos, escritos;

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

© J. Javier Gutiérrez, Michael González

5/ma/14

14

Prueba de iocontrol (cont.)

UNIVERSIDAD
DE CANTABRIA

//Primer uso dejado con el modo cambiado
fd=open("/dev/ioctl0", O_RDWR);
if (fd==-1) { perror("Error al abrir el fichero");
exit(1);}
printf("Fichero abierto\n");
escritos=write(fd,mistring,strlen(mistring)+1);
printf("Escrito en modo 1\n");

//cambio a modo 2
modo=IO_MODO2;
ioctl(fd,CAMBIAR_MODO,&modo);
leidos=read(fd,&strleido,100);
printf("Leido en modo 2\n");

//cambio de nuevo a modo 1
modo=IO_MODO1;
ioctl(fd,CAMBIAR_MODO,&modo);
leidos=read(fd,&strleido,100);
printf("Leido en modo 1\n");

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

© J. Javier Gutiérrez, Michael González

5/ma/14

15



Prueba de iocontrol (cont.)

UNIVERSIDAD
DE CANTABRIA

// cambio final a modo 2
modo=IO_MODO2;
ioctl(fd,CAMBIAR_MODO,&modo);
escritos=write(fd,mistring,strlen(mistring)+1);
printf("Escrito en modo 2\n");

if (close(fd)==-1) {perror("Error al cerrar el fichero");
exit(1);}
printf("Fichero cerrado\n");

//Segundo uso
fd=open("/dev/ioctl0", O_RDWR);
if (fd==-1) {perror("Error al abrir el fichero");
exit(1);}
printf("Fichero abierto\n");

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

© J. Javier Gutiérrez, Michael González

5/ma/14

16

Prueba de iocontrol (cont.)

UNIVERSIDAD
DE CANTABRIA

modo=1234; //para probar que se lee bien
ioctl(fd,LEER_MODO,&modo);
printf("Operando en modo %d \n", modo);

escritos=write(fd,mistring,strlen(mistring)+1);
printf("Escrito\n");

if (close(fd)==-1) {
perror("Error al cerrar el fichero");
exit(1);
}
printf("Fichero cerrado\n");

exit(0);
}

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

© J. Javier Gutiérrez, Michael González

5/ma/14

17

UNIVERSIDAD
DE CANTABRIA

Plataformas de Tiempo Real:
Disposi
  • Links de descarga
http://lwp-l.com/pdf1134

Comentarios de: PTR-TEMA3 (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad