sistema operativo con calendarización y multitarea en un microcontrolador programado en c++ y una...

14
Sistema Operativo con Calendarización y Multitarea en un Microcontrolador Programado en C++ y una Interfaz Programada en C# Giorgio Luigi Morales Luna Especialidad de Ingeniería Mecatrónica Facultad de Ingeniería Mecánica Universidad Nacional de Ingeniería Lima, Perú 2014. Resumen—Este paper tiene como principal propósito el guiar al lector a través de los conceptos y pasos principales que sigue la programación de un sistema calendarizado con multitarea usando un microcontrolador y una consola, comunicados a través de la comunicación serial. Para ello, luego de elegir el microcontrolador adecuado, se explica la estructura del código a usar; desde la estructura del PCB, el sistema operativo, la interrupción serial, el algoritmo encargado de intercalar los procesos en ejecución y recibir el calendario de procesos. Por otro lado se darán los alcances suficientes para la programación de la interfaz a través de Visual Studio C#, como la manera en cómo se envían los comandos y direcciones de procesos a través de elementos visuales como botones o listbox, además del algoritmo encargado de crear el calendario y el envío del mismo. Finalmente se exponen los resultados y las simulaciones pertinentes, además de ciertas observaciones a considerar. I. INTRODUCCIÓN La programación monotarea es útil y eficiente cuando la aplicación no requiere la ejecución de más de una aplicación a la vez, de modo que el contador de programa del microcontrolador a usar sigue su curso normal y es interrumpido sólo cuando es necesario usar alguna interrupción que sea vital para el proceso, como la interrupción serial o el timer. Sin embargo; si es preciso que el programa a desarrollar realice más de una tarea a la vez, es necesario ahondar en el concepto de programación multitarea. Por otro lado, ciertas aplicaciones necesitan de procesos cuyo tiempo de muestreo sea fijo y no sea afectado por algún otro proceso de menor prioridad. Entonces, a continuación se proporcionarán los conceptos y direcciones necesarias y suficientes para que el lector sea capaz de implementar en su microcontrolador tantos procesos como sea posible y pueda, a través de una interfaz, enviar comandos que ejecuten las tareas pre-programadas con la ventaja de poder ejecutar al mismo tiempo tantas tareas como sea necesario. II. ALCANCES PREVIOS 1. Planificación de la ejecución de las tareas (Round- Robin) Teniendo la idea clara de que el objetivo es ejecutar varios procesos a la vez, se debe implementar una lógica que posibilite esto, ya que es imposible que el microcontrolador de por sí pueda ejecutar más de un proceso al mismo tiempo. En ese sentido se usará el algoritmo de Round.-Robin para la ejecución deseada. Round-Robin es un método útil para seleccionar todos los elementos en un grupo de manera equitativa y en un orden racional, normalmente comenzando por el primer elemento de la lista hasta llegar al último y empezando de nuevo desde el primer elemento.

Upload: giorgio-luigi-morales-luna

Post on 22-Nov-2015

34 views

Category:

Documents


2 download

DESCRIPTION

Sistema Operativo con Calendarización y Multitarea en un Microcontrolador Programado en C++ y una Interfaz Programada en C#

TRANSCRIPT

Paper Title (use style: paper title)

Sistema Operativo con Calendarizacin y Multitarea en un Microcontrolador Programado en C++ y una Interfaz Programada en C# Giorgio Luigi Morales LunaEspecialidad de Ingeniera MecatrnicaFacultad de Ingeniera MecnicaUniversidad Nacional de IngenieraLima, Per 2014.

