20.04.2013 Views

Descarga este documento en formato PDF - Ucontrol

Descarga este documento en formato PDF - Ucontrol

Descarga este documento en formato PDF - Ucontrol

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

15 de 22<br />

‘Mark’ Time (Secs) = 100m<br />

‘Sapce’ Time(Secs) = 5.9<br />

Simul<strong>en</strong> y vean como cada vez que se pasa por rtos_wait() y si el semáforo es mayor que cero, se decrem<strong>en</strong>ta<br />

y se <strong>en</strong>tra <strong>en</strong> la sección crítica, si el semáforo es 0 <strong>en</strong>tonces la tarea espera a que esté disponible el recurso<br />

(semáforo>0) para ejecutar el código de la sección crítica.<br />

[Volver al Índice]<br />

> En sus marcas, listos, ¡FUERA!<br />

Un mom<strong>en</strong>to, un mom<strong>en</strong>to, no tan rápido que, hay una salida <strong>en</strong> falso del corredor del carril No. 2.<br />

En un caso como el anterior diríamos que ha fallado la sincronización de los corredores <strong>en</strong> el arranque, y la<br />

sincronización es el tema que vamos a tratar hoy <strong>en</strong> nuestro cursillo de los RTOS para uC.<br />

En el mundo de los uC es frecu<strong>en</strong>te la utilización de demoras para esperar a que ocurran ciertos hechos o<br />

ev<strong>en</strong>tos, para <strong>en</strong> consecu<strong>en</strong>cia hacer algo. La duración de estas demoras puede ser conocida, como <strong>en</strong> el caso<br />

de esperar a que una LCD coloque los datos <strong>en</strong> determinados registros antes de <strong>en</strong>viarle otro dato, o esperar a<br />

que la USART saque un dato que está transmiti<strong>en</strong>do antes de poder escribir nuevam<strong>en</strong>te <strong>en</strong> el registro de<br />

transmisión; sin embargo también son frecu<strong>en</strong>tes aquellas esperas <strong>en</strong> las que no sabemos cuanto podemos<br />

demorarnos.<br />

En los casos <strong>en</strong> que no conocemos cuanto debemos esperar se pued<strong>en</strong> utilizar las interrupciones, pero <strong>en</strong> los<br />

uC no t<strong>en</strong>emos interrupciones ilimitadas ni tampoco existe una biblioteca de mecanismos de interrupción<br />

disponibles para todos los casos que se nos pres<strong>en</strong>tan. Es por estas razones que muchas veces esperamos a la<br />

ocurr<strong>en</strong>cia de estos ev<strong>en</strong>tos haci<strong>en</strong>do suposiciones y blandi<strong>en</strong>do demoras.<br />

Para la implem<strong>en</strong>tación de demoras exist<strong>en</strong> varios mecanismos más o m<strong>en</strong>os efici<strong>en</strong>tes, sin embargo un SO no<br />

nos ofrece <strong>este</strong> tipo de mecanismos que podemos llamar un poco primitivos. Para la implem<strong>en</strong>tación de<br />

demoras efici<strong>en</strong>tes los SO han creado los mecanismos de sincronización de procesos.<br />

En la <strong>en</strong>trega anterior vimos la coordinación, <strong>en</strong> realidad los autores de los libros más reconocidos <strong>en</strong> el tema<br />

de los SO, han llamado a estos mecanismos y al que veremos hoy, “mecanismos de sincronización de<br />

procesos”, pero a mi me gusta distinguir <strong>en</strong>tre aquellos que se dedican especialm<strong>en</strong>te a implem<strong>en</strong>tar esperas<br />

efici<strong>en</strong>tes para la protección de recursos, de aquellos que se dedican a implem<strong>en</strong>tar esperas efici<strong>en</strong>tes para<br />

ev<strong>en</strong>tos por los cuales un proceso debe esperar antes de continuar su ejecución. Notemos que <strong>en</strong> ambos casos<br />

la tarea o proceso debe esperar, pero no <strong>en</strong> todos los casos la espera ti<strong>en</strong>e la misma naturaleza, <strong>en</strong> uno<br />

