100% encontró este documento útil (1 voto)
138 vistas143 páginas

Apunte Final STR

1. El documento presenta el programa de estudios de un curso sobre sistemas en tiempo real (STR). 2. Las unidades cubren conceptos básicos de STR, arquitectura general, sistemas operativos en tiempo real, programación en tiempo real y unidades lógicas y de estado finito. 3. Los temas incluyen definiciones de STR, tipos de estrictez temporal, componentes de STR y conceptos como concurrencia, comunicación entre procesos y planificación de tareas.

Cargado por

Mario Ramos
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
100% encontró este documento útil (1 voto)
138 vistas143 páginas

Apunte Final STR

1. El documento presenta el programa de estudios de un curso sobre sistemas en tiempo real (STR). 2. Las unidades cubren conceptos básicos de STR, arquitectura general, sistemas operativos en tiempo real, programación en tiempo real y unidades lógicas y de estado finito. 3. Los temas incluyen definiciones de STR, tipos de estrictez temporal, componentes de STR y conceptos como concurrencia, comunicación entre procesos y planificación de tareas.

Cargado por

Mario Ramos
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

PROGRAMA SISTEMAS EN TIEMPO REAL

Unidad N° 1: Introducción a los STR:

Conceptos y definiciones más destacadas. Estrictisidad. Profundidad. Componentes.


Características en los requerimientos. Relación de la dimensión y la complejidad. Tipos de
datos necesarios. Planteo de concurrencia; control de procesos; de iteración con el medio y
de la fiabilidad y tolerancia a fallos. Conceptos de SRLA y SRLC.
Unidad N° 2: Generalidad de la estructura:

Unidad central de procesamiento. Control por supervisión del estado. Control por
interrupción. Programación a bajo nivel. Planificación y drivers de periféricos:
sincronización por interrupciones, Polling e interrupciones vectorizadas, controladores de
interrupción y transferencia de datos. DMA. Timers y servicios de tiempo. Circuitos de
Watch-dog. Entrada/Salida. Conversores A/D y D/A.
Unidad N° 3: Introducción a los RTOS:

Sistema operativo de uso general. Sistemas operativos multitarea de tiempo real.


Administrador de tareas. Requisitos temporales. Tareas periódicas y esporádicas.
Administración básica de memoria, intercambio de segmentos de programa por las propias
tareas. Procesos e hilos. comunicación entre procesos. Secciones críticas. Exclusión mutua
con espera activa. Dormir y despertar. Semáforos. Monitores. Transferencia de mensajes.
Control de recursos.
Unidad N° 4: Programación en RT:

Descripción general. Acceso a un clock. Retraso de un proceso. Programación de actividades


periódicas. Programación de timeouts. Especificación de requisitos temporales. Atributos
temporales. Tareas periódicas y tareas esporádicas. Planificación. Modelo simple y
planificación por prioridades fijas con desalojo. Tests basados en la utilización y en el
análisis de cada tarea. Procesos esporádicos. Interacción entre procesos. Planificación de
tareas. Herencia de prioridades, prioridad dinámica y prioridades de colas.
Unidad N°5: Unidad Aritmética y Lógica:

Sistemas de numeración. Operaciones en los sistemas binarios. Indicadores SZVC.


Detección y toma de decisiones lógica. Unidades aritméticas y lógicas (ALU) con
selección de operación.
Unidad N°6: Autómatas de Estados Finitos:
Modelado de los autómatas de estado finitos y sus tipos. Memorias de un bit. Expresión del
funcionamiento. Análisis y Síntesis de sistemas secuenciales asíncronos y síncronos.
Limitaciones de la máquina de estados finita determinista.
Unidad N° 1: Introducción a los STR:

Conceptos y definiciones más destacadas. Estrictisidad. Profundidad. Componentes.


Características en los requerimientos. Relación de la dimensión y la complejidad. Tipos de
datos necesarios. Planteo de concurrencia; control de procesos; de iteración con el medio y
de la fiabilidad y tolerancia a fallos. Conceptos de SRLA y SRLC.
Unidad 1: introducción a los STR

1. Conceptos y definiciones más destacadas

Sistemas reactivos son aquellos que a partir de la ocurrencia de un evento que proviene
del medio exterior y con el cual interacciona, tiene la capacidad de “entender” ese
evento, generar una acción, calcular o cambiar su comportamiento ya sea sobre sí o sobre el
medio.
Sistemas estocástico (sistema previo o predictivo) saber qué podrá suceder antes del
evento según acciones pasadas.

Un sistema reactivo previo no existe porque necesita que el evento suceda.


Sistemas dedicados pensados y diseñados para dar una respuesta a una aplicación
específica previendo un tiempo de vida útil que generalmente lo determina por las
condiciones ambientales o de contexto de la aplicación. Es un desarrollo a medida.

*bajo qué condiciones durará cierto tiempo

*puede o no recibir un evento para que reaccione

Un sistema reactivo no puede ser dedicado.


Sistemas de tiempo real
● Sistema digital (informático) que cumple con dos condiciones:
a- Va a interaccionar repetitivamente con el contexto (medio físico)
b- Va a responder a cada uno de esos estímulos siempre dentro de un plazo de tiempo
determinado más o menos un incremento también determinado.
● Un sistema en tiempo real es un sistema informático que debe satisfacer las
limitaciones del tiempo de respuesta limitado o arriesgarse a sufrir consecuencias
graves, incluida la falla.
● Un sistema en tiempo real es aquel cuya corrección lógica se basa tanto en la
exactitud de los resultados y su puntualidad.
● Sistema informático en el que es significativo el tiempo en el que se producen sus
acciones. No es suficiente que las acciones del sistema sean lógicamente correctas,
sino que, además, es necesario que se produzcan en el instante adecuado (antes de
un tiempo máximo).
● Condición temporal:
Para que un STR funcione de manera correcta no basta con que las acciones sean correctas,
sino que además debe definir sus salidas dentro de un tiempo especificado. No importa la
magnitud, si es mucho o poco tiempo: Salida correcta en el tiempo especificado
Definiciones útiles:
Tiempo de respuesta→ tiempo entre la presentación de un conjunto de entradas a un
sistema y la realización del comportamiento requerido, incluida la disponibilidad de todas
las salidas asociadas. Qué tan rápido y puntual debe ser el tiempo de respuesta depende de
las características y el propósito del sistema específico.

Falla/ fracaso→ "Incapacidad del sistema para funcionar de acuerdo con las
especificaciones del sistema".

Un sistema fallido es un sistema que no puede satisfacer uno o más de los requisitos
estipulados en la especificación de requisitos del sistema.
2. Estricticidad// Estrictez

Estos tipos de sistemas se pueden distinguir de aquellos otros en los que un fallo al
responder puede ser considerado como una respuesta mala o incorrecta. Efectivamente,
para algunos este es el aspecto que distingue un STR de otros en los que el tiempo de
respuesta es importante pero no crucial.

Por lo tanto, la corrección de un STR depende, no solo del resultado lógico de la


computadora, sino también del tiempo en el que se producen los resultados.
STR estrictos/ hard/ críticos→ aquellos en los que es absolutamente crucial que las
respuestas se produzcan dentro del tiempo límite especificado. Todas sus acciones deben
terminar dentro de un plazo especificado. Por ejemplo, sistema de control de vuelo de un
avión.
STR no estrictos /soft/ esenciales→ los tiempos de respuesta son importantes pero el
sistema seguirá funcionando correctamente aunque los tiempos límite no se cumplan
ocasionalmente. Se pueden exceder de ese plazo de vez en cuando, pero el valor de la
respuesta decrece con el tiempo. Por ejemplo, adquisición de datos para una aplicaciónde
control de procesos.
STR firm→ Un sistema firme en tiempo real es aquel en el que unas pocas fechas límite
incumplidas no conducirán a una falla total, pero faltar más de unas pocas puede conducir a
una falla completa o catastrófica del sistema.

Pueden perder el plazo ocasionalmente y una respuesta tardía no tiene valor. Es como una
mezcla entre hard y soft, hasta un tiempo funciona como hard pero luego de ese tiempo
existen pérdidas (la respuesta ya no tiene valor pero el sistema sigue funcionando bien)
Para que un STR funcione correctamente no basta con que sus salidas sean correctas, sino
que además las debe definir dentro de un tiempo especificado. En otras palabras, debe
garantizar una respuesta antes de que se cumpla un límite de tiempo o deadline.

Deadline es el tiempo máximo que se permite a un proceso computacional terminar su


ejecución. El deadline absoluto es el tiempo en el que la tarea tiene que estar resuelta;
por otro lado, el deadline relativo es el tiempo que tiene que pasar como máximo en el
momento en el que llega la tarea y el momento en el que se termina (deadline absoluto).

ai: tiempo en que llega la tarea.

di: deadline absoluto.

Di: deadline relativo.

Por otro lado, podemos clasificar un STR respecto a tiempos de respuesta.

Podremos verlos en esta línea de tiempo, donde T es el plazo de tiempo determinado en el


cual se debe producir la respuesta correcta (también incluye un determinado más/menos
incremento de T).

● Un STR estricto es aquel en el que el tiempo en el que se produce la respuesta es


absolutamente crucial para el correcto funcionamientodel sistema.

La respuesta debe ocurrir justo en T o hasta -Δt.

● Un STR no estricto es aquel en el que el tiempo en el que se produce la respuesta es


sólo importante, tiene un límite, pero ocasionalmente puede ser excedido y el
sistema aún funciona correctamente.

La respuesta puede ocurrir hasta + Δt. Si se excede,debe definir la cantidad de veces que
lo hace ya que es ocasional.
● Un STR hard o duro es aquel en el que todas las acciones deben terminar dentro de
un plazo especificado de lo contrario no tendrán valor (ej.: sistema de navegación
de aviones).
● Un STR soft o suave es aquel en el que se puede extender el plazo de vez en cuando,
pero el valor de la respuesta disminuye con el tiempo (ej.: sistema de
comunicación).

Interactividad: no son de TR
● Sistemas Interactivos→ no se hace explícito o no se puede definir el requerimiento
de tiempo para obtener la respuesta.
● Sistemas no interactivos→ se define un tiempo límite para la respuesta óptima y/o
para la respuesta con “valor”.
Tiempo en las tareas:

● Tiempo real estricto (hard real time): todas las acciones deben terminar dentro del
plazo especificado.
● Tiempo real flexible (soft real•time): se pueden perder plazos de vez en cuando yel
valor de la respuesta decrece con el tiempo.
● Tiempo real firme (firm real•time): se pueden perder plazos ocasionalmente y una
respuesta tardía no tiene valor.
En un mismo sistema puede haber tareas con distintos tipos de requisitos temporales.

3. Profundidad

4. Componentes de un STR
Clasificación funcional de los elementos que intervienen en el sistema que se encarga de

resolver el STR→ cuando hablamos de STR se debe tener en cuenta si se refiere al proceso

que es de TR o al hard/soft que son los encargados de controlar a ese STR.

La arquitectura de un STR debe soportar:


● Gran velocidad de cálculo: Si bien en un STR es necesario garantizar los plazos de
las tareas por encima del flujo, es una característica necesaria un procesador veloz
que haga rápidamente las tareas para garantizar estos plazos. Si el procesamiento es
lo suficientemente rápido, no debería suponer un problema realizar las tareas dentro
de los plazos estipulados.
● Alta velocidad en la atención a interrupciones: Las interrupciones son segmentos
de código que se ejecutan cuando ocurre un determinado evento, tanto el hardware
como el software deberán permitir ejecutarlas muy rápidamente para evitar
introducir una carga excesiva en el sistema que puedan impedir que el
programa finalice en el tiempo adecuado.
● Alto flujo de entrada / salida: El hardware deberá contar con múltiples buses que
garanticen un elevado flujo de entrada / salida.
● Tolerancia a fallos: permite la operación continua en el caso de producirse un
estado anormal en el sistema o el fallo de algún componente hardware.
● Arquitecturas propietarias: Un hardware con una arquitectura propietaria es uno
diseñado específicamente para que cumpla una tarea, con esto se logra una mayor
eficiencia del sistema, a costa de perder flexibilidad.
5. Características en los requerimientos

● Los recursos están limitados

● Los dispositivos de entrada y salida son especiales para cada sistema

● El sistema digital debe “reaccionar a tiempo” ante los cambios en el sistema quecontrola.
Una acción retrasada puede ser inútil o peligrosa
Tareas: Cada una de las actividades que ejecuta un STR. Pueden clasificarse como
(según propiedades):
● Tareas funcionales→ ¿qué hacen?

● Tareas temporales → ¿cuándo/en cuanto hacen?

● Tareas de seguridad→ fiabilidad, seguridad, etc.

El comportamiento temporal de las tareas se especifica mediante atributos temporales


● Cuándo se ejecutan→ esquema de activación

● Qué plazo tienen para ejecutar cada acción

Temporalidad de las tareas:

Activación
● Periódica: a intervalos regulares, con período T
● Aperiódica: cuando ocurre un evento determinado

» Esporádica: separación mínima entre activaciones T


» Estocástica, a rachas, irregular

Plazo de respuesta

● Absoluto: tiempo límite para terminar

● Relativo: intervalo desde la activación

Hay que garantizar la ejecución de cada tarea y que “termina” (se realice) dentro de plazo
Características:
▪ Grandes y complejos
Grandes: atienden a la variedad de eventos del mundo real.

Complejos: deben responder a cambios de los requisitos. Mejoras y mantenimiento


constante (extensibles).

Lehman y Belady (1985) relacionan grandeza con variedad y la mayor o menor


grandeza con el grado de variedad. Los indicadores tradicionales, como el número de
instruccionesy el esfuerzo de desarrollo son síntomas de variedad.

La variedad es la de las necesidades de actividades en el mundo real y su reflejo en


un programa. Pero el mundo está cambiando continuamente y también lo hacen las
necesidades y actividades de la sociedad, por lo tanto, los problemas grandes, como todos
los sistemas complejos, deben evolucionar continuamente.

Ante “cambio continuo”, los STR precisan mantenimiento constante y mejoras


durante susciclos de vida. Deben ser extensibles.
Aunque los STR son a menudo complejos, las características proporcionadas por los
lenguajes y entornos de TR permiten que esos sistemas complejos sean divididos en
componentes más pequeños que se pueden gestionar de manera efectiva.

Cuando afirmamos que un STR es “grande”, nos referimos a que atienden a la gran
variedad de eventos -necesidades, actividades o fenómenos- del mundo real y lo reflejan en
su programa.

El grado de grandeza (mayor o menor grandeza), varía con el grado de variedad.


Algunos ejemplos de variedad podrían ser el número de instrucciones o el esfuerzo de
desarrollo.

Cuando afirmamos que un STR es “complejo”, nos referimos a que tiene en cuenta
de que como en el mundo real todo es cambiante o todo puede cambiar, estos programas
también deben hacerlo para seguir siendo útiles por ende precisan de mantenimientos y
mejoras constantes durante sus ciclos de vida.
Aunque los STR suelen ser “complejos”, los lenguajes y entornos de tiempo real
permiten que éstos puedan ser divididos en componentes más pequeños que podrían
gestionarse de manera más efectiva.
▪ Manipulación de reales:

Los datos que manipulan los algoritmos de control matemáticamente complejos, necesitan
un grado de precisión elevado.

Los sistemas a estudiar se modelan como un conjunto de EDOS de 1°orden y un requisito


fundamental de un lenguaje de programación de TR es la capacidad para manipular
números reales o de coma flotante y realizar operaciones en tiempos definidos.

▪ Fiable y seguro:
Cuando afirmamos que un STR es “fiable” y “seguro”, nos referimos a que cuando se
produce la interacción sistema-operador, el diseño de la interfaz debe minimizar la
posibilidad de error humano, es decir, tanto el software como el hardware deben soportar
ambientes hostiles, ser claros o estar bien definidos para que el operador no se confunda.
Es posible que el STR falle, pero éste solo puede fallar en forma controlada.

El lenguaje de programación debe tener funcionalidades para enfrentar condiciones de error


esperadas como inesperadas.

El tamaño y complejidad de los STR exacerban el problema de la fiabilidad, no sólo deben


considerarse las dificultades inherentes a la aplicación, sino también aquellas introducidas
por un diseño de software defectuoso.
▪ Control concurrente (de los distintos componentes del sistema):
Ante la realidad que se desarrolla en paralelo, se presenta el problema de la concurrencia.
* Ciclo spooling

* Soporte del kernel

* Soporte del Lenguaje

El lenguaje de programación debe tener funcionalidades para dar soporte directo para la
programación concurrente.

Un sistema embebido suele constar de computadoras y varios elementos coexistentes


externos con los que debe actuar simultáneamente. La naturaleza de estos elementos es la
de existir en paralelo. La velocidad de un computador moderno es tal que las acciones que
se realizan en secuencia, pero dan la ilusión de ser simultáneas. Los lenguajes más
modernos como Ada, Java, Pearl tienen soporte directo para programación concurrente.
● Soporte para STR:

Los procesadores destinados a STR tienen capacidades que garantizan tiempos de


ejecución. El comportamiento debe ser predecible.
El lenguaje debe tener funcionalidades que ayuden en operaciones críticas de tiempo.
Para lo cual se debería especificar los tiempos en que deben ser ejecutadas las instrucciones
y en que las instrucciones son completadas.

Es muy difícil diseñar e implementar sistemas que garanticen que la salida apropiada
sea generada en los tiempos adecuados bajo todas las condiciones posibles. Por esto, los
STR se construyen habitualmente utilizando procesadores con considerable capacidad
adicional, garantizando que el “comportamiento en el peor de los casos” no produzca
ningún retraso inoportuno durante los periodos críticos de operación del sistema.

Dada una adecuada potencia de proceso, se precisa soporte de lenguaje y ejecución


parapermitir al programador:

-Especificar: los tiempos en los que deben ser realizadas las acciones y los tiempos en los
que las acciones deben ser completadas.

-Responder: a situaciones en las que no todos los requisitos temporales se pueden satisfacer
y a situaciones en las que los requisitos temporales cambian dinámicamente.

Estos requisitos permiten que el programa se sincronice con el tiempo.

Con el fin de cumplir los tiempos de respuesta, es necesario que el comportamiento del
sistema sea predecible.
● Interacción con interfaces:

El control de la interacción con los devices, puede ser hecho por el kernel o por el
programador.

Se necesita un control a bajo nivel, pero sin perder calidad por lo que se evita la
programación Low Level.

El lenguaje de programación debe tener funcionalidades para especificar registros de


dispositivos y control de interrupciones.

Para interaccionar con el mundo externo, los sistemas embebidos requieren de


componentes de computador, estos interactúan mediante los registros de E/S, y sus
requisitos son dependientes de dispositivos y computadoras. Los dispositivos pueden
generar interrupciones para indicar al procesador que se han utilizado ciertas operaciones o
que se han alcanzado ciertas condiciones de error.

Su control debe ser directo y no a través de una capa de funciones del S.O.
▪ Implementación eficiente

Debido a que los STR son críticos con respecto al tiempo, la eficiencia de la
implementación será más importante que en otros sistemas.

La abstracción de los detalles de programación y el enfoque en la resolución del problema


“no son permitidos” ya que el programador debe preocuparse por el costo del uso de sus
instrucciones. El programador debe conocer los detalles de los algoritmos, del lenguaje y
del hardware.

6. Determinismo

Un STR es aquel en el que el resultado correcto


depende tanto de su validez lógica como así también
del instante en que se produce (determinismo).

El determinismo hace referencia a que el tiempo de


ejecución de los programas de TR debe estar
acotado en el caso más desfavorable para cumplir las restricciones temporales (no debe
ser necesariamente rápido).

Para el contexto de un STR, el determinismo es conocer exactamente cómo se comporta el


entorno del sistema, tener seguridad de que no aparecerán situaciones a las que el sistema
no pueda responder adecuadamente. Los elementos que nos permiten asegurar o no el
determinismo serían:
● Tiempo que toma una tarea para iniciarse
● Tiempo que toma una tarea para realizarse
● Tiempo en que tarda el sistema antes de responder a una interrupción
● Conocer muy bien las características del entorno del STR
El tiempo juega un gran papel en el determinismo, debemos saber con exactitud todos
estos para el correcto funcionamiento, por ejemplo, hay tareas que necesitan ejecutarse
antes que otras para que puedan iniciarse.
Los factores que podrían ir en contra del determinismo podrían ser:
● No conocer alguno o ninguno de los tiempos necesarios.
● No conocer el entorno en el que se encuentra el STR.
● El entorno en donde se encuentra el STR es cambiante o no siempre actúa igual.
7. Sistema-Proceso

*Requerimientos para saber si el sistema o proceso a controlar es un STR:


Debe describirse en términos de: Objetivos de control, Componentes de sistema,
Resultados.
Ejemplo:
● Componentes: fuente, interruptor, receptor

El interruptor temporizado se debe programar para que se cierre por un tiempo de 30:50
minutos. La R llega a T° de régimen a los 50seg
● Resultado: depende de T°

En un tiempo menor a los 50seg se debe alcanzar una temperatura de 150°C y mantener esa
temperatura por 30 minutos. (puede ser un sistema de horneado o calefacción).
● Objetivo de control: depende de la energía

Una vez cerrado el interruptor, el aporte de energía al sistema deberá permanecer constante
por 30min a una T° de 150°C luego de transcurrido 50seg.
La energía que le demos al sistema es tal que permita llegar a los 150°C en 50” y
mantenerla por 30’, por lo tanto, el objetivo de control es que esa energía se mantenga
constante.
● Entrada/control/salida:
E= 220v en realidad es la T° que queremos que tenga el recinto

C=switchen realidad es un elemento secundario (de control) S=T°

de Ren realidad nos interesa la T° del recinto.

● Sistema: no es la resistencia, es todo el conjunto.


● Controlador: un elemento externo que intervendrá el interruptor para abrirlo o
cerrarlo a partir de la T° del recinto.

Si tenemos un STR al cual le conocemos sus límites de sus salidas, vamos a diseñar un
controlador, también de TR, que podrá generar ciertas señales de control para intervenir en dicho
sistema y modificar la salida a partir de cierta entrada definida para que esa salida obtenga los
valores necesarios según laentrada que hemos requerido en este sistema.
Conceptos de SRLA y SRLC
Sistemas de control interconexión de componentes formando un sistema de configuración
que provee una respuesta deseada. A partir de una entrada que es una entrada de valor
deseado de salida, genera la salida deseada o algo lo más cercano posible.
▪ SRLA Sistema de control de lazo abierto

-El grado de desempeño queda determinado por ESTIMACIÓN o CRITERIO


preestablecido

-El cumplimiento de un requerimiento se puede aproximar en forma escalonada por


TIEMPO o por MARCA.
□ la salida no tiene efecto sobre la acción de control, no se mide la salida ni se realimenta
para compararla con la entrada.

La salida no se compara con la entrada de referencia, por lo tanto, a cada entrada de


referencia le corresponde una condición de operación fija (la precisión dependerá de la
calibración).

Ante la presencia de perturbaciones, no se realiza la tarea deseada, por ende, en la


práctica sólo se utilizará si se conoce la relación entre la salida y la entrada y si se sabe que
no habrá perturbaciones internas ni externas.
▪ SRLC Sistema de control de lazo cerrado

Mantiene una determinada relación entre salida y entrada de referencia, las compara y
usa la diferencia como medio de control, es un sistema de control realimentado.

Se alimenta al controlador con la señal de error de actuación, que es la diferencia


entre la señal de entrada y la señal de realimentación, con el fin de reducir el error y llevar la
salida del sistema a un valor deseado.

El uso de la realimentación vuelve la respuesta del sistema relativamente insensible a


las perturbaciones externas y a las variaciones internas en los parámetros del sistema.
● Sistemas de control en LC en comparación con los sistemas en LA:

Como se podrá observar en las definiciones el control de lazo cerrado nos da


ennuestra planta un comportamiento automático, sin necesidad de un operador humano.

En cambio, en un sistema de lazo abierto, todo el proceso de control se hace en base


a un operador humano, toda operación es manual.

“Resumen”