ResumenEste paper tiene como principal propsito el guiar al lector a travs de los conceptos y pasos principales que sigue la programacin de un sistema calendarizado con multitarea usando un microcontrolador y una consola, comunicados a travs de la comunicacin serial. Para ello, luego de elegir el microcontrolador adecuado, se explica la estructura del cdigo a usar; desde la estructura del PCB, el sistema operativo, la interrupcin serial, el algoritmo encargado de intercalar los procesos en ejecucin y recibir el calendario de procesos. Por otro lado se darn los alcances suficientes para la programacin de la interfaz a travs de Visual Studio C#, como la manera en cmo se envan los comandos y direcciones de procesos a travs de elementos visuales como botones o listbox, adems del algoritmo encargado de crear el calendario y el envo del mismo. Finalmente se exponen los resultados y las simulaciones pertinentes, adems de ciertas observaciones a considerar. IntroduccinLa programacin monotarea es til y eficiente cuando la aplicacin no requiere la ejecucin de ms de una aplicacin a la vez, de modo que el contador de programa del microcontrolador a usar sigue su curso normal y es interrumpido slo cuando es necesario usar alguna interrupcin que sea vital para el proceso, como la interrupcin serial o el timer. Sin embargo; si es preciso que el programa a desarrollar realice ms de una tarea a la vez, es necesario ahondar en el concepto de programacin multitarea. Por otro lado, ciertas aplicaciones necesitan de procesos cuyo tiempo de muestreo sea fijo y no sea afectado por algn otro proceso de menor prioridad. Entonces, a continuacin se proporcionarn los conceptos y direcciones necesarias y suficientes para que el lector sea capaz de implementar en su microcontrolador tantos procesos como sea posible y pueda, a travs de una interfaz, enviar comandos que ejecuten las tareas pre-programadas con la ventaja de poder ejecutar al mismo tiempo tantas tareas como sea necesario.

Alcances PreviosPlanificacin de la ejecucin de las tareas (Round-Robin)Teniendo la idea clara de que el objetivo es ejecutar varios procesos a la vez, se debe implementar una lgica que posibilite esto, ya que es imposible que el microcontrolador de por s pueda ejecutar ms de un proceso al mismo tiempo. En ese sentido se usar el algoritmo de Round.-Robin para la ejecucin deseada. Round-Robin es un mtodo til para seleccionar todos los elementos en un grupo de manera equitativa y en un orden racional, normalmente comenzando por el primer elemento de la lista hasta llegar al ltimo y empezando de nuevo desde el primer elemento.Llevando este concepto al problema en cuestin, imagine que tiene que ejecutar dos procesos simultneamente. El orden de ejecucin es el que se muestra en la Figura 1. Primero, se ejecuta el Sistema Operativo, que es parte del programa que no pertenece a ningn proceso especfico y se encarga de configurar la ejecucin o no ejecucin del resto de procesos. Segundo se procede a ejecutar el Proceso 1 durante un tiempo pequeo, llamado quantum; una vez finalizado dicho tiempo se guardar la posicin en la que se encontraba el contador de programa antes de ser interrumpido por la interrupcin del quatum, luego se llamar nuevamente al sistema operativo. Tercero se ejecuta el Proceso 2 durante un quatum hasta que es interrumpido nuevamente. Posteriormente se ejecutar nuevamente el Proceso 1 retomando la posicin en la que se haba quedado la primera vez que se ejecut. Y as sucesivamente.

S.O.P1S.O.P2S.O.P1S.O.P2

1quantum1quantum1quantum1quantum

Figura 1Como se puede apreciar, no se trata de una multitarea del todo simultnea, se trata de ejecutar las tareas sucesivamente turnadas por un tiempo o quantum. Mientras ms pequeo sea el quantum en cuestin, ms simultnea parecer la ejecucin; y mientras ms procesos se ejecuten a la vez, menor ser la velocidad con que se ejecute cada proceso y ms lento ser el sistema.Bloque de Control de Proceso( PCB)El Bloque de control del proceso es un registro especial donde el sistema operativo agrupa toda la informacin que necesita conocer respecto a un proceso particular. Cada vez que se crea un proceso el sistema operativo crea el BCP correspondiente para que sirva como descripcin en tiempo de ejecucin durante toda la vida del proceso.

