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.

10 de 22<br />

ocupado <strong>en</strong> perder el tiempo, y es por eso que a <strong>este</strong> mecanismo se le llama espera ocupada.<br />

Sin embargo un RTOS nos ofrece un conjunto de herrami<strong>en</strong>tas para eliminar <strong>este</strong> molesto inconv<strong>en</strong>i<strong>en</strong>te, el<br />

más s<strong>en</strong>cillo de ellos es aquel que le permite a una tarea decirle al RTOS: ponme a dormir hasta que me toque<br />

de nuevo mi turno de ejecutarme. Para ese efecto el RTOS de CCS implem<strong>en</strong>ta la función rtos_yield().<br />

Este mecanismo es muy bu<strong>en</strong>o puesto que mi<strong>en</strong>tras la tarea “se duerme” nuestro microcontrolador puede<br />

dedicarse a realizar otras tareas útiles y hacer de la espera ocupada una espera efici<strong>en</strong>te. Para la tarea que<br />

está dormida esto no repres<strong>en</strong>ta nada, a ella le da lo mismo ocupar al procesador <strong>en</strong> hacer nada que <strong>en</strong> hacer<br />

algo productivo, sin embargo no ocurre lo mismo para el resto de las tareas que están esperando que se les<br />

<strong>en</strong>tregue el procesador.<br />

Otro caso <strong>en</strong> que yield() nos puede ser útil es para <strong>en</strong>tregar el procesador cuando nos hemos pasado de<br />

tiempo <strong>en</strong> la ejecución de alguna tarea. Ya sabemos que el RTOS de CCS es cooperativo, por lo que si una<br />

tarea consume más tiempo de la cu<strong>en</strong>ta puede hacer que el sistema colapse, ya que hay que <strong>en</strong>tregar<br />

explícitam<strong>en</strong>te el procesador al RTOS para que se lo de a otra tarea.<br />

Sin embargo con la función de las estadísticas habilitadas, podemos comprobar si alguna tarea se ha pasado<br />

de tiempo, y con ello implem<strong>en</strong>tar mecanismos adecuados para que la tarea <strong>en</strong> cuestión reajuste su dinámica<br />

y ceda el procesador oportunam<strong>en</strong>te, para ello podemos auxiliarnos de la función rtos_overrun(). Esta función<br />

no ti<strong>en</strong>e valor si se usa d<strong>en</strong>tro de una tarea para comprobar si ella misma se ha pasado porque la actualización<br />

de las estadísticas se hace después de ceder el procesador, considero que esta es una de las debilidades de<br />

<strong>este</strong> RTOS, <strong>en</strong> ese s<strong>en</strong>tido.<br />

El uso de rtos_overrun(), debería poderse utilizar d<strong>en</strong>tro de una misma tarea para comprobar si desde que me<br />

cedieron el procesador para ejecutar, me he pasado de tiempo o no y <strong>en</strong> consecu<strong>en</strong>cia <strong>en</strong>tregar el procesador<br />

al RTOS.<br />

En el ejemplo que les traigo hoy vamos a emplear rtos_yield() para ceder el procesador y rtos_overrun() para<br />

conocer si una tarea se ha pasado de tiempo.<br />

Sin embargo yield() no es una función realm<strong>en</strong>te poderosa, al m<strong>en</strong>os <strong>en</strong> <strong>este</strong> RTOS, porque pone a dormir a la<br />

tarea durante un período completo del valor rate, que especificamos al declarar la función como una tarea del<br />

RTOS, y eso <strong>en</strong> ocasiones no es lo que deseamos. Aún así es mejor que el procesador de nuestro PIC esté<br />

haci<strong>en</strong>do algo útil y no perdi<strong>en</strong>do el tiempo.<br />

En las <strong>en</strong>tregas futuras veremos otras funciones que nos ofrece <strong>este</strong> RTOS para hacer esperas más efici<strong>en</strong>tes<br />

vinculadas al uso de recursos compartidos <strong>en</strong> nuestras aplicaciones. El uso efici<strong>en</strong>te del procesador, los<br />

recursos del sistema y la no linealidad <strong>en</strong> la ejecución de las tareas <strong>en</strong> un sistema que emplea SO, ha obligado<br />

a los diseñadores de SO a crear mecanismos para proteger los datos y hacer uso de esos recursos de forma<br />

ord<strong>en</strong>ada y segura. Estos mecanismos se clasifican <strong>en</strong> dos grupos: La sincronización y la coordinación que<br />

com<strong>en</strong>zaremos a ver <strong>en</strong> la próxima <strong>en</strong>trega.<br />

Ejemplo:<br />

Implem<strong>en</strong>te <strong>en</strong> un PIC16F877 una aplicación <strong>en</strong> la que se ejecut<strong>en</strong> tres tareas, con las sigui<strong>en</strong>tes<br />

características:<br />

- La tarea No. 1 T<strong>en</strong>drá un contador el cual se increm<strong>en</strong>ta <strong>en</strong> un lazo hasta que alcanza el valor de 1000.<br />

Cuando llegue a ese valor imprime el sigui<strong>en</strong>te m<strong>en</strong>saje: “Tarea contadora completada” y además pone una<br />

bandera a 1, para indicar que ha concluido. Debe colocar <strong>en</strong> esta tarea código para que la tarea ceda el<br />

procesador <strong>en</strong> algún mom<strong>en</strong>to al RTOS. El tiempo máximo de ejecución de esta tarea es de 10ms y debe<br />

ejecutarse cada 30ms.<br />

- La tarea No. 2 debe esperar a que la tarea No. 1 termine para <strong>en</strong>viar por el puerto serie un m<strong>en</strong>saje similar<br />

al de la tarea No. 1, sin embargo, esta tarea también <strong>en</strong>viará, por el puerto serie, un m<strong>en</strong>saje cada vez que le<br />

cede el procesador al RTOS. Esta debe ejecutarse <strong>en</strong> un tiempo de 10ms y debe ejecutarse cada 40ms.<br />

- Por último, existe una tarea que se <strong>en</strong>carga de hacer parpadear un LED conectado <strong>en</strong> RB0, cada 100ms y<br />

<strong>en</strong>viar un m<strong>en</strong>aje por el puerto serie <strong>en</strong> caso de que la Tarea 1 o la Tarea 2 se hayan pasado <strong>en</strong> algún<br />

mom<strong>en</strong>to de su tiempo de ejecución. El tiempo de procesador para esta tarea debe ser de 10ms.<br />

Código:<br />

#include "D:\Docum<strong>en</strong>tos\Projects\RTOS\RTOS.h"<br />

#use rs232(baud=19200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=9)<br />

#use RTOS(timer=0, minor_cycle=10ms, statistics) //se utilizan las estadísticas<br />

//hace falta para usar rtos_overrun()<br />

int32 iT1Counter = 0;<br />

int1 bT1Flag = 0;<br />

int1 bLed = 0;<br />

#task (rate=30ms, max=10ms)

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

Saved successfully!

Ooh no, something went wrong!