● Un STR debe reaccionar a los estímulos del objeto controlado (o el operador) dentro
de los intervalos de tiempo dictados por su entorno. El instante en el que el
resultado que debe producirse se llama deadline. Si un resultado tiene utilidad
incluso después de que el deadline pasó, se clasifica como soft, de lo contrario es
firm. Sí podría producirse una catástrofe si se incumple un deadline, se considera
hard.
● El sistema que debe cumplir al menos un deadline hard se denomina STR hard o
STR crítico para la seguridad. Si no es hard, es soft.
● En un STR hard debe garantizarse por diseño que cumplirá los plazos especificados
en todas las situaciones porque la utilidad de muchas aplicaciones en tiempo real
puede depender de un rendimiento predecible durante un escenario de carga
máxima.
● Un STR hard debe mantener la sincronía con el estado del entorno (el objeto
controlado y el operador humano) en todas las operaciones escenarios. Por lo tanto,
está regulado por los cambios de estado que ocurren en el medio ambiente.
● La base de datos en tiempo real debe actualizarse cada vez que una entidad RT
cambia su valor. Esta actualización se puede realizar periódicamente, provocada por
la progresión del reloj en tiempo real por un período fijo (observación activada por
tiempo), o inmediatamente después de un cambio de estado, un evento, ocurre en
la entidad RT (evento activado observación).
● El deadline de un lazo de control es el intervalo de tiempo entre la observación de la
entidad RT y el inicio de una reacción del objeto controlado como consecuencia de
una acción informática basada en esta observación.
● La confiabilidad R (t) de un sistema es la probabilidad de que un sistema
proporcione el servicio especificado hasta el momento t, dado que el sistema estaba
operativo en t = 0.
● La mantenibilidad es una medida del tiempo que lleva reparar un sistema después
de la última ha experimentado una falla benigna, y se mide por la probabilidad M
(d) de que el sistema se restaura dentro de un intervalo de tiempo d segundos
después de la falla.
● La disponibilidad es una medida de la correcta prestación del servicio con respecto a
la alternancia de servicio correcto e incorrecto, y se mide por la probabilidad A (t)
de que el sistema está listo para brindar el servicio en el momento t.
Unidad N° 2: Generalidad de la estructura:

Unidad central de procesamiento. Control por supervisión del estado. Control por
interrupción. Programación a bajo nivel. Planificación y drivers de periféricos:
sincronización por interrupciones, Polling e interrupciones vectorizadas, controladores de
interrupción y transferencia de datos. DMA. Timers y servicios de tiempo. Circuitos de
Watch-dog. Entrada/Salida. Conversores A/D y D/A.
Unidad 2: GENERALIDAD DE LA ESTRUCTURAUNIDAD CENTRAL DE
PROCESAMIENTO
La unidad central de procesamiento CPU es el hardware dentro de una computadora u otros
dispositivos programables.
Su trabajo es interpretar las instrucciones de un programa informático mediante la realización
de las operaciones básicas aritméticas, lógicas y externas (provenientes de la unidad de
entrada/salida).
Una computadora puede contener más de una CPU (multiprocesamiento). En la actualidad,
los microprocesadores están constituidos por un único circuito integrado (chip) aunqueexisten los
procesadores multinúcleo (varias CPU en un solo circuito integrado). Un circuito integrado que
contiene una CPU también puede contener los dispositivos periféricos, y otros componentes de un
sistema informático; similar a un microcontrolador (menos potente en RAM) se le denomina sistema
en un chip (SoC).
Los componentes de la CPU son:
● Unidad aritmética lógica (ALU): realiza operaciones aritméticas y lógicas.
● Unidad de control (CU): dirige el tráfico de información entre los registros de la CPU
y conecta con la ALU las instrucciones extraídas de la memoria.
● Registros internos: no accesibles (de instrucción, de bus de datos y bus de dirección) y
accesibles de uso específico (contador programa, puntero pila, acumulador, flags, etc.) o
de uso general.
Microcontrolador y microprocesador

Difrencias entre uP y uC
[Link]
microprocesador-3/

MICROCONTROLADOR
Un microcontrolador es una computadora en un chip que controla objetos, procesos o eventos.
Cualquier cosa que almacena, controla, calcula o muestra información probablemente tiene un
microcontrolador en ésta. A diferencia del microprocesador, que requiere otros componentes, como
la memoria, para trabajar, el microcontrolador es una computadora por sí mismo y se utiliza en
sistemas más pequeños.
En función del proyecto a desarrollar se debe seleccionar el uP de la familia y que mejor se adecue:
● Por ejemplo, el microcontrolador 12F675: es un PIC de 8 pines, con módulos: Timer y ADC.
● Un microcontrolador como el 16F877: es de 40 pines y tiene módulos Timer, ADC, USART,
I2C, PWM, entre otros.
Bloques de un microcontrolador:

Diagrama de bloques de un microcontrolador PIC:

MICROPROCESADOR
El microprocesador es el circuito central del sistema digital. Es el encargado de
ejecutar el programa desde un sistema operativo. Sólo ejecuta instrucciones en lenguaje
binario, realizando operaciones aritméticas y lógicas.
Arquitecturas de los microprocesadores

La Arquitectura de un microprocesador se define por el conjunto de instrucciones


que puede obedecer y las maneras en que las instrucciones pueden especificar la localización de los
datos por procesar. Existen 2 tipos de arquitecturas bien diferenciadas:
• Arquitectura Von Neumann: se caracteriza por los procesadores que poseen el
mismo dispositivo de almacenamiento tanto para los datos como las instrucciones. Al ser
almacenados en el mismo formato dentro de la memoria, utilizan un único bus de datos para
comunicarse con la CPU. Esto hace que sea más eficiente en el uso de su memoria, pero
requiere una ambigüedad para reconocer datos.
Constan de 5 partes: la ALU, unidad de control, memoria, dispositivo de entrada y salida y un
bus de datos que los comunica.
La mayoría de las computadoras que usan esta arquitectura, son más lentas en determinadas áreas:

• Arquitectura Harvard: Divide las instrucciones de los datos que se


comunican con la unidad central de procesos en dos memorias separadas. Esto genera
también que se utilice buses de información. Aunque en común un único bus de direcciones,
con control que pueda diferenciar entre ambas memorias. No requiere ambigüedad para
reconocer datos, pero no es tan eficiente en la utilización de la memoria.

Las instrucciones y los datos se almacenan en cachés diferentes para mejorar el


rendimiento. pero por su contraparte, tiene el inconveniente de tener que dividir la cantidad
de memoria caché entre los dos, por lo que funciona mejor en los casos particulares cuando
la frecuencia de lectura de instrucciones y de datos es aproximadamente la misma.
CONTROL POR SUPERVISIÓN DE ESTADO

Ciclo de instrucción
Cuando un ordenador arranca entra en un bucle infinito en el cual se ejecutan
instrucciones una tras otra. El ciclo comienza con la búsqueda, donde se busca en la
memoria la instrucción que se quiere ejecutar. Luego se pasa a la fase de decodificación
en donde el procesador descubre que es lo que quiere hacer la instrucción. Luego viene
una fase de ejecución de la propia instrucción en donde se realiza lo que la instrucción
dice que se haga y por último una fase de finalización en donde se completa la
instrucción, posiblemente guardando en memoria algún resultado.

Latencia: La latencia es igual a el número de ciclos de instrucción, multiplicado


por la duración del ciclo de instrucción.
Un microprocesador es un circuito secuencial, el cual está comandado por los
flancos ascendentes y descendentes de un reloj o clock. El periodo de esta señal de reloj
es lo que se denomina como ciclo máquina y las instrucciones ejecutadas son
instrucciones máquina. Durante estos ciclos máquina se van realizando las distintas
operaciones para concretar las instrucciones.
Dependiendo de la complejidad de la fase se necesitarán más o menos ciclos
máquina. La fase de búsqueda como la de decodificación, por lo general tardan una
cantidad fija de ciclos, mientras que la de ejecución y finalización pueden tardar un
número variable de ciclos acorde a su complejidad.
En los microcontroladores PIC los ciclos de instrucción están bien definidos acorde a
lo que indica su datasheet. En los PIC normalmente un ciclo de instrucción demora 4 ciclos
de reloj o 4 ciclos máquina. Si se tiene un clock de 4MHz, se podría decir que se ejecutarán
1 MIPS (1 millón de instrucciones por segundo).

En los PIC se distinguen por lo general solo la fase de búsqueda (2 ciclos de ck) y
ejecución (2 ciclos de ck). Esto permite que mientras se está ejecutando una instrucción,
durante la segunda mitad de instrucción, estará buscando la siguiente instrucción. Esto
último se denomina Pipeline o paralelismo de ejecución de instrucciones.

CONTROL POR INTERRUPCIÓN

Interrupciones

Cuando se produce una señal de interrupción, el uP suspende lo que esté haciendo y


carga una dirección predeterminada para ejecutar lo que encuentre a partir de esa dirección
ISR (Rutina de Servicio de Interrupción). Luego, mediante una instrucción de retorno, es
posible volver al lugar donde se encontraba antes de producirse la interrupción.
Una interrupción es una llamada a una subrutina, pero iniciada por el hardware en
cualquier instante de ejecución del programa principal. Es una alternativa al “polling”. El
manejo de interrupciones permite operar el manejo del “multitasking” o multitareas, es
decir, una técnica de programación en la cual es posible dar atención a multitud de
periféricos, reduciendo al mínimo el tiempo de procesamiento.
Las fuentes de interrupción son variadas, si se habilitan varias interrupciones el
programa saltará a la misma rutina de interrupción y es responsabilidad del programador
crear una rutina que identifique su fuente
Hay un registro de control y/o estado de interrupciones. Cada bit tiene designada
una función que habilita (o no) y registra a: las interrupciones, enmascara de manera
global/local, los timer y el cambio de puerto (pin).

PILA o STACK

Al generarse la señal de interrupción, el microcontrolador termina primero la


ejecución de la instrucción que se esté procesando en ese momento, guarda en el
STACK o PILA la dirección de memoria de código de la siguiente instrucción y
posteriormente hace un llamado a la “subrutina de atención de interrupciones”, cuyo
inicio siempre se encuentra en una dirección determinada (ver esto en el datasheet).
Al final de la subrutina de atención de interrupciones, mediante la instrucción
“Return From Interrupt” el flujo del programa regresa al programa principal mediante
el mismo mecanismo, recuperando la dirección de retorno previamente almacenada en el
STACK.
La PILA o STACK es una zona de memoria separada de la memoria principal de
programa y la de datos manejada por hardware en estructura LIFO (Last In First Out) a
partir de instrucciones o funcionamientos especiales del uP. Puede producirse en ella un
Overflow y no hay bandera que indique ese problema. No solo las instrucciones la usan,
sino también las instrucciones CALL, PUSH y POP.
Registro OPTION o SETEO

Es un registro de R/W (Read/Write) que contiene varios bits de control para


configurar: Fuentes y tipos de clock, Funcionamiento de módulos internos como el prescaler
o WD (Watch Dog), Funcionamiento eléctrico de señales de interrupción, habilitación de
nivel pull-up en puertos, configuración de los puertos.

En la tabla no figuran los tres primeros bits, ya que estos determinan el divisor de frecuencia
o prescaler.

Prescaler.

El prescaler se aplicará a cada uno de los timers del sistema y al watchdog y su


división de frecuencia dependerá de la cantidad de bits designados para tal fin.
El preescalador toma la frecuencia del reloj del temporizador y la divide por algún
valor antes de alimentarlo al temporizador, según como esté la configuración de sus
registros.
Registro de TIMER
Puede ser usado como temporizador/contador de n bits de lectura/escritura con selector
de reloj interno o externo con selección de flanco del reloj externo. Con un prescaler
programable de m bits.
• Temporizador: el registro incrementa su valor en cada ciclo de instrucción.
• Contador: el registro incrementa su valor con cada impulso introducido por un
puerto.

Cuando el registro se desborda, comienza de nuevo a contar a partir del 0 e informa


de este evento a través de la activación de un flag y/o una interrupción (interrupt on
overflow). El temporizador provoca una de las interrupciones.

Registro Status
Contiene el estado aritmético de la ALU, del RESET, banco de memoria
seleccionado, etc. Los bits pueden ser activados (set) o borrados (cleared).

Program Counter
Indica la dirección de memoria que se leerá a continuación para su ejecución y
especifica la dirección de la instrucción a traer para su ejecución. El contador de programa
es incrementado automáticamente en cada ciclo de instrucción de tal manera que las
instrucciones son leídas en secuencia desde la memoria.

Watchdog Timer
Es un registro que se debe borrar a intervalos con una instrucción (CLRWDT), si
transcurrido cierto tiempo el registro no se ha borrado el micro se resetea (Time-out mode).
Supervisa los programas del microcontrolador para ver si están fuera de control o han
dejado de funcionar. Hay otros modos de WD como el de preguntas y respuestas.
En un STR, se puede usar el temporizador de vigilancia WD para monitorear una
tarea de tiempo crítico para asegurarse de que se complete dentro del tiempo máximo
asignado y, si no lo hace, para terminar la tarea e informar la falla.

Registros PORTn
Registros de los puertos representados por n, en el que cada bit es una línea que se
puede hacer E/S del puerto.
Manejo de puerto
Cada uno de los pines a ser utilizados como entradas o salidas digitales tienen un
nombre relacionado con el puerto al que pertenecen y al número de orden del bit con el cual
se programara, por ejemplo, para el puerto B se tienen los pines RB0, RB1, RB2, RB3, RB4,
RB5, RB6 y RB7. Para la manipulación de los pines del microcontrolador, entonces, se
cuenta con dos registros de 8 bits cada uno, TRISx y los PORTx. TRIS configura los puertos
como entradas o salidas, mientras que POR se usa para habilitar una lectura o escribir, por
ejemplo, si queremos poner en 1 (HIGH) al puerto RB3 se le debe decir al PORTB 3.

Puertos GPIO: GPIO significa General Purpose Input/Output, Entrada/Salida de Propósito


General.
Es el pin genérico cuyo comportamiento se puede programar:
• Schmitt trigger: circuito comparador especial que usa la histéresis para
prevenir el ruido que podría tapar a la señal original y que causaría falsos cambios de
estado si los niveles de referencia y entrada son parecidos. La histéresis es la tendencia de
un material aconservar su polarización en ausencia del estímulo que la generó.
Mediante estos puertos el microcontrolador puede monitorizar y controlar otros
dispositivos. Para añadir flexibilidad al micro, muchos de sus pines de entrada/salida, están
multiplexados con funciones alternativas. Un 1 en el registro TRIS, indica que es pin de entrada.
Un en TRIS indica que es un puerto de salida.
El reset de los registros TRIS suele estar en 1, de tal forma que por defecto los pines estén
configurados como entradas, evitando posibles cortocircuitos en la alimentación que
podrían dañar el micro o el resto del sistema.

• Latch: es un reset, circuito electrónico biestable asíncrono usado para almacenar


información (1 bit), los cambios en su estado de salida es función de los estados presentes en las
entradas y en los estados previos a la salida. Los latches, a diferencia de los flip-flops , no necesitan
una señal de reloj para su funcionamiento. En los GPIOs se usan latches D, que se almacena un 1
o 0 dependiendo de la entrada en su pin D, siempre y cuando esté activada (por lo general en high)
la entrada Enable.

El registro PORT funciona como un latch para los datos de salida. Cuando el registroPORT
se lee, el micro lee los niveles presentes en los pines de I/O (no en los latches).

Cuando una función esta multiplexada en un pin de I/O de propósito general, la


funcionalidad de un pin puede cambiar para acomodarse a los requisitos del módulo periférico.
Por ejemplo, el pin RA4 tiene como función alternativa servir como entrada de reloj para el
temporizador/contador TMR0.

Mapas de memoria

Es una tabla que indica cómo está distribuida la memoria. Contiene información sobre
el tamaño y las relaciones que existen entre direcciones lógicas y físicas. Es el mapa de la
memoria RAM y en PIC está dividida en registros especiales y registros de propósito general.
Los primeros ocupan las 11 primeras posiciones (0 - 0B). Existen hasta 4 bancos de registros
con 16 registros cada uno.
PROGRAMACIÓN A BAJO NIVEL
La palabra bajo no significa de menos calidad. Se refiere a que las pautas de actuación
están muy ligadas a las instrucciones del hardware. Es utilizado para tareas muyespecíficas.
Funciona gracias a un proceso de instrucciones muy elaboradas, logrando que se revise hasta
el más mínimo detalle. Pueden ser: Lenguaje en código binario, lenguaje máquina y lenguaje
ensamblador.
Las instrucciones se pueden clasificar en operaciones orientadas a registros,
operaciones orientadas a bits y operaciones con constantes y de control.

Algunas de las operaciones orientadas a registros son:


• CLRW: limpia el registro Work
• MOVWF: mueve W a F (registro que debemos indicar)
• NOP: no hace nada
• RLF: rotar a la izquierda a través del carry. L (left) Algunas de las operaciones
orientadas a bits son:
• BCF: limpiar un bit que pasamos del registro F que también le pasamos
• BSF: activa un bit que pasamos del registro F que también le pasamos
• BTFSC: pregunta si el bit F es igual a 0. Si no es 0, decrementa y pasa a la siguiente
línea de instrucción. Si es 0, salta la línea de instrucción que seguía y pasa
directamente a la siguiente a esta.
• BTFSS: pregunta por el bit del registro F, si el bit esta en uno, el programa salta una
línea y ejecuta la siguiente. Si el bit estaba en cero, no salta una línea sino que ejecuta
la instrucción inmediatamente siguiente.
• Algunas de las operaciones con constantes y de control son:
• ADDLW: suma un literal que le pasamos a W y se guarda en W
• CALL: llama a una subrutina (es como una función).
• GOTO: salta a la línea de instrucción que le indiquemos mediante un literal
• MOVLW: carga al W con el literal L.

Todas las instrucciones se ejecutan en un ciclo de instrucción, exceptuando las que


modifican el contenido del PC. La instrucción BTFSC f, b genera 2 cuando salta. GOTO,
CALL, RETURN usan 2 ciclos de instrucción.

Instrucciones RISC

RISC es una filosofía de diseño de CPU que está a favor de conjuntos de


instrucciones pequeñas y simples que toman tiempo para ejecutarse. RISC significa
Reduced Instruction Set Computer, en español Computador con Conjunto de Instrucciones
Reducidas. Son usados en microcontroladores como los PIC.

Instrucciones CISC

Los uP tienen un conjunto de instrucciones que se caracteriza por ser muy amplio
y permitir operaciones complejas entre operadores situados en la memoria o en los
registros internos, en contraposición a la arquitectura RISC.

TÉCNICA PIPELINE

Es técnica empleada en el diseño de procesadores, basada en la división de la ejecución de las


instrucciones en etapas, consiguiendo así que una instrucción empiece a ejecutarse antes de que
hayan terminado las anteriores y, por tanto, que haya varias instrucciones procesando
simultáneamente.
Cada una de las etapas debe completar sus acciones en un ciclo de reloj, pasando sus
resultados a la etapa siguiente y recibiéndolos de la anterior. Para eso es necesario almacenar los
datos en registros intermedios. Cualquier valor que pueda ser necesario en una etapa posterior debe
irse propagando a través de esos registros intermedios hasta que ya no sea necesario.
Para conseguir la segmentación es necesario que una instrucción utilice solamente una etapa
en cada ciclo de ejecución.
Ya que todas las etapas deben de tardar lo mismo en su ejecución, el tiempo de ciclo seráel
de la etapa más lenta, más el del retardo provocado por la utilización de los registros intermedios.
Comparando este esquema con el multiciclo, el tiempo de ciclo será más lento, pero el CPI (Ciclos
Por Instrucción) será menor, lo que provoca un aumento del rendimiento.
Ya que si no tenemos en cuenta los riesgos estructurales (que pueden provocar paradas en el
pipeline), tendríamos que, en cada ciclo de reloj, termina de ejecutarse una instrucción (CPI=1).
PLANIFICACIÓN Y DRIVERS DE PERIFÉRICOS
Sistemas microprogramados

Sistemas digitales capaces de leer, interpretar y luego ejecutar de forma secuencial;


instrucciones (órdenes) que conforman un programa. Su estructura general esta conformada
por la unidad central de proceso que realiza la interpretación y ejecución de lasinstrucciones.
También general las órdenes de control para gobernar todo el sistema y las operaciones
aritméticas y lógicas.

Cumplen con el ya mencionado ciclo de instrucción:


Interrupciones
Es una señal recibida por el procesador de una computadora, que indica que debe
«interrumpir» el curso de ejecución actual y pasar a ejecutar código específico para tratar esta
situación.
Una interrupción es una suspensión temporal de la ejecución de un proceso, para pasar a
ejecutar una subrutina de servicio de interrupción, la cual, por lo general, no forma parte del
programa, sino que pertenece al sistema operativo o al BIOS. Una vez finalizada dicha subrutina, se
reanuda la ejecución del programa.
Las interrupciones son generadas por los dispositivos periféricos habilitando una señal del
CPU (llamada IRQ del inglés "interrupt request") para solicitar atención del mismo. Por ejemplo,
cuando un disco duro completa una lectura solicita atención al igual que cada vez que se presiona
una tecla o se mueve el ratón.
La primera técnica que se empleó para esto fue el polling, que consistía en que el propio
procesador se encargará de sondear los dispositivos periféricos cada cierto tiempo para averiguar si
tenía pendiente alguna comunicación para él. Este método presentaba el inconveniente de ser muy
ineficiente, ya que el procesador consumía constantemente tiempo y recursos en realizar estas
instrucciones de sondeo.
El mecanismo de interrupciones fue la solución que permitió al procesador desentenderse de
esta problemática, y delegar en el dispositivo periférico la responsabilidad de comunicarse con él
cuando lo necesitara. El procesador, en este caso, no sondea a ningún dispositivo, sino que queda a
la espera de que estos le avisen (le "interrumpan") cuando tengan algo que comunicarle (ya sea un
evento, una transferencia de información, una condición de error, etc.).

Funcionamiento del mecanismo:


Todos los dispositivos que deseen comunicarse con el procesador por medio de interrupciones
deben tener asignada una línea única capaz de avisar al CPU cuando le requiere para realizar una
operación. Esta línea se denomina IRQ.
Las IRQ son líneas que llegan al controlador de interrupciones, un componente de hardware
dedicado a la gestión de las interrupciones, y que puede estar integrado en el procesador principal o
ser un circuito separado conectado al mismo. El controlador de interrupciones debe ser capaz de
habilitar o inhibir las líneas de interrupción y establecer prioridades entre las mismas. Cuando varias
líneas de petición de interrupción se activan a la vez, el controlador de interrupciones utilizará estas
prioridades para escoger la interrupción sobrela que informará al procesador principal. También
puede darse el caso de que una rutina de tratamiento de interrupción sea interrumpida para realizar
otra rutina de tratamiento de una interrupción de mayor prioridad a la que se estaba ejecutando;
aunque hay interrupciones que no se pueden deshabilitar (conocidas como interrupciones no
enmascarables o NMI).
Un procesador principal que no tenga un controlador de interrupciones integrado, sueletener
una única línea de interrupción llamada habitualmente INT. Esta línea es activada por el controlador
de interrupciones cuando tiene una interrupción que servir. Al activarse esta línea, el procesador
consulta los registros del controlador de interrupciones para averiguar cual IRQ hay que atender. A
partir del número de IRQ busca en la tabla de vectores de interrupción la dirección de la rutina a la
que debe llamar para atender la petición del dispositivo asociado a dicha IRQ.

Procesamiento de una interrupción


1. Terminar la ejecución de la instrucción máquina en curso.
2. Salvar el estado del procesador (valores de registros y flags) y el valor del contador de
programa, IP, en la pila, de manera que en la CPU, al terminar el proceso de interrupción,
pueda seguir ejecutando el programa a partir de la última instrucción.
3. La CPU salta a la dirección donde está almacenada la rutina de servicio de interrupción
(Interrupt Service Routine, o abreviado ISR) y ejecuta esa rutina que tiene como objetivo
atender al dispositivo que generó la interrupción.
4. Una vez que la rutina de la interrupción termina, el procesador restaura el estado que
había guardado en la pila en el paso 2 y retorna al programa que se estaba usando
anteriormente.

Tipos de interrupciones(según la fuente que las produce):


