Descarga este documento en formato PDF - Ucontrol
Descarga este documento en formato PDF - Ucontrol
Descarga este documento en formato PDF - Ucontrol
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