Cuando el proceso termina, su BCP es borrado y el registro puede ser utilizado para otros procesos. Un proceso resulta conocido para el sistema operativo y por tanto elegible para competir por los recursos del sistema slo cuando existe un PCB activo asociado a l. El bloque de control de proceso es una estructura de datos con campos para registrar los diferentes aspectos de la ejecucin del proceso y de la utilizacin de recursos. La informacin almacenada en un BCP incluye tpicamente algunos o todos los campos siguientes: Identificador del proceso. Estado del proceso. Por ej. listo, en espera, bloqueado. Contador de Programa: Direccin de la prxima instruccin a ejecutar. Valores de registro de CPU. Se utilizan tambin en el cambio de contexto. Espacio de direcciones de memoria. Prioridad en caso de utilizarse dicho algoritmo para planificacin de CPU. Lista de recursos asignados (incluyendo descriptores de archivos y sockets abiertos). Estadsticas del proceso. Datos del propietario (owner). Permisos asignados. Eleccin del MicrocontroladorDiseo de Sistemas en Tiempo Real MT325El microcontrolador ms comnmente para estos propsitos es el Pic, de modo que se tiene ahora que decidir qu tipo de gama se va a elegir. El principal criterio para elegir entre un Pic de gama media y uno de gama alta es la capacidad que ste tenga para leer los registros del Stack.Cuando el Contador de Programa (PC) hace un salto debido a una instruccin call, la posicin desde la que se salt se guarda en el Stack con el propsito de que ste valor sea devuelto al PC slo cuando se use una funcin del tipo return. En este caso, con el fin de implementar el algoritmo de la seccin II.A, el objetivo ser guardar la posicin del PC antes de que salte a atender la interrupcin -que sucede cuando termina un quantum- en una variable determinada. Esto es posible slo en los Pic de gama de alta a travs de los registros TOSH, TOSL y TOSU (ver Figura 2). En conclusin, se elegir un Pic de gama alta y especficamente el 18f4550.

Calendario de ProcesosDiseo de Sistemas en Tiempo Real MT325Para el caso de aplicacin de procesos cuya ejecucin sea peridica y necesite ejecutarse siempre cada cierto tiempo (tiempo de muestreo) y cuya duracin de proceso sea pequea, debe incluirse el concepto de Sistemas Calendarizados. Un calendario es entonces un vector que contiene la informacin del ordenamiento de los procesos a ejecutarse.La organizacin de procesos segn el tiempo de muestreo se har en funcin al nmero de quantums que ste necesite. Por ejemplo, si un proceso debe ejecutarse cada 50ms y la duracin escogida de un quantum es de 5ms, significa que el tiempo de duracin de dicho proceso equivale a 10 quantums.Finalmente, de acuerdo al tiempo de duracin (tambin en quantums) de cada proceso y su tiempo de muestreo, debe ejecutarse un algoritmo que encuentre el mejor ordenamiento del grupo, de manera que se obtenga un vector como el mostrado en el siguiente ejemplo:

112000112000

Donde los nmeros 1 y 2 representan al proceso 1 y 2 respectivamente, y el nmero 0 indica que el sistema est en espera de algn nuevo proceso. Cada cuadro equivale a una duracin de un quantum.Programacin del MicrocontroladorLa lgica del programa seguir el planeamiento de Round-Robin, de modo que se buscar la forma de implementar dicha lgica a travs del lenguaje C++ en el compilador Pic C. El programa a desarrollar constar de cuatro partes bsicas: PCB Sistema Operativo, Interrupcin de la Comunicacin Serial, Interrupcin del Quantum y Procesos. A continuacin se

Figura 2analizarn cada una de ellas y se dar atencin a los subcdigos relacionados:PCBDebido a que usarn mltiples procesos, se crear una estructura que defina las variables necesarias que distingan a un proceso de otro al momento de la ejecucin (ver Seccin II.2). Dichas variables son: Id: Es el identificador del proceso. Dir_inicio: Contiene la direccin de inicio del proceso. Dir_corriente: Guarda la posicin en la que se encontraba el proceso antes de su ltima interrupcin. Estado_proceso: Define si el proceso est cargado, est en ejecucin o en espera. (1,2 y 0). Acc: El valor del registro acumulador antes de la ltima interrupcin. Quantum: Enumera las veces que se ha interrumpido el proceso. Sirve para saber cul es el tiempo de ejecucin.

La Figura 3 ilustra la programacin de la estructura PCB:

Figura 3Interrupcin de la Comunicacin SerialLa funcin del Pic mientras no est ejecutando ninguna tarea es esperar hasta que se reciba algn comando de inicio.

Los elementos recibidos desde la consola sern de cuatro tipos: Comandos, Direcciones, Longitud de Calendario y Calendario. Los comandos sern de 1byte y sern guardados en la variable char recib, las direcciones sern de 2 bytes, la longitud de calendario de 1byte y el Calendario es un vector cuya longitud depende de la Longitud de Calendario. Debido a que el Pic slo puede recibir 1 byte por vez a travs de la comunicacin serial, la direccin a mandar se dividir en dos partes (los 8 bits ms altos y los 8 ms bajos) y cada una se guardar en un vector.

