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).