• Interrupciones de hardware: se producen como resultado de una operación de E/S, no son
producidas por ninguna instrucción de un programa sino por las señales que emiten los dispositivos
periféricos. Son asíncronas a la ejecución del procesador, es decir, se pueden producir en cualquier
momento independientemente de lo que esté haciendo el CPU en ese momento. Las causas que las
producen son externas al procesador y a menudo suelenestar ligadas con los distintos dispositivos
de entrada o salida.
Cuando el microprocesador accede a un periférico (disco duro, puerto de comunicación, etc.),
puede transcurrir algún tiempo antes de que los datos sean obtenidos o transmitidos. La solución más
simple es esperar hasta recibir los datos o hasta que se haya efectuado la transmisión (polling), pero
esta solución bloquea todos los programas en ejecución, y eso no puede admitirse en un sistema
multitarea. Por ello, en los sistemas modernos se prefiere un funcionamiento mediante interrupciones,
ya que éstas permiten mejorar la productividad del procesador, de forma que este último puede
ordenar una operación de entrada o salida y, en lugar de tener que realizar una espera activa, se
puede dedicar a atender a otro procesoo aplicación hasta que el dispositivo esté de nuevo disponible,
siendo dicho dispositivo el encargado de notificar al procesador mediante la línea de interrupción que
ya está preparado para continuar o terminar la operación de entrada o salida.
• Excepciones: son aquellas que se producen de forma síncrona a la ejecución del procesador
y por tanto podrían predecirse si se analiza con detenimiento la traza del programa que en ese
momento estaba siendo ejecutado en la CPU. Normalmente son causadas por una condición de error
en un programa, por ejemplo, la división entre 0, el desbordamiento, el acceso a una posición de
memoria no permitida, etc.
Normalmente genera un cambio de contexto a modo supervisor para que el sistema operativo
atienda el error. Así pues, las excepciones son un mecanismo de protección que permite garantizar
la integridad de los datos almacenados tanto en el espacio de usuario como en el espacio kernel.
Cuando el Sistema Operativo detecta una excepción intenta solucionarla, pero en caso de no poder
simplemente notificará la condición de error a la aplicación/usuario y abortará la misma.
• Interrupciones por software: son generadas por un programa en ejecución. Para generarlas,
existen distintas instrucciones en el código máquina que permiten al programador producir una
interrupción, las cuales suelen tener nemotécnicos tales como INT (por ejemplo, en DOS se
realiza la instrucción INT 0x21 y en Unix se utiliza INT 0x80 para hacer llamadas de sistema).
Actúan de la siguiente manera: Un programa en ejecución llega a una instrucción que requiere
del sistema operativo para alguna tarea, por ejemplo, para leer un archivo en el disco duro (cuando
un programa necesita un dato exterior, se detiene y pasa a cumplir con las tareas de recoger ese dato).
En ese momento por tanto llama al sistema y se interrumpe virtualmente hasta recibir respuesta, en
el ejemplo anterior hasta que no se haya leído el disco y el archivo esté en memoria principal.
Durante esa espera las instrucciones que se ejecutarán no serán del programa, sino del sistema
operativo. Una vez éste termine surutina ordenará reanudar la ejecución del programa auto
interrumpido en espera. Por último,la ejecución del programa se reanuda.

Determinación de la fuente que genera la interrupción


Hay distintas formas de identificar la fuente de una determinada interrupción. La primera
alternativa que se consideró fue asignar una línea (un bit) para cada interrupción, lo cual suponía un
gran costo en cuanto a la relación de número de dispositivos y número de bits usados y a menudo
limita el número de dispositivos que se podían conectar.
Por ello, se pensó con posterioridad en que en cada patilla de interrupción debería poder
conectarse más de un dispositivo, debiendo implementar por tanto una metodología que permitiese
identificar de forma unívoca de qué dispositivo se trataba. Para ello hay varias directrices:
● Polling: el microprocesador comprueba de manera sistemática todos los dispositivos de manera
que «busca» cuál de ellos fue el que solicitó la interrupción. Esto tiene una ventaja y es que es
barato a nivel de coste hardware ya que el polling se implementa en software, no obstante, tiene
otras desventajas que no podemos olvidar y es que suele ser lento porque tiene que comprobar
en serie todos los dispositivos y establece una prioridad en los dispositivos (el orden de sondeo)
y por tanto puede provocar inanición.
● Interrupciones vectorizadas: suele ser rápido, pero implica un alto costo en el hardware.
● Hardware paralelo: se utiliza un registro de interrupción cuyos bits se controlande forma
independiente por las señales de petición de interrupción de cada periférico. Según la posición
de cada bit en el registro, se establece la prioridad.
LUEGO TOCA HACER EL MICROPROCESADOR FICTICIO:

Primero vamos a definir que la unidad de enteros será de 8 bits, el reloj será de 12
MHz para 3MIPs promedio (3 millones de instrucciones por segundo), las GPIOs serán 2
de 8 bits, 3 interrupciones externas con prioridad, 1 timer de 16 bit, 2 timer de 8 bit, módulo
de comunicación serie, módulo de CAD de 10 bits y tc = 30 useg, y registro de trabajo W.
La memoria del microprocesador ficticio será de 8Kx14 para programa, 8 niveles de
stack (instrucciones), 68 x 8 para datos eeprom.

La memoria RAM tendrá los registros correspondientes: especiales, de propósito


general, de posición fija. todo esto distribuido en 4 bancos de 16. Es muy importante
también aclarar el registro de estado y cada bit que lo compone:

Luego los timers de nuestro microprocesador ficticio: TMRn que puede ser leído y
escrito como cualquier registro. Incrementar su valor con una señal externa aplicada al pin
T0CKI o mediante el oscilador interno; PTMRn encargado de programar el modo de cada
timer:

La salida de la ALU va al registro W y también a la memoria de datos, por lo tanto el


resultado puede guardarse en cualquiera de los dos destinos.
El registro de trabajo general W es de 8 bits. Luego se tiene 2 puertos A y B de 8 bits en
el cual se puede configurar a RB0 como entrada de interrupción externa:

Las interrupciones se generan a partir de un evento y provoca que el uC deje de


ejecutar la tarea que está realizando para atender ese evento. Luego de atendida la
interrupción, el uP regresa y continúa la tarea que estaba realizando antes de ocurrida la
interrupción (instrucción RETI). Las fuentes de interrupción son variadas y tienen prioridad
con un vector ubicado en las últimas direcciones de memoria. Si se habilitan varias
interrupciones, el programa saltará a la misma rutina de interrupción y es responsabilidad
del programador crear una rutina que identifique su fuente.

Fuentes de interrupción ordenadas de más a menos prioridad:


1. Interrupción externa por pin RB0/INT
2. Desborde del Timer 0
3. Cambio en el estado en los bits 4 a 7 del puerto B
4. Desborde del timer 1
5. Desborde del timer 2
6. Fin de conversión A/D
7. Lectura/escritura del puerto de comunicación
8. Escritura de EEPROM finalizada
INTR es un registro de solo lectura, donde se especifica que tipo de interrupción ha
ocurrido:

Luego tenemos que establecer las pautas para el manejo de puertos: Cada pin de I/O
es digital; cada pin tiene el nombre del puerto al que pertenece con el número de orden; cada
puerto cuenta con dos registros: TRISx y PORTx; Tris es el registro para configurar si ese pin
será de entrada o salida y luego el Port será para escritura o lectura de un determinado pin.

SINCRONIZACIÓN POR INTERRUPCIONES

El proceso de sincronización por interrupción se inicia cuando el controlador


informa al procesador, mediante una petición de interrupción, de qué ha ocurrido un evento
que requiere su atención. Lógicamente, si el controlador no está capacitado para generar tal
petición entonces la sincronización por interrupción entre el procesador y el controlador
no es posible. En la descripción de un controlador debe siempre quedar claro en qué
condiciones el controlador generará una petición de interrupción.
Algunos controladores tienen un bit en el registro de control que se utiliza para
inhibir las interrupciones del controlador. Por ejemplo, el procesador puede inhibir las
interrupciones del controlador de impresora poniendo un 0 en el bit 0 del registro de control
(sin alterar el resto de los bits de este registro).

A menos que se especifique lo contrario, supondremos que las interrupciones están


permitidas en el controlador (es decir, el bit correspondiente del registro de control está a
1). Por tanto, la operación de inhibición de la interrupción será necesaria cuando se quiera
realizar una sincronización por encuesta. En ese caso, además, antes de finalizar el
programa deberán restaurarse las interrupciones inhibidas, volviendo a poner un 1 en el bit
correspondiente del registro de control.
Super Loop
El loop del código es infinito

¿Cómo detener el controlador para que no funcione indefinidamente?

Se podría agregar un modo de finalizar el loop. En la condición, cada vez que


termine dehacer un proceso, se pide una confirmación de que el loop debe terminar.
Pero hay que tener en cuenta de que el proceso de temporización se basa en un sleep.
Implementación del SLEEP→ mediante un loop que tenga un gran número de ciclos,
si conocemos cuáles son las instrucciones que se van a ejecutar en el ciclo, la velocidad
del clock con el que se ejecuta, la cantidad de ciclos del clock que utilizarán las
instrucciones para ejecutarse, podemos calcular el tiempo que lleva ejecutar un loop.
El problema es que cuando se está ejecutando el ciclo, toma el control de todo el
sistema, por lo tanto, si en algún momento se traba el ciclo, se termina trabando todo el
sistema.

Otro problema es que no podemos intervenir en el sistema para, por ejemplo, dar un
mensaje de error.

Lo que se propone es el código de abajo: agregar un sleep con el mínimo tiempo


que se pueda utilizar (1) → sleep (1) donde el sleep sigue siendo un método de temporizado.
Con el while mostramos por cada uno de esos ciclos, el valor de un contador
descendenteque sucede cada un segundo.
Pero el problema subsiste porque el sleep sigue solo que el error se redujo a 1
segundo. Con este método podríamos advertir al usuario que el sistema no está trabado.
Si sucede un error interno en el sleep deberíamos apagar el sistema, no podemos
agregar un botón de stop.
Lo que se puede hacer es agregar una interfaz de entrada de datos que nos
permitaconocer qué sucede con el sistema y a partir de allí, tomar una decisión.

¿Qué falta para agregar un botón de stop de emergencia?


¿Qué falta para leer y escribir datos del exterior?

POLLING E INTERRUPCIONES VECTORIZADAS

Polling o sondeo es una operación de consulta constante, generalmente hacia un


dispositivo de hardware, para crear una actividad sincrónica sin el uso de interrupciones,
aunquetambién puede suceder lo mismo para recursos de software.
Esto, aplicado a programación puede ser visto como una pobre implementación en
búsqueda del sincronismo de procesos. Por ejemplo, se podría consultar constantemente
un directorio del sistema de archivos para indicarle al usuario cuándo llegan nuevos
contenidos a la misma.

Sin embargo, estas constantes consultas degradarán el rendimiento del equipo y


probablemente sería mejor implementar la solución por otro medio, en particular,
pidiéndole al sistema operativo que informe de transferencias a ese directorio en particular.
GPIO→ (General Purpose Input/Output, Entrada/Salida de Propósito General) es un
pin genérico en un chip, cuyo comportamiento (incluyendo si es un pin de entrada o salida)
se puede controlar (programar) por el usuario en tiempo de ejecución.
Los pines GPIO no tienen ningún propósito especial definido, y no se utilizan de
forma predeterminada. La idea es que a veces, para el diseño de un sistema completo que
utilizael chip podría ser útil contar con un puñado de líneas digitales de control adicionales,
y tenerlas a disposición ahorra el tiempo de tener que organizar circuitos adicionales para
proporcionarlos. Por ejemplo, los chips Realtek ALC260 (códec de audio) tienen 8 pines
GPIO, que quedan sin utilizar de forma predeterminada. Algunos integradores de sistemas
(Acer Inc. laptops) que emplea el ALC260 utilizan la primera GPIO (GPIO0) para
encender el amplificador utilizado para los altavoces internos y el conector de auriculares
del ordenador portátil.

Capacidades:
• Pines GPIO que pueden ser configurados para ser entrada o [Link]: push
pull, open drain, analógico
• Entrada: flotante, pullup, pull down, analógica.
• Pines GPIO que pueden ser activados / desactivados.
• valores de entrada se pueden leer (por lo general alto = 1, bajo = 0)
• valores de salida de lectura / escritura seleccionable
• valores de entrada que a menudo se pueden utilizar como IRQ (típicamente
para los eventos de activación)
• El dispositivo puede utilizar DMA para mover grandes cantidades de datos
demanera eficiente dentro o fuera del dispositivo.
• Algunos pueden ser configurados como fuente de interrupción externa.

Arquitectura LOAD/STORE
La arquitectura de carga-almacenamiento o carga-guardado es una arquitectura de
conjunto de instrucciones que divide las instrucciones en dos categorías: acceso a la
memoria (carga y almacenamiento entre la memoria y los registros) y operaciones ALU
(que solo ocurren entre los registros).
Store→ lee el valor que tiene el pin cuando cambia. Lee lo que hay en un registro
(flip-flop) y lo guarda en memoria.
Load→ agarra lo que hay en la memoria y lo guarda en un registro.

Representan el hardware necesario para transaccionar (entrar y sacar) datos, utilizan


dos ciclos de clock como mínimo.
**Nuevo método de programación: Loop con Polling {video STR 07}

• En STORE leemos datos del exterior, estos se almacenan en buffer y quedan a disposición.

• En ACTIONS realizamos los distintos cálculos/operaciones.


• En LOAD escribimos los resultados en nuestro sistema
exterior.
• En ACTIONS realizamos nuevas acciones.

*Ejemplo con diagrama de la derecha


1,175us es el tiempo que tarda un loop del polling.
Si existen eventos que se producen a menor tiempo, los perdemos, sean síncronos o
no.
El tiempo de proceso que calculamos define si nuestro sistema del programa sirve
para undeterminado requerimiento temporal.
Debemos saber, con precisión, ese requerimiento de nuestro sistema y también la
velocidad con la que él mismo responde a ese requerimiento.

Por lo general se recomienda que se agregue un margen de seguridad. Con eso el


sistema podrá dar respuesta a otro sistema cuyo requerimiento sea mayor al de 10us.
En esos 10us nuestro software debe tomar los valores que ingresen al sistema,
procesarlos y calcular las salidas.
Una vez determinado el requerimiento temporal del sistema/proceso a controlar, el
controlador digital a diseñar deberá realizar sus cálculos en un tiempo menor al determinado
del sistema incluyendo un cierto margen de seguridad.

Etapas de ejecución {video STR 08}

IF→ busca en el programa la próxima instrucción en la memoria del programa EPROM pin
externo→ nos permite llevar a la máquina a un nuevo estado (interrupción)
int→ nuevo evento: interrupción: cada vez que el pin externo realice una determinada señal,el
nuevo estado influenciará en IF
vector de interrupciones→ almacena las direcciones de las primeras instrucciones de cadauna de
las rutinas que atienden a la interrupción.
Interior de un uC
• EPROM→programa

• RAM→ se declaran las variables y otras estructuras que se necesiten


• Módulo NVIC (Nested Vectored Interrupt Controller) → controla las instrucciones que
podamos generar en el pin externo
• Program counter→ registro que contiene la dirección de la instrucción que se está
ejecutando.
En el momento en el que llega una interrupción a través del pin externo, el hardware dedicado a
interrupciones, guarda la dirección de la interrupción que se está ejecutando (que está en el
program counter) en un stack (estructura de datos de pila) y en el vector de interrupciones se
encuentra la primera instrucción de la rutina que tiene que dar solución a esa interrupción. cada una
de esas direcciones que se encuentran en el vector de interrup. Tienen una relación con el pin o
número de interrup. que se está generando. Una vez esto,el hardware que genera las interrup. Toma
en control y pone la dirección que se encuentra en el vector en el programa counter. Luego el
program counter determinará cuál será la próxima interrupción. en ejecutarse y esa interrupción.
Pertenece a la rutina de atención de la interrupción que se ha generado. Por lo tanto, ahí comienza
la generación de otro código que pertenece a esa interrupción. una vez que el código finaliza, le
manda una señal al hardware tal que éste trae la dirección que había almacenado en el stack, la
guarda en el program counter y a partir de ahí da continuidad al código que se venía ejecutando
anteriormente y el desenvolvimiento normal del programa de la EPROM.

Ejecución de interrupciones

Programa principal y tres rutinas de tres tipos de interrupciones.


Comenzamos ejecutando el programa, llega una interrupción de manera asíncrona,
tiene el número 1 y nos indica que se tiene que ejecutar la rutina que atiende a esa
interrupción. Se carga la rutina que pertenece a esa interrupción, se termina y volvemos al
programa principal hasta que aparezca o no alguna otra.

Son asíncronas, no sabemos cuándo llegarán ni tampoco respetan el orden 0,1,2.


¿Qué sucede si mientras se ejecuta una interrupción se genera otra? → se debendefinir
prioridades

Comenzamos ejecutando el programa, llega una interrupción (en el ejemplo la 0 y


tiene el menor grado de prioridad) se ejecuta su código; en ese momento llega una
interrupción de mayor prioridad (interrupción 2), por lo tanto, para la otra, se ejecuta la de
mayor y cuando ésta termina, sigue la que se estaba ejecutando, termina y vuelve a
ejecutarse el programa.
Si comienza el programa y llega la interrupción de mayor prioridad se ejecuta y si en
ese momento llega una de menor prioridad a esta, no pasa nada. la interrupción de mayor
prioridad sigue ejecutándose y cuando termina, se ejecuta la de menor prioridad.

DMA: Acceso Directo a Memoria:

Sucede que el microprocesador es un cuello de botella debido a que siempre hay un


programa principal para correr. Cada vez que ingresamos un dato, tenemos que ejecutar
múltiples instrucciones, cada una de estas requiere como mínimo un acceso a la memoria.

Para solucionar esto se usa el DMA, acceso directo a memoria. Se necesita de un


DMA control que realiza las siguientes funciones: quitar al CPU el uso del BUS; conectar el
puerto al bus y provee todas las señales y la dirección en donde se debe realizar la
transferencia del dato en memoria; luego, una vez terminada la transferencia, DMAC otorga
al CPU el uso del bus.
Para quitar el CPU del bus, algunos uP tienen una entrada TSC (tri state control) que
permite ponerlo en estado de alta impedancia y parar el clock (“duerme”).

Acceso Directo a Memoria:


Permite a cierto tipo de componentes de una computadora acceder a la memoria del
sistema para leer o escribir independientemente de la unidad central de procesamiento
(CPU). Muchos sistemas hardware utilizan DMA, incluyendo controladores de unidades de
disco, tarjetas gráficas y tarjetas de sonido. DMA es una característica esencial en todos los
ordenadores modernos, ya que permite a dispositivos de diferentes velocidades comunicarse
sin someter a la CPU a una carga masiva de interrupciones.
Una transferencia DMA consiste principalmente en copiar un bloque de memoria de
un dispositivo a otro. En lugar de que la CPU inicie la transferencia, esta se lleva a cabo por
el controlador DMA. Un ejemplo típico es mover un bloque de memoria desde una memoria
externa a una interna más rápida. Tal operación no ocupa al procesador y, por ende, éste
puede efectuar otras tareas. Las transferencias DMA son esenciales para aumentar el
rendimiento de aplicaciones que requieran muchos recursos.
Cabe destacar que, aunque no se necesite a la CPU para la transacción de datos, sí se
necesita el bus del sistema (tanto bus de datos como bus de direcciones), por lo que existen
diferentes estrategias para regular su uso, permitiendo así que no quede totalmente
acaparado por el controlador DMA.

TIMERS Y SERVICIOS DE TIEMPO


● Interrupciones internas: TIMERS
Útiles para la programación. Es una interrupción parametrizable y síncrona habilitada por el
programador y que permite la ejecución de una rutina de manera periódica a partir de una base de
tiempo interna del uP.
De este modo logramos tener una herramienta que nos permite ejecutar un código
determinado que corresponde a la rutina de atención de ese timer cada un período determinado por
el programador.
Comienza a ejecutarse el programa principal y nos llega una interrupción de timer. En ese
momento, como toda interrupción, se corta la ejecución del programa principal y se ejecutala rutina
de atención a esa interrupción, ésta finaliza y se vuelve al código principal que se ejecutará un
determinado tiempo. una vez cumplido ese tiempo.

Cada un determinado tiempo (definido por el programador) se ejecuta la rutina de ese timer.
Dentro del esquema de las etapas de ejecución se agregan: etapa de interrupciones externas
(asíncronas) y una etapa de interrupciones internas (síncronas).

CIRCUITOS DE WATCHDOG
El watchdog es un temporizador interno de la unidad de control (UC), que dispone
de su propio oscilador RC interno, que provoca un reset del sistema en caso de que éste se
haya bloqueado. Es un mecanismo pensado para evitar que el UC se encuentre en un estado
indeterminado como consecuencia de un error de programación o de un fallo hardware
(alimentación, etc.). Por eso, su función es la de mantener la seguridad en el sistema para
evitar que entre en un estado descontrolado.
Su funcionamiento se basa en un temporizador interno que irá continuamente
decrementando de forma secuencial un contador con un tiempo prefijado, inicialmente con
un valor relativamente alto. El tiempo nominal de desbordamiento es dependiente de la
temperatura, la tensión de alimentación y varía con el chip.

Cuando este contador llegue a cero, se reiniciará el sistema, así que se debe diseñar
una subrutina en el programa de manera que refresque o reinicie al perro guardián antes de
que provoque el reset. Si el programa falla o se bloquea, al no actualizar el contador del
perro guardián a su valor de inicio, éste llegará a decrementarse hasta cero, se desbordará
y se reiniciará el sistema que volverá a un estado conocido y seguro. El desbordamiento del
perro guardián se puede dar en funcionamiento normal o en el estado de reposo.
A veces el circuito del perro guardián es un chip externo al procesador y a veces es la parte
integral como es el caso de muchos microcontroladores. A menudo, los watchdogs también lanzan
otras acciones preventivas aparte de reiniciar el procesador. Pueden desencadenar la actuación de
sistemas de control, por ejemplo, para apagar sistemas peligrosos como motores, circuitos de alta
potencia, generadores de calor, etc.
Al gráfico anterior de interrupciones TIMERS se lo complementa con otra
herramienta: WATCHDOG.

Es un timer al cual se lo debe actualizar durante todo el programa, de tal modo que
no se produzca.
Sería una interrupción que no queremos que se produzca→ esto es útil porque en el
momento en el que se produzca el watchdog pasaremos al estado HALT que es un estado
de parada/reset del uC. Si en algún momento ocurre la interrupción de watchdog, nuestro
controlador y programa se resetearán.

El watchdog se implementa mediante un contador descendente. Una vez que


inicializamos un contador, a medida que pasa el tiempo y de manera independiente, se va
descontando hasta llegar a cero. Cuando llega a cero se produce la interrupción. Pero
debemos evitar que llegue a cero: cada cierto tiempo tenemos que ir actualizando el valor del
watchdog.
En el ejemplo se setea el watchdog en 100. A medida que el programa se va
ejecutando, el watchdog va decrementando y en un primer momento lo que hacemos es una
actualización: cuando llega a 23 lo hacemos volver a 100. Luego sigue todo normal.

¿Qué sucede si no lo actualizamos? Se produce la interrupción de watchdog, se corta la ejecución


del programa principal, se inicializa nuevamente en 100 y se comienza a ejecutar la rutina principal
del programa.
Ahora surgen nuevas preguntas:
● ¿Se puede implementar un botón de emergencia?
● ¿Qué hacer ante una inestabilidad del software? (cuando se tilda)
● Con los elementos incorporados, ¿cómo hacer un análisis de tiempo?

ENTRADA Y SALIDA – CONVERSORES


Parámetros más importantes
● Voltaje de referencia y de trabajo - Voltaje, referencia interna o externa,
precisión, sobrevoltaje, etc.
● Tipo de ADC - Flash, Aproximaciones sucesivas, Delta, Sigma
● Resolución - 1 - 32 bits, ENOB
● Frecuencia de muestreo - Mayor velocidad = menor precisión y mayor consumo
● Canales - 1 - 16 típicamente
● Tipo de entradas - Single Ended, diferencial
● Otros parámetros: Consumo, oscilador, repetitividad y precisión en la
medida, linealidad, impedancia de entrada, tipo de interfaz, encapsulado.

Programar un A/D
Necesita una tensión de referencia para poder trabajar adecuadamente Vref, además
de la cantidad de bits que presenta el conversor analógico digital. Luego se podrá calcular la
resolución:

Se debe configurar al PIC en los siguientes registros: ADCON, ADSTAT e INTCON


[Link]
Para convertir una señal analógica en digital, el primer paso consiste en realizar un
muestreo (sampling). Este, toma muestras de voltaje en diferentes puntos de la señal. La
frecuencia a la que se realiza el muestreo se llama frecuencia de muestreo y se mide en Hz. A
mayor cantidad de muestras tomadas, mayor calidad y fidelidad tendrá la señal digital
resultante.
Circuito de retención: una vez que se toma muestras de la señal periódicamente, es
necesario mantener estables el valor, a su salida un tiempo necesario para el próximo paso
que es el de cuantificación.

Una señal cuyo muestreo se realice a 24 kHz, tendrá menos calidad y fidelidad que
otra realizada a 48 kHz. Sin embargo, mientras mayor sea el número de muestras tomadas,
menor será el tiempo disponible para procesarla.
El siguiente paso es la cuantización de cada muestra (valores numéricos decimales
discretos). Luego sigue la codificación en donde los valores de las tomas de voltajes se
representan numéricamente por medio de códigos y estándares previamente establecidos. Lo
más común es codificar la señal digital en código numérico binario.
Los valores binarios acorde a cada voltaje de entrada se verán como sigue:

CARACTERISTICAS DE LA SEÑAL

❖ Resolución

Es expresada en unidades de tensión, dependerá del escalón tomado como referencia


con respecto a los niveles de tensión dado por el número de bit, por ejemplo, con n bit, habrá
2^n niveles de tensión.

❖ Desviación máxima