Cuando el programa reciba algn dato ste se guardar en la variable recib. Si la variable condicional recdir es igual a 0 significa que lo recibido es un comando, as que no se hace ninguna otra modificacin. En cambio, si la variable recdir es igual a 1, lo siguiente a recibir es una direccin, en ese caso, primero se recibir los 8 bits ms altos (guardados en dir[0]) y luego -en la siguiente interrupcin- se recibirn los 8 ms bajos (guardados en dir[1]). Con ambos bytes recibidos se hace el clculo del valor de la direccin deseada como se ve en la Figura 4, acto seguido se reestablece el valor de la variable recdir a 0. Por ltimo, si la la variable recdir es igual a 2 se est por recibir el calendario. Para recibir el calendario primero se pone la variable booleana cal a false para recibir la longitud de cola. El siguiente dato que llegue formar parte del vector calendario, para ello se la variable cal a true. As, todos los datos que lleguen se irn guardando en el vector calendario hasta que su longitud sea igual al valor de la variable longcola.

Figura 4Sistema OperativoEs el ncleo del programa, es en este lugar en el que el Pic ordena que se ejecute o no un determinado proceso dependiendo de cul sea el comando que se ha recibido (ver Figura 6.b). Los comandos recibidos pueden tomar los siguientes valores:0: No hace nada.1: Cargar proceso.2: Descargar proceso.3: Ver acumulador.4: Leer entrada analgica AN0.5: Leer entrada analgica AN1.6: Ver versin.7: Cargar calendario8: Ejecutar calendario9: Detener calendario

Al momento de entrar al Sistema Operativo (SO) se deshabilitan las interrupciones del quantum (del timer) y se enva una instruccin a la consola -printf("O")- avisando de que el sistema est listo para recibir un comando, de tal modo que el programa no avanzar hasta que se reciba algn comando (ver Figura 5.a). Si el usuario no ha seleccionado ningn comando para enviar, la consola por defecto mandar el comando 0.

Subcdigo de los ComandosEn la seccin anterior se enumer cules son los comandos a usar para este programa, ahora se hablar de la programacin especfica que tiene lugar en cada case:4.1. Comando CargarEste comando (1) se manda intrnsecamente cada vez que el usuario decide iniciar algn proceso desde la consola. Una vez que el Pic haya recibido el comando 1 deber iniciar un proceso, para ello debe conocer la direccin del proceso que va a iniciar as que pone la variable recdir a 1

Figura 5.a.

Figura 5.b.(ver Seccin III.1) y enva una notificacin a la consola -printf("D")- para que sepa que est listo para recibir la direccin. El programa no avanzar mientras no se haya recibido la direccin (ver Figura 6).Una vez que sepa a dnde direccionar el proceso, deber cargarlo en algn miembro de la estructura PCB proceso- disponible. Para ello se evaluar la cola*, de tal manera que si algn lugar de la misma es igual a 0 significa que est disponible. Una vez que se encuentre un lugar disponible para cargar el proceso, se asignan los valores de las variables pertinentes (dir_inicio, estado_proceso=1). 4.2. Comando DescargarCuando un proceso est en ejecucin, desde la consola cabe la posibilidad de descargarlo seleccionando el proceso en cuestin y presionando un botn. ste botn mandar hacia el Pic el comando 2 y luego la direccin del proceso que se quiera descargar. El programa realizar un algoritmo de bsqueda entre los procesos cargados hasta que encuentre una coincidencia entre la direccin enviada y las direcciones guardadas. Cuando la bsqueda sea exitosa eliminar a dicho elemento de la cola de procesos y la reordenar (Figura 7).

*La cola es un registro de diez elementos en el que se establece el orden de ejecucin de los procesos.Figura 6

Figura 74.2. Otros Comandos Algunos botones de la interfaz usada permiten realizar acciones simples que no requieren la estructura de un proceso, como devolver el valor del acumulador o leer un valor analgico. Sin embargo, qu pasa si se desea ejecutar uno de estos comandos mientras un proceso est en ejecucin? La solucin es retener la ejecucin del programa (se deja al proceso en stand-by) mientras se termine de ejecutar el comando. Por ejemplo, apenas se atiende al comando 3 (Figura 9) el Pic enva una notificacin a la consola de que ha recibido dicho comando. Cuando la consola reciba dicha notificacin preparar una nueva ventana para mostrar el valor del acumulador (W). Cuando dicha ventana est lista enviar nuevamente una notificacin (enva un w) al pic para que mande el valor esperado. Finalmente el Pic enva el valor del W y luego de un tiempo enva la instruccin F para que la consola se cierre. Una vez que el programa salga del subcdigo mediante la instruccin break, el proceso que se estaba ejecutando seguir hacindolo desde donde se qued.