esperamos por un recurso físico al que queremos acceder y que no está disponible, <strong>en</strong> el otro esperamos a que<br />

se produzcan ciertos hechos que determinan el “estado” del sistema.<br />

Vamos a utilizar como refer<strong>en</strong>cia el problema anterior para ver el mecanismo de la sincronización <strong>en</strong> ejecución.<br />

Supongamos ahora que le hemos colocado a nuestros robots una <strong>en</strong>trada que cuando está <strong>en</strong> nivel bajo le<br />

indica al robot que no coloque o extraiga botellas de la cinta transportadora. Con <strong>este</strong> mecanismo simple<br />

vamos a tratar, por un lado, de evitar que el robot despachador de botellas ll<strong>en</strong>e demasiado la cinta y por el<br />

otro que los robots ll<strong>en</strong>adores de cajas trat<strong>en</strong> de ll<strong>en</strong>ar las cajas cuando no hay sufici<strong>en</strong>tes botellas <strong>en</strong> la cinta<br />

transportadora. Es decir, vamos sincronizar el proceso de ll<strong>en</strong>ado/vaciado de la cinta transportadora. Las<br />

v<strong>en</strong>tajas de esto son evid<strong>en</strong>tes, por ejemplo: si el robot ll<strong>en</strong>ador no ti<strong>en</strong>e botellas que poner <strong>en</strong> la cinta los<br />

robots ll<strong>en</strong>adores trabajarán hasta que la cantidad de botellas se lo permita; si los robots ll<strong>en</strong>adores dejan de<br />

trabajar, <strong>en</strong>tonces el robot despachador trabajará hasta que ll<strong>en</strong>e la cinta transportadora.<br />

Para lograr lo anterior, vamos a poner que la cantidad máxima de botellas que pued<strong>en</strong> estar <strong>en</strong> la cinta es de<br />

100 y que la cantidad mínima de botellas es 24, por lo que cada una de las tareas que ati<strong>en</strong>de a los robots<br />

deberá, además de llevar la actualización del total de botellas <strong>en</strong> la cinta, indicarle a los robots que se<br />

det<strong>en</strong>gan cuando la cantidad de botellas <strong>en</strong> la cinta esté fuera del rango especificado. Además vamos a utilizar<br />

el puerto serie para Tx la cantidad de botellas que hay <strong>en</strong> la cinta <strong>en</strong> cada mom<strong>en</strong>to.<br />

Las <strong>en</strong>tradas a los robots (salidas de nuestro PIC) las hemos colocado <strong>en</strong> los pines RB3..RB5, <strong>en</strong> RB3 al robot<br />

despachador, <strong>en</strong> RB4 al robot ll<strong>en</strong>ador1 y <strong>en</strong> RB5 al robot ll<strong>en</strong>ador2<br />

Para hacer la sincronización de tareas el RTOS de CCS nos ofrece una sola función, aunque parezca poco esta<br />

función es bi<strong>en</strong> poderosa, vamos a verla con más det<strong>en</strong>imi<strong>en</strong>to. La función se llama rtos_await(expr) lo que<br />

ti<strong>en</strong>es que pasarle es una expresión lógica que la función evaluará, si esta resulta verdadera <strong>en</strong>tonces<br />

continúas la ejecución normal de tu programa, si te devuelve falso, <strong>en</strong>tonces rtos_await() le cederá el<br />

procesador al RTOS y la tarea quedará bloqueada hasta que exp se cumpla para <strong>en</strong>tonces continuar <strong>en</strong> la línea<br />

sigui<strong>en</strong>te a la llamada a la función.<br />

Ahora bi<strong>en</strong>, es cierto que esta función es poderosa y simple, pero eso implica que t<strong>en</strong>emos que saber donde<br />

ponerla, ya que si no evaluamos bi<strong>en</strong> nuestras expresiones o no colocamos la función <strong>en</strong> el lugar adecuado,<br />

estaremos sometiéndonos a riesgos durante la ejecución de nuestro código. Por ejemplo puede ocurrir que

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!