Beruflich Dokumente
Kultur Dokumente
ndice
Introduccin
Comunicacin entre tareas:
mail box, queues, pipes.
Introduccin
Servicios bsicos de RTOS
Planificador de tareas (multitarea)
Semforos: comunicacin y sincronizacin entre tareas
Cola de mensajes
Cola de mensajes:
permite el envo de mensajes entre tareas.
mensajes organizados como un buffer circular.
Dos estrategias:
Se enva un puntero a los datos del mensaje (C/OS-II)
Se copian los datos directamente (otros)
Otros servicios de los RTOS
Comunicacin de errores
Opcin: cola de mensajes (se indica tipo error con un entero)
ReadFromQueue( )
Obtiene un mensaje de la cola
Repaso
Qu significa que las funciones sean reentrantes?
Qu garantiza?
Colas y punteros
Puntero a void (null pointer): void*
Uso como comodn:
cualquier puntero puede ser transformado a void*
nuevamente transformado al tipo original
Espera un mensaje.
Detalles funciones...
Otros servicios de los RTOS
10
Colas: C/OS-II
OS_EVENT *OSQCreate(void **start, INT8U size)
aplicacin.
size tamao del arreglo de punteros.
Retrona:
OS_EVENT *
11
Colas: C/OS-II
INT8U OSQPost(OS_EVENT *pevent, void *msg)
Retorna:
OS_NO_ERR. Mensaje enviado a la cola.
OS_Q_FULL. Si la cola est llena..
OS_ERR_EVENT_TYPE. pevent no apunta a un buzn.
OS_ERR_PEVENT_NULL. pevent es un NULL.
OS_ERR_POST_NULL_PTR. msg es un NULL.
Otros servicios de los RTOS
12
Colas: C/OS-II
void *OSQPend(OS_EVENT *pevent, INT16U timeout,
INT8U *err)
Retorna:
cdigos de error
Otros servicios de los RTOS
13
Colas: C/OS-II
Estructura:
OS_EVENT
typedef struct{
INTU8 OSEventType; /* Tipo de evento */
INTU8 OSEventGrp;
/* Grupos de la lista de espera */
INT16U OSEventCnt; /* Contador (para semforos) */
void *OSEventPtr;
/* Puntero al mensaje */
INT8U OSEventTbl[OS_EVENT_TBL_SIZE]; /* Lista de espera */
} OS_EVENT;
14
Actividad en grupo
Implementacin: registro de errores
Objetivo:
Escribir el cdigo para C/OS-II del ejemplo de uso de colas
para implementar el registro de errores.
Material:
Cdigo genrico de la implementacin (no incluye main).
Prototipos de las funciones de cola de C/OS-II.
Grupos:
3 a 4 participantes
Tiempo:
10 minutos
Puesta en comn.
Otros servicios de los RTOS
15
#define WAIT_FOREVER 0
/* Our message queue */
static OS_EVENT *pOseQueue;
/* The data space for our queue */
#define SIZEOF_QUEUE 25
void* apvQueue[SIZEOF_QUEUE];
void main(void)
{
pOseQueue = OSQCreate (apvQueue,
SIZEOF_QUEUE);
!! Create Task1
!! Create Task2
!! Create ErrorTask
}
void Task1(void)
{
...
if (!! problem arises)
vLogError(ERROR_TYPE_X);
!! Other things that need to be done
...
}
void Task2(void) {
...
if (!! problem arises)
vLogError(ERROR_TYPE_Y);
...
}
Buzones
Permite el pasaje de un mensaje entre tareas
Similar uso a la cola de mensaje
17
18
Buzones: C/OS-II
OS_EVENT *OSMboxCreate(void *msg)
Retorna:
OS_EVENT *
puntero al buzn.
19
Buzones: C/OS-II
void* OSMboxPend(OS_EVENT *pevent,
INT16U timeout, INT8U *err)
Retorna:
void* direccin del mensaje
20
Buzones: C/OS-II
INT8U OSMboxPost(OS_EVENT *pevent, void *msg)
Retorna:
OS_NO_ERR. Mensaje depositado en el buzn.
OS_MBOX_FULL. El buzn contiene un mensaje.
OS_ERR_EVENT_TYPE. pevent no apunta a un buzn.
OS_ERR_PEVENT_NULL. pevent es un NULL.
OS_ERR_POST_NULL_PTR. msg es un NULL.
Otros servicios de los RTOS
21
Buzn: Ejemplo
Tarea de Impresin
Una tarea encargada de administrar la impresin
Comunicacin entre la tarea de impresin y el resto de
las tareas: va un Buzn
Estudio de caso:
rutina de interrupcin del timer manda actualizar el
tiempo mostrado en el display.
22
#include <stdio.h>
#include "display.h"
/* Cabeceras de uC/OS-II */
#include <includes.h>
typedef struct{
INTU8 hh;
INTU8 mm;
INTU8 ss;
} Time;
while(1){
pHora = (Time *) OSMboxPend(
pMbox_time, 0, &error);
if(error == OS_NO_ERR){
/* copia de dato compartido */
__disableInt();
time_copy = *pHora;
__enableInt();
sprintf(buf,
"\n%02d:%02d:%02d",
time_copy.hh,
time_copy.mm,
time_copy.ss);
DisplayPutString(buf);
}else{
/* Procesar el error */
}
}
OS_EVENT *pMbox_time;
void main(void)
{
/*bla bla bla*/
pMbox_time = OSMboxCreate(NULL);
/*bla bla bla*/
}
__interrupt void TimerISR (void)
{
static Time time_act;
time_act.ss++;
if(time_act.ss == 60){
...
}
OSMboxPost(pMbox_time, &time_act);
}
Pipes (tuberas,cao)
Las tuberas (pipes) son similares a las colas.
Las diferencias principales son:
Mensajes pueden ser de distinto tamao.
Cada tarea puede escribir/leer nm arbitrario de bytes.
Normalmente se usan para cadenas de caracteres
24
Buzones/Cola de mensajes/Tuberas
Atencin:
No garanta programas libres de errores.
Posibles fallos:
Eleccin:
Entre RTOS varia cada implementacin
Considerar funcionalidad, rendimiento y costo
Otros servicios de los RTOS
25
Unidad Didctica 6:
Otros servicios de los RTOS
Sistemas embebidos para tiempo real
ndice
Introduccin
Comunicacin entre tareas:
mail box, queues, pipes.
27
28
29
30
31
Ejemplo
Implementacin: gestin de tiempo
Escribir seudo-cdigo para muestrear cada 1 seg un
dato del ADC.
Escribir cdigo para C/OS-II.
32
Eventos
Es una bandera booleana que una tarea puede:
Crear, Disparar(Set), Borrar (Reset), Esperar (Wait for)
33
Eventos:
Poco ms complicado pero...
Una tarea puede esperar por muchos eventos a la vez.
Mltiples tareas pueden desbloquearse por un evento.
34
35
36
37
Interrupciones en RTOS
Observaciones:
1. Llamar funciones del RTOS que puedan bloquearse
38
Envia mensaje
al buzn
Entra a ISR
Envia mensaje
al buzn
Sale de ISR
39
Interrupciones en RTOS
2da Regla:
No llamar funciones del RTOS que pueda hacer
conmutar tareas, sin que RTOS sepa que se est en una
interrupcin.
40
OSIntEnter()
OSMboxPend( )
OSIntExit()
41
Actividad en grupo
Implementacin: RadiomodemControl
Objetivo:
Grupos:
2 a 4 participantes
Tiempo:
Puesta en comn.
Otros servicios de los RTOS
42
Bibliografa
An Embedded Software PrimerDavid E. Simon
Chapter 7: More Operating System Services
43