Está en la página 1de 43

Unidad Didctica 6:

Otros servicios de los RTOS


Sistemas embebidos para tiempo real

ndice
Introduccin
Comunicacin entre tareas:
mail box, queues, pipes.

Gestin del tiempo


Eventos
Gestin dinmica de memoria
Interrupciones en RTOS
Resumen

Otros servicios de los RTOS

Sistemas embebidos de tiempo real

Introduccin
Servicios bsicos de RTOS
Planificador de tareas (multitarea)
Semforos: comunicacin y sincronizacin entre tareas

Servicios adicionales para comunicacin entre


tareas:
buzn de correo (mail boxes)
cola de mensajes (queue)
tuberas (pipes)

Otros servicios de los RTOS

Sistemas embebidos de tiempo real

Cola de mensajes
Cola de mensajes:
permite el envo de mensajes entre tareas.
mensajes organizados como un buffer circular.

Normalmente se usan cuando:


Se necesita un almac. temporal para rfagas de datos.
Existen varios generadores de datos y un slo
consumidor y no queremos bloquear a los generadores.

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

Sistemas embebidos de tiempo real

Cola de mensajes: Preguntas


Qu pasa si leemos cuando la cola esta vaca?
Ms comn: se bloquea a la tarea que llama
Muchos RTOSs ofrecen dos funciones para leer:
Leer de la cola, se bloquea si est vaca
Leer de la cola, retorna (inmediatamente) un error si vaca

Qu pasa si escribimos y est llena?


Ms comn: se retorna un error
Quien llama debe verificar el valor retornado. Qu hacer?

Menos comn: se bloquea hasta que haya lugar.


Obviamente esta versin no puede llamarse desde ISR.

Ninguna solucin se adapta a todas la necesidades.


Otros servicios de los RTOS

Sistemas embebidos de tiempo real

Cola de mensajes: Ejemplo


Registro de errores (logs)
Task1 & Task2: tareas de alta prioridad
requerimientos temporales exigentes

Si detectan errores necesitan registrarlos


almacenamiento no voltil o transmisin

Solucin: ErrorTask (tarea baja prioridad)


No afecta el tiempo de respuesta de Task1 & Task2

Comunicacin de errores
Opcin: cola de mensajes (se indica tipo error con un entero)

Otros servicios de los RTOS

Sistemas embebidos de tiempo real

/* RTOS queue function prototypes */


void AddToQueue (int iData);
void ReadFromQueue (int *p_iData);
/* Task1: high priority*/
void Task1 (void)
{
...
if (!! problem arises)
vLogError (ERROR_TYPE_X);
!! other things that need to be done
...
}
/* Task2: high priority */
void Task2 (void)
{
...
if (!! problem arises)
vLogError (ERROR_TYPE_Y);
!! other things that need to be done
...
}
Otros servicios de los RTOS

void vLogError (int iErrorType)


{
AddToQueue (iErrorType);
}
static int cErrors;
/* ErrorTask: low priority*/
void ErrorsTask (void)
{
int iErrorType;
while (FOREVER)
{
ReadFromQueue (&iErrorType);
++cErrors;
!! Send cErrors, iErrorType
}
}

Sistemas embebidos de tiempo real

Cola de mensajes: funciones


Dos funciones reentrantes:
AddToQueue( )
Agrega un mensaje a la cola

ReadFromQueue( )
Obtiene un mensaje de la cola

Repaso
Qu significa que las funciones sean reentrantes?
Qu garantiza?

Atencin: Ejemplo simplificado


Otros servicios de los RTOS

Sistemas embebidos de tiempo real

Colas y punteros
Puntero a void (null pointer): void*
Uso como comodn:
cualquier puntero puede ser transformado a void*
nuevamente transformado al tipo original

Cola de punteros a void


Encolado de mltiples datos (ejemplo: arreglo de char)
Se guardan los datos en un buffer
Se pasa un puntero al buffer en la cola

Encolado de un dato: ejemplo int


encolar como: (void *) data
recuperar y castear a int
Otros servicios de los RTOS

Sistemas embebidos de tiempo real

Colas en C/OS-II: resumen


OS_EVENT *OSQCreate(void **start, INT8U size)

Crea la cola con el arreglo de punteros a void creado


por la aplicacin.
INT8U OSQPost(OS_EVENT *pevent, void *msg)