Figura 84.1. Recepcin del Calendario Al igual que con el comando cargar, cuando se recibe el comando 7 se reenva a la consola una c -printf("c") para notificar que se encuentra en espera de la recepcin del calendario. Entonces, primero se recibir la longitud del calendario y luego el calendario (ver Seccin III.2).Una vez que se ha recibido el calendario, ste debe ser revisado por un algoritmo que eliminar las repeticiones (ver Figura 9) para evitar que pasado cada quantum el proceso se reinicie.112220112220

Figura 9a Calendario original

102000102000

Figura 9b Calendario Modificado

Figura 10Subcdigo de EjecucinLuego de salir del switch, el programa debe direccionar el PC a la direccin del primer proceso de la cola (cola[0]) si es que se ha cargado algn proceso y si no, devolver el PC al inicio del SO a la espera de un nuevo comando (ver Figura 11).

Si un proceso se ha cargado y quiere ejecutarse por primera vez (estado_proceso=1), se direccionar el programa a la direccin inicial de dicho proceso y se modificar el valor de su variable estado_proceso a 2.

Si dicho proceso ya ha sido ejecutado con anterioridad, significa que sufri la interrupcin del timer, la cual redireccion el PC nuevamente al SO. Ahora, para que el proceso contine desde la posicin en que se qued el PC, se tendr que dirigir a la posicin indicada por su variable dir_corriente.

Si no se ha cargado ningn proceso el programa regresa al inicio del SO, en este caso indicado por la bandera BANDERA (ver Figura 5.a.)

Interrupcin del Quantum (Timer)Este cdigo es la base de la programacin multitarea, ya que es el encargado de turnar los procesos cada cierto tiempo.

Figura 11La interrupcin elegida para esta aplicacin fue la del Timer1 (T1). El primer paso al atender la interrupcin es guardar el valor del acumulador en la variable acc. Adems se debe aumentar el valor de la variable quantum (que sirve para calcular cunto tiempo se ha estado ejecutando un proceso). El paso ms complicado es actualizar el valor de la variable dir_corriente, para ello se debe leer el Stack a travs de los registros TOSL, TOSH y TOSU (ver Figura 2). Una vez actualizadas las variables necesarias, se cambia el orden de la cola, mandando el primer elemento de la cola al final de la misma y adelantando una posicin a todos los procesos siguientes, de modo que cola[0] ahora contendr el id siguiente proceso.Finalmente, para salir de la interrupcin debe variarse el valor de los registros TOS para evitar que el PC regres a la posicin desde donde salt. En ese sentido, si la direccin del SO es 0x2802, TOSL ser igual a 0x02; TOSH, a 0x28 y TOSU, a 0x00.

Figura 12

Programacin de la InterfazLa interfaz ser desarrollada en lenguaje C# a travs del software Visual Studio 2010. Se trata de programar una aplicacin de interaccin con el usuario en la que a travs de botones se decida si ejecutar procesos o comandos y al mismo tiempo visualizar qu procesos estn en ejecucin, teniendo la posibilidad de seleccionar alguno de la lista y descargarlo del microcontrolador. En este apartado se discutir principalmente la programacin vinculada con el envo de comandos simples, de procesos, descarga y adems se dar especial atencin a la creacin de elementos visuales a travs de documentos de texto:Creacin de Botones desde un TxtCon el fin de realizar una programacin ms compleja, emulando la de un sistema real, se crear un fichero con los datos necesarios para la creacin de los botones -como nombre del botn, texto a insertar en el botn, imagen, direccin del proceso involucrado, etc. Los datos correspondientes a cada botn estarn separados por un puntero, en este caso de nombre Comando. De forma que el texto de dicho fichero quede como:

Comando1Probar B04098D:\(Direccin de Imagen 1)Comando2Probar B15378D:\(Direccin de Imagen 2)

La utilidad de esta tcnica es que con slo aumentar unas cuantas lneas a este documento de texto se crearn los botones correspondientes automticamente.