La máxima desviación entre la gráfica real y la recta ideal se define como linealidad
integral y se expresa en porcentaje del valor de fondo de escala (%FSR-font scale range).
Como valor típico de linealidad integral es +/- 0,5 LSB, con lo que es necesario que el
conversor garantice para todas las condiciones de trabajo este valor.
❖ PARÁMETROS DINÁMICOS:

1. Tiempos de conversión: es el tiempo desde que se aplica la señal de convertir hasta que
la señal (analógica o digital) esté disponible a la salida.

2. Tiempo de adquisición: es el tiempo durante el cual el sistema de muestreo y


retención (sample & hold) permanece en estado de muestreo (sample), para asegurarse que el
consiguiente estado (retención o hold) esté dentro de la banda de error especificada para la
señal de entrada.

3. Tiempo de asentamiento: tiempo entre la señal de retención y la salida estabilizada de


la señal (dentro de la banda de error especificada).

4. Slew rate: significa velocidad de subida. Es la velocidad a la cual el valor de la salida


del S&H converge al valor muestreado deseado. El proceso de conversión requiere que la
señal analógica de entrada permanezca en un valor constante de tal forma que el ADC pueda
realizar su tarea en forma adecuada.

❖ Programar A/D - amplitud:

Al momento de programar un Conversor Análogico Digital ,se debe contar con la


tensión de referencia Vmax. En el ejemplo que sigue se usará una Vmax de 5 V y los bits
destinados al CAD será de 10:

Obviamente esta resolución nos delimitará un error de cuantificación gracias a nuestra


señal cuantificada. El error gráficamente se vería como sigue:

Conversores A/D y D/A


La salida producida por casi todos los sensores es de tipo analógico. Cuando un uC forma parte de
un sistema de medición o de control, es necesario convertir la salida analógica del sensor en una
digital antes de alimentar al uC. De igual manera, muchos actuadores funcionan con entradas
analógicas por lo que las salidas digitales de un UC deben convertirse a su forma analógica antes de
utilizarla como entrada del actuador.
● Conversión A/D
La conversión A/D implica la conversión de señales analógicas a palabras binarias.

● Elementos básicos de la conversión

Procedimiento→ un temporizador que proporciona al CAD impulsos de señal de duración regular


y cada vez que este recibe un impulso muestra la señal analógica.

figura 2.a muestra la señal analógica


La figura 2.b muestra la señal que proporciona las señales de tiempo en las que se realizael
muestreo.
Figura 2.c muestra el resultado del muestreo: impulsos angostos.
Luego se utiliza una unidad de muestreo y retención (sample and hold) para retener cada valor de
muestreo hasta que se produce el siguiente impulso. Esta unidad es necesaria porque el convertidor
requiere una cantidad finita de tiempo (tiempo de conversión) para convertir una señal de analógica
a digital.

Interruptor electrónico para tomar la muestra, un capacitor para retenerla y un seguidor de voltaje
en un amplificador operacional.
El interruptor se controla tal que la muestra se tome en el momento que lo dicte la entrada de
control, una vez que el interruptor se cierra, el voltaje de entrada se aplica en el capacitor y el voltaje
de salida se vuelve igual al voltaje de entrada, si el Vin cambia mientras el interruptor está cerrado,
el V en el capacitor y el Vout reflejarán el cambio. Cuando el interruptor se abre el capacitor retiene
su carga y el Vout sigue siendo igual al de Vin en el momento en el que se abrió el interruptor. el V
queda retenido hasta que el interruptor se vuelve a cerrar.
El tiempo necesario para que el capacitor se cargue hasta el valor analógico de entrada de una
nueva muestra se llama tiempo de adquisición y depende del valor de capacitancia resistencia del
circuito cuando el interruptor está conectado. Sus valores típicos son del orden de los 4us.
La relación entre la entrada muestreada y retenida y la salida de un CAD: salida restringida de 3 bits.
Existen 8 niveles de salida posibles, por lo tanto, dado que la salida de CAD, para representar
la entrada analógica sólo puede ser uno de estos 8 niveles posibles.
Existen un intervalo de entradas donde las salidas no cambian, estos 8 niveles adyacentes se
llaman intervalo de cuantización, en la figura es 1 voltio.
Dado la naturaleza tipo escalón de la relación la salida digital no siempre es proporcional ala
entrada analógica por lo que siempre habrá un error denominado error de cuantización. Cuando la
entrada está centrada en el intervalo, el error de cuantización es cero, el error máximo es igual a la
mitad del intervalo más menos medio bit.
La longitud posible de la palabra determinada: resolución del elemento: el cambio más pequeño en
la entrada que produce un cambio en la salida digital: un bit en la posición del bit menos
significativo de la palabra (bit en el extremo derecho) así, en una palabra con longitud de N bits de
entrada analógica escala total esta.

Los CAD muestrean señales analógicas en intervalos regulares y convierten estos valores en
palabras binarias→ tasa de muestreo→ teorema de Nyquist.

Tipos de CAD:
Es el más utilizado. El voltaje se genera mediante el temporizador que emite una
secuencia regular de impulsos que son contados de forma binaria y la palabra binaria
resultante se convierte a un voltaje analógico utilizando un CDA. Este voltaje aumenta en
escalón, si se compara con el V de entrada analógico del sensor, cuando el V generado por
el temporizador sobrepasa el V analógico de la entrada, los impulsos del temporizador se
detienen mediante el cierre de una compuerta. La salida que en ese momento produce el
contador es una representación analógica del V analógico.
Si la comparación puede realizarse iniciando el conteo en 1, el bit menos
significativo, y luego continuar bit tras bit de forma ascendente, el método más rápido es el
de las aproximaciones sucesivas. se elige del bit más significativo que sea menor que el
valor analógico y después se agregan bits sucesivos menores para los cuales el valor total
no excede el valor analógico.

Como cada uno de los bits de la palabra se prueba en secuencia, en una palabra, de
N bits, solo se requieren N pasos para hacer la comparación, por lo tanto, si la frecuencia
del reloj es Fe, el tiempo entre impulsos es 1/Fe, así el tiempo necesario de conversión es
N/Fe.

Rampa

Se utiliza un V analógico que se aumenta a una tasa constante→ V rampa y se aplica


un comparador donde se compara con el V analógico del sensor.
El tiempo en el que el V rampa tarda en tener el valor del V del sensor dependerá del
valor de la magnitud del V analógico muestreado.
Cuando inicia el V rampa, se abre una compuerta para arrancar un contador binario
que cuenta los impulsos regulares del temporizador, cuando ambos V son iguales la
compuerta se cierra y la palabra que indica el contador es la representación digital del V
analógico muestreado.

Es más común que el de una sola rampa. El V analógico se aplica al integrador que
maneja el comparador, la salida del comparador aumenta en cuanto la salida del integrador
es mayor que unos cuantos mV. Cuando la salida del comparador es alta, una compuerta
AND pasa impulsos a un contador binario que los cuenta hasta que se produce un
desbordamiento; el contador vuelve al valor cero y envía una señal a un interruptor que
desconecta el V desconocido, conecta el V de referencia e inicia de nuevo el conteo.
La polaridad de V de referencia es opuesta a la del V de entrada, el V del integrador
entonces disminuye a una tasa proporcional al V de ref. Cuando la salida del integrador es
cero, el comparador produce un valor bajo, con lo cual la compuerta AND también tiene un
valor bajo y el temporizador se apaga. Entonces el conteo es una medida del V de entrada
analógico.
Estos CAD tienen un gran rechazo al ruido debido a que la acción integral promedia
las contribuciones aleatorias negativas y positivas a lo largo del periodo de muestreo. Sin
embargo, son muy lentos.
Es muy rápido. En un convertidor de N bits se utilizan en paralelo 2’ n-1
comparadores de V, y en cada uno de ellos el V de entrada analógico es una entrada.
Un V de ref se aplica a una escalera de resistencias de manera que el V aplicado
como entrada en cada comparador tenga un bit mayor que el V aplicado al comparador
anterior.
Por lo tanto, cuando al CAD se le aplica el V analógico, todos los comparadores
con V analógico mayor que el V de ref de un comparador producirán una salida alta
y en los que es menor, una salida baja. Las salidas obtenidas se alimentan en paralelo
a un sistema de compuertas lógicas que las traduce en una palabra digital.

Para saber cada cuánto (intervalo de tiempo) debo realizar el muestreo, aplico el
teorema de Nyquist. ↓
Límite de Nyquist {video STR 09}
Adecuación de los niveles: ¿cómo muestrear señales que son muy débiles/pequeñas como por
ejemplo, diferencias de presión que son pequeñas variaciones de tensión en un transductor? Es
necesario amplificarla antes de conectarlas al ADC. Se multiplica el voltaje por alguna
ganancia Av.

Tasa de muestreo fs
Efecto aliasing→ (o solapamiento) es el efecto que causa que señales continuas distintas se
tornen indistinguibles cuando se muestrea digitalmente. Cuando esto sucede, la señal original
no puede ser reconstruida de forma unívoca a partir de la señal digital.
Teorema de Nyquist→ la frecuencia a la que tenemos que muestrear debe ser al menos dos
veces mayor a la frecuencia máxima de la señal.

El ingeniero Harry Nyquist formuló el siguiente teorema para obtener una


grabación digital de calidad: “La frecuencia de muestreo mínima requerida para
realizar una grabación digital de calidad, debe ser igual al doble de la frecuencia
de audio de la señal analógica que se pretenda digitalizar y grabar” - Condición
de Nyquist.
Entonces la velocidad de muestreo tiene un límite dado por el Teorema de
Nyquist, dicho de otra forma, la frecuencia de muestreo debe ser mayor al doble que la
frecuencia máxima del ancho de banda de la señal muestreada. Si esto no se cumple
surge un fenómeno denominado aliasing.

Como se ve en la imagen, fam es la frecuencia de muestreo mínima y f la


frecuencia de la señal a muestrear. El aliasing nos hace pensar que la onda es de una
frecuencia distinta, sin embargo, si fam = 2f obtendremos una onda chata.
Pero en el último diagrama se ve que la frecuencia de muestreo se adapta bien a
la de la señal muestreada porque fam > 2f. Un buen criterio general para la velocidad
surge del equilibrio del tiempo de resolución del algoritmo más un cierto tiempo de
protección.

Configurar un Conversor Analógico Digital en un uC

El CAD está bajo el control de los bits de cuatro registros:


● ADRESH - Registro alto del resultado de la conversión A/D
● ADRESL - Registro bajo del resultado de la conversión A/D
● ADCON0 - Registro de control 0
● ADCON1 - Registro de control 1

El resultado obtenido después de convertir un valor analógico en digital es un


número de n bits que se almacena en los registros ADRESH y ADRESL. Hay dos
maneras de manejarlo: justificación a la izquierda y a la derecha. En caso que no se
utilice el A/D, estos registros se pueden utilizar como registros de propósito general.

Los ADCON son los registros para configurar el clock que tendrá el A/D (esto
afecta a la conversión). La señal de reloj se genera por el oscilador interno. El ADCON
se habilita como registro para A/D en el registro INTCON.
Ancho de banda

El ancho de banda es la diferencia medida en Hertz, entre la máxima y la


mínima frecuencia que puede pasar por un canal de comunicaciones.
A partir de la velocidad en que se toman las muestras o de la frecuencia a que
se llevará a cabo esta acción, es posible asociar el concepto de Ancho de banda de
Nyquist definida como:

Como regla general, la frecuencia de muestreo debe cumplir la siguiente condición:

Periodo de muestreo

A partir de una gráfica y su curva expresada matemáticamente, es posible


obtener el tiempo de crecimiento y definir el periodo de muestreo obteniendo el ancho
de banda. Esto no siempre es posible así que también se puede estimar el periodo de
muestreo calculando el periodo de oscilación del sistema en lazo cerrado. Luego se
tomará como periodo de muestreo máximo a la décima parte del tiempo o periodo de
oscilación.

CONVERSIÓN D/A

La entrada de un CDA es una palabra binaria, la salida es una señal analógica que representa
la suma ponderada de los bits que no son cero, representados por la palabra.
Por ejemplo: la entrada 0010 produce una salida analógica que es el doble de lo que se obtiene
con una entrada de 0001.
Esta figura ilustra la entrada de un CDA con resolución de 1 V para palabras binarias.
Tipos de CDA

(Video STR 11)

Utiliza un amplificador sumador para formar la suma ponderada de todos los


bits que no son cero en la palabra de entrada. El Vref se conecta a las resistencias por
medio de interruptores electrónicos que responden al 1 binario, los valores de las
resistencias de entrada dependen de qué bit de la palabra responde a un interruptor. El
valor de la resistencia para los bits sucesivos de LSB se reduce a la mitad, por ello la
suma de los V es una suma ponderada de los dígitos de la palabra.
La desventaja es que requiera de R exactas para cada resistor por lo cual es un
problema para el amplio intervalo que se necesita. Se limita para conversiones de 4
bits.

(Video STR 12)


Resuelve los problemas de obtener R exactas ya que solo se necesitan dos
valores.
El V de salida se genera conmutando las secciones de la escalera con el V ref a
0V, dependiendo de si hay un 1 o un 0 en la entrada digital.

Una retención es un dispositivo que retiene una salida hasta que una nueva la
reemplaza. Cuando un CDA la posee, se puede conectar directamente con el bus de
datos de un UC que lo considera como una dirección más para el envío de datos. Si no
tiene retención, se conecta a través de un adaptador de interfaz de periféricos. Para
proporcionar la retención se utiliza el zn 558

Limitación de velocidad

La velocidad de muestreo depende del contexto en el que se aplica la


digitalización. No es lo mismo digitalizar una señal que tenga muchos cambios en poco
tiempo a una que tenga pocos cambios en mucho tiempo. La segunda será mucho más
fácil de digitalizar.
También hay que tener en cuenta la precisión de la digitalización que queremos
lograr.

.
Unidad N° 3: Introducción a los RTOS:

Sistema operativo de uso general. Sistemas operativos multitarea de tiempo real.


Administrador de tareas. Requisitos temporales. Tareas periódicas y esporádicas.
Administración básica de memoria, intercambio de segmentos de programa por las propias
tareas. Procesos e hilos. comunicación entre procesos. Secciones críticas. Exclusión mutua
con espera activa. Dormir y despertar. Semáforos. Monitores. Transferencia de mensajes.
Control de recursos.
0. INTRODUCCIÓN

La mayoría de los sistemas embebidos están limitados por restricciones de tiempo real. En los
controles de producción las maquinas deben recibir sus órdenes al tiempo justo para garantizar el buen
funcionamiento de la fábrica y para satisfacer las necesidades de los clientes. O en los vuelos, los
sistemas de control de vuelos contienen muchísimos artefactos cuyas operaciones dependen en exclusiva
del tiempo, como, por ejemplo, los controles de combustión de las turbinas, etc. “Tiempo Real”
significa que el sistema informático ya no controla su propio dominio de tiempo, ahora el progreso del
tiempo del ambiente es el que dicta como el tiempo progresa dentro del sistema.

1. SISTEMA OPERATIVO DE USO GENERAL

Es un programa centrado para máquina determinada. El propósito de un sistema operativo es:


– Administrar recursos (hardware, software, tiempos)
– Interfaz para el acceso al hardware y al sistema mismo
– Soportar a lenguajes de alto nivel (overhead)
– Minimizar la complejidad e incrementar la seguridad
Convierte al hardware en una VM.

Un sistema operativo es un software que se ejecuta en un microcontrolador o un sistema con


microprocesador que cumple una serie de funciones. Primeramente, se encarga de ejecutar procesos o
tareas, asignando un tiempo de ejecución dependiendo de su prioridad. En segundo lugar, gestiona
archivos y carpetas a los que tienen acceso las aplicaciones. Por último, gestiona los controladores de los
dispositivos conectados, como teclados, tarjetas de sonido, discos duros, etc.

En un SO de uso general los retardos que existen entre la ejecución de cada tarea son despreciables y lo
que es llamado el administrador de tareas o «scheduler» no funciona de una manera predecible, por lo
que el orden de ejecución de las tareas y el tiempo que se mantendrán funcionando no se puede saber.

Se puede afirmar que la misión de un sistema operativo es doble: por una parte, suministrar al
usuario una máquina virtual más fácil de manejar que el propio hardware y que oculte al usuario
los aspectos del diseño de éste. Por otra parte, debe ser gestor de una serie de recursos, hardware y
software, que son compartidos por los procesos y usuarios que estén trabajando simultáneamente
en el sistema. En todo lo que resta de capítulo se entenderá siempre que se trata con sistemas operativos
multiusario y multitarea a menos que se especifique lo contrario.

La forma más sencilla de entender un SO es concebirlo como un bloque monolítico. El acceso al


hardware y a los dispositivos E/S se realiza a través del SO (en sistemas monousuario es posible eludir al
SO para manejar el hardware directamente). El núcleo de un SO general, de tiempo compartido, a
menudo ofrece una serie de facilidades que para una aplicación en particular pueden no ser necesarias,
pero si están incluidas en el Kernel del SO lo están haciendo más sofisticado y penalizando el tiempo
requerido para realizar las tareas que tenga encomendadas. Recientemente los sistemas operativos que
proporcionan un kernel mínimo (microkernel) se están haciendo muy populares, el resto de las
características pueden ser añadidas desde un lenguaje de alto nivel por un programador de aplicaciones
(que no tiene por qué ser el usuario final). El término microkernel no quiere decir, estrictamente, que el
tamaño que ocupa sea pequeño, sino que está diseñado de manera que realiza solamente las misiones
fundamentales del sistema, dejando para otros procesos el atender a los restantes servicios del sistema
operativo.

El SO se utiliza para facilitar la multitarea y la integración de tareas en diseños con recursos y


tiempo limitados, como suele ocurrir en los sistemas integrados. Además, el término "tiempo real" indica
previsibilidad/determinismo en el tiempo de ejecución más que velocidad bruta, por lo que normalmente
se puede demostrar que un RTOS satisface los requisitos de tiempo real duro debido a su determinismo.

Los conceptos clave de los RTOS son:

Tarea: Las tareas (también podrían llamarse procesos/hilos) son funciones independientes que se
ejecutan en bucles infinitos, normalmente cada una responsable de una función. Las tareas se ejecutan
de forma independiente en su propio tiempo (aislamiento temporal) y pila de memoria (aislamiento
espacial). El aislamiento espacial entre las tareas puede garantizarse con el uso de una unidad de
protección de memoria por hardware (MPU), que restringe la región de memoria accesible y
desencadena excepciones de fallo en caso de violación de acceso. Normalmente, los periféricos
internos están mapeados en la memoria, por lo que se puede utilizar una MPU para restringir el acceso
a los periféricos también.

El Kernel o núcleo, es una parte fundamental del sistema operativo que se encarga de
conceder el acceso al hardware de forma segura para todo el software que lo solicita, el Kernel es
una pequeña e invisible parte del sistema operativo, pero la más importante, ya que sin esta no
podría funcionar. Todos los sistemas operativos tienen un Kernel.
Este núcleo de los sistemas operativos se ejecuta en modo privilegiado con acceso
especial a los recursos del sistema para poder realizar las peticiones de acceso que le va pidiendo
el software que lo necesita, además como los recursos no son ilimitados, también hace de arbitro
a la hora de asignarlos, decidiendo el orden de las peticiones recibidas según la prioridad e
importancia de estas. Una gestión muy importante y fundamental que en la mayoría de las
ocasiones pasa desapercibida aun siendo un trabajo esencial para coordinar todo el hardware con
el software. Sirve para administrar los recursos de hardware solicitados por los diferentes
elementos de software y hacer de intermediario decidiendo a que y cuando se concede este
acceso evitando así sobrecarga del sistema, recursos innecesarios y acceso a software malicioso
al propio Kernel y llegar a poder controlar así todo el sistema.
Las tareas pueden estar en diferentes estados:

• Bloqueado: la tarea está esperando un evento (por ejemplo, tiempo de espera, disponibilidad de
datos/recursos)
• Listo: la tarea está lista para ejecutarse en la CPU, pero no se está ejecutando porque la CPU está
siendo utilizada por otra tarea
• En ejecución: la tarea está asignada para ser ejecutada en la CPU

Programador: Los programadores en el RTOS controlan qué tarea debe ejecutarse en la CPU y existen
diferentes algoritmos de programación. Normalmente lo son:

• Preventivo: la ejecución de la tarea puede ser interrumpida si otra tarea con mayor prioridad está
lista
• Cooperativo: el cambio de tarea solo se producirá si la tarea que se está ejecutando en ese
momento se rinde

La programación preventiva permite que las tareas de mayor prioridad interrumpan a las de menor
prioridad para cumplir con las restricciones de tiempo real, pero tiene el costo de una mayor sobrecarga
en el cambio de contexto.

Comunicación entre tareas (ITC): Normalmente, varias tareas tendrán que compartir información o
eventos entre sí. La forma más sencilla de compartir es leer/escribir directamente las variables globales
compartidas en la RAM, pero esto no es deseable debido al riesgo de corrupción de datos causado por
una condición de carrera. Una mejor manera es leer/escribir variables estáticas de archivo accesibles
por funciones setter y getter, y las condiciones de carrera pueden ser prevenidas deshabilitando las
interrupciones o usando un objeto de exclusión mutua (mutex) dentro de la función setter/getter. La
forma más limpia es utilizar objetos RTOS seguros para hilos, como la cola de mensajes, para pasar
información entre tareas.

Además de compartir información, los objetos RTOS también son capaces de sincronizar la ejecución de
tareas, ya que éstas pueden bloquearse para esperar la disponibilidad de los objetos RTOS.

2. SISTEMAS OPERATIVOS MULTITAREA DE TIEMPO REAL

Una de las necesidades fundamentales de un SO es asignar recursos del computador a las diversas
actividades que se deben realizar. En un SOTR este proceso es complicado debido al hecho de que algunas
actividades son temporalmente críticas y unas tienen mayor prioridad que otras. Debe haber algún medio
para asignar prioridades a las tareas para que el planificador (scheduler) disponga su ejecución de acuerdo
a un esquema de prioridades. Además, hay que añadir cuestiones como la gestión de la memoria entre las
distintas tareas y las características estándar para soportar un sistema de archivos, dispositivos de E/S y
programas de utilidad. El control de todo el sistema recae sobre el módulo gestor de tareas responsable
de la asignación de la CPU. Este módulo muchas veces se conoce como monitor o ejecutivo. Todas las
características mencionadas anteriormente son compartidas tanto por SOTR como por otros sistemas
multitarea y multiusuario en tiempo compartido como el ya conocido UNIX.
Un hecho verdaderamente diferencial entre los SOTR y los SO en tiempo compartido es el algoritmo
de planificación para la asignación de la CPU. En los SOTR la aplicación y el SO se encuentran
íntimamente acoplados, mucho más que en los sistemas en tiempo compartido. Un SOTR debe ser capaz
de responder a intervalos prefijados o ante eventos externos de una manera determinista, y esto sin
importar el impacto que pueda derivar sobre otras tareas o procesos. En un entorno en tiempo real,
las tareas críticas deben recibir los recursos del sistema que necesiten y cuando los necesiten, a pesar de
los efectos que puedan ocasionar a otras tareas. Este hecho también condiciona el comportamiento del
SO frente a otros aspectos como pueden ser el sistema de archivos y la gestión de dispositivos de E/S.

Características:

➢ Soporte para la planificación de procesos en tiempo real:


Un SOTR debe proporcionar soporte para la creación, borrado y planificación de múltiples procesos,
cada uno de los cuales monitoriza o controla parte de una aplicación. Típicamente, en un SOTR, es
posible definir prioridades para procesos e interrupciones. En contraste, en un sistema de tiempo
compartido, solo el propio sistema operativo determina el orden en que se ejecutan los procesos.

➢ Planificación por prioridad (pre-emptive).


Un SOTR debe asegurar que un proceso de alta prioridad, cuando esté listo para ejecutarse, pase por
delante de un proceso de más baja prioridad. El SO deberá ser capaz de reconocer la condición
(usualmente a través de una interrupción), pasar por delante del proceso que se está ejecutando y
realizar un rápido cambio de contexto para permitir la ejecución de un proceso de más alta prioridad.
Un SO de propósito general como el UNIX SYSTEM V si tiene un proceso corriendo en el kernel
debe esperar a que finalice su ejecución en este espacio (en el cuanto de tiempo que le corresponde)
para luego activar el proceso más prioritario.

➢ Garantía de respuesta ante interrupciones.


Un SOTR debe reconocer muy rápidamente la aparición de una interrupción o un evento, y tomar
una acción determinística (bien definida en términos funcionales y temporales) para atender a ese
evento. Debe responder tanto a interrupciones de tipo hardware como software. El propio SO debe
ser interrumpible y reentrante (recordar que uno de los problemas del DOS, que no es un SOTR, se
debe a no ser reentrante). Las interrupciones son una fuente introductoria de indeterminismo,
imponen la aparición de latencias. Estudiaremos éstas al final del capítulo.
➢ Comunicación interprocesos.
Un SOTR debe ser capaz de soportar comunicaciones interprocesos de manera fiable y precisa, tales
como semáforos, paso de mensajes y memoria compartida. Estas facilidades se emplean para sincronizar
y coordinar la ejecución de los procesos, así como para la protección de datos y la compartición de
recursos.
Según cómo, dónde y cuándo se ubiquen en memoria, los programas pueden ser de varios
tipos:

Programas Reentrantes:
Son aquellos programas que, si no se están ejecutando, dejan la memoria libre para otros
procesos. Estos procesos, cuando se liberan, se suelen almacenar temporalmente en el disco duro.
Son los procesos gestionados mediante la técnica de memoria virtual.

Programas Reubicables:
Son aquellos que, una vez cargados en RAM para ejecutarse, pueden variar de situación, ya
que la parte de RAM que ocupan puede ser necesaria para ubicar otro proceso. Estos procesos o
programas cambian de posición cuando se está realizando una operación sobre el ordenador. Esta
operación suele ser de configuración interna del propio ordenador.

Programas Residentes:
Son aquellos que, una vez cargados en memoria, permanecerán en ella hasta que se apague
el ordenador. No cambian su ubicación en ningún momento. Suelen ser programas de antivirus, de
análisis de sistema, de monitorización, etc. Los más comunes son los llamados centinelas, que
incorporan los antivirus para que analicen continuamente lo que se carga en memoria. De esta
forma, si se ejecuta un proceso, el programa residente lo analiza y, si detecta algo raro o extraño,
envía un mensaje de alerta.
La ubicación de estos programas en memoria dependerá, fundamentalmente, del sistema
operativo y de la propia aplicación que lance el programa residente. Suelen ubicarse en esos 64 KB
de memoria, aunque no necesariamente.

Programas Reutilizables:
Son programas que normalmente son utilizados por varios usuarios a la vez en memoria,
independientemente del número de usuarios que los vayan a utilizar. Con ello se consigue un mejor
aprovechamiento de la memoria.

➢ Adquisición de datos a alta velocidad.


Es necesario que el sistema sea capaz de manejar conjuntos de datos con una alta velocidad de
adquisición. De esta forma, un SOTR proporciona medios para optimizar el almacenamiento de datos
en disco, sobre todo a través de E/S buffereada. Otras características adicionales pueden ser la
posibilidad de preasignar bloques de disco contiguos a archivos (almacenamiento secuencial) y dar
control al usuario sobre los buffers.

➢ Soporte de E/S.
Las aplicaciones TR típicamente incluyen cierto número de interfaces de E/S. Un SOTR debe
proporcionar herramientas para incorporar fácilmente dispositivos de E/S específicos (incluso a medida).
Para los dispositivos estándar la librería estándar de E/S debería ser suficiente. Deben además soportar
E/S asíncrona, donde un proceso puede iniciar una operación de E/S, y luego continuar con su ejecución
mientras concurrentemente se está realizando la operación de E/S. En este aspecto cabe recordar la
existencia de procesadores específicos (canales de E/S, controladores de DMA etc.) dedicados a realizar
operaciones de E/S sin el concurso de la CPU.

➢ Control, por parte del usuario, de los recursos del sistema.


Una característica clave de los SOTR es la capacidad de proporcionar a los usuarios el control específico
de los recursos del sistema, incluyendo la propia CPU, memoria y recursos de E/S. El control de la CPU
se logra sobre la base de una planificación por prioridades en la cual los usuarios pueden establecer las
prioridades de los procesos. Además, se dispone de temporizadores en tiempo real y de funciones para
manejarlos para planificar eventos y períodos de espera. Un SOTR debe también facilitar el bloqueo de
la memoria (locking), de esta forma se puede garantizar que un programa, o parte de él, permanece en
la memoria, a fin de poder realizar cambios de contexto de manera más rápida cuando ocurre una
interrupción. Debería ser capaz de permitir al usuario la asignación de buffers y la posibilidad de bloquear
o desbloquear archivos y dispositivos. El control que se ejerce es generalmente mucho mayor en los
SOTR que en los SO genéricos. En estos últimos un usuario no tiene control sobre la prioridad de sus
procesos, el algoritmo de planificación, el cierre de páginas virtuales en memoria, la reserva de espacio
en disco etc.

Sistemas multitarea

Las aplicaciones de tiempo real deben interaccionar, generalmente, con dispositivos externos tales como
sensores y actuadores, además del correspondiente monitor, teclado y disco rígido. Estas interacciones
con dispositivos externos tienen la particularidad de que están sucediendo todas simultáneamente. La
misión de la aplicación es proveer una respuesta adecuada, a través de sus salidas, a cada una de las
entradas, todas al mismo tiempo.

Esquema MULTITAREA
Cada tarea se piensa independiente de las demás y son enviadas al sistema para que las administre
temporalmente. Los recursos de cada tarea, son designados por el sistema y controlados por él.

Una tarea pertenece a un usuario


• Un usuario o varios de ellos puede ejecutar varias tareas
– Puede requerir compartir datos (comunicación)
– Puede requerir compartir recursos (coordinación)
• Los datos de cada usuario/tarea deben estar protegidos
• Una tarea puede constituirse en uno o más procesos.

Un proceso es una entidad activa, imagen de un programa en memoria más la información


Relacionada con el estado de su ejecución.
Un programa es una entidad pasiva, una lista de instrucciones; que define la actuación que
tendrá el sistema.

Un proceso se puede definir como un programa en ejecución.


● Un programa puede estar constituido por:
– Sección de código: contador de programa y los registros del procesador
– Sección de stack: variables locales, direcciones de retorno y parámetros de funciones
– Sección de datos: variables globales
– Sección de heap: asignación dinámica

Por lo regular Sistema Operativo de tiempo real suele tener la misma arquitectura que un Sistema
Operativo convencional, pero su diferencia radica en que proporciona mayor prioridad a los
elementos de control y procesamiento que son utilizados para ejecutar los procesos o tareas.
• El SOTR debe ser multitarea y permisible
• Un SOTR debe poder asignar prioridades a las tareas
• El SOTR debe proporcionar medios de comunicación y sincronización entre tareas
• Un SOTR debe poder evitar el problema de inversión de prioridades
• El comportamiento temporal del SOTR debe ser conocido
¿Cómo debe entonces estructurarse la aplicación para cumplir con dichos requerimientos? Existen
unas pocas alternativas encabezadas por dos estructuras básicas: el gran loop o la
estructura multitareas.

La primera opción maneja todos los eventos secuencialmente, en un orden predeterminado, dentro de
una tarea única que se repite cíclicamente. Es la forma más simple de estructurar una aplicación, pero
puede complicarse su diseño cuando el número de eventos a manejar es muy elevado. En este caso, el
programa de aplicación debe encargarse de recorrer las múltiples tareas. Esto resulta en programas
complicados y difíciles de mantener.

La segunda opción tiene, en cambio, al sistema operativo como protagonista. éste se encarga de emular
un entorno de ejecución para diferentes tareas que se ejecutan independientemente una de la otra. Cada
tarea dispone de un cierto tiempo de acceso a los recursos, administrado por el sistema operativo. En este
tipo de sistemas, el programador escribe las tareas a realizar en programas diferentes, más simples. El
sistema operativo es el encargado de hacer que todos estos programas se ejecuten en un único
microprocesador. En este tipo de sistemas debe procederse cautelosamente al asignarse el número de
tareas, ya que la emulación a cargo del sistema operativo significa una sobrecarga para el sistema de
computadora.

En el campo del tiempo real, tanto los sistemas operativos de propósitos generales como los
embedded systems, deben proveer la capacidad de realizar múltiples tareas simultáneamente, sin
que esto signifique una complicación excesiva para el programador. Este tipo de sistemas
operativos se denomina, en forma general, sistemas operativos multitarea.

Analizando el problema de ejecutar varias tareas simultáneamente con un poco más de profundidad,
puede verse que un sistema operativo multitarea debe proveer al menos tres funciones específicas,
relativas a la administración de dichas tareas (además del manejo de memoria y control de dispositivos
de hardware, responsabilidad irrenunciable de todos los sistemas operativos, multitarea o no):

➢ Scheduler de tareas: es una tarea adicional, de mayor jerarquía que las demás, que se encarga de
determinar en qué orden se ejecutará el resto de las tareas presentes en el sistema.
➢ Dispatcher de tareas: toma los recaudos necesarios para comenzar una tarea. Esto significa
preservar el estado de los recursos que la tarea anterior estuviera utilizando en el momento de comenzar
una nueva.
➢ Comunicación: El sistema operativo debe proveer algún mecanismo de comunicación y
sincronización entre los diferentes procesos que se están ejecutando simultáneamente.
➢ El kernel o núcleo del sistema operativo es la porción más pequeña de sistema operativo que
provee esas tres funciones.
Cada una de estas tres funciones del kernel multitarea está asociada a un problema diferente. Y
dichos problemas tienen diferentes soluciones. Por ejemplo, si se dispone de tres procesos listos para ser
ejecutados, ¿en qué orden deben ser ejecutados? ¿Cómo se reparte el tiempo de CPU entre los tres? ¿Se
ejecuta primero el más urgente? Si se elige esta última opción ¿cuál es el más urgente? La toma de este
tipo de decisiones está a cargo del scheduler del sistema operativo y son muy diversas las estrategias que
pueden utilizarse. Más adelante se describen las más importantes.

Pero ese no es el único problema que debe afrontarse al diseñar un sistema operativo multitarea.
Si la misma CPU es utilizada por varios programas de usuario diferentes, y suponiendo que dichos
programas se ejecutan en el orden indicado por el scheduler, al interrumpirse uno de los programas para
ejecutar otro el kernel debe encargarse de guardar toda la información necesaria, tal que el programa
desplazado pueda ser retomado luego. Esta es la misión del dispatcher. Generalmente éstos se
implementan utilizando para cada tarea en ejecución una estructura de datos llamada TCB (Task Control
Block). Esta estructura contiene todos los datos asociados a una tarea, que son de relevancia para el
sistema operativo, como por ejemplo un número de identificación, el estado de los registros del
microprocesador en el momento de ser desplazada, un puntero a la última operación ejecutada del
programa, etc.

Por último, otro problema que debe resolverse en un sistema operativo multitarea, es la
sincronización y concurrencia. ¿Qué sucedería si dos programas de usuario que se ejecutan compartiendo
la CPU a intervalos de tiempo, decidieran acceder a un recurso único de hardware simultáneamente,
como por ejemplo una impresora? Para ello, un sistema operativo de este tipo debe proveer los
mecanismos necesarios para administrar los recursos compartidos de una forma ordenada. Este tipo de
mecanismos es utilizado también para sincronizar tareas entre sí, y se describen con profundidad más
adelante.

Como puede verse, la complejidad de un sistema operativo multitarea es bastante grande. El


kernel debe encargarse de las tareas mencionadas, además de la administración de memoria y los
manejadores de dispositivos (drivers). Por lo tanto, la utilización de un sistema tan complejo lleva
apareada una sobrecarga del sistema, ya que una buena parte de la CPU debe utilizarse para la toma de
decisiones y administración de las múltiples tareas. Pero esto no es una desventaja. Si se utiliza un
sistema operativo que no provee estos mecanismos, solo podrá realizarse una tarea con una CPU. Y si en
cambio se desean ejecutar varias tareas con éste, el programador de una aplicación se verá en la
obligación de implementar por sí mismo los mecanismos de scheduling, dispatching y comunicación,
cada vez que escriba una aplicación.

Por lo tanto, si bien los sistemas operativos multitarea son un poco más complicados de utilizar,
esto se debe a la gran cantidad de herramientas que presentan al programador. Y en el momento de
desarrollar una aplicación elaborada, resultan en definitiva más simples de operar.

A continuación, se profundizará en las técnicas scheduling por ser uno de los puntos clave de los
sistemas de tiempo real. Luego se mencionan los mecanismos de comunicación más comúnmente
utilizados en los sistemas operativos standard. Posteriormente se presentan otros aspectos de importancia
a tener en cuenta al analizar las propiedades de un sistema operativo de tiempo real, como relojes y
entrada/salida en tiempo real. Para finalizar se presenta un resumen de las técnicas utilizadas actualmente
para la asignación de prioridades entre las tareas.

3. ADMINISTRADOR DE TAREAS

Un sistema operativo es un conjunto de programas que pueden organizarse como:

➢ Kernel Monolítico

➢ Microkernel

Básicamente un kernel es el núcleo del sistema operativo y se ejecuta de modo privilegiado. Se encarga
de ejecutar los servicios a través de llamadas del sistema.

El kernel es el proceso de más alta prioridad activado por:

• Una interrupción (quantum time)

• Una llamada al sistema (system call).

Sus funciones principales son:


1. Mantener un registro del estado de cada tarea. Además, se encarga de los temas relacionados con
la creación de procesos, filiación, herencia, gestión de la memoria etc.
2. Planificar el uso de la CPU; Decide qué tarea utiliza el procesador en cada instante.
3. Realizar el cambio de contexto de los procesos.
4. permitir el acceso a periféricos o accesorios que se conectan al equipo
5. administra la memoria para que se utilice de manera eficiente
6. gestiona el tiempo de procesador que utilizan los programas y procesos dentro del programa
El administrador de tareas realiza las siguientes funciones:
• Registra el estado de cada proceso (status contexto)
• Planificar el tiempo de CPU para cada tarea.
• Realiza el cambio de contexto
• Predecible – Determinista – Temporizado

Diferencia entre kernel y microkernel:


Un microkernel es más ligero y ocupa menos memoria y menos recursos que el Kernel. Es más
volátil y más adaptable al hardware disponible. Puede funcionar prácticamente en cualquier tipo
de dispositivo.

El KERNEL se activa y pone a disposición toda su gran cantidad de componentes, sea que se
utilicen o no en el dispositivo disponible.

El microkernel, en cambio, al ejecutarse carga e incorpora únicamente los componentes que


necesita el dispositivo disponible conectado. No utiliza código muerto que no necesita el
dispositivo.
En los kernel; el administrador de tareas suele estar dividido en dos partes:

• El planificador (scheduler): seleccionará el proceso que se va a ejecutar de lista de espera

• El despachador (dispatch): guarda el estado de los procesos y carga el nuevo en la CPU

Estados de un proceso:

1. Se solicita (desde un usuario u otro proceso) al SO la creación de un


proceso junto a sus recursos y estructuras.

2. Listo/preparado Está listo para iniciar o continuar su ejecución, pero el


sistema no le ha asignado un procesador.

3. Ejecución: el proceso está siendo ejecutado en este momento. Sus instrucciones están siendo pro
cesadas en algún procesador.

4. Terminado: El proceso terminó de ejecutarse; sus estructuras están a la espera de ser limpiadas p
or el sistema operativo.

5. Bloqueado: en espera de algún evento para poder continuar su ejecución (aun si hubiera un proc
esador disponible, no podría avanzar).
6. Espera: el proceso en ejecución manda a otro proceso a la espera de un cambio de estado de eso
s procesos (por software).

7. Zombie: existe para el SO pero no está en memoria. El padre no recibe return desde el proceso.

Manejo de prioridades: En la programación de una


aplicación, la mayoría de los sistemas operativos (de
cualquier tipo) permite al programador especificar una
prioridad para la general aplicación e incluso para
diferentes tareas dentro de la aplicación (hilos). Estas
prioridades sirven como una señal para el sistema
operativo, que dicta que operaciones son los más
importantes. El objetivo es que, si dos o más tareas están
listas para funcionar al mismo tiempo, el sistema operativo
ejecuta la tarea con la prioridad más alta.
Gestión de procesos

Gestión de proceso: Realización de tareas cuasi paralelo en un procesador utilizando procesos o hilos
(proceso ligero) por:
• Mantener estados de procesos, gestión de colas de proceso.
• Tareas preventivas (cambio de contexto rápido) y rápido manejo de interrupciones.
• Planificación de la CPU (garantizando plazos, minimizando proceso de los tiempos de espera, la
equidad en la concesión de recursos como potencia de cálculo).
• Proceso de sincronización (secciones críticas, semáforos, monitores, de exclusión mutua).
• Comunicación entre procesos (buffering). •Apoyo de un reloj de tiempo real como una referencia
de tiempo interna.

Ejecución de Tareas

El programador de procesos (scheduler) determina cuál será la siguiente tarea a ser ejecutada,
elaborando la lista de tareas a ejecutar Tal determinación obedece a una estrategia de programación
(scheduling strategy) preestablecida
Usualmente su accionar se repite a intervalos regulares establecidos por el reloj de tiempo real
(RTC)
El ejecutor (dispatcher) toma el primer proceso de la lista generada por el scheduler, le asigna
memoria y tiempo de procesador (se encarga del cambio de contexto) e inicia su ejecución (le transfiere
el control)

Estrategias de Scheduling

• Cooperativa o No Expropiativa (Non preemptive ) Cada tarea se ejecuta hasta su finalización,


se autobloquea (p/ej: esperando una respuesta de hardware) o suspende voluntariamente su
ejecución para permitir la ejecución de otra tarea.
Los procesos se ejecutan hasta su finalización o hasta que
entrega a otro el estado RUN (por bloqueo o espera). Tienen el problema de que
procesos “poco importantes” pueden bloquear a los “importantes”
• Apropiativo (Preemptive ) La ejecución de la tarea puede ser suspendida por el scheduler al
surgir una tarea con mayor prioridad (expropia la CPU a la tarea que se esté ejecutando y se la
cede cambio de contexto mediante) o al finalizar el tiempo asignado a esa tarea
El proceso en RUN puede ser “sacado” de ese estado.
Un proceso se ejecuta un tiempo predefinido y es suspendido.
Requiere un clock interrupt para que el scheduler recupere el control de la CPU

Algoritmos de Scheduling

• Round-Robin: Las tareas se ejecutan en secuencia (en ronda), pueden ejecutarse: Durante un
tiempo preestablecido (time slice) e igual para todos Con un tiempo asociado a cada tarea Una
tarea comienza cuando la anterior finaliza
• Crecimiento monolítico: Cada tarea tiene asociado un nivel de prioridad único y se ejecuta hasta
su finalización o bloqueo
• Menor tiempo de finalización 1°: Se ejecuta primero la tarea que requiere menos tiempo
estimado para su finalización
Roun Robin - QUANTUM
El Round Robin es uno de los algoritmos más antiguos, sencillos y equitativos en el reparto de la
CPU entre los procesos lo que significa que evita la monopolización de uso de la CPU, y es muy
válido para entornos de tiempo compartido.

El algoritmo consiste en definir una unidad de tiempo pequeña, llamada quantum o cuánto de tiempo,
la cual es asignada a cada proceso que está en estado listo. Si el proceso agota su quantum (Q) de
tiempo, se elige a otro proceso para ocupar la CPU. Si el proceso se bloquea o termina antes de
agotar su quantum también se alterna el uso de la CPU.

Es por ello que surge la necesidad de un reloj en el sistema. El reloj es un dispositivo que genera
periódicamente interrupciones. Esto es muy importante, pues garantiza que el sistema operativo (en
concreto la rutina de servicio de interrupción del reloj) coja el mando de la CPU periódicamente. El
quantum de un proceso equivale a un número fijo de pulsos o ciclos de reloj.

Al ocurrir una interrupción de reloj que coincide con el agotamiento del quantum se llama al
despachador, el cual le cede el control de la CPU al proceso seleccionado por el planificador.

Un proceso puede abandonar la CPU por 2 criterios:


1. Libremente, si su tiempo de ejecución en la CPU es < Q (quantum).
2. Después de una interrupción, si su tiempo de ejecución en la CPU es > Q (quantum) o si el
proceso se bloquea.

Status de una Tarea


Una tarea esencialmente puede estar en dos estados:
• Not Running: No está en ejecución (es un estado compuesto por subestados):
*Ready: Lista para su ejecución
*Bloqued: A espera de un evento para volver a Ready
*Suspended: Totalmente inactiva
• Running: En ejecución
Conforme al estado de la tarea, las prioridades asignadas a ellas y a la estrategia de scheduling
establecida, el scheduler elabora la lista de tareas ready, para que oportunamente el dispatcher le asigna
memoria y tiempo de procesador e inicia su ejecución

Comunicación entre Tareas

• Queues (colas) Es una colección de estructuras de datos ordenada Las operaciones que se pueden
realizar son agregar a la estructura al final, sacar una estructura del inicio (Fist In – First Out),
sacar del final (Firt In – Last Out), información del estado de la cola y copias datos (sin modificar
la cola) Pueden usarse como buffers de datos si una tarea genera más información que la que otra
es capaz de procesar Las implementaciones más comunes son mediante buffers circulares y listas
enlazadas y su uso correcto es responsabilidad del desarrollador
• Mutex (exclusión mutual) Se utilizan para bloquear el acceso a recursos de hardware o software
que deben ser compartidos por distintas tareas El mutex actúa como un ticket (token) que debe
ser adquirido por la tarea que desea acceder al recurso compartido Una vez que una tarea
adquiere el mutex asociado a un recurso, ninguna otra tarea puede adquirirlo hasta que sea
liberado por la tarea que lo adquirió primero Su uso correcto es responsabilidad del desarrollador.
• Semaphores (semáforos) Se utilizan para sincronizar tareas Pueden ser binarios (tienen dos
estados) o contadores (llevan un conteo) Una tarea es propietaria del semáforo y fija su estado o
valor de conteo, otras tareas pueden leer el estado o el conteo y actuar en consecuencia Su uso
correcto es responsabilidad del desarrollador
• Sockets En general se utilizan para sincronizar tareas que se ejecutan en distintos dispositivos
conectados en red Suele utilizarse una arquitectura cliente-servidor en la que una tarea (servidor)
provee información o recursos a otras tareas (clientes) Cada tarea dispone de un socket y éstos se
conectan entre sí Cada socket puede aceptar conexiones de un número distintos de otros sockets
Son bidireccionales, secada tarea puede leer y escribir en ellos
• Shared Memory (memoria compartida) Es un área de memoria física compartida entre dos o
más tareas. Todas las tareas las ven como parte de su propia área de memoria Normalmente las
tareas acceden a ella mediante punteros. Es un método de comunicación de bajo nivel No hay
controles sobre el acceso a la memoria, los mismos deben implementarse mediante semáforos u
otras técnicas Su uso correcto es responsabilidad del desarrollador

En todos los casos presentados es de destacar que su uso correcto es responsabilidad del
desarrollador, habiendo algunos problemas de sincronización a evitar:
• Deadlocks (bloqueo mútuo): cuando dos o más tareas concurrentes se encuentran c/u esperando a
la otra para proseguir (lo que nunca ocurrirá)
• Starvation (inanición): cuando a una tarea se le niega el acceso a un recurso compartido.
• Inversión de prioridades: cuando dos tareas de distinta prioridad comparten un recurso y la de
menor prioridad bloquea el recurso antes que la de prioridad mayor, bloqueando esta última al
momento que precise el uso del recurso compartido

4. REQUISITOS TEMPORALES

Los SOTR se caracterizan por presentar requisitos especiales en cinco áreas generales
✓ Determinismo.
✓ Sensibilidad.
✓ Control del usuario
✓ Fiabilidad.
✓ Tolerancia a los fallos.
Determinismo:
Un sistema operativo es determinista si realiza las operaciones en instantes fijo s y
predeterminados o en intervalos de tiempo predeterminados. Cuando hay varios procesos compitiendo
por recursos, incluido el procesador, ningún sistema será por completo determinista. El punto hasta el
cual un sistema puede satisfacer las solicitudes de manera determinista depende, en primer lugar, de la
velocidad con que pueda responder a las interrupciones y, en segundo lugar, de si el sistema posee
suficiente capacidad para gestionar todas las peticiones en el tiempo requerido. Una medida útil de la
capacidad de un SO para operar de forma determinista es el retardo máximo que se produce desde la
llegada de una interrupción de alta prioridad hasta que comience el servicio de la rutina asociada. En un
SOTR este tiempo puede ir desde unos pocos microsegundos a 1 milisegundo, en los SO que no son de
tiempo real el retardo puede caer en un rango desde decenas a cientos de milisegundos. ´
Sensibilidad

Es una característica semejante a la anterior, hace referencia a cuánto tiempo consume un sistema
operativo en reconocer una interrupción, es el tiempo preciso para dar servicio a la interrupción después
de haberla reconocido. Depende de:

La cantidad de tiempo necesaria para iniciar la gestión de la interrupción y empezar la ejecución


de la rutina de tratamiento (ISR Interrupt Service Routine). Si la ejecución de la ISR requiere un cambio
de proceso ese tiempo será mayor.
• La cantidad de tiempo necesario para ejecutar la ISR.
• El efecto de anidamiento de las interrupciones. El servicio se retrasará si el sistema debe atender
la llegada de otra interrupción más prioritaria.
• El determinismo y la sensibilidad forman conjuntamente el tiempo de respuesta a sucesos
externos.
Control del usuario