Enva un mensaje a la cola.


void *OSQPend(OS_EVENT *pevent, INT16U timeout,
INT8U *err)

Espera un mensaje.

Detalles funciones...
Otros servicios de los RTOS

Sistemas embebidos de tiempo real

10

Colas: C/OS-II
OS_EVENT *OSQCreate(void **start, INT8U size)

Descripcin: Crea la cola.


Parmetros:
start puntero a arreglo de punteros a void, creado por la

aplicacin.
size tamao del arreglo de punteros.

Retrona:
OS_EVENT *

Otros servicios de los RTOS

puntero a la estructura usada para manejar la cola.

Sistemas embebidos de tiempo real

11

Colas: C/OS-II
INT8U OSQPost(OS_EVENT *pevent, void *msg)

Descripcin: Enva un mensaje


Parmetros:
pevent es el puntero a la estructura de la cola.
msg puntero al mensaje.

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

Sistemas embebidos de tiempo real

12

Colas: C/OS-II
void *OSQPend(OS_EVENT *pevent, INT16U timeout,
INT8U *err)

Descripcin: Espera un mensaje y devuelve su


direccin. Si da error retorna NULL y devuelve el cdigo
de error en la variable pasada por referencia err.
Parmetros:
pevent es el puntero a la estructura de la cola.
timeout tiempo mximo de espera (en ticks).
err devuelve un cdigo de error.

Retorna:
cdigos de error
Otros servicios de los RTOS

Sistemas embebidos de tiempo real

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;

Otros servicios de los RTOS

Sistemas embebidos de tiempo real

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

Sistemas embebidos de tiempo real

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);
...
}

void vLogError(int iErrorType)