En Visual, la programacin consiste en leer cada lnea del documento de texto con el comando ReadLine() a travs de la clase StreamReader tal que se la lea como cadena. En conclusin, la creacin de botones a travs de la lectura de lneas (con la cadena Comando como separador) queda como se muestra en la Figura 12. Se crear un fichero para la creacin de botones de los procesos y otro para los botones de los comandos simples (ya que estos no mandan ninguna direccin de proceso).

Figura 13Cargar procesoCuando se de click a un botn de procesos ste debe enviar el comando 1 pero no instantneamente, sino cuando el Pic se lo pida. Entonces, el evento click del botn presionado actualizar el valor de la variable ve con un 1 y la variable direccin (int32) con el valor de la direccin del proceso. Como la direccin es de 2 bytes se separan los 8 bits ms altos de los bajos en dos variables separadas (dataTx[1] y dataTx[2]).direccion = Convert.ToUInt32(dir[0]);ve = "1"; dataTX[1] = (byte)(direccion >> 8 & 0xff);dataTX[2] = (byte)(direccion & 0xff);

Slo cuando el Pic enve la instruccin O indicando que ya est listo para recibir un comando (ver Figura 6.a), la consola enviar el ltimo valor ve cargado (si no se presiona ningn botn ve=0) y luego reestablece el valor de ve a su valor anterior (0). Y slo cuando el Pic enve la instruccin D, la consola enviar los dos elementos del vector dataTx para que el Pic los combine nuevamente, como sigue:

else if (RxString1 == "D"){ seriaPortW.Write(dataTX, 1, 1); seriaPortW.Write(dataTX, 2, 1); direccion = 0; dataTX[1] = (byte)(0x00); dataTX[2] = (byte)(0x00); }

Cargar comandoEs el mismo principio de la seccin anterior. Es decir, cuando se presiona algn botn de los comandos, la variable ve se actualiza con el valor del comando correspondiente a dicho botn (ya no 1) y cuando el Pic pida por algn comando disponible, se mandar el ltimo valor cargado de ve.

El problema aparece, como se coment en la seccin III.4.2. , al tratar de ejecutar un comando mientras un proceso se ha iniciado. Se resolvi el problema por la parte del Pic en la Figura 8, pero el problema ac es distinto ya que (tomando el mismo ejemplo de la Figura 8) al recibir la instruccin w del Pic la interfaz deber abrir una nueva ventana en la que la comunicacin serial est habilitada. Esto puede resultar imposible si es que se no se utiliza una clase pblica que involucre la definicin del puerto serial usado. En la Figura 14 se ilustra cmo se puede crear una clase de este tipo definiendo una clase de este tipo, desde la cual se pueden habilitar todas las propiedades del puerto serial (con la posibilidad de modificarlas en algn punto distinto del programa) desde la funcin Value.

Finalmente, todo aquel formulario que quiera hacer uso del puerto serial deber crear un nuevo elemento de la clase creada:SerialPort seriaPortW = MySerialPortHolder.Value;

Esto soluciona definitivamente el problema de que dos o ms formularios no puedan usar el mismo puerto serial al mismo tiempo.

Descargar comandoLa dinmica de este procedimiento es seleccionar alguno de los tems del ListBox que contiene la informacin de los procesos en ejecucin y luego presionar el botn de descarga.

Cada tem contiene los datos de direccin, nombre del proceso e identificador, separados por un -. La instruccin Split permitir separar toda la cadena que aparece en el tem y guardar cada elemento en un vector. Slo ser de inters el primero, el que contiene la direccin (arr[0]) segn lo que se vi en la seccin III.4.2. Finalmente, una vez que se cargaron los valores de ve(=2) y de direccin, estos se enviarn cuando el Pic lo requiera de la misma manera como cuando se carga un proceso (ver Seccin IV.2).

CalendarizacinEl algoritmo de calendarizacin tiene como objetivo ordenar los procesos segn su tiempo de muestreo y crear el vector de calendario de modo que no exista ningn cruce entre los mismos. Para ello son tres los pasos a seguir: Ordenar los procesos segn su tiempo de muestreo, calcular el mnimo Figura 14 Figura 15

comn mltiplo de los tiempos de muestreo y ejecutar el algoritmo de calendarizacin.Figura 16