Es generalmente mucho mayor en un SOTR que en uno de tiempo compartido. En estos últimos
un usuario no puede otorgar prioridades a sus procesos, decidir sobre el algoritmo de planificación, qué
procesos deben estar siempre residentes en memoria etc.

Fiabilidad

Es normalmente mucho más importante en SOTR Un sistema en tiempo real controla sucesos que
están teniendo lugar en el entorno y en su propia escala de tiempos, las perdidas o degradaciones en el
sistema que los controla pueden tener consecuencias catastróficas.

Tolerancia de fallos

Un SOTR debe diseñarse para responder incluso ante varias formas de fallo, se pretende que se
pueda conservar la capacidad máxima y los máximos datos posibles en caso de fallo. Opciones como la
de volcar el contenido de la memoria a un archivo y abortar el programa ante la aparición de un fallo
están totalmente prohibidas. Un SOTR intentará corregir el problema o minimizar sus efectos antes de
proseguir con la ejecución.

Asociada a la tolerancia a fallos está la estabilidad. Un sistema será estable si en los casos es los
que es imposible cumplir todos los plazos de ejecución de las tareas se cumplen al menos los de las más
críticas y de mayor prioridad.
ESQUEMA CONCEPTUAL:

5. TAREAS PERIÓDICAS Y ESPORÁDICAS


Las actividades de un sistema de tiempo real se llaman tareas. Las mismas poseen diferentes tipos de
requisitos
• Funcionales: qué hacen
• No funcionales: todos las demás
*Temporales: cuándo se ejecutan, cuánto tardan, …
*Fiabilidad, seguridad
*Costo, consumo de energía, etc.

Ejecución de la tarea:
Atributos temporales de las tareas:

➢ Activación

A) Periódica: a intervalos regulares, con período T


B) Aperiódica: cada vez que ocurre un evento determinado. A su vez esta puden ser:
*Esporádica: separación mínima entre activaciones T
*Estocástica, a rachas, irregular

➢ Plazo de respuesta

Absoluto: tiempo límite para terminar


Relativo: intervalo desde la activación

Importante: Se trata de garantizar que la ejecución de cada tarea termine dentro del plazo esperado

6. ADMINISTRACIÓN BÁSICA DE MEMORIA, INTERCAMBIO DE SEGMENTOS DE


PROGRAMA POR LAS PROPIAS TAREAS.

La memoria es uno de los recursos más valiosos que gestiona el sistema operativo. Uno de los
elementos principales que caracterizan un proceso es la memoria que utiliza. Ésta está lógicamente
separada de la de cualquier otro proceso del sistema (excepto los threads de un mismo proceso que
comparten normalmente la mayor parte de la memoria que tienen asignada). Un proceso no puede
acceder, al espacio de memoria asignado a otro proceso, lo cual es imprescindible para la seguridad y
estabilidad del sistema. El direccionamiento es una parte importante de la gestión de memoria, puesto
que influye mucho en la visión del mismo por parte de un proceso, como en el aprovechamiento del
hardware y el rendimiento del sistema. En Linux, además, un proceso tiene dos espacios de memoria: el
espacio de memoria del usuario, único para ese proceso, y el espacio de memoria del kernel, idéntico en
todos los procesos.

Objetivos del sistema de gestión de memoria:


• Ofrecer a cada proceso un espacio lógico propio.
• Proporcionar protección entre procesos.
• Permitir que los procesos compartan memoria.
• Dar soporte a las distintas regiones del proceso.
• Maximizar el rendimiento del sistema.
• Proporcionar a los procesos mapas de memoria muy grandes.
Sabemos que el ordenador cuenta con la memoria central o principal, pero esta es limitada y, en
grandes sistemas, insuficiente.
Al principio, para ubicar los procesos en memoria y solucionar este problema, se adoptaron
técnicas tales como dividir el programa en partes denominadas capas. Cada una de las capas se iba
ejecutando (cargando en memoria) según fuera necesario; es decir, primero se pasaría parte del programa
del disco duro (o soporte de almacenamiento) a la memoria, y cuando fuera necesario utilizar otra parte
del programa que no estuviese en memoria central o principal (RAM), se accedería de nuevo al disco
para cargar la siguiente capa en memoria central.
Esta labor de dividir el programa en capas la puede realizar el mismo programador mediante la
división del programa en módulos que se irán ejecutando según sea necesario, si bien esto supone un
elevado esfuerzo para él.
Fotheringam diseñó un método conocido como de memoria virtual. Este diseñador pensó en la
posibilidad de que, al ubicar un programa en memoria, este fuera demasiado grande para el tamaño físico
de aquella y creó una técnica para hacer que en memoria permaneciera solo la parte del programa
que se estuviera ejecutando y que el resto quedara en el disco.
Este concepto, aplicado hoy en día en la mayoría de los sistemas operativos, considera el espacio
libre de disco como si se tratase de memoria RAM (memoria virtual). Así, para el usuario el programa
estará cargado en RAM, pero en realidad solo se cargará en RAM la parte del programa que se esté
ejecutando en ese instante.
Entre tanto, el resto del programa en ejecución permanecerá temporalmente almacenado en disco
para su posterior utilización, si fuera necesario. Si en un momento dado necesitamos ejecutar una parte
del programa almacenada en memoria virtual (en el disco duro), esta pasará a RAM para su ejecución
real, y la parte del programa que estaba en RAM pasará al disco. Así, siempre habrá más RAM libre
para realizar cálculos o ejecutar otros programas, sobre todo en sistemas operativos multiusuario
y multitarea.
En la Figura 3.5 podemos ver los elementos que entran en juego a la hora de utilizar memoria
virtual.
Para la ubicación de programas en memoria, se puede utilizar la técnica de memoria virtual para
que siempre haya RAM libre para todos los programas que queramos ejecutar, es decir, para los
procesos.
Eso sí, cuando cargamos demasiados procesos a la vez, el sistema se ralentiza, ya que tiene que
pasar información continuamente desde el disco duro a la RAM o viceversa. Los sistemas operativos
multiusuario y multitarea son especialistas en esta gestión.

Intercambio

Zona de INTERCAMBIO:
La zona de intercambio es una zona de un disco duro utilizada para almacenar procesos que
actualmente no están en ejecución y así dejar memoria RAM libre para los procesos que sí lo están.

Al principio, en los sistemas operativos monousuario y monoproceso, la gestión de memoria era


muy sencilla. Las memorias tenían poca capacidad y solo se reservaba una parte de ellas para el sistema
operativo.
Con la aparición de los sistemas operativos multiusuario y multitarea, la gestión de memoria
se convierte en una de las funciones más importantes del sistema operativo. La parte del sistema
operativo que administra la memoria es el administrador de memoria. Su labor es clara: llevar un
registro de las partes de memoria que se están utilizando y de las que no. De esta forma, reserva
espacio de memoria para los nuevos procesos y libera el espacio de los procesos que finalizan.
El administrador de memoria también se encarga de
gestionar el intercambio de datos entre memoria y disco, siempre
y cuando los procesos sean tan grandes que no quepan de una
sola vez en la memoria.
La gestión de memoria es importante cuando trabajamos
en sistemas operativos multiproceso, y aún más en sistemas
operativos multihilo, ya que se comparten espacios de memoria
en los que se alojan las variables compartidas y a los que
acceden varios procesos o hilos de un proceso. En este caso, la
memoria tiene que ser gestionada y controlada por el sistema
operativo de tal forma que cada proceso utilice el espacio de
memoria sin afectar a otros espacios de memoria en los que
pueda haber datos o registros con información para otros
procesos o hilos de un proceso.

Para gestionar la memoria en sistemas operativos multitarea, esta se divide en particiones fijas.
Así, el sistema operativo dispone de una cola de los procesos que solicitan entrar en memoria. El
planificador tiene en cuenta los requerimientos de memoria de cada uno de los procesos y las particiones
de memoria disponibles. Estos requerimientos de uso de memoria se almacenan en el BCP.
La mayor dificultad de diseño de las particiones fijas es la adecuada selección de los
tamaños de las mismas, puesto que puede derivar en un desaprovechamiento o fragmentación de
la memoria. Esta fragmentación puede ser:
• Interna: cuando la parte de la memoria que no se está usando es interna a una partición asignada
a un proceso.
• Externa: cuando una partición disponible no se emplea porque es muy pequeña para
cualesquiera de los procesos que esperan.
Con un conjunto dinámico de procesos ejecutándose no es posible encontrar las particiones
de memoria adecuadas. La opción es disponer de particiones variables.
El problema que se plantea ahora es disponer de un registro con información de las particiones
libres y ocupadas, que sea eficiente tanto en el tiempo de asignación como en el aprovechamiento de la
memoria. No obstante, se siguen presentando problemas de fragmentación externa.
Una solución es permitir que los procesos puedan utilizar memoria no contigua, lo que se
consigue mediante técnicas de paginación. En esta situación hay un mecanismo de traducción de las
direcciones lógicas a las físicas mediante una tabla de páginas. La tabla de páginas presenta dos
cuestiones a tener en cuenta: el tamaño de la tabla (que puede ser demasiado grande) y el tiempo de
asignación (que debe ser de corta duración).
En contraposición a la visión de la memoria como un array o lista unidimensional, está la
concepción por parte del usuario de considerar la memoria como un conjunto de segmentos de
diferentes tamaños, sin ninguna ordenación entre ellos.
Este esquema corresponde a la segmentación. En este caso, el espacio de direcciones lógicas es
un conjunto de segmentos con diferentes nombres y tamaños. En el esquema de segmentación no se
produce fragmentación interna, pero sí externa, que ocurre cuando todos los bloques de memoria
libres son muy pequeños para acomodar un trozo o bloque de proceso.
Aunque la segmentación y la paginación son esquemas diferentes de gestión de la memoria,
se pueden considerar estrategias combinadas, ya que la única diferencia es que la paginación
utiliza bloques de memoria de tamaño fijo.
En todos estos esquemas, se supone que el proceso que se va a ejecutar está cargado totalmente
en memoria. La idea de permitir ejecutar procesos que no están cargados totalmente en memoria, e
incluso que sus tamaños superen al de la memoria física instalada, da lugar al concepto de
memoria virtual. En los sistemas operativos actuales se puede configurar el área de intercambio, de tal
forma que podemos indicar el tamaño en disco destinado a tal fin, e incluso se puede indicar en qué disco
se puede realizar el intercambio. El gran inconveniente de modificar «a la ligera» lo que el sistema
administra automáticamente, es que podemos provocar que el rendimiento del equipo sea menor.
Paginación, segmentación y swapping
Segmentación, paginación y swapping son técnicas de gestión de memoria, que en general
permiten ejecutar programas de un tamaño superior a la capacidad de la memoria RAM
utilizando el disco duro como una «ampliación» de la memoria principal del equipo.
La ventaja es que se puede ejecutar cualquier programa; el inconveniente es la pérdida de
rendimiento.
Paginación
La paginación es una técnica que consiste en dividir la memoria interna o RAM en zonas iguales
llamadas frames, y los programas en partes del mismo tamaño denominadas páginas. Para ubicar un
programa en memoria, el sistema operativo buscará en memoria física los frames que tenga libres. El
tamaño de estos frames se diseña mediante hardware. Si utilizamos un sistema de multiprogramación y
solo hay un trabajo, este tendrá asignados todos los frames necesarios para él. Esta asignación de frames
la realiza el sistema operativo.
Mediante la tabla de páginas, la UCP asigna las direcciones físicas de los frames a las páginas
en las que se ha dividido el programa. La asignación de los frames no tiene que ser necesariamente
consecutiva. Un proceso se puede ubicar en memoria interna en frames no contiguos, ya que estos
pueden estar ocupados por otros procesos. La técnica de paginación es similar a la de memoria
virtual. La gran diferencia es que aquí no existe disco duro para intercambiar parte de los
procesos.
Concretamente, el sistema operativo DOS utiliza una técnica parecida a la paginación. Como
ejemplo, veamos el sistema operativo DOS. Solo sirve de almacenamiento para parte del núcleo del
sistema operativo y para almacenar temporalmente parte de los procesos que tengan un tamaño superior
a 640 KB. DOS divide la memoria extendida (por encima del primer MB) en páginas de 64 KB para
realizar el intercambio de información con la memoria convencional. Un programa de 1 MB ocupará lo
que pueda de memoria convencional y el resto se almacenará temporalmente en memoria extendida. Este
programa se paginará a través del llamado marco de página. Se intercambian las páginas desde memoria
convencional a extendida y viceversa, dependiendo de la parte del proceso que se vaya a ejecutar. Esta
gestión de memoria se conoce como memoria expandida.

En resumen, la paginación es una técnica de reasignación o redireccionamiento dinámico, con la


consideración de que la tabla de páginas se puede almacenar en registros especiales destinados a tal
efecto o en una parte de la propia memoria.
La transformación de las direcciones lógicas en físicas la realiza la unidad de administración de
memoria o Management Memory Unit (MMU).

Segmentación
Es una técnica similar a la paginación que permite definir los bloques de memoria de tamaño
variable. Cada segmento puede variar desde 0 hasta un máximo permitido. Estos segmentos pueden tener
longitudes distintas. Además, la longitud de un segmento puede variar según las necesidades del
programa.
Supongamos que realizamos un programa y, para que se ejecute, necesita utilizar tablas
(estructuras de datos) en memoria. Si tenemos en cuenta que una tabla puede asignarse de forma estática
o dinámica según las necesidades del programa, habrá veces en que esta tabla necesitará un espacio
determinado en memoria, mientras que otras, este espacio será mayor o menor según la necesidad.
Gracias a la segmentación podemos ubicar en memoria estas estructuras de datos,
independientemente del tamaño que tengan.
El ordenador, a través del sistema operativo, puede organizar la memoria en bloques
concretos y tener partes de ella destinadas a almacenar las estructuras de datos, que pueden crecer
o menguar según las necesidades del usuario o del programa. Para ello se utilizarán las pilas de
memoria o stacks, en las que se gestionan las estructuras de datos necesarias.
La paginación difiere de la segmentación en que las páginas son de tamaño fijo y los segmentos
no. El uso de la técnica de paginación o segmentación dependerá del sistema operativo utilizado y de la
máquina en la que lo usemos, además de las necesidades del software.
Swapping
El swapping es una técnica similar a la de memoria virtual. Cuando varios usuarios están
ejecutando procesos en un mismo ordenador, este se ve obligado a cargarlos en RAM. Según el estado
en el que se encuentre el proceso de cada usuario, la memoria se irá liberando de su proceso y pasará a la
zona de swap mediante la técnica llamada swap-out. De esta forma, la memoria interna queda liberada
para que en ella se pueda almacenar otro proceso del mismo usuario o de otro.
Si el usuario vuelve a solicitar su proceso para seguir ejecutándolo, se produce el denominado
swap-in, que consiste en pasar el programa de la zona de swap a la memoria interna.
Esta zona de swap se suele utilizar en sistemas operativos como UNIX y Linux. Está formada
por un espacio físico del disco en el que tenemos el sistema operativo y las aplicaciones que se van a
ejecutar. Los fabricantes de estos sistemas operativos recomiendan que esta zona sea del 20 %
aproximadamente del espacio en disco o el doble de la capacidad de RAM del ordenador.
La diferencia entre la gestión de memoria virtual y el swapping es que, mediante la primera,
puede llegar a ocurrir que el disco esté tan lleno que la gestión sea difícil o imposible, ya que el espacio
destinado al intercambio suele ser espacio del disco duro en el que está instalado tanto el sistema
operativo como el software de aplicaciones y los datos del usuario. En el swapping no puede ocurrir esto,
ya que esta zona siempre estará reservada y disponible para el intercambio de programas con la memoria
principal. Normalmente, al estar esta zona en un dispositivo físico diferente, todo el espacio estará
disponible cada vez que encendamos el ordenador.
7. PROCESOS E HILOS.

Un proceso es un concepto manejado por el sistema operativo y que referencia un programa en


ejecución. A los procesos, dependiendo especialmente del sistema operativo utilizado, se les denomina
flujos de control, tareas, threads o hilos, según el contexto.

PROCESO:
Un proceso es un conjunto de instrucciones correspondientes a un programa que son ejecutadas por
la CPU.

HEBRA O HILO:
Una hebra o hilo es un subproceso de un proceso que consume recursos propios pero que depende
del proceso padre que lo ha ejecutado.

Cuando se ejecuta más de un proceso de forma concurrente en un sistema, todos necesitan que el
propio sistema les suministre una serie de recursos. Para ello, el sistema operativo, gracias a la UCP
(Unidad Central de Proceso), se encarga de asignar estos recursos en un orden adecuado y atendiendo a
unas prioridades. También realiza funciones de sincronización de todos los procesos, para que se
ejecuten en el orden adecuado y según la prioridad decidida.

Cada vez que un programa se convierte en proceso, es decir, cada vez que se ejecuta un programa,
además de ubicar en memoria las instrucciones que lo componen y sus datos asociados, a dicho proceso
se le asocia una estructura de datos.

Esta estructura de datos, que es única para cada proceso, identifica el proceso respecto de los
demás y sirve para controlar su correcta ejecución. Es lo que se llama el bloque de control del proceso
o BCP, y contendrá para cada proceso la siguiente información: estado actual del proceso, identificador
del proceso, prioridad del proceso, ubicación en memoria y recursos utilizados.

Una hebra es un punto de ejecución de un proceso. Un proceso tendrá siempre una hebra, en la
que corre el propio programa, pero puede tener más hebras. Las hebras representan un método software
para mejorar el rendimiento y eficacia de los sistemas operativos. Las hebras de un mismo proceso
compartirán recursos, como memoria, archivos, recursos hardware, etc.

Un proceso clásico será aquel que solo posea una hebra. Pongamos un ejemplo. Si ejecutamos el
procesador de textos Word, con un solo documento abierto, el programa Word convertido en proceso
estará ejecutándose en un único espacio de memoria, tendrá acceso a determinados archivos (galerías de
imágenes, corrector ortográfico, etc.), tendrá acceso al hardware (impresora, disquetera), etc. En
definitiva, este proceso, de momento, solamente tiene una hebra.

Si en esta situación, sin cerrar Word, abrimos un nuevo documento, Word no se vuelve a cargar
como proceso. Simplemente el programa, convertido en proceso, tendrá a su disposición dos hebras o
hilos diferentes, de tal forma que el proceso sigue siendo el mismo (el original).

Word se está ejecutando una sola vez y el resto de documentos de texto que abramos en esta
misma sesión de trabajo no serán procesos propiamente dichos. Serán hilos o hebras del proceso
principal, que es el propio procesador de textos.
8. COMUNICACIÓN ENTRE PROCESOS.

Los procesos pueden ser:

• Independientes: no se sincronizan ni comunican. (son muy raros)

• Cooperativos: se comunican y sincronizan sus actividades.

• Competitivos: compiten por recursos del sistema.

Nos interesa definir qué es comunicar y sincronizar:

• Sincronizar: Satisfacer las restricciones en el enlazado de las acciones de los distintos procesos.

• Comunicar: pasar información de un proceso a otro.

Las comunicaciones entre procesos están soportadas de una manera precisa y estable, empleando
mecanismos como el uso de semáforos, el paso de mensajes y el uso de memoria compartida.

Cuando varios procesos se ejecutan concurrentemente en una tipica aplicación en TR, el SO debe
facilitar un mecanismo para la sincronización e intercambio de información entre los distintos procesos.
La IPC es clave en el diseño de una aplicación como un conjunto de tareas cooperantes, en la cual cada
proceso maneja una parte bien definida del todo. Son varios los mecanismos de IPC: semáforos,
monitores, colas de mensajes y memoria compartida. Diversos autores han demostrado como a partir
de semáforos y memoria compartida se pueden implementar colas de mensajes o monitores y viceversa
en lo que se conoce como equivalencia de primitivas. La mayoría de las tendencias apuntan al empleo
de las colas de mensajes como principal mecanismo de comunicación y sincronización. En efecto, éste
es el mecanismo empleado por A. Tanembaum en el desarrollo del SO Minix, el del QNX y también el
empleado por el ADA, que pese a no ser un SO implementa en el mismo lenguaje el concepto de proceso
(task) y la comunicación entre procesos mediante el mecanismo de cita. En el caso del QNX el paso de
mensajes se hace de manera transparente a través de todos los computadores conectados en la red. Hay
que recordar que los mensajes son simplemente conjuntos de bytes sin ningún significado especial
para el SO Son los procesos que los envían y reciben quienes les otorgan significado. Además, el
paso de mensajes es el mecanismo más eficaz para comunicar procesos a través de computadores
conectados en red.

La sincronización de los procesos también se puede lograr mediante el paso de mensajes, ya que
un proceso puede sufrir un cambio de estado cuando envía o se dispone a recibir un mensaje, pasando
por ejemplo a bloquearse hasta que el destinatario lo haya leído o el emisor lo envíe.

Supongamos dos procesos A y B, donde el proceso A enviará un mensaje al proceso B.


Supongamos también que inicialmente el uso de la CPU corresponde a A, que llega hasta el punto de
enviar el mensaje, llamada al sistema send, sin que el proceso B haya alcanzado el punto donde espera
leer el mensaje, llamada al sistema receive. Llegado a este punto el proceso A se bloqueará tras ejecutar
el send, (está send blocked) esperando a que B ejecute el receive.
Ya que el proceso A se bloquea, el uso de la CPU queda a disposición de B, que ejecutará su
código hasta llegar al punto de la llamada a receive. En este momento, el proceso A pasa al estado reply
blocked, permanece bloqueado hasta que B le envía una respuesta. B por su parte no se bloquea,
procesará los datos recibidos y mandará una contestación al proceso A, llamada al sistema reply.

El mensaje de réplica es transferido al proceso A que se desbloquea y pasa al estado de listo para
ejecutarse. Ahora A y B están ambos listos y pueden por tanto competir por el uso de la CPU.

En caso de que el proceso B hubiera ejecutado la llamada a receive antes de que el proceso A
hubiese ejecutado el send, B se habría bloqueado (receive blocked) hasta la llegada del mensaje.

De esta manera se tienen un conjunto de procesos cooperantes, comunicándose y sincronizándose


según el mecanismo IPC antes descrito. Cada nueva aplicación, o servicio del sistema operativo, es
simplemente un proceso más, como antes quedó dicho. Por tanto, las labores que le quedan al
microkernel o ejecutivo son las siguientes:

• Comunicación interprocesos.
• Planificación de procesos.

• Despachador de interrupciones.

• Interfaz con la red.

9. SECCIONES CRÍTICAS. EXCLUSIÓN MUTUA CON ESPERA ACTIVA

Variables compartidas y Paso de mensaje

• Variables compartidas: objetos a los que puede acceder más de un proceso. La comunicación se logra
accediendo a dichas variables cuando sea necesario. Sin embargo, esto puede traer problemas.

• Paso de mensajes: intercambio explícito de datos entre dos procesos mediante el paso de un mensaje
mediante alguna forma que brinda el SO o el propio lenguaje. Esto se realiza mediante algún
mecanismo.

VARIABLES COMPARTIDAS
Considere dos procesos que actualizan una variable compartida, X, mediante la sentencia: X:= X+1
– Carga el valor de X en algún registro.
– Incrementa el valor en el registro en 1.
– Almacena el valor del registro de nuevo en X.
Como ninguna de las tres operaciones es indivisible, dos procesos que actualicen la variable
simultáneamente generarían un entrelazamiento que podría producir un resultado incorrecto.

• Las partes de un proceso que tienen acceso a las variables compartidas han de ejecutarse
indivisiblemente unas respecto a las otras. Estas partes se denominan secciones críticas.
• La protección requerida se conoce como exclusión mutua.

Sección crítica

Es una secuencia de instrucciones que debe ejecutarse sin perder el control, y afecta variables
compartidas. Si un proceso está ejecutando código de su sección crítica, ningún otro proceso puede estar
ejecutando código de su sección crítica.

Exclusión mutua

Es el mecanismo que asegura que solo un proceso está haciendo algo en un instante determinado.
Sincronización para proteger una sección crítica. Es necesario si dos procesos comparten variables.
Se utilizan para bloquear el acceso a recursos de hardware o software que deben ser compartidos
por distintas tareas. El mutex actúa como un ticket (token) que debe ser adquirido por la tarea que desea
acceder al recurso compartido.
Una vez que una tarea adquiere el mutex asociado a un recurso, ninguna otra tarea puede
adquirirlo hasta que sea liberado por la tarea que lo adquirió primero.
Su uso correcto es responsabilidad del desarrollador.

Sincronización condicionada
Es necesaria cuando un proceso necesita realizar alguna acción, solo después que se haya
cumplido una condición.
Utilización de buferes: productor / consumidor
Son aquellos problemas en los que existe un conjunto de procesos que producen información que
otros procesos consumen, siendo diferentes las velocidades de producción y consumo de la información.
Este desajuste en las velocidades, hace necesario que se establezca una sincronización entre los procesos
de manera que la información no se pierda ni se duplique, consumiéndose en el orden en que es
producida.