{
BYTE byReturn;
/* Write to queue. Cast as void* */
byReturn = OSQPost (pOseQueue,
(void *) iErrorType);
if (byReturn != OS_NO_ERR)
!! Handle situation queue is full
}
static int cErrors;
void ErrorsTask(void)
{
int iErrorType;
BYTE byErr;
while (FOREVER)
{
/* Cast value received back to int.*/
iErrorType = (int) OSQPend(pOseQueue,
WAIT_FOREVER, &byErr);
++cErrors;
!! Send cErrors and iErrorType
}

Buzones
Permite el pasaje de un mensaje entre tareas
Similar uso a la cola de mensaje

Otros servicios de los RTOS

Sistemas embebidos de tiempo real

17

Buzones en C/OS-II: resumen


OS_EVENT *OSMboxCreate(void *msg)

Crea el buzn con el mensaje inicial msg.


void* OSMboxPend(OS_EVENT *pevent,
INT16U timeout, INT8U *err)

Espera a que llegue un mensaje y devuelve su


direccin.
INT8U OSMboxPost(OS_EVENT *pevent, void *msg)

Enva un mensaje al buzn. Si ya hay un mensaje


devuelve un cdigo de error.
Otros servicios de los RTOS

Sistemas embebidos de tiempo real

18

Buzones: C/OS-II
OS_EVENT *OSMboxCreate(void *msg)

Descripcin: Crea el buzn con el mensaje inicial.


Parmetros:
msg es el puntero al mensaje inicial

Retorna:
OS_EVENT *

Otros servicios de los RTOS

puntero al buzn.

Sistemas embebidos de tiempo real

19

Buzones: C/OS-II
void* OSMboxPend(OS_EVENT *pevent,
INT16U timeout, INT8U *err)

Descripcin: Espera a que llegue un mensaje y


devuelve su direccin.
Parmetros:
pevent es el puntero devuelto por OSMboxCreate()
timeout tiempo mximo de espera (en ticks).
err devuelve un cdigo de error.

Retorna:
void* direccin del mensaje

Otros servicios de los RTOS

Sistemas embebidos de tiempo real

20

Buzones: C/OS-II
INT8U OSMboxPost(OS_EVENT *pevent, void *msg)

Descripcin: Enva un mensaje al buzn. Si ya hay un


mensaje devuelve un cdigo de error.
Parmetros:
pevent es el puntero devuelto por OSMboxCreate().
msg es la direccin del mensaje.

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

Sistemas embebidos de tiempo real

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.

Otros servicios de los RTOS

Sistemas embebidos de tiempo real

22

#include <stdio.h>
#include "display.h"
/* Cabeceras de uC/OS-II */
#include <includes.h>

void TimePrint (void)


{
char buf[10];
Time time_copy, *pTime;
int error;

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

Es necesario establecer un protocolo:


terminadas por un carcter nulo
enviar el nmero de bytes total y luego el mensaje.

C/OS-II no dispone de esta funcionalidad.


Otros servicios de los RTOS

Sistemas embebidos de tiempo real

24

Buzones/Cola de mensajes/Tuberas
Atencin:
No garanta programas libres de errores.
Posibles fallos:

Usar el buzn/cola/tubera errneo.


Las colas se pueden llenar: disear para el peor caso de rfaga.
Al pasar punteros se pueden estar creando datos compartidos.
Si se usa la cola de punteros para enviar datos se pueden
interpretar mal.

Eleccin:
Entre RTOS varia cada implementacin
Considerar funcionalidad, rendimiento y costo
Otros servicios de los RTOS

Sistemas embebidos de tiempo real

25

Unidad Didctica 6:
Otros servicios de los RTOS
Sistemas embebidos para tiempo real

ndice
Introduccin
Comunicacin entre tareas:
mail box, queues, pipes.

 Gestin del tiempo


Eventos
Gestin dinmica de memoria
Interrupciones en RTOS
Resumen
Otros servicios de los RTOS

Sistemas embebidos de tiempo real

27

Gestin del tiempo


En los RTOS la gestin de tiempo es fundamental:
Rutinas de control deben ejecutarse peridicamente: TS.
Ahorro de energa: actividades no crticas han de
realizarse cada cierto tiempo (no continuamente).
Dilogo con el hardware.
Gestin de timeouts.

Otros servicios de los RTOS

Sistemas embebidos de tiempo real

28

Gestin del tiempo


Interrupcin peridica
incrementa un contador: cuenta desde el arranque.
cada incremento se denomina tick de reloj.
configurable al compilar el ncleo.
Para el C/OS-II el tick es de 10 ms por defecto.

Funcin retardo (delay)


retarda la tarea por el periodo de tiempo especificado,
es decir: se bloquea hasta que el tiempo expira

Otros servicios de los RTOS

Sistemas embebidos de tiempo real

29

Gestion del tiempo: C/OS-II


void OSTimeDly(INT16U ticks)

Suspende la tarea durante el nmero de ticks


especificado.
void OSTimeDlyHMSM(INT8U horas, INT8U min,
INT8U seg, INT8U mili)

Suspende la tarea durante el tiempo especificado en


horas, minutos, segundos y milisegundos.

Otros servicios de los RTOS

Sistemas embebidos de tiempo real

30

Gestin del tiempo: Preguntas


Cun preciso son los retardos?
Cmo se logran tiempos ms precisos?
Son tiles los timeout de los semforos, etc?

Otros servicios de los RTOS

Sistemas embebidos de tiempo real

31

Ejemplo
Implementacin: gestin de tiempo
Escribir seudo-cdigo para muestrear cada 1 seg un
dato del ADC.
Escribir cdigo para C/OS-II.

Otros servicios de los RTOS

Sistemas embebidos de tiempo real

32

Eventos
Es una bandera booleana que una tarea puede:
Crear, Disparar(Set), Borrar (Reset), Esperar (Wait for)

Generalmente manejados en grupos


Caractersticas:
Varias tareas se pueden desbloquear con un mismo
evento
Tarea se desbloquea por cualquier evento del grupo
Despus ocurre el evento, todas las tareas son
desbloqueadas y el evento se borra.

Diferencias y similitudes con semforos...


Otros servicios de los RTOS

Sistemas embebidos de tiempo real

33

Comunic. entre tareas: Comparacin


Semforos
Ms rpido y simple, pero informacin si/no (ocupado)
Una tarea solo se bloquea en un semforo por vez.

Eventos:
Poco ms complicado pero...
Una tarea puede esperar por muchos eventos a la vez.
Mltiples tareas pueden desbloquearse por un evento.

Colas (buzones y tuberas)


Una tarea solo se puede bloquear en una cola pero...
Permiten enviar ms informacin
Otros servicios de los RTOS

Sistemas embebidos de tiempo real

34

Gestin dinmica de memoria


Funciones: malloc() y free() de la librera estndar
no son apropiadas para sistemas de tiempo real
lentas
tiempos de ejecucin no predecibles.

RTOS disponen de funciones alternativas


pools de memoria: buffers de tamao fijo
comportamiento predecible
ciertas limitaciones

Otros servicios de los RTOS

Sistemas embebidos de tiempo real

35

Gestin de memoria: C/OS-II


La memoria se divide en particiones y cada particin se
divide en bloques del mismo tamao.
La aplicacin puede obtener bloques de una particin.
OS_MEM *OSMemCreate(void *addr, INT32U nblks,
INT32U blksize, INT8U *err).

Crea una particin de memoria.


void *OSMemGet(OS_MEM *pmem, INT8U *err)

Obtiene un bloque de memoria.


INT8U OSMemPut(OS_MEM *pmem, void *pblk)

Devuelve un bloque de memoria.


Otros servicios de los RTOS

Sistemas embebidos de tiempo real

36

OS_MEM *PartiMens; /* Estructura de control */


typedef struct{
INT8U id;
INT8U tiempo;
} Sensor;

/* Nmero del sensor */


/* Tiempo en ciclos del T7 de retardo del eco */

/* Se asigna memoria para la particin */


#define N_BLOQ_MENS 16
BYTE8 MemPartiMens[N_BLOQ_MENS][sizeof(Sensor)];
void main(void)
{
INT8U err;
OSInit();
...
PartiMens = OSMemCreate(MemPartiMens, N_BLOQ_MENS,
sizeof(INFO_SENSOR), &err);
if(err != OS_NO_ERR){
/* Abortamos porque no tenemos memoria */
}
...
OSStart();
}
Otros servicios de los RTOS

Sistemas embebidos de tiempo real

37

Interrupciones en RTOS

Observaciones:
1. Llamar funciones del RTOS que puedan bloquearse

Tomar semforos, leer de colas, esperar por eventos


1era regla

2. Llamar funciones del RTOS que pueda hacer


conmutar tareas

Liberar semforos, escribir en colas, disparar eventos

Otros servicios de los RTOS

Sistemas embebidos de tiempo real

38

Interrupciones: 2da observacin


ISR
RTOS

Envia mensaje
al buzn

Tarea1 (espera buzon)


Tarea2
ISR
RTOS

Entra a ISR

Envia mensaje
al buzn

Sale de ISR

Tarea1 (espera buzon)


Tarea2
Otros servicios de los RTOS

Sistemas embebidos de tiempo real

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.

Existen tres mtodos para solucionar el problema:


Avisar al RTOS de la entrada y salida de la ISR.
RTOS intercepta todas las interrupciones y luego llama
a la ISR proporcionada por la aplicacin.
Existen funciones especiales para su llamada desde las
ISR.
Otros servicios de los RTOS

Sistemas embebidos de tiempo real

40

Interrupciones en RTOS: C/OS-II


void OSIntEnter(void)

Indica al RTOS que se empieza a ejecutar una ISR.


void OSIntExit(void)

Indica al RTOS que se termina de ejecutar la ISR.


ISR
RTOS

OSIntEnter()

OSMboxPend( )

OSIntExit()

Tarea1 (espera buzon)


Tarea2

Otros servicios de los RTOS

Sistemas embebidos de tiempo real

41

Actividad en grupo

Implementacin: RadiomodemControl
Objetivo:

Escribir el cdigo de la tarea que maneja un radio-modem:


1.
2.
3.
4.

Espera por un mensaje para transmitir.


Pasa la radio a modo Tx: llama la funcin PTT_On().
Espera 250 ms (necesario para que se estabilice el transmisor).
Manda el mensaje: llama la funcin UART_Send(...) que retorna luego
de mandar todos los caracteres. Explicar modificaciones a realizar a la
funcin original.
5. Pasa la radio a modo Rx: llama la funcin PTT_Off().
6. Vuelve al punto 1.

Grupos:

2 a 4 participantes

Tiempo:

5 minutos para implementar el mdulo

Puesta en comn.
Otros servicios de los RTOS

Sistemas embebidos de tiempo real

42

Bibliografa
An Embedded Software PrimerDavid E. Simon
Chapter 7: More Operating System Services

Otros servicios de los RTOS

Sistemas embebidos de tiempo real

43

También podría gustarte