El nmero de procesos a calendarizar es variable, pero a cada proceso se le asignarn tres variables que los identificarn: Id, tiempo de duracin y tiempo de muestreo. Entonces, se crea una estructura que contenga estos atributos. public struct PCB { public int duracion; public int tiemuest; public int id; } public PCB[] procesos = new PCB[Escritorio.numb];

donde Escritorio.numb representa al nmero de procesos escogido por el usuario.La funcin INICIALIZAINDICES de la Figura 16 permite que el conteo de los procesos empiece no por 0 sino por 1. La funcin MINIMADURACION calcula el mayor tiempo de duracin de los procesos ingresados. Por otro lado la funcin ORDENAMENORAMAYOR reordena todos los procesos segn su tiempo de muestreo con el algoritmo mostrado en la Figura 17:

Figura 17

Luego, la funcin MINIMOCOMUNMUESTREO calcula el mnimo comn mltiplo de los tiempos de muestreo de modo que:

Figura 18Siendo MCM una funcin que devuelve el valor del mnimo comn mltiplo de dos nmeros segn el algoritmo de Euclides.Finalmente la funcin CALENDARIZA ordena los ids de los procesos cargados en un vector llamado COLA. Comenzando por el proceso con menor tiempo de muestreo, lo coloca en la cola en tantas posiciones como lo indique su tiempo de duracin; para el proceso siguiente se repetir esta accin empezando por la posicin siguiente a donde se qued el proceso anterior. Esto se repite hasta cumplir el nmero de veces que debe repetirse cada proceso dentro la longitud requerida (en el ejemplo aparecern en total 2*mcm nmeros).

Figura 17Una vez calculado el calendario ptimo, cuando se presiona el botn Enva cola se crea un nuevo vector llamado colaenviada de modo que el primer elemento de esta cola es la longitud del calendario (mcm) y los elementos posteriores son el calendario en s. Una vez que el pic entre al bucle principal y reciba el comando 7 responder con una c confirmando que est a la espera de la cola y la consola enviar byte a byte los elementos de la cola hasta que se hayan cubierto todos sus elementos. Figura 18

ResultadosMediante el algoritmo de creacin de elementos visuales (ver Seccin IV.1) a travs de la importacin de documentos de texto (ficheros) se consigue un entorno visual como el mostrado en la Figura 19.

Figura 19El espacio gris de la parte inferior est destinado a albergar al formulario MDI que emerge cuando se ejecuta alguno de los comandos. En la Figura 20 se muestra uno de esos casos.

Figura 20La barra de tareas inferior es la determina el funcionamiento de la calendarizacin. En ella se puede escoger el nmero deseado de procesos a calendarizar; luego de escoger el nmero de procesos se da click al botn Cargar para asignar los atributos.

Figura 21Luego se comprueba la validez del algoritmo de calendarizacin.EJEMPLO 1:

Figura 22Se obtiene el calendario: 1223312200

EJEMPLO 2:

Figura 23Se obtiene el calendario: 333112333000333110333002333110333000

Adems se puede observar los segundos transcurridos de alguno de los procesos multitarea ejecutados:

Figura 24

Conclusiones y Recomendaciones Se comprueba que un sistema multitarea es realizable pero muy delicado al mismo tiempo debido a que necesita, en primer lugar, operar con tiempos de interrupcin muy rpidos que a veces pueden causar problemas en el envo y recepcin de tramas de datos; y segundo, procesos relativamente simples. Por otro lado, con tiempos de interrupcin muy altos el sistema ser muy lento y si se ejecutan muchos procesos a la vez puede que no se ejecuten como debe ser.

Respecto a la simplicidad de los procesos, cabe sealar que es altamente recomendable no usar funciones que involucren saltos del PC. Por ejemplo, la funcin delay_ms() requiere un salto hacia donde est definida dicha funcin. Si una interrupcin de quantum sucede al momento de ese salto, ser difcil que luego el proceso se reanude donde se qued.

El tratar de evitar funciones de C es recomendable no slo para la programacin de los procesos, sino para el cdigo en general, a fin de asegurar que el recorrido del PC sea tal cual se ha pensado (segn el algoritmo Round-Robin). Por ejemplo, durante la realizacin del presente proyecto se verific que el rendimiento mejoraba significativamente si se evitaba usar las funciones enable_interrupt(INT_TIMER1) y en su lugar se llamaba directamente los registros involucrados (PIR1 y PIE1).