10. . DORMIR Y DESPERTAR. SEMÁFOROS. MONITORES. TRANSFERENCIA DE


MENSAJES.

SEMÁFOROS

Un semáforo es una estructura diseñada para sincronizar dos o más o procesos, de modo que su
ejecución se realice de forma ordenada y sin conflictos entre ellos. Permite resolver la mayoría de los
problemas de sincronización entre procesos y forma parte del diseño de muchos sistemas operativos y
de lenguajes de programación concurrentes.

Semáforos binarios:

Es un indicador de condición que registra si un recurso está disponible o no. Solo puede tomar dos
valores (semáforo binario):

1: recurso disponible

0: recurso no disponible

Se le asocia una cola de tareas.


Cómo funciona

Para evitarlo, se idearon los semáforos. Un semáforo básico es una estructura formada por una
posición de memoria y dos instrucciones, una para reservarlo y otra para liberarlo. A esto se le puede
añadir una cola de threads para recordar el orden en que se hicieron las peticiones.

Cuando el S.O. ejecuta una llamada, comprueba el valor que hay en la posición de memoria del
semáforo, y si es distinta de cero, se limita a restarle 1 y devolver el control al programa; sin embargo,
si ya es cero, duerme al proceso que hizo la petición y lo mete en la cola de procesos, en espera de que
el semáforo se ponga a un valor distinto de cero.

Exclusión Mutua con SEMAFÓROS

Semáforos para proteger conjunto de recursos

En caso que exista un conjunto de recursos similares, se puede usar una versión más general de
semáforo que lleve la cuenta del número de recursos disponibles. En este caso el semáforo se inicializa
con el número total de recursos disponibles (N) y las operaciones de espera y señal se diseñan de modo
que se impida el acceso al recurso protegido por el semáforo cuando el valor de éste es menor o igual
que cero.
Características

Los semáforos tienen algunas características que pueden generar inconvenientes:

• las variables compartidas son globales a todos los procesos.

• las acciones que acceden y modifican dichas variables están diseminadas por los procesos.

• para poder decir algo del estado de las variables compartidas, es necesario mirar todo el código.

• la adición de un nuevo proceso puede requerir verificar que el uso de las variables compartidas es
el adecuado.

• Generamos programas poco escalables

MONITORES

Es un conjunto de procedimientos que proporciona el acceso con exclusión mutua a un recurso o


conjunto de recursos (datos o dispositivos) compartidos por un grupo de procesos. Los procedimientos
van encapsulados dentro de un módulo que tiene la propiedad especial de que sólo un proceso puede
estar activo cada vez para ejecutar un procedimiento del monitor.

Un monitor es un conjunto de procedimientos que proporciona el acceso con exclusión mutua a


un recurso o conjunto de recursos (datos o dispositivos), se lo puede ver una valla alrededor del recurso
(o recursos), de modo que los procesos que quieran utilizarlo deben entrar dentro de ella.

Características:

Es un TAD:

• uso independiente de la implementación.

• el usuario no conoce la iimplementación.

• nada se sabe del orden en que se van a invocar acciones del monitor.

• por lo que necesita una correcta especificación.


Tipos de monitores:

*MONITOR: Es el monitor más simple de todos pues solo tiene tres estados y las funciones internas
son muy sencillas.

*MANAGER: es muy similar al monitor tipo monitor, la diferencia esencial es que un proceso que es
reiniciado debe abandonar el monitor

*MEDIADOR: Este monitor fue propuesto por C.A.R. Hoare, tiene la característica de compensar las
desventajas de los monitores tipo monitor y tipo manager

*GLADIADOR: tiene la característica fundamental de solo tener un punto de consistencia interno,


ocurre cuando el proceso que está activo abandona este estado y sigue dentro del monitor

Un monitor encapsula el código relativo a un recurso compartido en un solo módulo de programa

Funcionamiento

Respecto a la sincronización: la exclusión mutua se asegura por definición:

– por lo tanto, sólo un proceso puede estar ejecutando acciones de un monitor en un


momento dado.

– aunque varios procesos pueden en ese momento ejecutar acciones que nada tengan que
ver con el monitor

La sincronización condicionada:

– cada proceso puede requerir una sincronización distinta, por lo que hay que programar
cada caso.

– para ello, se usarán las variables “condición”:

• se usan para hacer esperar a un proceso hasta que determinada condición sobre el
estado del monitor se “anuncie”

• también para despertar a un proceso que estaba esperando por su causa

Existe necesidad de sincronización de condición. Se maneja con dos operadores que se llaman wait
y signal.

• Un wait siempre bloquea y se ubica en una cola asociada a esa variable de condición.

• Cuando un proceso bloqueado libera su bloqueo permitirá ingresar a otro proceso.

• Cuando un proceso ejecuta una operación signal, liberará un proceso bloqueado.


Críticas:

• Solución elegante a problemas de exclusión mutua.

• No soluciona bien las sincronizaciones de variables de condición.

Ventajas:

*Mantenimiento más simple

*Menos errores de programación

La interfaz del monitor es un conjunto de funciones que representan las diferentes operaciones
que pueden hacerse con el recurso. La implementación del monitor garantiza la exclusión mutua
mediante semáforos o algún otro mecanismo.

TRANSFERENCIA DE MENSAJES

PASO DE MENSAJES

• Se necesita un proceso emisor y uno receptor.

• Información para intercambiar.

• Operaciones básicas son:

– Enviar (mensaje)

– Recibir (mensaje)

• Se debe establecer un enlace entre receptor y emisor:

– Modelo de sincronización

– Como nombrar los procesos

– Estructura del mensaje

Manda un mensaje que es recibido por otro proceso que suele esperar dicho mensaje

El paso de mensajes es imprescindible en sistemas distribuidos dado que en este caso no existen recursos
directamente compartidos para intercambiar información entre los procesos.

Características:

• Tipos de sincronización

• Identificación del otro lado

• Prioridades
TIPOS DE SINCRONIZACIÓN

• Sincronización implícita: un proceso no puede recibir un mensaje antes que el emisor lo haya
emitido.

– Asíncrona: el emisor continúa sin saber si el mensaje llegó o no

– Síncrona: el emisor continúa solo cuando se recibió el mensaje

– Invocación remota: el emisor continúa sólo cuando se recibió una respuesta desde el
receptor

El paso de mensajes puede ser síncrono o asíncrono depende de lo que haga el remitente antes de seguir
procesando.

• el remitente puede esperar hasta que se haya ejecutado la recepción correspondiente al otro lado;
es el método de la comunicación síncrona

• el remitente puede seguir procesando sin esperar al receptor es el método de la comunicación


asíncrona

• el remitente puede esperar hasta que el receptor haya contestado al mensaje recibido; es el método
de la involucración remota

Se pueden distinguir varias posibilidades en cómo dos procesos envían y reciben sus mensajes

• Usan nombres únicos para identificar tanto el remitente como el receptor tienen que especificar
exactamente con que proceso quieren comunicarse

• Solo el remitente especifica el destino

• A ninguna de las dos partes le interesa cual será el proceso al otro lado

PRIORIDADES:

Para el paso de mensajes su usa muchas veces el concepto de un canal entre el remitente y el receptor o
también entre los buzones de mensajes y sus lectore

"Los canales pueden ser capaces de distinguir entre mensajes de diferentes prioridades

SOLUCIONES POR HARDWARE

Las soluciones hardware se dividen en dos tipos

• Optimistas: Consideran que lo más probable es que no haya conflictos, y si los hay sea en número
reducido, por lo que permiten cualquier acceso a la variable compartida. En las actualizaciones.
caso de conflicto, mantienen la integridad del sistema descartando

• Pesimistas: Bloquean todo aquello que pueda interferir, actualizan la variable, desbloquean lo
bloqueado al principio.

[Link]

11. PROBLEMAS EN LA COMUNICACIÓN ENTRE PROCESOS

En todos los casos presentados es de destacar que su uso correcto es responsabilidad del
desarrollador, habiendo algunos problemas de sincronización a evitar:
• Deadlocks (bloqueo mútuo): cuando dos o más tareas concurrentes se encuentran c/u esperando
a la otra para proseguir (lo que nunca ocurrirá).
• Starvation (inanición): cuando a una tarea se le niega el acceso a un recurso compartido.
• Inversión de prioridades: cuando dos tareas de distinta prioridad comparten un recurso y la de
menor prioridad bloquea el recurso antes que la de prioridad mayor, bloqueándose esta última al
momento que precise el uso del recurso compartido.

12. CONTROL DE RECURSOS.


Unidad N° 4: Programación en RT:

Descripción general. Acceso a un clock. Retraso de un proceso. Programación de actividades


periódicas. Programación de timeouts. Especificación de requisitos temporales. Atributos
temporales. Tareas periódicas y tareas esporádicas. Planificación. Modelo simple y
planificación por prioridades fijas con desalojo. Tests basados en la utilización y en el
análisis de cada tarea. Procesos esporádicos. Interacción entre procesos. Planificación de
tareas. Herencia de prioridades, prioridad dinámica y prioridades de colas.
!
" # $ % &
'
' ( '

# ' ' )
* +,- & . * ' /

& * " , *
&

