Sie sind auf Seite 1von 11

Sistema Operativo con Calendarizacin y Multitarea en un

Microcontrolador Programado en C++ y una Interfaz


Programada en C#
Giorgio Luigi Morales Luna
Especialidad de Ingeniera Mecatrnica
Facultad de Ingeniera Mecnica
Universidad Nacional de Ingeniera
Lima, 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.
I. INTRODUCCIN
La 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.

II. ALCANCES PREVIOS
1. Planificacin 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. P1
S.
O.
P2 S.O. P1
S.
O.
P2


Figura 1
Como 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.
2. 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
1quantum 1quantum 1quantum 1quantum
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.

3. Eleccin del Microcontrolador
El 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.

4. Calendario de Procesos
Para 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:

1 1 2 0 0 0 1 1 2 0 0 0

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.
III. PROGRAMACIN DEL MICROCONTROLADOR
La 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 2
analizarn cada una de ellas y se dar atencin a los subcdigos
relacionados:
1. PCB
Debido 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.
Diseo de Sistemas en Tiempo Real MT325 Diseo de Sistemas en Tiempo Real MT325
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 3
2. Interrupcin de la Comunicacin Serial
La 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 4
3. Sistema Operativo
Es 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 calendario
8: Ejecutar calendario
9: 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.

4. Subcdigo de los Comandos
En 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 Cargar
Este 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 Descargar
Cuando 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).

Figura 6

Figura 7
4.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
*La cola es un registro de diez elementos en el que se establece el orden de
ejecucin de los procesos.
mediante la instruccin break, el proceso que se estaba
ejecutando seguir hacindolo desde donde se qued.

Figura 8
4.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.
1 1 2 2 2 0 1 1 2 2 2 0
Figura 9a Calendario original

1 0 2 0 0 0 1 0 2 0 0 0
Figura 9b Calendario Modificado


Figura 10
5. Subcdigo de Ejecucin
Luego 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.)

6. 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 11
La 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

IV. PROGRAMACIN DE LA INTERFAZ
La 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:
1. Creacin de Botones desde un Txt
Con 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:

Comando
1
Probar B0
4098
D:\(Direccin de Imagen 1)
Comando
2
Probar B1
5378
D:\(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 13
2. Cargar proceso
Cuando 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);
}

3. Cargar comando
Es 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.

4. Descargar comando
La 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).

5. Calendarizacin
El 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 18
Siendo 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 17
Una 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

V. RESULTADOS
Mediante 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 19
El 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 20
La 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 21
Luego se comprueba la validez del algoritmo de calendarizacin.
EJEMPLO 1:

Figura 22
Se obtiene el calendario: 1223312200

EJEMPLO 2:

Figura 23
Se obtiene el calendario: 333112333000333110333002333110333000

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


Figura 24
VI. 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).