& 0 (1 "- *
* 2 ' * " 3
3 ( "

& 4
' /

5 0 ( '

5 ( '

5 # . 5( ' *
"

5 0 ( '

2 % ' ( * ( * '
' # * ("
* $

"' ' " 3


' '

6 "' * ' ' &


( ( ( ' "*
# 7 * " 3

0 89 $ / " ('
" "

- *

52 /
:
1
( * " #
'
5 /
1 ;
0 3
0
52
5 * /

2 ;

< ' ( )
/

5 + " *
5 . 5(
$ ( ' % . 2( 5

! " #$
0 = 20& 6!0 '
+1 2&-2> ( " *
( " * +1 " 3 ( ? 0 (
1-6 @( !0? " < 2-6!< & +6 A < 2-6!<
* * * ! 0 +-6 B3 ( * ! 0 +-6
* ! 0 +-6 (
( C C DE4CC C( ' ) # " . F # 5
< # :C <

!! "
#$ % !! "
!! &
$ $ ! !! '( ) !

* $ +$
* $ , - .
* $ #$ % , - . #$ %
* $ , - .
* $ $ 0 / , - . $
$ 0 / +
, -
- $
#$ % - $ #$ %
- $
/ $ 0 - $ $ .
G
* $ 1*
, -
#$ % - #$ %
-
/ $ 0 - $ -2 ! .

* $ 343 , * - % - $ .
* $ 343 , * - $ % - .
* $ 353 , * - % - $ .
* $ 353 , * - % - . $

* $ 363 , * 7 % - . 8$$+
* $ 3623 , * 7 % - . 8$$+
* $ 393 , * 7 % - . 8$$+
* $ 3923 , * 7 % - . 8$$+

$ - : $

!!!
0

% &'
$ H 0 89 " '
0 ' I < 3 '

!!!
0 ! +

; - $
- $
< - $ -2 = ! = 5

/
/ ; - $ /
/ - $ /
/ > $ - $ /
/ < - $ /

- $ /
* $ +$

* $ 343 , * - % - / .
* $ 343 , * - / % - .
* $ 353 , * - % - / .
* $ 353 , * - % - . /

* $ 363 , * 7 % - . 8$$+
* $ 3623 , * 7 % - . 8$$+
* $ 393 , * 7 % - . 8$$+
* $ 3923 , * 7 % - . 8$$+

* $ 343 , * 7 % - / . /
* $ 353 , * 7 % - / . /
* $ 353 , % - / . /
4
* $ 3?3 , * - / % - . /
* $ 3?3 , * - % - / . /
* $ 3@3 , * 7 % - / .
* $ 3@3 , * - / % - . /
* $ 3 3 , % - / . /

* $ 363 , * 7 % - / . 8$$+
* $ 3623 , * 7 % - / . 8$$+
* $ 393 , * 7 % - / . 8$$+
* $ 3923 , * 7 % - / . 8$$+
* $ $ $ , / - / . $
* $ $ / , - $ . /

* $ $ $ 0 , / - . /
* $ # $ $ 0 ,</ - . /
* $ # ++ $ 0 ,#/ - . /

/ $ 0 $ A 5 B !! B
$ 0 / + , - / - $ / $ 0 $ / - $
/ .
* $ 1* ,/ - / $ 0 $ / - / .

!!!
0 0 ! +

(
& ' # '
( /
1C-2 1 D
+$$ 55 +$$
: A% , 1 D5 1C.9 !
0 +$$
* (0 "/

) ;

( ! 0 +-6( # ( (' * '

( ' 3 * * 3 3
( " 3 $

0 ' /
0 +
E 1- $ < 1 -2F!

+$$
1
0 + E 1
0 +$$
0

0 +

E 1- $ < 1 -2F!
9
/ G- #

/ G-2 1 D4 E 1
+$$
1
0 + / G5 1 D
/ G-2/ G4 E 1
0 +$$
0
< ' ) ("' 022+-6 * '
C( 9( : C

0 89 ( ( ' # '
/

) ; HH

& ) $ )* % +,(
' ' * ( ".H =5 #

(
$0
E 1- $ < 1 -2H!

+$$
1
0 + E 1
0 +$$
0
' 022+-6 * * 9 !
* ' * J9 (

& 022+-6 < 022+-6 : ( 3(


# ( K L ' % . 5
< " " ' 0 0( (
0 0 3

< 022+-6 9 ." ' 0 0


5 " /
$0
E 1- $ $ -2H!
/ G-

/ G-2 1 D4 E 1
+$$
1
0 + + / G 55 0 '&7 + I 0 + ,/ G5 +$ .
/ G-2/ G4 E 1
0 +$$
0

- . * ,
M 3( ' < ( H ) *
$ (" ( '
E
< * C ) * '
( '

0 *

% / /
1 1 1
55 ++ 0 $ + E / /1 7 J +
55 +$ 0 + !
# , - #K < .
0 1 1 1

$0 1 1 1
!!! 55 0 + $

+$$
+
# , - #K < . 0$
< E #K-2
0 #
!!!
$
0 + !
!!! 55 $ $ + $ +L
0 +
!!!
0 +$$
0 1 1 1

" / /

2 3 " ( # ' *
* ( # * 3 * ( #

+$$
!! $ +$ 0 0 + $
+
1 1 1 ! # , .
$
0 + !H
++
0 +
0 +$$
& ) /
+
K! ,!!!. 55 K $ M $ $ 0$
$
0 + !H
0 +

M +$ + ! 0 + "! 0 $ $ + $ - 0
+ $ , + + . M + $
0$ 7 $ 0 0 $ $ $ 0$ !
% /
K
< # .0 2( ' '
3 5
+
55 ++ 0 7 $ 0 +
55 ,$ $ + . M 0
55 I * + I 0 + $
% $
55 $ 7 J N $ 0 + +
55 * + I J ++
0 +

+
0 + !
% $
O 55K 0$ 7 + O $ % 0$7 $ 0
0 +

< (
'

55 $ + $ 0 N+ +$
55!!!
+
0 + + $
% $
+$$
55 $ 0 * $ 0 + + 0$
0 +$$
0 +
0
< ( '

! " #

' 0
( I ( 3 (
' # '

" ) ' ' ( % " " ("' *


' < ( ' 3 I 3
# " 3
/ "' (
" ( " # ( '
' '

& . 5
.* 3 5/
D

<

&

!1 N L :

$1 . O!5

"1 # . O&5

2 1& #

2 31 & 3$

& * ' / ( 3

# ( * ( #
& * 3 * # $ (
' & 3
( ' # * . ' * 3
JN ' 5 3

< ' . * , '


* . * , ' 0 * ,
# ( # *3 * ,
(

!
8

! %

'
? *
$0 K $0
K $0$- $ $ -2!!! 55 $ $ /
/ - -2 !!!

!!!
+$$
0 + + /
55 1 K 1
/ -2/ 4K $0$
0 +$$
0 K $0
/
$0 K $0
K $0$- $ $ -2!!! 55 $ $ /
$ - $ $ -2!!! 55 $ $ /
/ 7 - -2 !!!
1 - : $

!!!
+$$
0 + + /
-2 +$ 4 $
+
0 + +
C
1
% $
55 1 K 1
0 +
/ -2/ 4K $0$
0 +$$
: $
A% 1 29 !!!
0 K $0

' 4
& 3 * $ 3 ' ' *
' * & *
* ' 3 ' * * 3 " 3
'

$ 0 $
$ 0 / + 55 $ 0$ + $ L $ $
C

$ - $$+ -2 ; +
0 $

$ 0 $0 $
$ 0 / +

$ -2
0 / +
C A% $

$ -2; +
0 C
0 $

$0 $ 0

55 + I O
+$$
$!C
55 1 /K1
0 +$$
0 $ 0

M +$ + $ $0 ! 0 $0 "! 0 %
+ + J $ N0 0 0 + $ +!
+ I + N+ +$ 0 O + + + + I P
+$ 0 $ + $ $ 7 + $7 + 0$ +
+ O 0 + J + + + !

0
< 9 ("
( * ( ( :C
.0B2! ( 0B2 !( 0B!2 ( 0B! 2( 5 < (
( ( (
0 ' (
. 5( * <
# (' 3 *3 ' '

' '

0 /

0 ('
. ( 5
5 4 (' (
( " ( ( '
< (' '

4 . 5( 4 .
(" 5

1 3 " ' * " .


5 & 3
< : 3 ( 3
< ( * 3 0 3(
/ "
( ( 3 3
"

6
* " (
3 3
# /

)
(
&
& *
3$
< ' 3 . 5

4 0 1

6 6)

2 3$

3$

3 ( 2 ON ! N < ' ON !

( # ) ) *
7
:
0 0
< . 5 3 "
( 3 ' "
" $ * ( 0 (
' ' ( 0
( (

' 0 0 * 8
,
3 0 )
3 3 3' 3
3 . '
3 ( # ( 5 ! ( )
' 2 ( ( /

. 5 . 5 .2 5
9C C :CP
: C : :CP

< ' " ' :( ' 3 <


( 3 C (" 3 4C
0 ' 4C 3 :( ( ' #
C (" "

: : : : : :

0 0 * 68
,
0 3 / 3 *
. " 5 " /
' $ ( 1<0
3

' ( 0 /
" ( ' $

9 / / <
/

ON

( 1<0( 3
/
G

,
C .: 5

6 C
CCC
: C D:D
G C KK8
4 C K9E

& : N C E8G

! ' E8 GP 3
1<0

H 1

! !:
GC C G C GGG
: 4C C : C :9C
G 9C : C :4C
NC D:G

. J C KK85

< ) * ( G N9C( ' C


" :

C :C 4C EC
(
"' < ( * * (
# 3
4

H 1

! !:
E 4 G C :9C
: 4C 9 : C :9
G DC G: C 4CC
NC KK9

3 . O C KK85 !

H (1

! !:
:C 9 G C :9C
: 4C C : C :9C
G DC 4C C 9CC
N CCC

. J C KK85 < ( . 5
2

/ ( 3 <
(

0 4

3 ( 3$ * 3$
. N 25 3 3
( 3 3 / N 2 L +( +
3$ ' $ ' * Q( L 5 <
' * 3 C 2 "
' ! * QC( 5( ) * ' * * 3 $ /

M * * 3 ' % " ' < N 9" NE( "G * (


C( E( : 2 * 3 2 2
" ' 3 ( $ /

"
. 5

! .5 " ' &


3 /
9

. 5

& @ 3 * '
( ' 3 ' % *
/

. 5

. 5

< . L 5N . 5( . L 5J ( ' '

H -1

!
K G G
: : G :
G :C 9

;(

:.C5 N G L G N E

:. 5 N E NJ ;

G.C5 N 9 L G L G N

G. 5 N 9 L :RG L RG N 4

G.:5 N 9 L :RG L :RG N K

G.G5 N 9 L GRG L :RG N :C

G.45 N 9 L GRG L :RG N :C NJ ( ; <

2 ' G /

!
:C 9 G 9
: 4C C : 9
G DC 4C DC

?'

& 3 " . (
3 < ( 5
E
( 0 . *$$8
,
< 3 ( ' ' # .
5 3 $ " 2 ( * * *
* 3 ' '
' 3 # <
) 1<0( ' ( <
" '

1<0 3 " "


# 0 (" * (
' # . 3 3 5 3 "
3 2 !!<0
( # "
# " " ( ' # # '
# #*

( 4
$ E9 ' " 3 ( *
# * 3 *
:C * 3 3 * * :C ( * 3

' !N 3 (
* " ( * ' * ( ' .
3 5 ' !O

( 0 / *
= $6 ,
2 ! ' ( *
. " !( 5

3 *3

< . L 5N . 5( . L 5J!( ' '

H '1

! $ *$6 , * 68 ,

:C G 9

: 9 G K

G C 4 C

4 :C G :C

2 ' !1 - ("' 1<0


K
-
# 3 $ '
" # ( $ 3
. 5
$ ' '
. * ( ( 3 ( 5

< ' ' ( '


3 "'

H 1

< 4 4' M"7 $ * ) '


"M"7
*

< 0 *

4 4 M7 4

G G 77 :

: : :

MMMM

0 NC

: G 4 9 E K D 8 C : G 4 9 E K D

M . #$

7 . #$

B '

M $ * #$
:" G 2 G 3 (' (" :'
( G 7( $ * ( " :
- 4 ' 3 " G 4 )
3 4 M( ' 3
$ * ( < ' ' 3 ( "
G G ) 7( ' > S G
? : ' * 3 :
< 4 ' M" ' "
D
3 < M
(' 4( ' M( ' " 4
7 " " 2 4
' & .T U T 5
* :( E( D( " K

@ " " ' 4 * ' (


( ' *
G" : " '
7 B '
0 ' . ' 5 ' B ) 3 (
B 0 4. 05 '
' .B5 M # #
4( " # " ' :" G 2 3$
" ' 2 '
' #

: G 4 9 E K D 8 C : G 4 9 E K D

& 8( :( 4 " K :( E( D( " K


3 ( 3 &
'

& ' ' ) / 4 G(


G * ' :( : 4

3 ( ' "
# .+2 5( /

2 ( ) ) '
2 * .# 5 (' 3$ '
3 ' 3$ " * '
'

: G 4 9 E K D 8 C : G 4 9 E K D
8
M ! 4 3 4(
:" G* * ' 3 & 4 -
' M( * * ( '
4' " * 4 <(
.' 3 5 4 E
:( 4 " K

2 ( ' ( 3$ ( * * &
3$ ' 3/

& % ($
. 5( $ # . 5

.5 ' ( .5
( " 2 (= ' =

& 3 B/

&
. 5

* (
* ' * # !

> 0
$ "

= <" " " #


0 * 0 * 3 "

1 1 1
$ , .
0 1 1 1
& " /

@* 3 ,A

! % * *
*

0 DG( * 3 ("

0 89( /
/ E 1 /,K 1 -/ !K $ .
55 + 0 + I 0$ + 0 * O 0
55 % 0 +
!!!
!!!
:C
$ ,K 1 .
0 / E 1 /
!!!
/ - / E 1 /,/ !K $ Q; / .
/"- / E 1 /,/ !K $ Q / .
< * "( * "
.<" ! T "5 2 ' ' * 3 '

$ ! #
# ! % &'(

)%* % # " %
! +
! , & - "
. / " 0 $ -
. ' # !

)%* % - . )%* % 1 "


!
' #

)%* % 2 ! 3
2
! ! 1 - $ - .
2 ! "
. " 4 $

> B
< "
/

" + C )*! C" + ,A

< " ( 3

0 3 " <
" ' ( 3 $
-A 01T -

0 3 ( " /

! * / ' 3 *
! * / ' 3 (
" '

/ ' ( 3$ "

4
0 89 ( " =
0 !" T /
0 ! 0 * $

++ - $
* $ 323 , * 7 % - . 8$$+
:
* $ , - . /
* $
$ 0 $ , - $ .
* $ 0, - . 8$$+
* $ ++ + , - . 8$$+

!!! 55 $ * 0 % +
0 0 ! 0 * $

A % /
A % 0 ! * $ 0
K $0 !
$ 0 / K $ ,K $ - / ! K $ -
0 ! 0 * $ ! -2
0 ! 0 * $ ! .
* $ G K $ , - 0 ! 0 * $ ! -2
0 ! 0 * $ ! . / ! K $
0 0 ! K $
A T " * *

< T "

>
0 89 # "

DE E #FC " !@* )C 0 ,A

"T+ * / S+S-TM +6A +- + ?TM +6A;

S+S-TM +6A * ( " ) 0 DG & )


< +- + ?TM +6A( ' 3
*

- /
/ E 1
K 1 ,!!!.
0 / E 1
+2+-6( " 3 S+S- <
* * ( 3 +2+-6 (
' * S+S- < 0 /
K 1 / , 7 # 7 8 R .
/ E 1
K 1 ,K 1 /.,!!!.
0 / E 1

$0 / E 1

+$$
+
K 1 , .,!!!. 0$
!!!
0 K 1
$
A% K 1 , .Q 1< 2 29
::
K 1 ,# .,!!!. 0$
!!!
0 K 1
$
A% K 1 , .Q 1< 2 0 K 1 ,# .Q 1< 2 29
K 1 ,8 R .,!!!. 0$
!!!
0 K 1
0 +
0 +$$
0 / E 1

& // E 1 !K 1 , .,!!!.

0 2- 6 / ) ' 3

5 5 " 5 6 ( !
#
.
! . - " # -

! . . /#
0

>( 0
7 * ' ' " 3 "
) 0
" /
)

& ' * )
' ' " ' "
' 3 "

2 " *
* " ' (
' 3 ("' 3 ) 2
' 3 (
; ' ' 3 " " * #
' *
' " " * # " '

& " 6 ' $ #

+C$ 7 C )* )C 0 ,A

"T+ / S+S-TV+ @+6T +- + ? (


" < S+S-TV+ @+6T +- + ?
S+S- ) * ' < $
' " ! 3
* < S+S-TV+ @+6T +- + ?
2 +&+6AT&-2>+6A & = T "

# # 5. 7 1
.
:G

? !
2 ' "
( *
(

& ) < * (
* ( ' 3 . ( 5
< * . 5( ' (
*

7 3 "
' 3(

' ( # ( (
' ' ! 3
'

? 3 )0
B # * * (
/

& ' $
& ' # 3
& ' $ /
* '
'
* " ' '
& 3

" $ W# &
( ' '
( & * . #
# ' 5( '
$

* ' ) (
( $ 3 . * * 5 0
' 0 ' 3

?
#
2 & 3
* "
0 ) "
2
$ *
:4
?
@ S+S-( 0 #
" 3 3 * "
* ( * "
(

? (
2 * " '
( (
3 & 0 *

? - 4
*
3 # " (
' "
( * " 3 *
* 0 ( * (
' $ 3 *
( ' $

? '
@ # S+S-( # *
( 0
# 3 $

? # 5 )
" * . 5
' 3 * 2
# /

" # * . #$
A ' ' '

0 ' 0 =+ =T+ ( "


" ' 0 2 " =/+

$
$ /$+ 0 !!# :
$ 0 $ , - $ $ 0 0 - $ /$+ 0.
$ 0 $ , - $ 0 0 - $ /$+ 0.

0 $

$0 $

$ 0 $ $+ 0$ $
/$+ , - $ $ 0 0 - $ /$+ 0.
$ 0 , - $ 0 0 - $ /$+ 0.

, - $ $ 0 0 - $ /$+ 0.
0$ - $ /$+ 0 -2 $ /$+ 0 S
:9
$ $ 0$ - 8$$+ -2 ; +
- + -2
0 $ $+ 0$ $

$ 0
$0 $ $+ 0$ $
/$+ , - $ $ 0 0 - $ /$+ 0.A%
0$ 9

* 0 0 62 0$ %
0$ -2 0$ 5 0 0 55
+
J
0 *
0 /$+

, - $ $ 0 0 - $ /$+ 0.A%
$ $ 0$

-2 5
* 2 %
$ $ 0$ -2 ; +
0 *
* 0 0 6 2 0$ %
0$ -2 0$ 5 0 0 55
+
J
0 *
0

$ 0 , - $ 0 0 - $ /$+ 0.

0$ -2 0$ 4 0 0 55 + $
* S $ 9 %
-2 B $
$ $ 0$ -2
0 *
0
0 $ $+ 0$ $

$ 0 $ , - $ $ 0 0- $ /$+ 0.

$ $+ 0$ $ !/$+ , 7 0 0.
0 $

$ 0 $ , - $ 0 0- $ /$+ 0.

$ $+ 0$ $ ! , 7 0 0.
0 $

0 $

& " 0
& # ( *
# . 5' . 5
' 3 . 5 < '
' ( # (

0 " & *
( '
< "* * & (
:E
* <
' 2
* 2 " 3 '
< " 3
" 3 ' "

& 8 4
& ( < M
M ) < X ( ?
* X * ' ? ' # X

& ' . * 5 3 (
) " (
3 0 < ( *
3 3 * 3

( 3 2
3 ' ( '
# * - '
0# 2 .0 25 3 ( (
*

7 1
.

< $ G 8
* . # 5
* ( ( ( * #
* ( ( ( # (
) ( ' * !
( * 3 * & * * '
* "

( * ( '
* * '

* ' ("'
' *
* ' "
& 3

< 0
& "
I " < *
(" * #
* (0

0 / (
( ("
:K
< $ 0
* ( / % (
*

/
*$ 1#8 Q 8< 1 TK / 1 / #K
8< 1- / > 7 / 1 G / >

<+Y / ) (
8 !!"HH
*$ 8 Q/ > '
& B? 3 D 3 B? (
" " '

( 3 6 " ( 6 F *

. 5 " . 5
< - 0A T<+Y & < - 0A T 6+ ( = <?< 1(
) 7 # /D. " 5

< ' ' K


9CC 2 &&
*$ K Q/ 1 G / > H ? Q/ > @/ !/ 1 G <
< - 0A T<+Y . % 5
/
, /K 1- .
/ 1 G < , /K 1.
!!!
0
X' ( X 0!! <<
X
1 C1 - $ -2 ( 55 +
1 8 - $ -2' 55
# 5 !!
*$ # Q/ > 1 8
G
$ 0
!!!
0 $ 0
*$ GQ/ > 1 C1

< 0
+ *
.) 5 * ( ' # 6 "
-<( 70&( ! " < 22

) (
0 * $
* ( ' 3

< * . ( 5'
# 3 /
1## ,U1# 7 / D7 / K7 CU 7 7 C .
:D
*$ 1## Q/ > ( 55
*$ 1## ,U1# 29 '= =7
/ D 29 '= )=7
/ K 29 '= (=7
CU 29 '= =7
29 '=H =7
C 29 '=F =.
2 (

< ! $
) ( 3
#
* I *

< * +,- /

:H 9 .CCC / 0!T - ( CC C/ V + T - ( C CC/ -V TS0+&( CCC/ - @


B ". 5
DH C 6F . * * 5
K ! .+,- 5
E 0 * , *
GH9 *
H: S * .C / 0!( C/ V + ( /< >5
C 0 * , *

1 C1 - $ -2 ( 55
C1 - $ -2" 55 V 0 0 0 0 + $
+
55 $ 0$ J / / #!/ 1 G < ' , .
K1 1 , 1 7 C 1 7 K1C ; 7 1 U .
;< 1 , 7 C 7 / D.
< !!F
G / 1
$ 0
1 - K1 1
8</ - 811
< - <
1 - 811
8 - 811
;< - ;< 1
8 - 811
0 $ 0
*$ G / 1Q8 1 0 $A 1 0 ;
55 $ 8 1 0 0 * 0$ + /

*$ ;< 1 , 29 "= =7 C 29 "= =7 / D 29 "= =.


*$ K1 1 , 1 29 "= =7 C 1 29 "= =7
K1C ; 29 "= =7 1 U 29 "= =.
*$ G / 1
$ 0
55 $ $ $ $ !! + $
:8
55 $ $ 7 + $ - +$ N $ $
8 ?C1 !!
;< ?C1 !!"
8 ?C1 (!!(
1 ?C1 F!!F
< ?C1 '!! 55 $ < !!"
8</ ?C1 !! 55 $ 8</ &!!&
1 ?C1 "!! H 55 $ 1 )!!F
0 $ 0

< ( 0
- $ 00 -2 $ 00 ,'= FFH((=.
/ - G / 1
*$ / Q //
(
( . ( =
=5 ( 3

2 /

B $C $@ $ H H 6$ 6$ 6$ F

9 4 K E 9 4 G : C

- ( @0 !T - ( !? . "5( +! .+ 5 " A- * : ( "


- .C5( - . 5

1! .1 5 G ( 4 / (V ( ( < =(
C( (:(4

X .1 " $ 5 : (" * C( (:(G

"
GC

+ 8@8 6* &',
/
K + $ ,/ .

+ $ 50 * 05 $ 5
/ - $ -2 + $ 50 * 0

55 / 5 0 0 -

# - $ -2 $$ B;
# : - $ -2 $$ B

# : 8 #$0 + - $ -2 + $ 50 * 0
# : $ #$0 + - $ -2 + $ 50 * 0

# : 8 - $ -2 $$ +B
# : - $ -2 + $ 50 * 0

# : # - $ -2 + $ 50 * 0
; + - $ -2 + $ 50 * 0

- $ -2 + $ 50 * 0

55 / $ 5 + 0 + $ -

00 + $ 50 * 0
++ 00 - $ 00
/ $ < - $ -2 + $ 50 * 0
C$ 0 / I - $ -2 + $ 50 * 0 ? / $ <
# $ / I - $ -2 + $ 50 * 0

55 00 $ $ -
* $ 363 , * 7 % - 00 . 8$$+
* $ 3623, * 7 % - 00 . 8$$+
* $ 393 , * 7 % - 00 . 8$$+
* $ 3923, * 7 % - 00 . 8$$+
* $ 323 , * 7 % - 00 . 8$$+
55 * $ 3@23 , * 7 % - 00 . 8$$+
55 3@23 + + 0 * 0
$ $ , 7 363.
!!! 55 0 $ $ *$ ++ + 50 * 0 $ %

55 1 % / 5 0 + $ -
8 1 0 ,U % 1 0 ; 7 $A 1 0 ; .
* + 8 1 0 - $ 8 1 0

55 K $ 5 + 0 0 + $ , ! .-
K $ + $ 50 * 0
K $ K $ K $ B; !!
+ $ 50 * 0
K $ K $ K $ B 4 !!
K $ B
* + K $ - $ K $ -2 ,K $ B; 4
K $ B .@"

!!! 55 $ * 0 % +
0 /
G
8 !I F 8 " ! # $ 8* &',
/ !/ $ +
K + $ ,/ !/ $ + .
/ $ 1** + $ 50 * 0
/ $ $ / $ 1** !!/ $ 1** B
/ $ + $0 + $ 50 * 0
*$ / $ + B/ I / $ <
/ $ ,/ $ 1** 69. $* + 0
/ $ +
*$ / $ B $ $ / I / $ <

55 00 % -
* $ 343, * - 00 % - / $ 1** . 00
* $ 343, * - / $ 1** % - 00 . 00
* $ 353, * - 00 % - / $ 1** . 00
* $ 353, * 7 % - 00 . / $ 1**
* $ 3 $03, * - 00 % - / $ 1** .
/ $ 1**

55 $ $ $@* $ -
00 + $ 50 * 0
* $ $ 00 ,E + - 00 . 00
* $ $ ,E + - 00 . 00

$ $ , 7 343.
55 !!! 0 $ $ *$ ++ + 50 * 0 $ 0 + 0 %

55 !
0 / !/ $ +

1 M ,69. + 0
/ ! 00 $ $ $
K + $ , 00 $ $ $ .

1 M K$ ++ 1 M
* $ $ K$ ,E + - 00 . 1 M K$
* $ $ 00 ,E + - 1 M K$ . 00

$ $ , 7 $ K$ .
$ $ , 7 $ 00 .
0 / ! 00 $ $ $

A % / 7 : 17 / !/ $ +
A % / ! 00 $ $ $
/ 7 : 17 / !/ $ +

$ 0 K < K"

8 !!"HH
*$ 8 B I '
H !! H
*$ HB/ > )
G:
1G 1 ,;7 .
*$ 1G 1B/ >
*$ 1G 1 ,; 29 7 29 .

G / 1
$ 0
K 1 - H
17 G E17 171E ;- 1G 1
0 $ 0

*$ G / 1
$ 0
K 1 !!&
1 )!!)
G E1 H!!H
1 (!!(
1E ; F!!F
0 $ 0

*$ G / 1B/ > / 1 G <

1 A 1, . 1
8 1 A 1,8 . 8 1
1 A $ 1, 1G 1. 1
W 1 A 1, H. W 1
1 E A ! 00 $ $ $ ,8 .
1 E

T-8
- 00
E-1 M K$
G - G / 1

,3 $ 0 0 , !! H.3.
, G !K 1 .
A +
,3 1 ,;7 .3.
, G ! 1.
A +
,3 G E1 ,;7 .3.
, G ! G E1.
,3 1 ,;7 .3.
, G ! 1.
A +
,3 1E ; 1C ,;7 .3.
, G !1E ;.
A +
+ ,31E ;, F. 1, (. G, H. 1, ). K , 5
&.3.

,3 0 0 0 + $ , .-3.
$! , $ .
A +

,30 $ 0 + + T-3.
$! , 29 , $ ,:B 00 ..7A 0 %29 7 29 (.
A +
GG

,30 $ 0 G -3.
$! , , $ , G B 00 ..7 7 (.
A +

,3 $ 0 G -3.
$! , G B I .
A +

-2 G B 00
E-2 $ K$ , . 55 $ G
T-2E! ++ 55 T 2 $ 0$ 0 + J G

,3 $ 0$ 0 T 2 $ 0$ 0 + $ 2 3.
,T.
A +
,3 $ 2 3.
,T7 7".
A +

0 K < K"

0 /
0
2( T

* $ 18 , - .
* $ 18 , - .
#K1 , 7 18 7 X 0$ + Y.

18 , .
0 18

A % : 17 18
: 1
$ 0 R #K 1
1 A 1, . 1

,X + 0$ + 0 & X.
, 18 ,&..
A +
0 R #K 1

+1 - ' $ 2 &
2 3

0$ + , .
Z
4
[
' * ' + 0
" 2 < * ( # ' T " T = + 2
G4
G9

: ! ( <'

@V 2 0 .A G C95 /

' +-T0
. < 5 " ' * * # . 5
' ( ( +1 - '
" 2 Z Z Z Z( " (
*

2 2 (
' L L =( . * =
5

A % / !< 0 55 /1K1 K1/ 1/

1 0
55 K W< K /1 K< 1/ UC K
!!"HH 55 G1 ' 8 /
$ 0 / , $-/ !< 0 !/%$ < 0
0 $- .
* $ 0 , $-/ !< 0 !/%$ < 0.

0 1 0

$0 1 0

$ 0 / , $-/ !< 0 !/%$ < 0 0 $- .

$ 0 / 1 + $, -/ !< 0 !/%$ < 0


0- .
$ , 7 / 1 + $7 3$ $ 3. 55 # <

/ 1 + $, $70 $.
0 /
* $ 0 , $-/ !< 0 !/%$ < 0.

* $ 1 + , -/ !< 0 !/%$ < 0.

$ , 7 1 + 7 3 $ 3. 55 # ;< 1

1 + , $.
0 0

0 1 0

2 !! "

3 !-4

: D:9G .D:945 3 * (
% ' ( 4: (
D ' *# " 2 *# * : "
* ( " ) * ( ' *
* ' * 2 )
GE
C 0 #( * 3
. 8G DC @ 5 * * * :

* : * * ( D "
E (" * * * C

3 !-4 . N:E @ 5 " '


!-9 ( :: @

0 * *
: ' 4 * * ( *
( " 0
*
G ! * *

< 0 89 ( 2 (
( H (
. H ( 5( " H$ " =

= 0VT+- "
' ( * ( 2( /

A % : 17 C 1
: 17 C 1

$ 0 K < 8
- %

,3 + 7 ! 3.
, . D
A% + @2B!B +$$
K< D , .
D , .
0 +$$
A +
+ ,3; 3.
0 K < 8
0VT+- $ 0!> ?( ' * * 3 ( " > ?
' 3 3 /
C 1
$ 0 D , U- $ % .
$ 0 K< D , U- % .
0 C 1

0VT+- 2 ( "
T " T = + 2 * 2"0 /

A % * ! * !
$0 C 1
$ 0 D , U- $ % .
* $ G U %
GK
#K1 , 7G U 73 % 3.

U-2 $ 0 ,G U .
0 D

$ 0 K< D , U- % .
$ 0 K< U , %- % .
#K1 , 7K< U 73 % 3.

K< U , $ , U..
0 K< D
0 C 1

@? * % $! ?@
= + 0 6 !%9
= + 0 6 !%9
= + 0 6 0 $!%9
0 * Z* + 7 [ $$+
% % ,.
$ 0 % , % %.

@? 0 0 ?@
% % ,.
Z
@? + 0 * $ + *+ % 0 + 0$
? K$ M +$7 + *+ % 0 % 0 + % , . B#B
? + *+ % IJ 0 0 + % , . BDB
? + $ 0 + + 0 +
?@

% % %
$$+ % 2 * + @? / 7 % % + 0$
?@
* , % . Z @? 0 + + + 0
?@
% 2* +
% %
[
2 ,. @? * $ * 0 0M K ?@
* , \ : . Z @? + 0 * $ $ *+ % ?@
% 2
% %2, % . , \ :;;.
, % .
[
, % . , \ :;;. @? +J $ + ?@
[
$ 0 % , % %.
Z
* , %7 0$ .
**+ %, 0$ .
[

B0 X /
52
H
H IT
GD
H
5
H$
5& =
=

+,- " ' +,-


* # ( * # ( ' *

2 ( (" *
* * ' ( )
0 * ( ( *

" /

7 ( (
+ / ( ( (
2

& * ' 2 ( ' 3


* '
* . / 5 2
( ( * ("
* * *
( ( *

6
0 89( . 5 &
/

5 7CB .6-1B T106 [0!- ( X <+-65;

3 X <+-6 &
'

5 CB .6-1B T106 [0!- 5;

3 3

= " 3
) $ /
A % /
A % * ! !/ $
0 !
A
!! * ! !/ $ ! / G
K + U 0+ $ 0 $ 0
* $ 0 , - . 8$$+
* $ % 0 , - . 8$$+
* $ U 0+ , - .
K + U 0+
$ 0 % U 0+ , A U 0+ - K + U 0+
G8
- .
$ 0 : % U 0+ ,1+0 U 0+ - $ K + U 0+
A U 0+ - K + U 0+ - .
$ 0 % U 0+ , - .
* $ * , - . / ! 00
0 0 !
A % /
55 % + $ 50 * $
55 $ 0 RGKK "
55 < + *$ 0 ! 0
55 0 A % 355 ???3 % *$++$A $ 0 * $ !
0 ! !
/ G 8 - $ -2 "''
/ G;K - $ -2 "'
/ G - $ -2 "
/ G/ GE - $ -2 "
/ G # - $ -2 " "
/ G # - $ -2 " &
/ GU<K - $ -2 " )
/ G - $ -2 " H
/ GD - $ -2 " (
/ GK K - $ -2 " F
/ GW< - $ -2 " '
/ G</ - $ -2 "
/ G</ " - $ -2 &
/ G 1;K - $ -2 &
/ G K - $ -2 & "
/ G # - $ -2 & &
/ GK 1; - $ -2 & )
0 0 ! !
' /
# R 1 /
$ 0 # R 1
$ 0 /K< /
U 0+ , /K< / .
0 # R 1
!!!
0 # R 1 /

# $0
R 1 /
$ 0 $0 # R 1
$ 0 /K< /
!!!
A % 0 ! 7 0 ! ! 7 # R 1 /
0 ! 7 0 ! ! 7 # R 1 /
$ 0 R #K 1
!!!

!!!
% U 0+ ,# R 1 ! /K< / Q //7 1#8 .
!!!

( J J" F 9K
Q \ B (0(V (0;< "& ( G] ; 0 HV "
.:CCG5; ( :( G( 9
4C
Q:\ B (0(V (0;2 " 0 ; 2 * " . 8895; :(K( ( :

QG\ B H0 ( 1 ; 2 ! ; H@ . 88C5; E

Q4\ B ([; 0 89; 0 HV " . 88E5; : (::

Q9\ < (10;- - < I 0 89; + 2 . 88E5; :C(:4

QE\ 0 1 .0 15 . 8895
UNIDAD 4:Programación en RT
SUPER VIDEO:
[Link]
aEIE

Descripción general
Se define un programa en tiempo real como: “Un programa en el cual las
correctas operaciones dependen de los resultados lógicos computacionales y del
tiempo que se tarda en producir estos resultados."
Debido a los requerimientos especiales de rendimiento y fiabilidad
demandados por los sistemas en tiempo real, es importante la elección de un
lenguaje de programación.
Pueden utilizarse con eficacia muchos lenguajes de programación de propósito
general (C, Java, Pascal, Modula -2…) para aplicaciones de tiempo real.
Aunque existe una clase de lenguajes específicos para este tipo de
aplicaciones denominados lenguajes de tiempo real (Ada, Jovial, HAL/S, Chill y
otros).
Para que un lenguaje sea apropiado para tiempo real debe tener todas las
características ya mencionadas en la unidad 1 (características de un sistema en
tiempo real). Pero podemos destacar algunas:
● La capacidad de multitarea.
● Características modernas de programación que ayuden a asegurar la
corrección del programa (menos errores).
● Manejo de números reales (obligatorio).
● Manejo inteligente de las interrupciones (muy muy importante).

Sistemas reactivos por scanning


Este tipo de sistemas detecta los eventos mediante scanning de puertos, es
decir, los puertos pueden ser leídos completos o por bits. Una vez detectado el
evento, se llama a una función que de respuesta.
Si N es la cantidad de eventos a detectar, Li es la lectura de los puertos o bit
del evento i, Ri es la rutina de atención del evento i, Lri/Eri es la lectura de la
rutina Ri, Ti es el tiempo asignado a la lectura del puerto o evento i, y Tri es el
tiempo asignado a la rutina que atiende al evento i.
Primero se lee el puerto, luego se pregunta: ¿el puerto leído esta en 1? Si está
en 1,se ejecuta la rutina de atención de esa entrada, sino vuelve a escanear.
Sabiendo esto, podemos calcular también el tiempo de atención o de
reacción para el evento “i” o frecuencia de reacción. Si se tiene un clock de 12
Khz:

El tiempo de atención o de reacción viene dado a partir de un número


determinado de ciclos de clocks (timers internos). Para el ejemplo anterior se
debería configurar el timer para atender una rutina cada 20 uSeg o 50 KHz.

Polling
Es una técnica basada en un mecanismo de sondeo continuo, el cual consiste
en que el mismo microcontrolador se encarga de monitorear el estado o
información de un evento.
Tiene un inconveniente, los eventos no pueden ser monitoreados en forma
periódica, ya que el microcontrolador consume tiempo en ejecutar diversas
instrucciones que lo distrae de dicha actividad de sondeo, resulta una técnica
ineficiente.
La solución a esta problemática ha sido la incorporación de un dispositivo
controlador de interrupciones para atender cualquier tiempo de interrupción.
Sistema reactivo por clock
Este sistema tiene 2 variantes, con sincronismo uniforme y con sincronismo
no uniforme:

Sistema reactivo por interrupción


Es un sistema cuyo mecanismo consiste en que el dispositivo avisa de un
evento que se lo comunica al CPU para que este suspenda temporalmente el
programa principal, para ejecutar una rutina de atención al evento.
Cuando se genera una interrupción, el microcontrolador termina la ejecución
de la instrucción en curso, luego salva el estado de registros y el contador de
programa, luego salta a la dirección de memoria donde comienza la rutina de
atención y finalizada la rutina, se restaura el estado que había guardado y retorna al
programa principal.
Existen varios tipos de sistemas reactivos por interrupción:

● Con atención asíncrona completa:

● Con atención asíncrona en cascada (sin prioridad):


● Interrupción administrada por llegada (sin prioridad): usa una rutina de
administración de interrupciones que se ejecuta por cada llegada de una
interrupción (irq).

● Interrupción administrada con prioridad: las interrupciones se


memorizan y se evalúa cuál debe ser atendida, agregando un grado de
complejidad al código.

En estos últimos dos casos se dan tips de penalización: se penaliza con un Ti cuando
llega una irq (interrupción), se llama a una subrutina, por cada parámetro que se pasa
en la subrutina, o retorna al programa principal.
Existen también modos en que la interrupción irq es disparada:
● LOW: esta constante indica que se activa la interrupción cuando hay un
estado LOW (0V) en el pin asociado al tipo de interpretación.
● CHANGE: se dispara la interrupción cuando el pin cambia de valor de
voltaje o estado.
● RISING: flanco de subida: cuando hay una transición de bajo (LOW)
hacía alto (HIGH), se genera una solicitud de interrupción.
● FALLING: flanco de bajada: cuando existe una transición de alto (HIGH)
hacia bajo (LOW), entonces se activa la interrupción.

Sistema reactivo

Es aquel que interactúa constantemente con su medio ambiente a través de


eventos en momentos impredecibles y que evoluciona en una serie de estados
calculando una respuesta adecuada. Se dice que el sistema es conducido por eventos
(event driven). En un STR reactivo, la respuesta tiene restricciones temporales y por
lo tanto el tiempo se convierte en un evento más a tener en cuenta.

También podría gustarte