You are on page 1of 63

ARQUITECTURA DE COMPUTADORAS

Docentes:
Prof. Oscar Montes
Prof. Obadiah Oghoerore Alegbe
Prof. Roberto Garca
Tema:
Apuntes de la asignatura
Ao:
2011

Procesos
En el modelo de procesos todo software ejecutable de la computadora, inclusive el sistema operativo, se organiza en varios procesos secuenciales que de aqu en adelante llamaremos PROCESOS. Un proceso es en general parte de un programa con determinadas caractersticas: incluye el
estado propio del proceso, adems del estado del registro de la CPU y tiene la intencin de ser
ejecutado por el SO (est cargado en RAM). Las antiguas CPUs slo podan ejecutar un proceso
a la vez, pero como lo ejecutaban muy rpidamente, el operador poda tener la sensacin de que
haba muchos procesos ejecutndose a la vez. En este momento existen CPUs capaces de ejecutar
dos, tres y hasta cuatro procesos juntos, dependiendo de su estructura interna.
La diferencia entre un proceso y un programa es sutil pero crucial. Podramos utilizar la siguiente
analoga para aclarar este punto. Consideremos un cientfico de la computacin con una mente
culinaria, que est cocinando el pastel de cumpleaos de su hija. l tiene una receta para un pastel
de cumpleaos y una cocina bien abastecida con los ingredientes necesarios. En esta analoga la
receta es el programa (un algoritmo expresado en cierta notacin adecuada), el cientfico es el
procesador (CPU) y los ingredientes necesarios para el pastel son los datos de entrada. El proceso
es la actividad en la que el cocinero lee la receta, busca los ingredientes, y cocina el pastel (listo,
bloqueado, en ejecucin).
Imaginemos ahora que un hijo del cientfico entra corriendo, llorando y diciendo que lo pic una
abeja. El cientfico registra el punto de la receta donde se qued (el estado del proceso activo se
resguarda, se memoriza), busca un libro de primeros auxilios, comienza a leer las instrucciones
de ste y busca los elementos en el botiqun. El cientfico atiende la picadura de su hijo y luego
de que ste se calma, regresa al punto de elaboracin del pastel.
El proceso entonces se puede entender como una actividad especial de cierto tipo, en donde hay
un programa, entradas y salidas de datos y tiene un estado determinado.
Estados de un proceso
Aunque cada proceso se debe considerar como una entidad independiente (contador de programa,
estado interno, uso de memoria, etc.) es frecuente que los procesos deban interactuar unos con
otros. Un proceso podra generar cierta salida que fuera la entrada necesaria para otro proceso.
Desde este modelo, se utilizan tres estados fundamentales:
a) Listo: el programa (o parte de l) se carga en la memoria de trabajo (RAM). La caracterstica de estar cargado en RAM, es decir, la intencin cierta del SO de ejecutar esas instrucciones, convierten al programa en un proceso.
b) Ejecucin: en este estado la CPU tiene el control de las operaciones de ese proceso y las
va cumpliendo en un orden determinado. Este estado es propio del ncleo de la CPU, y
cada uno de ellos (si es que tuviera varios) puede tener a un proceso en este estado en un
tiempo muy breve que tomaremos como menor al tiempo de instruccin.

c) Bloqueado: cuando el proceso requiere de datos que se deban buscar en perifricos de entrada lentos (cuyo acceso involucre una cantidad razonablemente grande de tiempos de
instruccin) el SO pone al proceso en este estado de espera y conmuta a la CPU a otro
proceso.
Planificacin de procesos
Cuando hay ms de un proceso ejecutable, el SO debe decidir el orden de ejecucin. Esta parte
del SO se denomina PLANIFICADOR, y la lgica para esas decisiones estn implcitas en el
algoritmo de planificacin.
En los tiempos pasados, los sistemas de procesamiento eran por lotes (batch), porque eran grupos
o lotes de tarjetas perforadas que se deban procesar desde el comienzo hasta el fin. Cuando se
pens en multiprocesamiento, el planificador ya no era un operador, sino que deba ser algo que
tomara decisiones ms rpidamente. El planificador debe poder atender a ciertas caractersticas
para su operacin:
a) Equidad: garantizar que cada proceso obtiene un tiempo de CPU.
b) Eficacia: mantener a la CPU ocupada el 100 % del tiempo.
c) Tiempo de respuesta: minimizar el plazo de ejecucin entre varios procesos.
d) Tiempo de regreso: minimizar el tiempo que deben esperar otros procesos para entrar en
ejecucin.
e) Rendimiento: maximizar el nmero de tareas procesadas en la unidad de tiempo.
Un poco de reflexin muestra que algunas de estas condiciones se excluyen mutuamente. Se puede demostrar (Kleinrock 1975) que cualquier algoritmo de planificacin que favorezca algn tipo
de tarea afecta a otra. Por ejemplo: para darle ms tiempo de CPU a un usuario (proceso), hay
que darle menos a otro, ya que el tiempo de CPU es finito.
Una primera aproximacin a un algoritmo de planificacin ser la eleccin entre dos modos de
asignacin de la CPU: El modo apropiativo y el modo no apropiativo, vistos desde el SO, es
decir: si el SO va a poder conmutar la CPU en cualquier instante de la ejecucin de un proceso
(apropiativa) o el proceso se va a ejecutar de principio a fin sin ceder el uso de la CPU (no apropiativa).
Algunos de los tipos ms comunes de planificacin son:
a) FCFS: (First Come First Served) es una cola de espera tradicional en la que los procesos
se van ejecutando en el orden de llegada. Esta cola se puede considerar aleatoria (al azar)
y por lo tanto no implica planificacin alguna. Es en general el peor algoritmo de planificacin para cualquier recurso, aunque tambin el ms fcil de implementar.
b) Round Robin: este mtodo es apropiativo y bsicamente es el otorgamiento de la CPU
durante tiempos definidos denominados Quantum.
c) Por Prioridades: la hiptesis implcita en la planificacin anterior es que todos los procesos tienen igual importancia. Esto no es cierto en la realidad, ya que el proceso de actualizacin del reloj no puede esperar. Un defecto propio de la ejecucin por prioridades es
que procesos de muy baja prioridad lleguen a no ejecutarse jams; este jams es literal, ya
3

que en una universidad de EEUU se encontr por casualidad un proceso que llevaba meses esperando la ejecucin. Esta deficiencia de este tipo de planificaciones se soluciona
habitualmente incorporando la variable tiempo de espera haciendo que la prioridad del
proceso se incremente automticamente con el transcurso del tiempo.
d) Colas Mltiples: trata de solucionar algunos problemas de la planificacin por prioridades, teniendo en cuenta una caracterstica de los procesos que lleva a considerar el tiempo
necesario de ejecucin dado por el uso de la CPU en operaciones matemticas o la preponderancia del trabajo con datos externos. Estas clasificaciones se conocen con el nombre de limitado por CPU y limitado por E/S.
e) SJF (Shortest Job First): esta planificacin tiende a mejorar el tiempo de respuesta, poniendo en ejecucin primero los trabajos ms cortos y luego los ms largos; el tiempo de
regreso tambin se acorta, aunque el tiempo total es el mismo. Una desventaja importante
de este tipo de planificaciones es que el SO debera conocer con anticipacin cunto
tiempo de CPU requiere cada proceso, y el sistema no cuenta con capacidad de adivinacin.
Interrupciones

En la analoga del cientfico computador pastelero, se hizo referencia a un cambio de procesos. Si


usamos una planificacin del tipo de prioridades, que se considera apropiativa, el SO dependiendo de los procesos, deber conmutar a la CPU en el instante en que un proceso de mayor prioridad necesite ejecutarse. En la figura de arriba, el servicio del disco es un proceso que tiene prioridad sobre el servicio de comunicaciones, ste es ms prioritario que el servicio de impresora, y
ste es ms prioritario que el programa en ejecucin.

En una interrupcin se debe guardar el estado de la CPU (los registros ms importantes) y luego
comenzar la ejecucin del proceso siguiente.
El Bloque de control del proceso o en ingls PCB (Process Control Block) 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 PCB correspondiente
para que sirva como descripcin en tiempo de ejecucin durante toda la vida del proceso.
Cuando el proceso termina, su PCB 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 PCB incluye
tpicamente algunos o todos los campos siguientes:

Identificador del proceso (Process Identificator -PID-, de sus siglas en Ingls).

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 (registro base, registro lmite). (Ver Paginacin)

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 (tiempos de ejecucin histricos, limitacin de la CPU).

Datos del propietario (owner), habitualmente denominado padre/hijos.

Permisos asignados.

Comunicacin entre perifricos


Habitualmente se suelen denominar perifricos a elementos agregados fuera del gabinete de la
computadora, en nuestro caso nos centraremos en la CPU y usaremos ese vocablo para denominar elementos que se comunican con la CPU.
En la arquitectura Harvard, existen lneas de comunicacin (buses) diferentes para los datos y el
programa, este tipo de arquitectura es el que usa el C PIC; en el caso habitual de las PCs se usa
la arquitectura Von Neumann, cuya caracterstica es que datos y programa estn ubicados en la
RAM y por lo tanto comparten el bus de datos.
En las PCs existen tres buses diferenciados por su utilidad: el ya mencionado de datos, el de direcciones y el de control. Los de datos y direcciones quedan definidos por su nombre, el de control son todas las lneas de comunicacin que no puedan ser definidas ni como datos ni como direcciones.

En la figura anterior se esquematiza el modelo de Harvard, siendo cada uno de los bloques un
perifrico y uno de ellos la CPU.
El bus de datos puede incluir entre 32 y cientos de lneas, cuyo nmero se conoce como anchura
del bus de datos. Puesto que cada lnea solo puede transportar un bit en cada instante, el nmero
de lneas determina cuntos bits se pueden transferir al mismo tiempo. La anchura del bus es un
factor clave a la hora de determinar las prestaciones del conjunto. Por ejemplo, si el bus de datos
tiene una anchura de 8 bits (1 byte) y las instrucciones son de 16 bits, entonces el procesador debe acceder al mdulo de memoria dos veces por cada ciclo de instruccin y si busca un dato numrico tipo doble precisin, deber acceder 4 veces.
Las lneas de direccin se utilizan para designar el emisor y el receptor de la comunicacin y/o la
ubicacin del dato o instruccin buscado (RAM). Claramente, la anchura del bus de direcciones
determina la mxima capacidad de memoria direccionable en forma directa del sistema. En algunos casos de esta estructura se posiciona el programa en la parte baja de la memoria y los datos
en la parte alta de la memoria, como la manera de hacer sencillo el cambio entre instrucciones y
datos, cambiando el bit ms significativo (MSB).
Las lneas de control se utilizan como procedimientos pre y post comunicacionales (Handshaking).
Las seales de control transmiten tanto rdenes como informacin entre los mdulos del sistema.
Entre las ms comunes estn las seales de: Memory Write; Memory Read; I/O Read; I/O Write;
diferentes seales tipo ACK (Aknowledge); Bus Request; Bus Grant; Interrupt Req; Interrupt
ACK; etc.
Temporizacin de los buses
Las comunicaciones se pueden clasificar en Sncronas o Sincrnicas y Asincrnicas. Las primeras estn relacionadas directamente a un reloj (clock). Las comunicaciones en los buses son sincrnicas, aunque la frecuencia del reloj que las rige es diferente del reloj que comanda la CPU.
En la actualidad se pueden encontrar buses de 400 MHz y 800 MHz, cuando el de la CPU est
cerca de los 2000 MHz (2 GHz).
La figura siguiente representa en forma simplificada un ciclo de lectura/escritura de la RAM.

En el grfico aparecen los datos del reloj, el bus de direcciones, el bus de control y el de datos.
Generalmente se utilizan los flancos de bajada de la seal para efectuar la operacin indicada por
el nombre de la seal en cuestin.
La comunicacin comienza en el bus de control con las lneas de estado y despus de un breve
lapso aparecen la direccin del perifrico (en un gran porcentaje de casos, las comunicaciones
involucran como emisor o receptor a la CPU). Los perifricos leen esta direccin en el flanco de
bajada de la seal validacin de direccin y tienen un tiempo para compararla con su propia
direccin. Esta comparacin resulta vlida slo para el perifrico que debe intercambiar con la
CPU, en este caso, suponemos que es la RAM. Lo que sigue es la activacin de la RAM en el
modo de lectura (desde el punto de vista de la CPU lectura implica requerir de la RAM un dato
especfico), a partir de all la RAM coloca el dato en el bus de datos lnea de datos y con el
flanco descendente de la seal de lectura, la RAM le avisa a la CPU que puede copiar ese dato a
sus registros. En la operacin de escritura es la CPU la que avisa a la RAM a travs de la seal
escritura que el dato que est en el bus es el que se debe guardar.
Las seales de control involucradas en esta comunicacin son las de: lneas de estado, validacin
de la direccin, lectura y escritura.
Una vez completado este ciclo que, segn la figura, ocupara tres ciclos del reloj (7,5 nseg), los
buses de datos y direcciones se debern ocupar de otras comunicaciones. Dado que el tiempo es
no-humano, un humano supondra que el bus lleva una cantidad de datos muy grande; este proceso se denomina multiplexin, en este caso, de tiempo.
Debido a la complejidad cada vez mayor del uso del bus de datos, se incorpor al sistema un
RBITRO DE BUS.

Esta figura representa el mtodo antiguo de arbitraje a travs de un terminador de bus, en donde
cada perifrico o bloque solicitaba el uso del bus a travs de un contacto elctrico. La ubicacin
fsica de los bloques determinaba su prioridad, lograda por el tipo de conexin, denominado
Daisy Chain.
En la actualidad, el rbitro del bus es un perifrico ms al que acceden cada uno de los bloques
solicitando el bus de datos con una lnea (control), para identificarse pueden utilizar una lnea
cada perifrico o el bus de direcciones. El rbitro compara esa direccin para otorgarle un nivel
de prioridad, y sta a su vez, indicar cundo puede usar el bus de datos para la comunicacin
(ver esquema de Modelo Harvard).
Como estudio de caso, daremos algunas caractersticas del bus tipo PCI (Peripheral Component
Interconnect), patentado inicialmente por la empresa Intel en 1990 para su procesador Pentium,
posteriormente la patente fue cedida por Intel al dominio pblico, lo que motiv a muchos fabricantes de hardware a incorporar esas especificaciones a sus componentes. Como resulta de aplicacin electrnica sencilla, y por lo tanto es barato, ha ganado popularidad rpidamente, suplantando a los anteriores (ISA, EISA, Local bus, etc.).
El Standard PCI es un bus de 64 bits de datos, con una frecuencia de reloj de 66 MHz y transferencias mltiples de datos (hasta 528 MB/seg o 4,224 Gb/seg.). Esto es decir que el rbitro (tambin centralizado) puede otorgar el bus a un perifrico para que ste transmita un tren de datos
seguidos, dependiendo del trfico de datos en cada instante. Este tipo de transferencia hace a la
eficiencia y rapidez de transmisin, caractersticas necesarias para adaptarse mejor a las frecuencias de la CPU.

A este bus se le pueden acoplar adaptadores para conectar perifricos ms lentos o ms rpidos
que las velocidades normalizadas.
El arbitraje es centralizado y sincrnico, utiliza un esquema maestro-esclavo (master-slave) y
prioridades para la cesin del bus. Cada dispositivo del bus PCI se conecta al rbitro a travs de
una lnea de peticin identificada con un nmero que por simplificacin supondremos relacionado al orden de prioridad de ese dispositivo; el rbitro contesta con una lnea tambin numerada
para que el dispositivo reconozca su posibilidad de uso del bus.

Ciclos de instruccin
Cuando hablamos de los procesos los relacionamos con un programa. Habitualmente estamos
acostumbrados a programar en lo que denominamos lenguajes de alto nivel (el nivel se corres-

ponde con el grado de abstraccin y, por lo tanto, el nivel ms alto es el del programador y el
nivel ms bajo la CPU); como esas instrucciones las debe entender la CPU lo que denominamos
compilador es el encargado de traducir las estructuras de alto nivel a niveles compatibles con la
CPU.
En los prrafos siguientes trataremos de conceptualizar cmo es una instruccin de bajo nivel
suponiendo una sentencia de asignacin del tipo
A=B+A
Esta sentencia debe entenderse como: tomar el contenido de la direccin B de memoria e ingresarlo a uno de los registros de la CPU; tomar el contenido de la direccin A, ubicarlo en otro registro de la CPU; sumar los valores de los datos obtenidos y, por ltimo, ubicar el resultado en la
direccin A (el dato previo de la direccin A se pierde).
El mtodo que vamos a ejemplificar supone un direccionamiento directo de la memoria RAM
(ms adelante veremos que hay otros modos de direccionamiento de la RAM).
Proponemos considerar que las primitivas del procesador usado son 16, lo cual implica cdigos
de operacin para la CPU de cuatro bits. En la actualidad se usa combinar en una instruccin los
cdigos de operacin y las direcciones de memoria. Para este esquema, si queremos direccionar
hasta 2.048 Bytes de RAM necesitaremos un formato de instruccin de 16 bits, como indica la
siguiente figura.

En la figura, los cdigos de operacin a usar se limitan a cargar la instruccin de bajo nivel al
registro acumulador desde la memoria; sumar a ese acumulador un dato desde la memoria y almacenar el resultado del acumulador en una posicin de memoria.
En la figura siguiente se esquematiza la operacin A=B+A simplificando el formato de instruccin a nmeros decimales y suponiendo que A=941 y B=940, siendo stas las direcciones que
contendrn los datos a sumar.
AC representa el registro Acumulador (o de trabajo para el PIC)
IR representa el registro del decodificador de instrucciones

10

Las posiciones de RAM estn identificadas por su direccin y el contenido (en este caso se respeta el orden bajo para el programa y el alto para datos).

En el caso particular del C PIC el formato de instrucciones es de 14 bits; 8 corresponden a las


direcciones y 6 a los cdigos de operacin.
Los pasos del esquema anterior involucran las siguientes operaciones:
Paso 1: el PC (Program Counter) tiene la direccin 300. En esa direccin existe la instruccin
compuesta de 1 (cargar AC desde la memoria) y 940, que es la direccin de memoria. Este dato
(1 940) se copia en el registro de instruccin y se decodifica: cdigo de operacin y direccin de
memoria.
Paso 2: se efecta un ciclo de lectura de la RAM a la posicicin 940 y se copia el dato de esa
direccin (valor 3) al acumulador.
Paso 3: el PC tiene la direccin 301. En esa direccin existe la instruccin compuesta de 5 941,
que se copia en el registro de instruccin y se decodifica: cdigo de operacin y direccin de
memoria (cdigo de operacin 5 es sumar al acumulador un dato de memoria)

11

Paso 4: ejecuta la suma entre el acumulador y el dato de la posicin de memoria 941.


Paso 5: el PC (Program Counter) tiene la direccin 302. En esa direccin existe la instruccin
compuesta de 2 (almacenar el acumulador en una posicin de memoria) y 941, que es la direccin
de memoria. Este dato (2 941) se copia en el registro de instruccin y se decodifica.
Paso 6: se ejecuta la instruccin 302, con lo cual se copia el contenido del acumulador a la posicin de memoria 941.
Modos de direccionamiento
Ya sea por las operaciones a realizar o para lograr direccionamientos ms amplios, existen varias
formas de que en una instruccin se haga referencia al dato de memoria. Algunos de esos modos
estn graficados a continuacin.

12

Direccionamiento Inmediato
Es la forma ms sencilla de direccionamiento porque en realidad no es un direccionamiento. En
la instruccin (codop+operando) el cdigo de operacin siempre indica la operacin matemtica
o lgica a realizar. En el resto del cdigo de la instruccin en este modo simplemente est el valor
para usar en la operacin, es decir, no hay acceso adicional a memoria para tener el valor.
Direccionamiento Directo

13

Los bits que en la instruccin anterior contenan el operando ahora contienen una direccin fsica
de la memoria donde reside el dato a utilizar. La limitacin de este direccionamiento est en la
cantidad de bits destinada a las direcciones.
Direccionamiento Indirecto
En este caso los bits contienen una direccin de memoria cuyo contenido es la direccin de memoria que contiene el dato. Con este esquema podramos usar, por ejemplo, 4 bits en el campo de
direcciones de la instruccin (16 posibilidades) y a travs de una tabla residente en RAM de 16
posiciones de 1 byte, accederamos en realidad a 256 posiciones por cada una de las entradas de
la tabla, en total, 16x256=4096 posiciones. Dependiendo del microprocesador esta tabla puede
estar dentro de alguna zona de memoria interna con lo cual se ahorrara uno de los accesos a memoria externa.
Direccionamiento con Desplazamiento
Dentro de estos los ms conocidos son el relativo y el indexado.
Relativo: Este direccionamiento requiere que las instrucciones tengan dos campos de direcciones; el valor contenido en uno de los campos es utilizado directamente y el otro campo de direcciones contiene habitualmente una referencia implcita. La direccin efectiva se consigue sumando la direccin explcita al contenido de la direccin implcita. Esto si bien es complicado de entender mediante texto, es fcilmente entendible si pensamos en una tabla de conversiones de doble entrada. La tabla estar ubicada en forma secuencial en memoria a partir de la direccin explcita de la instruccin. El desplazamiento a los otros renglones de la tabla se guarda en una posicin de memoria referenciada indirectamente. Variando el valor de esta ltima posicin de memoria, obtenemos el acceso a cada uno de los renglones de la tabla.
Indexado: En este caso la primera porcin de la direccin es tambin relativa, es decir, referencia a una posicin de la memoria externa.

Memoria
Cuando nos referimos a Memoria, estamos hablando, especficamente, de la RAM. Es uno de
los recursos ms importantes de una mquina, ya que interviene en una relacin muy estrecha con
el microprocesador. En forma bsica podemos pensar la memoria fsica como un estante con muchos cajones y dentro de cada cajn lo que llamamos un dato; cada cajn se podr abrir mediante
una direccin especfica.
Administracin de la Memoria
El esquema ms sencillo es el direccionamiento directo, lineal, de la memoria fsica. Para este
tipo de direccionamiento no hay otra planificacin ms que comprobar si el espacio fsico libre de
memoria permite cargar el programa y los datos que queremos ejecutar. Este tipo de esquema fue
el utilizado en las primeras computadoras para el modo monoprocesamiento.
14

Cuando se comenz a pensar en mejorar la eficiencia de la CPU, esto llev a considerar lo que se
llama multiprocesamiento. En este contexto la CPU se conmuta entre varios procesos (cada proceso podra pertenecer a un programa diferente); la RAM debe contener a los procesos y, por lo
tanto, la RAM va a estar compartida. Los algoritmos de administracin de la memoria tienen sentido en el contexto de multiprogramacin.
Multiprogramacin lineal
ste es el esquema ms sencillo de la administracin y se basa en usar la memoria para cargar la
mayor cantidad de procesos posibles. El SO no utiliza otro algoritmo que no sea el de buscar un
espacio lo suficientemente grande como para que quepa el proceso.
En la primera carga de la memoria se puede llegar a aprovechar valores muy cercanos al 100 %
de la memoria, pero a medida que el SO debe cambiar los procesos para su futura ejecucin, y ya
que los procesos no ocupan todos el mismo lugar, van quedando huecos cada vez ms pequeos y
distribuidos, lo que los convierte en intiles (los procesos deben cargarse en posiciones contiguas
de la memoria). A este problema se lo llama Fragmentacin Externa y puede dejar espacios muy
grandes de la memoria inutilizables.
La forma de solucionar esto es efectuando la compactacin de la memoria. En este modelo el SO
debe analizar todo el espacio de memoria e ir reubicando procesos de manera de ir acumulando
esos huecos de manera de volverlos tiles. Este procedimiento ocupa mucho tiempo de CPU,
haciendo que el rendimiento del sistema disminuya notablemente.
Multiprogramacin por pginas
La primera forma de solucionar la fragmentacin externa es dividiendo el espacio de memoria
RAM en subespacios (frames), todos de la misma capacidad. Se suele denominar Frames a los
marcos de pgina, es decir, al espacio fsico sin datos que conformar la pgina (datos). Este esquema tiene, como todos, sus ventajas y sus desventajas. Como ventajas principales estn:
a) Un direccionamiento jerarquizado, tipo rbol
b) La posibilidad de extender la memoria RAM a travs de un concepto denominado Memoria Virtual, en el que se usa el disco como extensin de la RAM disponible.
Como desventajas se pueden citar:
a) Que el direccionamiento es ms complejo y requiere apoyo de la arquitectura de la CPU
b) Dependiendo del tamao de las pginas, aparecen en la ltima pgina de un proceso zonas
libres (a menos que el proceso ocupe exactamente un mltiplo entero de la capacidad de
las pginas), que se denomina fragmentacin interna, y que, estadsticamente, podra estimarse en la mitad de la capacidad de una pgina.
c) Aparece el concepto de Direccin Lgica, que debe ser transformada a una direccin fsica, como vemos en el siguiente ejemplo:

15

En este esquema, los procesos pueden cargarse en zonas de memoria que no sean contiguas, la
que s debe ser secuencial es la tabla de pginas. Dentro del programa, cada direccin lgica est
constituida por un nmero de pgina y una direccin relativa dentro de la pgina (desplazamiento).
La tabla de pginas est implcita en los PCB, en la forma de registro Base y registro Lmite.
Existen mecanismos dentro de la arquitectura del procesador que verifican que las direcciones
fsicas obtenidas sean congruentes con esta tabla de pgina, para evitar que el Program Counter
est direccionado a una direccin de memoria errada.
El esquema siguiente representa el modo de direccionamiento del Pentium con un poco ms de
precisin.

16

Algoritmos de Reemplazo de Pginas


Utilizando el concepto posible dentro de paginacin que era la memoria virtual, se presenta el
problema de una memoria RAM escasa extendida por las pginas ubicadas en el disco. El problema implica saber qu pginas de la RAM puedo borrar cuando necesito cargar pginas del
disco.
El SO, cuando termina de ejecutar las instrucciones de una pgina, necesita continuar con la siguiente en forma secuencial. Ahora bien, una vez que termine de ejecutar las instrucciones de
esta nueva pgina, las preguntas son: qu pgina va a necesitar, y si esta pgina ya est cargada
en la RAM o hace falta borrar una de las pginas usadas para cargar la necesaria del disco (Fallo
de Pgina).
Detallaremos a continuacin algunos algoritmos tiles para los fallos de pgina:
a) Reemplazo sencillo tipo FIFO (First In First Out). Es el algoritmo ms sencillo y barato
de implementar, ya que slo lleva una cola de las pginas a reemplazar, cuyo orden en
principio es aleatorio. Este esquema es el que, en general, produce ms fallos de pgina, y
por lo tanto el menos eficiente.
b) Reemplazo ptimo. Es el mejor algoritmo en cuanto a la cantidad de fallos de pgina, pero es muy difcil de implementar. Se etiqueta cada pgina con un nmero equivalente a la
cantidad de instrucciones del programa en el que se hace referencia por primera vez a esa
pgina. El algoritmo implica cambiar las pginas de acuerdo al menor nmero, es decir, la
pgina a la que se hace referencia en la menor cantidad de instrucciones del programa. Para que este algoritmo pudiera ser implementado, el programa no debera tener saltos, o los
saltos ocurrir dentro de pginas contiguas a la actual, lo cual es irrealizable en programas
convencionales.

17

c) La menos recientemente usada (variable tiempo)(LRU: Least Recently Used). Es un


algoritmo que se basa en tiempo que ha pasado desde que esa pgina se us. Es probable
que las pginas que han sido usadas recientemente, no se usen enseguida. La implementacin de este algoritmo implica mantener una lista histrica de cundo fueron usadas las
pginas solicitadas por cada proceso.
d) La que ms recientemente se us (variable tiempo)(Most Recently Used) El algoritmo
es el contrario al anterior y, a pesar de ello, es mejor que el de reemplazo sencillo.
e) Menos frecuentemente usada (variable frecuencia)(LFU: Least Frequently Used). El algoritmo anterior se basaba directamente en el tiempo transcurrido desde el ltimo uso de
una pgina en particular. En este algoritmo, lo que se verifica es la cantidad de veces que
fue solicitada histricamente esta pgina. Ante un fallo de pgina, la que se reemplaza es
la que menos veces fue utilizada por el programa.
f) Ms frecuentemente usada (variable tiempo)(Most Frequently Used) Como en el caso
de tiempos, este algoritmo implica considerar el cambio de la pgina que ms se haya
usado. Teniendo en cuenta la localidad de las referencias, este algoritmo debera ser peor
que el anterior.
Existen otros mtodos de intercambio de pginas ms o menos eficientes que suponemos se tratarn con ms detalle en la materia destinada a SO.

Caso prctico del uso de los algoritmos vistos


Tomaremos el caso de un proceso que utiliza secuencialmente las pginas siguientes:
7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 0, 1, 7, 0, 1
Supondremos adems que slo disponemos de tres marcos para completarlos con los datos de
esos nmeros de pgina.
FIFO
Hay 19 pedidos de pginas, a continuacin se grafican los fallos de pgina.

Con este algoritmo, de 19 pedidos hubo 12 fallos. Tener en cuenta que esto es una cola en donde
los nuevos datos entran por la parte superior y los ltimos datos se pierden.
PTIMO

18

En este algoritmo se reemplaza la pgina que no se usar durante el mayor perodo de tiempo que
sigue, es decir, el SO debe adivinar la secuencia de pginas que usar el programa.

LRU

Este algoritmo se podra llevar a cabo asociando cada posicin de la tabla de pginas a un contador que se vaya incrementando con unidades de tiempo predefinidas. La pgina que se cambia es
la que tiene el mayor nmero asociado. En el caso de no haber fallo de pgina, el contador asociado a ella se vuelve a 0.

LFU

En el ejemplo, al querer aplicar el algoritmo, nos encontramos con que dos de las pginas han
sido usadas igual nmero de veces, en este caso adoptamos cambiar la que ms lejana en el tiempo estuvo, o sea que, en realidad, hemos hecho una mezcla de dos algoritmos.
Multiprogramacin por segmentos
Conceptualmente se puede entender como un conjunto de espacios de longitud variable. La ventaja de esta imagen sobre el enfoque de paginacin estriba en que se puede proporcionar proteccin a nivel de byte si fuera necesario. Para el Pentium existe una referencia al segmento de 16
bits y un desplazamiento de 32 bits. Dos de los bits de la referencia al segmento se utilizan para
proteccin y los 14 restantes para especificar el segmento. En total se dispone entonces de 246, o

19

sea 64 TeraBytes; el espacio de direcciones fsicas utiliza 32 bits, lo que da una memoria de trabajo de 4 GigaBytes (lmite de los SO actuales).

Algoritmos para el manejo de la memoria secundaria o virtual


Para mejorar la eficiencia de la transferencia de datos en el disco, se pueden usar 3 algoritmos
bsicos:
a) FCFS (First Come First Served). El archiconocido mtodo de que el primero que llega es
el primero que se atiende.
b) SSTF (Shortest Seek Time First). Con este algoritmo se organiza la cola de pedidos al
disco de manera que estn ordenadas por cercana a la posicin que se toma como inicial.
c) SCAN (Barrido). Este mtodo trata de mantener la direccin (ascendente o descendente)
que llevaban las cabezas al momento que consideramos como inicial y lee slo en esa direccin, cuando vuelve al principio no lee ni escribe.
d) C-SCAN (Barrido circular) Este algoritmo lee tanto en el camino de pistas ascendente
como descendente
Estos algoritmos tratan de minimizar las traslaciones entre pistas de las cabezas que era un tiempo relativamente largo y que afectaba fundamentalmente a la velocidad de transferencia de datos.
En el siguiente grfico vamos a sacar los tiempos de respuesta suponiendo que un proceso haya
pedido datos de las siguientes pistas:
50, 98, 183, 37, 122, 14, 124, 65, 67

20

Memoria Cach
Glosario
Capacidad: normalmente se expresa en trminos de Bytes, aunque dependiendo de la jerarqua
de memoria se puede expresar en palabras. Lamentablemente nunca se pusieron de acuerdo en
cuanto a la definicin de cantidad de bits de una palabra. En general se toma como la unidad natural de la jerarqua de memoria de la que se est hablando, y de la CPU asociada. Hay palabras
de 32, 64, 128 bits.
Tiempo de acceso: es el tiempo que tarda en realizarse una operacin de lectura/escritura completo, es decir: el tiempo que transcurre desde el instante en que se presenta una direccin a la
memoria hasta que el dato (Byte o palabra) est disponible para su uso en el bus de datos.

21

Tiempo de ciclo de memoria: es el tiempo de acceso ms los tiempos de las seales de control
involucradas.
Ubicacin: indica si la memoria es interna o externa al computador. La memoria interna suele
identificarse con la memoria principal (RAM). El punto de vista para determinar la ubicacin
podra ser tambin la CPU; en este caso la memoria interna estar constituida por los registros y
la memoria cach, y la memoria externa pasara a ser la RAM.
Unidad de transferencia: indica cuntos bits o Bytes se transfieren en un ciclo de lectura/escritura. Algunas veces coincide con la palabra, pero en otros casos es mayor (256 bits o
ms).
Unidades direccionables: en la mayora de los casos, coincide con la palabra; en algunos, especialmente los registros, se permite direccionar a nivel de bits. En cualquier caso, la relacin entre
las unidades direccionables A y el nmero de unidades direccionables es 2A=N.
Velocidad de transferencia: es la velocidad a la que se pueden transferir datos (actualmente se
habla de bits por el tipo de transmisin usado). Se puede utilizar la siguiente relacin:
TN TA

N
R

TN = tiempo medio de lectura/escritura de N bits.


TA = tiempo de acceso medio por bit
N = nmero de bits
bits
R = velocidad de transferencia en
seg

Jerarqua de memoria

Memoria en
tarjetas/CPU

Registros

Alto costo
por bit

Muy baja
capacidad

Muy rpida

Accesos
CPU a L2

Muy bajo
costo por bit

Alta capacidad

Lenta

Accesos
CPU a L1

Cach
RAM

Almacenamiento
Discos
fuera de tarjetas
Almacenamiento
WORM
fuera de lnea

Existe un compromiso entre las tres caractersticas clave (costo, capacidad y tiempo de acceso).
A menor tiempo de acceso, mayor costo; a mayor capacidad, menos costo por bit; a mayor capacidad, mayor tiempo de acceso.
Existe una solucin de compromiso que implica tener memorias en diferentes niveles (Levels),
estos se enumeran con valores en incremento de acuerdo a la lejana relativa a la CPU; as el L1
es la memoria ms cercana a la CPU y la L3 la ms lejana. Este esquema implica tener varios
niveles ordenados por capacidad-velocidad; en este caso, L1 es la ms veloz, aunque de menor
capacidad.

22

La ltima columna de la tabla de jerarquas supone que los acccesos a memoria lenta son cada
vez menos frecuentes. Esto es moderadamente verdad, siempre que se cumpla la condicin de
que la ejecucin de un proceso sea efectuado genricamente en pocas pginas de instruccin (o
datos); con la disminucin de los costos de cach al ser integrados al chip de la CPU esta condicin es mucho ms frecuente y por lo tanto la eficiencia del uso de cach se nota mucho ms.
Esta caracterstica de los programas o procesos fue denominada localidad de las referencias
(temporal y espacial) y establece que durante perodos de tiempo largos (tiempos de CPU), las
agrupaciones de memoria en uso cambian, pero considerando perodos cortos, el proceso tiende a
usar las mismas referencias a memoria. Estudios realizados sobre programas realizados en C demuestran que con 8 bloques de cach por proceso, slo hay fallos de pgina en menos del 1% de
los accesos a cach.
En el clculo de los tiempos de acceso para memorias de dos niveles, debemos considerar el concepto de tasa de aciertos. En una configuracin de dos niveles, la tasa de aciertos de un nivel
corresponder a la inversa (Tasa de fallos) del otro nivel.

TM H * T1 (1 H ) * (T2 T1 )
TM T1 T2 * (1 H )
H= tasa de aciertos del nivel 1
T1= tiempo de acceso medio al nivel 1
(1-H)= tasa de fallos del nivel 1 (certeza aciertosL1 = fallosL1)
T2= tiempo medio de acceso al nivel 2
TM= tiempo medio de acceso a los dos niveles
Si H fuera el 100%, el tiempo medio sera T1; si H fuera 0, el tiempo medio sera T1+T2
Supongamos que el procesador tiene que acceder a dos niveles de memoria: L1 contiene 1K palabras y un T1 = 10 nseg.; L2 contiene 100K palabras y T2 = 100nseg. y H = 0,95. El mtodo de
escritura de la cach es WT (write through), lo que lleva a considerar que si debe acceder al L2
debe haber efectuado un ciclo de lectura de L1 para buscar la pgina y, al no encontrarla, busca
en L2; cuando la encuentra debe grabarla en L1 para que la CPU pueda acceder al dato (o instruccin en V.Neumann). Despreciando los tiempos de handshaking, el tiempo medio de acceso
ser:

0,95 *10nseg (1 0,95)(10nseg 100nseg ) 15nseg


Lo que justifica usar diferentes niveles son las condiciones implcitas en el grfico de jerarquas:
L1 pequea pero extremadamente veloz, L2 ms grande y ms lenta y L3 mucho ms grande y
an ms lenta que L2. Una relacin posible es un orden de magnitud (10 veces) entre niveles.
Prestaciones
Para evaluar la cantidad de cach a utilizar se deben considerar el costo y el rendimiento final del
conjunto. El costo se calcula como:

Ct

C1M 1 C2 M 2
M1 M 2

C es el costo por palabra


M es la cantidad de palabras a adquirir

23

El nivel 2 es ms barato, de modo que interesa conseguir que Ct sea muy prximo a C2. Esto se
consigue haciendo que M1 << M2, cosa que se cumple en la realidad. Tambin debemos conseguir que TM sea cercano a T1, lo que se consigue con una cach de gran tamao.
Se deben considerar las dos variables: tiempo de
acceso (funcin de los aciertos) y costo (funcin
del tamao). Sabiendo que la relacin de los
tiempos de acceso medio entre la memoria principal y la cach es un nmero cercano a 50 y que
una relacin entre tiempo medio del sistema y
tiempo de acceso a cach puede ser 10, obtenemos una tasa de aciertos mnima del 82%. La
cuestin de la cantidad ser funcin de la localidad de las referencias a memoria, para una localidad entre moderada y fuerte conseguimos tasas
de acierto en ese orden con un 20% de memoria
cach.
Comprobar si se cumplen estas condiciones
usando la memoria principal como cach de disco, suponiendo que la relacin de costos es 1/200 y la relacin de tiempos 1000/1.
El clculo se complica un poco al considerar tres niveles, pero se puede resolver de a dos sistemas por vez, como un sistema lineal.
Partimos de que tenemos la certeza de que la pgina buscada est en alguno de los tres niveles:
H1 H 2 H 3 1

Entonces, el tiempo medio (o promedio) de acceso queda:


t m H1 * t1 H 2 * t1 t 2 H 3 * t1 t 2 t 3

Reagrupando:
tm tt H1 H 2 H 3 t2 H 2 H 3 t3 H 3
H1 H 2 H 3 1

tm tt t2 1 H1 t3 1 H 2 H1

En la actualidad, tenemos microprocesadores con hasta 3 niveles de cach integrados dentro de la


CPU, esto permite velocidades en el orden (o iguales) a la del reloj que comanda a la CPU. El
problema de la cercana es un tema fsico: si la longitud de la lnea(s) de transmisin de datos se
asemejan a la longitud asociada a esa onda, el conductor se transforma en una antena que irradia
energa al exterior como ondas electromagnticas (el principio de la radiodifusin), concretamente para frecuencias del orden de los 2GHz, la longitud de onda se calcula como:

m
3.108

c
seg 1,5.10 1 m 15cm

f
2.109 Hz

24

Para que no oficie de antena, la longitud de la lnea debe ser alrededor del 10% de , o sea 1,5
cm. Resumiendo lo anterior: no se deben mover seales elctricas con frecuencias cercanas a los
2GHz a distancias mayores de 1,5cm.
La figura siguiente describe la estructura de un sistema de memoria cach/principal. La memoria
principal consta de hasta 2n unidades direccionables y cada palabra tiene una nica direccin de
m bits. La memoria est dividida en bloques (podran ser pginas) de K palabras por bloque, es
decir que hay M bloques (pginas), siendo M = 2n/K. La cach consta de C filas, cada fila contiene K palabras, es decir que en cada fila de la cach entra un bloque de los considerados para la
memoria; tiene adems unos bits de ms como etiqueta, que habitualmente es parte de la direccin del bloque e informacin sobre modificaciones en el bloque (si fue modificado por el proceso hay que grabarlo a disco antes de eliminarla de la cach, en caso contrario slo se elimina). Se
cumple la condicin de que C<<M. En todo momento un subconjunto de bloques de la memoria
est copiado en la cach.

Unidades de Entrada/Salida
Uno de los elementos clave de un computador es el conjunto de mdulos de Entrada/salida. Cada
mdulo se conecta al bus del sistema o a un conmutador central y controla uno o ms dispositivos
perifricos. Las razones por las cuales un perifrico no se conecta directamente al bus son, entre
otras:
a) Existe una amplia variedad de perifricos con lgicas de funcionamiento diferentes
b) A menudo la velocidad de transferencia de datos es mucho menor que la del bus

25

c) Algunos pocos perifricos pueden tener velocidades que superen a la del bus
d) Los perifricos usan datos con formatos y tamaos de palabra diferentes a los del computador.

Como interfase entre el bus y el dispositivo genricamente aparece un mdulo de entrada/salida.


Este mdulo, como funcin, debera compensar la lgica del dispositivo de entrada/salida, los
formatos y las velocidades. Las funciones de un mdulo suelen incluir, adems de las antedichas,
el almacenamiento temporal de datos y la deteccin de errores.
El control de la transferencia de datos desde un dispositivo externo hasta el procesador podra
involucrar los siguientes pasos:
a) El procesador interroga al mdulo de entrada/salida para comprobar el estado del dispositivo.
b) El mdulo devuelve el estado.
c) Suponiendo que el dispositivo est preparado para transmitir o recibir datos, el procesador
solicita al mdulo la transferencia del dato.
d) El mdulo de entrada/salida obtiene o transmite el dato del dispositivo externo.
e) El dato se transfiere desde el mdulo al procesador.
Con referencia al gabinete, los dispositivos pueden dividirse en internos y externos. Genricamente, los externos interaccionan con el operador y, a excepcin del monitor (video), se pueden
considerar como muy lentos. Los internos estn ms relacionados a los datos y sus velocidades de
transferencia, comparados con los de la CPU, tambin son lentos (pero mucho ms rpidos que
los externos).
Como ejemplo, citaremos el mdulo (chip) identificado como 8255, destinado a controlar interfases que manejan datos en forma paralela (8 bits). Este chip es bastante parecido a un microcontrolador: tiene tres puertos de 1 Byte, configurables como entradas o salidas, una salida/entrada de
datos de 1 Byte, algunas seales de control y dos lneas para direcciones.
El uso ms difundido fue el concepto de mapeado en memoria. Este concepto implica que los
registros internos del mdulo (en este caso, el 8255) se hacen coincidir con direcciones fsicas de
la RAM. Con este mtodo, las diferencias de velocidad se solucionan porque esas posiciones de

26

memoria RAM actan como un almacenamiento de datos temporal (buffer) que compensa las
diferencias de velocidad.
En el modo de transmisin, la CPU coloca el dato a transferir en la posicin de RAM asignada,
habilita al mdulo con una seal de control denominada Chip Select (CS) y, a continuacin, otra
seal de control denominada Write. En el ciclo de lectura, el chip coloca al dato en otra posicin
de memoria, solicita una interrupcin y, cuando sta es aceptada, la CPU le indica al mdulo que
est lista a leer el dato con la seal Read; esta ltima aparentara no ser necesaria, ya que la CPU
puede leer el dato estrictamente con un acceso a memoria, esta seal, en realidad, le sirve al mdulo para saber que el dato fue ledo y que, eventualmente, puede colocar otro dato en la memoria.
Este mdulo, en particular, es programable en una cantidad de modos de funcionamiento. Esos
diferentes modos se eligen a travs de un dato denominado Palabra de control, al que se le
asigna otra posicin de memoria, efectundose la programacin a travs de un ciclo de escritura y
el conocimiento del estado del chip a travs de uno de lectura.
El mtodo anterior, denominado E/S programada tiene como ventaja la sencillez de la implementacin, pero la desventaja de emplear mucho tiempo en ciclos de lectura/escritura de RAM para
obtener el/los datos necesarios. Como ejemplo, supongamos que el proceso en ejecucin requiere
como operando a un valor codificado en PuntoFlotanteDoblePrecisin; esto requiere leer 64 bits
(8Bytes) y tambin 8 ciclos de lectura del mdulo de E/S.
Mientras la CPU carga el/los datos necesarios no puede hacer otra cosa que esperar respuesta del
mdulo. Como las velocidades de E/S son considerablemente menores que la RAM y la CPU, la
solicitud y carga del dato requiere mucho tiempo de inactividad de la CPU. En computadoras
personales, esto es un inconveniente menor ya que se resume a que el operador obtenga una baja
velocidad y use el tiempo de
inactividad de su CPU en penControladores
sar cmo puede hacer para
de interrupciones
esclavos
comprarse una PC ms rpida.
Si cambiamos nuestro punto de
Dispositivo externo 00
IRQ 0
vista a los negocios, ese tiempo
IRQ
1
Dispositivo externo 01
INT
representa dinero quieto en funIRQ 2
Dispositivo externo 02
IRQ 3
cin de dinero movindose y,
IRQ 4
por supuesto, el dinero movinIRQ 5
dose genera ganancias as que
IRQ 6
hay que hacer ms eficiente al
Dispositivo externo 07
Controlador
IRQ 7
de interrupciones
sistema.
Dispositivo externo 08

Dispositivo externo 15

Dispositivo externo 56

Dispositivo externo 63

IRQ 0
IRQ 1
IRQ 2
IRQ 3
IRQ 4
IRQ 5
IRQ 6
IRQ 7

IRQ 0
IRQ 1
IRQ 2
IRQ 3
IRQ 4
IRQ 5
IRQ 6
IRQ 7

maestro

INT

IRQ 0
IRQ 1
IRQ 2
IRQ 3
IRQ 4
IRQ 5
IRQ 6
IRQ 7

INT

INTR
CPU

Para mejorar este rendimiento,


se pens en agregar un controlador llamado de interrupciones
y hacer los pedidos a travs de
l. En este esquema, cuando la
CPU necesita un dato ejecuta
una orden de lectura a una direccin. La lnea de lectura
puede ir directamente al controlador de interrupciones o al

INT

27

controlador y a la RAM. La CPU sigue con otras tareas mientras el controlador de interrupciones
prepara al mdulo de E/S correspondiente a la direccin suministrada por la CPU. Cuando el sistema de E/S (mdulo + hardware correspondiente) est listo, lo comunica al controlador de interrupciones (CI) por una lnea de control de las 8 que dispone el CI. Dependiendo de la lnea solicitante, el CI las ordena por prioridades y solicita a la CPU la interrupcin por la lnea IntR, junto
con la identificacin del perifrico que requiere atencin. El SO determina si se va a atender o no
esa interrupcin a travs de mscaras de comparacin. Las mscaras no son otra cosa que
datos contra los cuales se compara la identificacin del perifrico que requiere atencin con algn
orden de prioridad preestablecido.
El 8259 de Intel (CI) se puede cablear en modo rbol para manejar hasta 64 dispositivos de E/S.
La programacin normal determina que la lnea IRQ 0 es ms prioritaria que la INT 7, por lo tanto en la figura tienen prioridades relacionadas en forma inversa a la identificacin del dispositivo.
En el caso de que la interrupcin sea aceptada, el SO entra en un ciclo de cambio de proceso
guardando los registros de la CPU y los datos necesarios para retomar el proceso actual y cuando
estn preservados, solicita al CI la direccin correspondiente del vector de interrupciones para
seguir el proceso de lectura/escritura del dato.
Aparentemente todo este proceso es ms largo que el anterior y es cierto, pero usando interrupciones, la CPU puede hacer otras cosas entre el pedido del dato y la lectura del mismo. El resultado es un aumento en la eficiencia de la CPU y por ello de todo el conjunto.
El manejo de E/S por interrupciones no soluciona el problema de tener varios ciclos para leer un
dato compuesto de varios Bytes, una alternativa ms moderna es usar una CPU ayudante denominada Direct Memory Access (DMA). Este chip se interpone en la comunicacin de los datos
con perifricos que habitualmente requieren datos largos y tiempos de respuesta menores a sus
transferencias a la memoria RAM, como por ejemplo la placa de red, la controladora de sonido y
el disco rgido, entre otros posibles.
La ventaja de agregar esta CPU ayudante es que la CPU principal le comunica el tipo de dato que
necesita y la direccin inicial de memoria en que hay que ubicarlo. El DMA se encarga de la tarea rutinaria de ir cargando las posiciones consecutivas de memoria hasta completar el dato y
avisarle a la CPU la disponibilidad del mismo a travs de una interrupcin. En este procedimiento, la CPU slo acta para pedir el dato y para obtenerlo.
En el caso de existir un solo Bus de Datos, van a tener que compartirlo entre la CPU y el DMA,
lo cual hace que la eficiencia del sistema se incremente comparado al uso sin DMA, pero no lo
deseable. La alternativa ms costosa es construir otro Bus que se llamar de E/S conectado directamente al DMA, con lo cual los procesamientos de E/S se delegan al DMA y los procesos ms
rpidos a la CPU, cada una de ellas con su propio canal de comunicaciones.
El ltimo concepto relacionado con las operaciones de E/S es el denominado Canal de E/S. El
mdulo de E/S tiene una zona de memoria propia, Buses propios y maneja un repertorio reducido
de instrucciones (es capaz de ejecutar procesos) tendientes a las comunicaciones con los dispositivos de E/S, desde un punto de vista es otra computadora cuya tarea es comunicar datos a una
computadora ms rpida (esquema de cliente-servidor). El rendimiento, la amplitud de datos y la
seguridad obtenida en el uso de la WideWorldWeb (internet) hizo que se pensara en esquemas
distribuidos an dentro del mismo gabinete y ahora existen configuraciones de E/S (FireWire,
Infiniband, USB) que usan protocolos de comunicaciones similares a los usados en Internet, aunque con menos capas y mucho ms rpidos, llegndose en algunos casos de uso de fibra ptica a

28

velocidades de transferencia de 30 Gb/seg y a 300m de distancia, cuando por cobre el PCI llega a
1Gb/seg a distancias de pocos centmetros.
Interrupciones en el Pentium
Hay dos tipos de eventos que hacen que el Pentium suspenda la ejecucin del flujo de instrucciones en curso y responda al evento: las interrupciones y excepciones. Una interrupcin se genera
por una seal del hardware y puede ocurrir en cualquier momento. Una excepcin se genera desde el software y es provocada por la ejecucin de una instruccin. Hay dos fuentes de interrupciones y dos fuentes de excepciones.

Interrupciones enmascarables: las recibe el procesador por el pin INTR. El procesador no


atiende una interrupcin enmascarable a no ser que un indicador especial lo habilite.

Interrupciones no enmascarables: el pin se denomina NMI. El procesador no tiene forma


de evitar atender a tales interrupciones (por ejemplo: RESET).

Excepciones detectadas por la CPU: se producen cuando el procesador encuentra un error


mientras intenta ejecutar una instruccin.

Excepciones programadas: hay instrucciones que generan una excepcin (por ejemplo: fallo de pgina, depuracin, etc.)

El procesamiento de las interrupciones usa una tabla de vectores, cada tipo de interrupcin tiene
asignado un nmero que se usa para identificarla. Este nmero se usa como entrada a la tabla de
vectores de interrupcin. La tabla contiene 256 datos de 32 bits cada uno, que representan la direccin (segmento y desplazamiento) de la rutina de servicio a ejecutar. Si se generan ms de una
interrupcin o excepcin, la CPU las atiende en un orden determinado por el SO.
ID
0
1
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

DESCRIPCIN
Error al dividir; desbordamiento de divisin o divisin por cero
Excepcin de depuracin. Incluye fallos e interceptaciones relacionadas con la depuracin de procesos.
Punto de parada causado por la instruccin INT3
Desbordamiento detectado por INT0
Instruccin fuera de lmites de la memoria
No definido
Dispositivo no disponible
Doble fallo: dos interrupciones ocurres durante la misma instruccin
Reservado
Segmento en estado de tarea no vlido
Segmento no presente
Error en la pila
Violacin de proteccin general
Fallo de pgina
Reservado
Error de coma flotante
Acceso a una palabra almacenada en direccin de Byte impar o doble palabra en
una direccin que no sea mltiplo de 4
Verificacin de la CPU (Watchdog)
29

19-31
2
32-255

Reservados
Interrupcin no enmascarable
Vectores de interrupcin del usuario (seal INTR)

Las dos ltimas son interrupciones y el resto excepciones. Cuando se produce una interrupcin y
es atendida tiene lugar la siguiente secuencia de eventos:
1) Si la transferencia supone un cambio de nivel de privilegio, los contenidos del registro del segmento de pila y puntero de pila ampliado se introducen en la pila.
2) El valor actual del bit EFLAGS se introduce en la pila.
3) Los indicadores de interrupciones y de trampa se ponen a cero. Ello inhabilita
otras interrupciones y la interceptacin o modo paso a paso.
4) Los contenidos actuales del puntero del segmento de cdigo y del puntero de instrucciones se guardan en la pila.
5) Si la interrupcin viene acompaada de un cdigo de error se guarda tambin en la
pila.
6) Se captan los contenidos del vector de interrupcin y se cargan los registros necesarios para la ejecucin de la interrupcin.
7) La instruccin IRED vuelve a cargar los registros desde la pila para continuar la
ejecucin anterior a la interrupcin.

Paralelismo en las instrucciones procesadores superescalares


El trmino superescalar fue usado en 1987 para mencionar a una mquina diseada para mejorar la velocidad de ejecucin de instrucciones escalares y estuvo muy relacionado con los procesadores pensados en esa poca, en donde haba ms limitaciones en la construccin de grandes
memorias RAM (internas y externas). Esta limitacin llev a disear procesadores que tenan
pocas instrucciones diferentes, pero cuya ejecucin se poda decodificar y ejecutar en tiempos
muy cortos, dndoles el nombre de RISC (conjunto de instrucciones reducido).
En la actualidad, un procesador superescalar es aquel que usa mltiples cauces de instrucciones
independientes. Cada cauce consta de mltiples etapas, de modo que puede tratar varias instrucciones a la vez (tpicamente un programa de computadora debe considerar que tiene sus instrucciones ordenadas en una serie cuya lgica resuelve el problema). El hecho de que haya varios
cauces introduce un nuevo nivel de complejidad al permitir varios flujos de instrucciones que se
procesan simultneamente. El procesador superescalar saca provecho de lo que se conoce como
paralelismo en las instrucciones, que hace referencia al grado en que las instrucciones pueden
ejecutarse en paralelo (independencia de las instrucciones).
El procesador capta varias instrucciones a la vez y trata de encontrar instrucciones cercanas que
sean independientes entre s y puedan, por ello, ejecutarse en paralelo (multiplexin de recursos,
no del tiempo). Si la entrada de una instruccin no es independiente, esto es que su entrada de
datos depende de la salida de otra (precedente), esta instruccin no puede ejecutarse al mismo
30

tiempo o antes de aquella. Una vez que se han identificado tales dependencias, el procesador
puede emitir y completar la ejecucin de instrucciones en un orden diferente al cdigo original.
El procesador puede eliminar algunas dependencias innecesarias a travs del uso y renombramiento de algunos de su gran cantidad de registros internos.
Para mejorar el valor del paralelismo de las instrucciones se puede usar una combinacin entre
software (el compilador) y hardware. Algunas de las limitaciones que se encuentran para mejorar
ese valor son:

Dependencia de datos verdadera

Dependencia relativa al procedimiento

Conflicto de recursos

Dependencia de datos verdadera:


Supongamos el ejemplo
A=A+B
C=A
La segunda instruccin no puede ejecutarse antes (o durante) la ejecucin de la primera porque
necesita datos de ella. Los procesadores superescalares pueden atrasar un ciclo de reloj a la instruccin dependiente para poder ejecutarla. Esto, de alguna manera es una multiplexin en tiempo, es decir que una instruccin se ejecuta despus que la otra.
Dependencia relativa al procedimiento
El caso de una bifurcacin condicional es una dependencia relativa al procedimiento, mientras no
se sepa el valor de la condicin no se puede ejecutar la instruccin de salto.
Conflicto de recursos
Uno de los recursos que aparenta ser poco importante son las comunicaciones a travs del bus de
datos, si la mquina tiene uno solo, las comunicaciones terminan siendo un cuello de botella para
el requerido paralelismo. Este conflicto se resuelve parcialmente disponiendo de varias computadoras virtuales (o reales) en una configuracin de red, siempre y cuando la comunicacin de
esta red sea mucho ms veloz que las comunicaciones internas de datos de cada nodo.
Implementacin superescalar

31

La figura representa grficamente el proceso de ejecucin de instrucciones en una CPU de este


tipo.

El programa a ejecutar consiste de una secuencia de instrucciones, tal como sale del compilador.
El proceso de captacin de instrucciones tiene una lgica para predecir saltos y genera un flujo
dinmico de instrucciones que enva a una ventana de ejecucin. En esta ventana, las instrucciones no forman un flujo secuencial sino que estn estructuradas de acuerdo a sus dependencias de
datos verdaderas. Aqu podran aparecer instrucciones fantasma, necesarias para completar una
lgica de programacin crtica (PERT). Las instrucciones se ejecutan y se desechan los resultados
irrelevantes o de tareas fantasma y se reordena secuencialmente el flujo de salida.
Los procesadores de Intel han ido modificando su estructura de escalar (80486), modesta arquitectura superescalar (Pentium: dos unidades independientes ALU para enteros), hasta ser completamente superescalares (Pentium Pro).
Arquitectura IA-64
Esta soporta desde el hardware el paralelismo de instrucciones y es bastante diferente a las aproximaciones seguidas por la historia de lo superescalar. Como siempre, est acompaada de la
tecnologa que permite grandes cantidades de registros y cach de hasta tres niveles integradas
dentro del chip. Tiene mltiples unidades de ejecucin completas, siendo hasta ahora cuatro, se
piensa que es posible llegar a ocho.
Un resumen que no expresa todo su potencial es que ahora las instrucciones se ejecutan con predicado, esto es que los ciclos de saltos condicionales se ejecutan completos: ambas ramas llegan a
sus resultados y luego se comprueba cul de las ramas ejecutadas sirve como dato, la otra se
desecha.
La teora de hacer y luego comprobar se aplica tambin en el caso de instrucciones de control y
datos.
Referencias bibliogrficas:

32

Sistemas Operativos Modernos, Adrew S. Tanenbaum. Editorial Prentis Hall.


Organizacin y Arquitectura de Computadores, William Stallings. Editorial Prentis Hall.

33

Programacin con assembler de un PIC 16F628/872


Los genricamente llamados procesadores tienen dos ramas que difieren en el modo en que se
comunican con el exterior: los procesadores propiamente dichos tienen patas definidas para entrada, salida, datos, direcciones y alimentacin conocidas y fijas en cuanto a sus funciones. Las
comunicaciones con el exterior son sncronas y permanecen en un estado lgico tiempos muy
cortos, en algunos casos la duracin de una instruccin (en el orden de algunos nanosegundos),
debido a la gran cantidad de informacin que se espera que manejen.
Los procesadores que llamaremos controladores se diferencian por tener patas de comunicacin
que pueden variar sus funciones durante la ejecucin de un programa. Pueden ser durante unos
ciclos de reloj entradas, luego pasar a ser salidas e incluso permanecer en un estado lgico inamovible durante mucho tiempo. El procesador al cual nos dedicaremos pertenece a esta ltima
clase, lo fabrica la firma Microchip y llevan genricamente el nombre de PIC y el nnero de modelo del que se trate, en este caso el 16F628.
El primer nmero hace referencia al grupo dentro de la clase: existen los 12, 14, 16 y 18, cuanto
mayor el nmero, mayor la potencia de procesamiento. A excepcin de los de alta gama, todos
tienen un grupo reducido de instrucciones (RISC), que ejecutan en lo que se denomina ciclo de
instruccin y que lleva cuatro ciclos del reloj.
Con estos controladores se han fabricado desde boyas hasta la lgica de un automvil. Son muy
verstiles en cuanto a la frecuencia de reloj y la cantidad de patas de comunicacin con el exterior, adems de las funciones internas que son capaces de manejar que cubren desde comunicaciones seriales, paralelas, conversores analgico-digitales, conversores de frecuencia, modulacin, etc. etc.
Todos tienen la esctructura de una mquina de Harvard, es decir una memoria (ms el bus correspondiente) para instrucciones y una memoria para datos, esto le permite instrucciones de 14 bits
contra 8 bits de la memoria de datos.
El modelo elegido tiene capacidad de almacenar programas de hasta 2000 lneas en una memoria
tipo Flash (de all la F del nombre), una RAM organizada en cuatro bancos de 128 posiciones
cada uno en donde residen los registros de control y algunas posiciones para ocupar con variables
del programa y una zona de memoria EEPROM (64 Bytes) en donde colocar datos cuyos valores
se quiere preservar ante una falta de energa elctrica (valores de configuracin o promedios,
etc.). El chip tiene 28 patitas, 24 son de entradas/salidas organizadas como tres grupos (PORTS)
de 1 Byte y las restantes son para la alimentacin y reloj externo. Cada pata tiene la posibilidad
de ser entrada o salida digital o analgica, entrada de eventos exteriores que se pueden contar,
entrada del programa, interrupcin, etc. Como promedio cada pata puede tener dos funciones
programables desde el programa a ejecutar (cambiables en tiempo de ejecucin). Est dotado de
tres contadores identificados como TMR0, TMR1 y TMR2, hasta ocho interrupciones concatenadas, 10 eventos diferentes para provocar inerrupciones, conversor A/D de 10 bits, comunicacin
tipo Master o Master/Slave y un circuito de deteccin de fallos en la alimentacin elctrica que
permite pasarlo al modo sleep, de bajo consumo y conservacin de los datos (debe tener una
alimentacin extra por batera tipo litio).
Sobre la familia de controladores PIC existe una infinidad de documentacin, programas, ensambladores y simuladores que dejan a cualquier apunte como el presente como una simplsima introduccin al tema. Es justamente eso lo que pretende este apunte: hacer una introduccin al lenguaje ensamblador de programacin.

34

Los lenguajes de programacin tratan de simplificar la vida del programador a medida que incrementan su nivel. El nivel de mquina, donde hay que escribir cada instruccin con los cdigos
de operacin y los argumentos en secuencias de unos y ceros, resulta ser el ms complicado; a
este nivel le sucede el assembler, en donde cada instruccin se identifica por una cantidad de letras (tres o cuatro) y los argumentos escritos en numeracin decimal o hexadecimal; a estos le
suceden los de mayor nivel, en donde la programacin ya acepta lenguajes matemticos y sintcticos simples, cuyo parecido al lenguaje convencional es cada vez mayor.
El reloj
Tiene un circuito interno que puede oficiar de reloj con slo dos componentes externos que pueden oscilar entre 100KHz y 1MHz aproximadamente, este reloj sencillo es poco preciso, variando
con la tensin de alimentacin, la temperatura, la variacin de valor de los componentes, etc. Para
osciladores ms precisos se deben usar cristales y se pierden dos patas del controlador. Este controlador puede funcionar con frecuencias de reloj desde 0Hz (parado) hasta 20 MHz. Estos extremos de frecuencias daran tiempos de instruccin entre infinito y 200 nanosegundos.
Como reloj interno para contar tiempos se usa el tiempo de instruccin que equivale a cuatro ciclos del reloj.
Timer cero (TMR0)
Como habamos dicho antes, los temporizadores son, en realidad, contadores de eventos. Si estos
eventos se realizan en tiempos iguales, la cuenta de estos implicara un tiempo conocido.
Este timer en particular se puede configurar como contador de eventos externos, que entraran
por una de las patas, o contador de eventos internos, provenientes de los tiempos de instruccin.
Tambin puede programarse lo que se denomina prescaler, que es en realidad un divisor programable en 8 etapas que van desde 1:2 a 1:256. El registro usado para poder configurar los
tiempos es el TMR0, de 8 bits, lo que permite divisiones de hasta 256 en pasos de a 1. La mxima
divisin que obtendramos usando el prescaler y el registro es de 1:65536.
La salida es un bit (flag) del registro INTCON, denominado TMR01F (bit 2 del INTCON). Este
flag, que habitualmente est en 0, cambia a 1 cuando el registro TMR0 pasa del valor FFh a 00h
(OVERFLOW). Si se configuran las interrupciones, este temporizador puede generar en el overflow una interrupcin.
Timer uno (TMR1)
Las diferencias con el timer 0 son las siguientes: el prescaler tiene 4 rangos configurables de 1:1 a
1:8, el registro TMR1 pasa a ser de 16 bits, pudiendo cargarse en 2 partes como TMR1L y
TMR1H. El timer este no genera interrupciones y su cuenta mxima ser de 524288
Timer dos (TMR2)
Muy parecido a los otros dos, salvo por la estructura, que en este caso tiene un prescaler configurable entre 1 y 16 en tres pasos, el registro TMR2 de 8 bits y un postscaler configurable entre 1 y
3, tambin en tres pasos. Este Timer puede generar interrupciones y su cuenta mxima ser por
12288.
PORTA
Tiene 6 patitas configurables como entradas digitales o analgicas o salidas digitales, esto se realiza a travs del registro TRISA (bits 0 al 5) y se configuran con el ADCON1 en lo referente a
digitales/analgicas.

35

PORTB
Tiene 8 patitas configurables como entradas/salidas en ambos casos digitales. Se pueden habilitar
unas resistencias de pull up internas, con lo cual el estado lgico sin conexin al exterior sern
1s. Otra caracterstica muy interesante de este puerto es que las patitas RB7:RB4 se comparan en
cada instruccin con el valor anterior y, de haber cambios, puede generar una interrupcin.
PORTC
Compuesto de 8 patitas bidireccionales configurables. Este, a diferencia del anterior, no puede
generar interrupciones y a diferencia del PORTA las entradas/salidas son siempre digitales.
INTERRUPCIONES
Todos estos controladores tienen la capacidad de manejar interrupciones, si bien mucho ms simples que lo explicado para microprocesadores. El modelo que estamos estudiando acepta diez
causas de interrupcin, de las cuales slo nos dedicaremos a tres:
a) Cambios en las entradas de mayor peso en el puerto B (bits 7 a 4)
b) Overflow en el registro del Timer 0
c) Oiverflow en el registro del Timer 1
d) Overflow en el registro del Timer 2
El bit 7 del registro INTCON, denominado GIE (Global Interrupts Enable), habilita (en 1) las
interrupciones o las inhabilita (en 0), ms all de que estn habilitadas por los bits correspondientes a cada una de ellas. El controlador, cuando acepta una interrupcin, guarda el contenido del
PC (program counter) en una zona de memoria RAM e inhabilita las interrupciones cambiando
de valor a GIE; es decir que slo puede atender a una interrupcin por vez. Al volver del programa de atencin a la interrupcin con RETFIE, habilita nuevamente las interrupciones y carga el
PC con el valor guardado en memoria, as puede continuar con la ejecucin del programa principal.
Hay que tener presente que el controlador no guarda otros valores de registros que no sea el PC,
si el procesador necesita otros valores de configuracin o registros (sobre todo el W) que pudieron ser modificados por la subrutina de interrupcin, corresponde al programador incluir en esa
subrutina de atencin, loos pasos necesarios para guardar valores importantes del programa principal. Un ejemplo de las instrucciones necesarias para esta operacin est explicitada en el ejemplo de Tips & Tricks, ms adelante en este apunte.
Adems del GIE deben estar habilitados los flags correspondientes a cada una de las interrupciones que queramos atender:
a) Se habilita con el flag RBIE (bit 3 del INTCON)
b) Se habilita con TMR0IE (bit 5 del INTCON)
c) Se habilita con TMR2IF (bit 1 del PIR1)
Como el controlador tiene un solo vector de interrupciones (ubicado en 04h), desde esta direccin
debemos ir a una primera subrutina en la que determinaremos cul es el flag que nos indica la

36

causa de la interrrupcin y desde all redireccionar a la subrutina de atencin de esa interrupcin


en particular. La primera instruccin debe cambiar el flag de la interrupcin para evitar recursividad en la misma.
Alguien podra suponer que la rutina a ser atendida puede seguir a la direccin 04h y es cierto, lo
que sucede es que si por algn motivo hay que modificar esa rtuina, debe correrse todo el programa principal para hacer lugar a las instrucciones nuevas. Como la compilacin se hace con
direcciones absolutas hay que recompilar todo nuevamente.
Como regla general, para programar en assembler conviene dividir el problema en partes e ir implementando cada una con una subrutina de pocas instrucciones que probaremos y repararemos
ms fcil que encontrar el problema en un programa extenso. No siempre se puede, pero conviene
tratar de hacerlo. Una vez que se tienen las subrutinas probadas, el programa principal va llamando en el orden previsto a cada una de ellas para obtener un resultado (funcin) o para trabajar
variables o tiempos sin necesitar un resultado numrico (subrutinas).
SET DE INSTRUCCIONES Y ENSAMBLADOR (MicrochipASseMbler)
***En el Apndice A se puede ver la configuracin paso a paso del MPLab.
Un programa para este controlador tiene habitualmente tres partes.

La primera, que es la configuracin del ensamblador, tiene las siguientes instrucciones:

a) RADIX: le indica al ensamblador en qu tipo de numeracin se va a trabajar por defecto,


y pueden ser DEC, numeracin decimal, HEX, numeracin hexadecimal, o BIN, numeracin binaria. Lo normal es que el ensamblador entienda numeracin hexadecimal, si durante el transcurso del programa queremos poner valores en otra numeracin bastar anteponerle al valor las letras d, h o b, y el valor entre comillas simples.
b) ORG: le indica al ensamblador el nmero de la lnea en la que debe comenzar el programa. En estos controladores es comn encontrar la instruccin ORG 5, que significa que la
primera lnea de programa va a estar en la direccin 5, y esto a su vez, indica que el programa no va a usar las interrupciones cuyo vector est en la direccin 4 de memoria de
programa.
c) EQU: asigna a una etiqueta un valor que se tomar como la direccin de esa etiqueta. Es
cmodo asignarle a los registros ms usados la direccin que efectivamente tienen en
memoria para recordar solamente el nombre del registro en operaciones de lectura o escritura.
d) LIST: permite leer un archivo de texto cuya extensin debe ser .inc y que contiene todas
las asignaciones de registros y memoria libre para evitarnos el cometer errores de programacin.
e) START / END: es la instruccin de comienzo/finalizacin de una compilacin. Habitualmente ubicada antes/despus de las instrucciones del programa y subrutinas asociadas.
Debe aparecer una vez cada una en el programa fuente.

La segunda es el listado de instrucciones en el orden que se supone resolver el problema.

37

La tercera son las subrutinas o funciones asociadas al programa, las cuales empiezan con
una etiqueta que las identifica y terminan con algunas de las variantes de RETURN.

SET DE INSTRUCCIONES
Todas las instrucciones pueden tener una etiqueta (Label) que las identifique.
Las lneas del programa no necesitan numerarse.
f identifica una direccin de RAM (registro).
k se usa para denotar un valor explcito (literal).
b se usa para identificar un bit en particular.
d se usa para direccionar el resultado de una operacin. Por defecto, es 1, lo que indica que el
resultado se guardar en la direccin marcada por f (en el mismo registro que se usa para la
operacin); en el caso de ser 0, el resultado de la operacin se guardar en el registro de trabajo que denominaremos W.

38

ADDLW
Sintaxis
Operandos
Operacin
Flags
Descripcin

Sumar literal con w


Addlw k
0<=k<=255
(w)+k -> w
C; DC; Z
El contenido del registro w
se suma al literal k

ADDWF
Sintaxis
Operandos
Operacin
Flags
Descripcin

Sumar w con f
Addwf f,d
0<=f<=127 d= [0,1]
(w)+(f) -> destino (d)
C; DC; Z
El contenido del registrto
w se suma al contenido
de la direccin f

ANDLW

Multiplicacin lgica entre l


yw
Andlw k
0<=k<=255
(w).and.k -> (w)
Z
El contenido del registro w
es andeado con el literal k

ANDWF

Multiplicacin lgica
entre w y f
Andwf f,d
0<=f<=127 d= [0,1]
(w).and.(f) -> destino (d)
Z
El contenido del registro
w es andeado con el contenido de f

Sintaxis
Operandos
Operacin
Flags
Descripcin

BCF

Borrar un bit de la posicin f

Sintaxis
Operandos
Operacin
Flags
Descripcin

Bcf f,b
0<=f<=127 ; 0<=b<=7
0 -> (f<b>)

BTFSS
Sintaxis
Operandos
Operacin
Flags
Descripcin

Prueba un bit, salta si es 1


Btfss f,b
0<=f<=127 ; 0<=b<=7

CALL
Sintaxis
Operandos
Operacin
Flags
Descripcin

Llamada a su rutina
Call k [label]
0<=k<=2047
(pc)+1 -> tos
K -> pc
Guarda el contenido actual
del PC y pone el contenido

Pone a 0 el bit b del contenido en f

Si el bit b del registro en f es


0, se ejecuta la siguiente
instruccin; si es 1, salta una
instruccin

Sintaxis
Operandos
Operacin
Flags
Descripcin

BSF
Sintaxis
Operandos
Operacin
Flags
Descripcin

Poner en 1 un bit de la
posicin f
Bsf f,b
0<=f<=127 ; 0<=b<=7
1 -> (f<b>)
Pone a 1 el bit b del contenido en f

BTFSC
Sintaxis
Operandos
Operacin
Flags
Descripcin

Prueba un bit, salta si es 0


Btfsc f,b
0<=f<=127 ; 0<=b<=7

CLRF
Sintaxis
Operandos
Operacin
Flags
Descripcin

Borrar el contenido de f
Clrf f
0<=f<=127
00h -> (f)
Z
El contenido del registro
sealado por f pasa 00h

Si el bit b del registro en f


es 1, se ejecuta la siguiente instruccin; si es 0,
salta una instruccin

39

de k en el PC

40

CLRW

Borrar el contenido de w

COMF

Sintaxis
Operandos
Operacin
Flags
Descripcin

Clrw

Sintaxis
Operandos
Operacin
Flags
Descripcin

DECFSZ
Sintaxis
Operandos
Operacin
Flags
Descripcin

Decrementa f, salta si es 0
Decfsz f,d
0<=f<=127 d= [0,1]
(f)-1 -> (destino); salto si 0

INCF
Sintaxis
Operandos
Operacin
Flags
Descripcin

00h -> (w)


Z
El contenido del registro
sealado por w pasa 00h

Complementa el contenido de f
Comf f,d
0<=f<=127 d= [0,1]
(f)-1 -> destino
Z
Decrementa en 1 el contenido de f

GOTO
Sintaxis
Operandos
Operacin
Flags
Descripcin

Salto incondicional
Goto k [label]
0<=k<=2047
K -> pc

Incrementa contenido de f
Incf f,d
0<=f<=127 d= [0,1]
(f)+1 -> (destino)
Z
Se incrementa en 1 el contenido de f

INCFSZ
Sintaxis
Operandos
Operacin
Flags
Descripcin

Incrementa f, salta si es 0
Incfsz f,d
0<=f<=127 d= [0,1]
(f)+1 -> (destino)

IORLW
Sintaxis
Operandos
Operacin
Flags
Descripcin

Or inclusivo literal con w


Iorlw k
0<=k<=255
(w).or.k -> (w)
Z
El contenido del registro w
es oreado con el literal

IORWF
Sintaxis
Operandos
Operacin
Flags
Descripcin

Or inclusivo entre w y f
Iorlwf f,d
0<=f<=127 d= [0,1]
(w).or.(f) -> (destino)
Z
El contenido del registro
w se orea con el contenido de f

MOVF
Sintaxis
Operandos

Mueve el contenido de f
Movf f,d
0<=f<=127 d= [0,1]

MOVLW
Sintaxis
Operandos

Mueve un literal a w
Movlw k
0<=k<=255

El contenido del registro f


se decrementa en 1, si la
operacin da 0 salta una
instruccin.

Salta a la direccin indicada por el literal.

El contenido del registro f


se incrementa en 1, si la
operacin da 0 salta una
instruccin.

41

Operacin
Flags
Descripcin

(f)->(destino)
Z
El contenido del registro f
se mueve a otro destino

Operacin
Flags
Descripcin

k-> (w)

MOVWF

Mueve el contenido de w a
la direccin f
Movwf f
0<=f<=127
(w) -> (f)

NOP

No opera

Sintaxis
Operandos
Operacin
Flags
Descripcin

Nop

Sintaxis
Operandos
Operacin
Flags
Descripcin

RETFIE
Sintaxis
Operandos
Operacin
Flags
Descripcin

RLF
Sintaxis
Operandos
Operacin

Mueve el dato del registro w


a la posicin f

Retorna desde una interrupcin


Retfie
Tos -> pc

1 -> gie

Retorna desde una interrupcin, habilitando las interrupciones globales.

Girar a izquierda a travs


del acarreo (carry)
Rlf f,d
0<=f<=127 d= [0,1]
cc

registro

RETLW
Sintaxis
Operandos
Operacin
Flags
Descripcin

RRF
Sintaxis
Operandos
Operacin

El literal k se mueve al
registro w

Deja pasar un ciclo de


instruccin

Retorna desde una interrupcin con un valor en w


Retlw k
0<=k<=255
Tos -> pc k -> (w)
Retorna desde una interrupcin con un literal en
el registro w

Girar a derecha a travs


del acarreo (carry)
Rrf f,d
0<=f<=127 d= [0,1]
cc

registro

Flags
Descripcin

C
El contenido del registro f
es rotado un bit hacia la
izquierda usando el carry

Flags
Descripcin

C
El contenido del registro f
es rotado un bit hacia la
derecha usando el carry

RETURN

Vuelve de una rutina

SUBLW

Sintaxis
Operandos
Operacin
Flags
Descripcin

Return

Sintaxis
Operandos
Operacin
Flags
Descripcin

Resta el literal del contenido de w


Sublw
0<=f<=127 d= [0,1]
k-(w) -> (w)
C, DC, Z
Resta el literal del contenido de w y pone el resul-

42

Tos -> pc
Retorna al programa principal desde una subrutina

tado en w

43

SUBWF
Sintaxis
Operandos
Operacin
Flags
Descripcin

XORWF
Sintaxis
Operandos
Operacin
Flags
Descripcin

Resta el contenido de w del


registro f
Subwf f,d
0<=f<=127 d= [0,1]
(f)-(w) -> (destino)
C, DC, Z
Resta el registro sealado
por w del contenido en f

XORLW
Sintaxis
Operandos
Operacin
Flags
Descripcin

O exclusivo entre w y el
literal
Xorlw k
0<=k<=255
(w).xor.k -> (w)
Z
El contenido de w se xorea con el literal y el
resultado va a w

O exclusivo entre w y f
Xorwf f,d
0<=f<=127 d= [0,1]
(w).xor.(f) -> (destino)
Z
El contenido de w se xorea con el contenido de f y
el resultado va al destino

Esta traduccin puede (y de hecho arreglamos varios) tener errores. Conviene verificarlas antes
de ponerse de lleno a programar con ellas.

44

Ejemplo de un archivo de texto cuya denominacin debe ser p16F628.inc para configurar el
ensamblado.
LIST
; P16F628.INC Standard Header File, Version 1.01
Inc.
NOLIST

Microchip Technology,

; This header file defines configurations, registers, and other useful bits of
; information for the PIC16F628 microcontroller. These names are taken to
match
; the data sheets as closely as possible.
; Note that the processor must be selected before this file is
; included. The processor may be selected the following ways:
;
;
;
;
;

1. Command line switch:


C:\ MPASM MYFILE.ASM /PIC16F628
2. LIST directive in the source file
LIST
P=PIC16F628
3. Processor Type entry in the MPASM full-screen interface

;==========================================================================
;
;
Revision History
;
;==========================================================================
;Rev:
;1.01
;1.00

Date:
Reason:
13 Sept 2001 Added _DATA_CP_ON and _DATA_CP_OFF
10 Feb 1999 Initial Release

;==========================================================================
;
;
Verify Processor
;
;==========================================================================
IFNDEF __16F628
MESSG "Processor-header file mismatch.
ENDIF

Verify selected processor."

;==========================================================================
;
;
Register Definitions
;
;==========================================================================
W
F

EQU
EQU

H'0000'
H'0001'

45

;----- Register Files-----------------------------------------------------INDF


TMR0
PCL
STATUS
FSR
PORTA
PORTB
PCLATH
INTCON
PIR1
TMR1L
TMR1H
T1CON
TMR2
T2CON
CCPR1L
CCPR1H
CCP1CON
RCSTA
TXREG
RCREG
CMCON

EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU

H'0000'
H'0001'
H'0002'
H'0003'
H'0004'
H'0005'
H'0006'
H'000A'
H'000B'
H'000C'
H'000E'
H'000F'
H'0010'
H'0011'
H'0012'
H'0015'
H'0016'
H'0017'
H'0018'
H'0019'
H'001A'
H'001F'

OPTION_REG
TRISA
TRISB
PIE1
PCON
PR2
TXSTA
SPBRG
EEDATA
EEADR
EECON1
EECON2
VRCON

EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU

H'0081'
H'0085'
H'0086'
H'008C'
H'008E'
H'0092'
H'0098'
H'0099'
H'009A'
H'009B'
H'009C'
H'009D'
H'009F'

;----- STATUS Bits -------------------------------------------------------IRP


RP1
RP0
NOT_TO
NOT_PD
Z
DC
C

EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU

H'0007'
H'0006'
H'0005'
H'0004'
H'0003'
H'0002'
H'0001'
H'0000'

;----- INTCON Bits -------------------------------------------------------GIE

46

EQU

H'0007'

PEIE
T0IE
INTE
RBIE
T0IF
INTF
RBIF

EQU
EQU
EQU
EQU
EQU
EQU
EQU

H'0006'
H'0005'
H'0004'
H'0003'
H'0002'
H'0001'
H'0000'

;----- PIR1 Bits ---------------------------------------------------------EEIF


CMIF
RCIF
TXIF
CCP1IF
TMR2IF
TMR1IF

EQU
EQU
EQU
EQU
EQU
EQU
EQU

H'0007'
H'0006'
H'0005'
H'0004'
H'0002'
H'0001'
H'0000'

;----- T1CON Bits --------------------------------------------------------T1CKPS1


T1CKPS0
T1OSCEN
NOT_T1SYNC
TMR1CS
TMR1ON

EQU
EQU
EQU
EQU
EQU
EQU

H'0005'
H'0004'
H'0003'
H'0002'
H'0001'
H'0000'

;----- T2CON Bits --------------------------------------------------------TOUTPS3


TOUTPS2
TOUTPS1
TOUTPS0
TMR2ON
T2CKPS1
T2CKPS0

EQU
EQU
EQU
EQU
EQU
EQU
EQU

H'0006'
H'0005'
H'0004'
H'0003'
H'0002'
H'0001'
H'0000'

;----- CCP1CON Bits ------------------------------------------------------CCP1X


CCP1Y
CCP1M3
CCP1M2
CCP1M1
CCP1M0

EQU
EQU
EQU
EQU
EQU
EQU

H'0005'
H'0004'
H'0003'
H'0002'
H'0001'
H'0000'

;----- RCSTA Bits --------------------------------------------------------SPEN


RX9
SREN
CREN
ADEN
FERR
OERR
RX9D

EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU

H'0007'
H'0006'
H'0005'
H'0004'
H'0003'
H'0002'
H'0001'
H'0000'

;----- CMCON Bits ---------------------------------------------------------

47

C2OUT
C1OUT
C2INV
C1INV
CIS
CM2
CM1
CM0

EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU

H'0007'
H'0006'
H'0005'
H'0004'
H'0003'
H'0002'
H'0001'
H'0000'

;----- OPTION Bits -------------------------------------------------------NOT_RBPU


INTEDG
T0CS
T0SE
PSA
PS2
PS1
PS0

EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU

H'0007'
H'0006'
H'0005'
H'0004'
H'0003'
H'0002'
H'0001'
H'0000'

;----- PIE1 Bits ---------------------------------------------------------EEIE


CMIE
RCIE
TXIE
CCP1IE
TMR2IE
TMR1IE

EQU
EQU
EQU
EQU
EQU
EQU
EQU

H'0007'
H'0006'
H'0005'
H'0004'
H'0002'
H'0001'
H'0000'

;----- PCON Bits ---------------------------------------------------------OSCF


NOT_POR
NOT_BO
NOT_BOR
NOT_BOD

EQU
EQU
EQU
EQU
EQU

H'0003'
H'0001'
H'0000'
H'0000'
H'0000'

;----- TXSTA Bits --------------------------------------------------------CSRC


TX9
TXEN
SYNC
BRGH
TRMT
TX9D

EQU
EQU
EQU
EQU
EQU
EQU
EQU

H'0007'
H'0006'
H'0005'
H'0004'
H'0002'
H'0001'
H'0000'

;----- EECON1 Bits -------------------------------------------------------WRERR


WREN

48

EQU
EQU

H'0003'
H'0002'

WR
RD

EQU
EQU

H'0001'
H'0000'

;----- VRCON Bits -------------------------------------------------------VREN


VROE
VRR
VR3
VR2
VR1
VR0

EQU
EQU
EQU
EQU
EQU
EQU
EQU

H'0007'
H'0006'
H'0005'
H'0003'
H'0002'
H'0001'
H'0000'

;==========================================================================
;
;

RAM Definition

;
;==========================================================================
__MAXRAM
__BADRAM
__BADRAM
__BADRAM
__BADRAM

H'01FF'
H'07'-H'09', H'0D', H'13'-H'14', H'1B'-H'1E'
H'87'-H'89', H'8D', H'8F'-H'91', H'93'-H'97', H'9E'
H'105', H'107'-H'109', H'10C'-H'11F', H'150'-H'16F'
H'185', H'187'-H'189', H'18C'-H'1EF'

;==========================================================================
;
;

Configuration Bits

;
;==========================================================================
_BODEN_ON
_BODEN_OFF
_CP_ALL
_CP_75
_CP_50
_CP_OFF
_DATA_CP_ON
_DATA_CP_OFF
_PWRTE_OFF
_PWRTE_ON
_WDT_ON
_WDT_OFF
_LVP_ON
_LVP_OFF
_MCLRE_ON
_MCLRE_OFF

EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU

H'3FFF'
H'3FBF'
H'03FF'
H'17FF'
H'2BFF'
H'3FFF'
H'3EFF'
H'3FFF'
H'3FFF'
H'3FF7'
H'3FFF'
H'3FFB'
H'3FFF'
H'3F7F'
H'3FFF'
H'3FDF'

49

_ER_OSC_CLKOUT
_ER_OSC_NOCLKOUT
_INTRC_OSC_CLKOUT
_INTRC_OSC_NOCLKOUT
_EXTCLK_OSC
_LP_OSC
_XT_OSC
_HS_OSC
LIST

50

EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU

H'3FFF'
H'3FFE'
H'3FFD'
H'3FFC'
H'3FEF'
H'3FEC'
H'3FED'
H'3FEE'

Tips & Tricks


Transcribo a continuacin algunas subrutinas descriptas en las hojas de datos. Se supone que,
como estn escritas por el fabricante del controlador, funcionan bien y son eficientes en el uso de
los recursos.
El PC (program counter) de este controlador es de 13 bits y, como debe poder guardarse en RAM
(de 8 bits), se compone de dos partes: los 8 bits de menor peso se denominan PCL y los 5 restantes PCLATH. En programas cortos, alcanza con guardar slo el PCL y eso lo hace automticamente con el llamado a una subrutina. Si el programa es largo y existe la posibilidad de que estemos ubicados ms all de la posicin 128 de la memoria de programa (Flash en este caso), hay
que tomar el recaudo de guardar por nuestra cuenta los cinco bits adicionales. Esta subrutina tiene
en cuenta esta restriccin.
Guarda registros importantes cuando atiende a una interrupcin:
MOVWF
SWAPF
CLRF
MOVWF
MOVF
MOVWF
CLRF
..
.
.
MOVF
MOVWF
SWAPF
MOVWF
SWAPF
SWAPF
RETFIE

W_TEMP
STATUS, W
STATUS
STATUS_TEMP
PCLATH, W
PCLATH_TEMP
PCLATH

Copia W al registro TEMP


Transpone nibbles del reg. STATUS para guardar en W
Borra los bits de direccin de bancos. Se posiciona en B0
Copia el reg. STATUS en un registro STATUS_TEMP
Slo se requiere si el programa usa ms de un banco de m
Copia PCLATH en W
Banco de memoria 0
Instrucciones de la subrutina de atencin a la interrupcin

PCLATH_TEMP, W
PCLATH
STATUS_TEMP, W
STATUS
W_TEMP, F
W_TEMP, W

Copia PCLATH en W
Restaura el valor de PCLATH
Copia los bits del banco de m. usado en el progr. Ppal.
Se posiciona en el banco de memoria
Transpone nibbles del reg. W_TEMP
Reposiciona W al estado original
Retorna de la int. Activando las interrupciones globales

En esta subrutina deben haberse previsto registros usables de la RAM para ubicar los valores de
W , STATUS y PCLATH que aqu se denominaron W_TEMP , PCLATH_TEMP y STATUS_TEMP.
Subrutina de exploracin para conocer la causa de una interrupcin
BTFSC
CALL

INTCON, 1
INTE

BTFSC
CALL
BTFSC
CALL

INTCON, 2
TIMER
INTCON, 0
IPORTB

Si el flag de int. Externa es 1, brinca


INTE es una etiqueta que identifica la subrutina de atencin a las interrupciones externas
Si el flag de la int. Por timer est activada, brinca
Timer es la etiqueta que identifica a subr. De atencin
Flag que identifica una int. Por cambios en la puerta B
IPORTB es la etiqueta que identifica.

51

Comprobar igualdad o identificar desigualdad


Se usan dos registros en memoria denominados REG1 y REG2 para comprobar su igualdad o
eventualmente cul es mayor (o menor) que el otro.
MOVF
XORWF
BTFSC
CALL
MOVF
SUBWF
BTFSS
CALL
CALL

REG1, 0
REG2, 0
ESTADO, 2
IGUAL
REG1, 0
REG2, 0
ESTADO, 0
MAYOR
MENOR

REG1 se carga en W
REG1 xor REG2 y se carga en W
Si Z = 0 son diferentes y brinca
Si Z = 1 son iguales y llama a la subrutina IGUAL
REG1 se carga en W (puede tener cualquier valor)
Se opera como: REG1 REG2 y se carga en W
Si C = 0 REG2 > REG1 y brinca
Si C = 1 REG2 < REG1 y llama a MAYOR
Viene de C = 0 REG2 > REG1 y llama a MENOR

Subrutina para pasar a diferentes bancos de memoria


Parto de la base de que estn configuradas las variables STATUS (direccin del registro de estado), RP0 yRP1 (bits 5 y 6 del registro de estado). De acuerdo a las combinaciones de RP0 y RP1
estaremos trabajando en diferentes bancos de la RAM.
BANCO0

BANCO1

BANCO2

BANCO3

BCF
BCF
RETURN
BSF
BCF
RETURN
BCF
BSF
RETURN
BSF
BSF
RETURN

STATUS, RP0
STATUS, RP1
STATUS, RP0
STATUS, RP1
STATUS, RP0
STATUS, RP1
STATUS, RP0
STATUS, RP1

Pone a cero el bit 5 del reg. De estado


Pone a cero el bit 6 del reg. De estado
Retorna en el banco 0 de la RAM
Pone a uno el bit 5 del reg. De estado
Pone a cero el bit 6 del reg. De estado
Retorna en el banco 1 de la RAM
Pone a cero el bit 5 del reg. De estado
Pone a uno el bit 6 del reg. De estado
Retorna en el banco 2 de la RAM
Pone a uno el bit 5 del reg. De estado
Pone a uno el bit 6 del reg. De estado
Retorna en el banco 3 de la RAM

Teniendo escrita esta subrutina, cuando hay que cambiar de banco, se usar un llamado a alguna
de las entradas, por ejemplo CALL BANCO1.
Tablas
En el siguiente ejemplo se usa una tabla para que, dado un valor del 0 al 7 colocado en W, se obtenga el cdigo binario para prender un indicador de siete segmentos y nos muestre el valor que
haba en W. Los segmentos estn conectados desde la a hasta la g en patas consecutivas del puerto B comenzando con RB0 y hasta RB6. El punto decimal (dp) est cableado a la pata RB7.
Hacemos una tabla en papel para ver las equivalencias entre los valores a visualizar y los segmentos que
deben prender en esa condicin:

52

org 5

15
16
17
18 nada
19
20
21 display
22
23
24
25
26
27
28
29
30
31

movlw
call
movwf
goto

0x03
display
portb
nada

addwf
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw

pcl
0x3F
0x06
0x5B
0x4F
0x66
0x6D
0x7D
0x07
0x7F
0x6F

0x00..al..0x09
Decimal
0
1
2
3
4
5
6
7
8
9

PortB
0011 1111
0000 0110
0101 1011
0100 1111
0110 0110
0110 1101
0111 1101
0000 0111
0111 1111
0110 1111

Ninstr PC W
15
16 03

Wret
----

Hexa
3F
06
5B
4F
66
6D
7D
07
7F
6F
PortB
-----

La ventaja de este cdigo es su extrema simpleza, la desventaja (y muy importante) es que las
tablas que podemos usar son limitadas porque ocupan posiciones de memoria destinadas al programa. Si se requieren tablas ms largas hay que cablear una memoria ROM externa y usar direccionamiento indirecto, es decir que el cdigo se complica bastante y la rapidez tambin se ve
afectada.

53

Programa para multiplicar dos binarios sin signo de 4 bits


#include<p16f628.inc>
cant

equ

0x20

F1

equ

0x21

F2

equ

0x22

aux

equ

0x23
org

clrf

aux

movlw 0x04
movwf cant
movlw 0x07
movwf f1
movlw 0x06
movwf f2
swapf f2,f
sigue

54

movfw cant
btfsc

status,z

goto

termina

bcf

status,c

rlf

aux,f

rlf

f2,f

btfsc

status,c

call

suma

decf

cant,f

goto

sigue

suma

movfw aux
addwf f1,w
movwf aux
return

termina

goto

termina

end

Programa para dividir un binario de 8 bits por uno de 4 bits, sin signo
#INCLUDE<P16F628.INC>
numerador

equ

0x20

divisor

equ

0x21

indice

equ

0x22

resultado

equ

0x23

org

sigue

divide

movlw

0x5a

movwf

numerador

movlw

0x05

movwf

divisor

clrf

resultado

clrf

indice

incf

indice

movfw

divisor

subwf

numerador,0

btfsc

status,c

goto

correr

bcf

status,c

rrf

divisor

55

bcf

status,c

rrf

indice

btfsc

status,c

goto

termina

bcf

status,c

movfw

divisor

subwf

numerador,1

btfss

correr

termina

tatus,c

goto

divide

movfw

indice

addwf

resultado,1

goto

divide

bcf

status,c

rlf

divisor

bcf

status,c

rlf

indice

goto

sigue

goto

termina

end

Referencias bibliogrficas:
Microchip: PIC16F62X datasheet.

56

Apndice A
Configuracin del MPLab 8.3
Les prepar esta gua para que puedan configurar el MPLab como yo lo tengo configurado. No
quiere decir que sea la mejor ni la nica, pero funciona.
Se comienza por generar un nuevo proyecto con el ayudante (Project Wizard)

Fig. 2

La primera pantalla es
como la Fig.2, simplemente una confirmacin. En la siguiente
deberemos elegir el modelo de PIC, en nuestro caso el
16F628/872.
En la prxima seleccionamos la herramienta
para compilar, elegimos el MPASM (opcin
por defecto)
En la siguiente seleccionamos un disco, carpeta
y nombre para guardar el proyecto.

La siguiente sirve para agregar archivos al proyecto. Agregamos el P16F628.INC para usarlo
como encabezado (#include)

57

Finalizacin del wizard para generar el proyecto. Aceptamos para volver a la pantalla del
MPLab.

.
Por
defect
o,
habr
dos ventanas:
a) el contenido actual del proyecto donde
debe aparecer entre las carpetas la de
encabezado con el archivo INC elegido
antes y
b) la ventana Salida (output) que aparece
vaca.
Ir al men Project, Build options y elegir la solapa para
configurar el MPASM Assembler.
Tildar la opcin para deshabilitar la distincin entre maysculas y minsculas, de forma que si editamos el programa
con minsculas, el ensamblador reconozca el archivo de
encabezado que habitualmente est escrito en maysculas.
Verificar la opcin de que trabaje en hexadecimal por defecto.

Lo siguiente es elegir la herramienta para depuracin (debugger), tildamos MPLabSim.


Despus de esta eleccin debera aparecer una barra de herramientas que nos permitir compilar
y correr la compilacin, ejecutar instruccin por instruccin, colocar puntos de detencin, etc.; es
decir sern las herramientas de depuracin de nuestro programa (subrutina, funcin).
Lo que deberemos elegir a continuacin es la frecuencia del reloj para la simulacin: men Debugger (depuracin), Settings (configuracin), solapa
Osc/Trace: elegir la frecuencia en el valor que usaremos comnmente: 4 MHz. Se podra elegir la otra

58

opcin de frecuencia que es 37 KHz, dependiendo de nuestro diseo.


Ahora sigue configurar al
PIC, a travs de la palabra
de configuracin. Esta palabra puede estar definida en el
programa o aqu.
Esta palabra establece los
siguientes parmetros para el
funcionamiento del PIC:
a) El tipo de reloj (oscilador) que va a usar
(interno, externo, por cristal, etc.) Nosotros usaremos el RC interno porque no necesitamos una precisin extrema y no inutilizamos dos de las patas de E/S del PIC.
b) El timer denominado perro guardin lo usaremos deshabilitado
c) El timer de encendido tambin deshabilitado
d) Habilitaremos el borrado total en un reset.
e) No interesa el siguiente que es la deteccin de apagado
f) La siguiente opcin debe habilitarse para poder luego programar el PIC con tensiones
normales (de lo contrario hace falta mayor tensin para programarlo)
g) Deshabilitamos la proteccin de lectura de la EEPROM
h) Deshabilitamos la proteccin del cdigo del programa
Lo que sigue es quizs un poco engorroso, pero no se me ocurri hasta ahora una mejor forma
para hacerlo.
Conceptualmente se trata de agregarle el archivo de texto donde estar definido nuestro programa; el problema es que el editor de textos es accesible slo desde la aplicacin y no he encontrado la manera de que agregue este archivo a la carpeta archivos fuente (source files) del proyecto y debe estar all antes de ordenar la compilacin porque el compilador busca en esa ruta el archivo de texto cuya extensin es .ASM.
De modo que a seguir los pasos:
1) Llamar al editor
desde el men Archivos (File), nuevo (New). Aparecer una ventana
con el nombre untitled (sin ttulo).

2) Hay que darle


uno o dos
TABs y pondremos cualquier cosa, por
ejemplo la directiva para que use el encabezado que incluimos antes: #include<p16f628.inc>

59

3) Cerrar el editor, guardndolo con un nombre (mejor el del proyecto) y la extensin


.ASM. (muy importante)
4) Cerrar el proyecto confirmando que se quiere guardar todo el espacio de trabajo, para que
cuando lo abramos aparezcan las ventanas que estn ahora.
5) Abrir el proyecto, ir a
la carpeta source files, apretar botn derecho del mouse y seleccionar add files
(agregar archivo), buscar el archivo recin
guardado y abrirlo.
Deber aparecer dentro
de la carpeta seleccionada.

6) Hacer doble click en el archivo para abrirlo.


Fin del proceso de agregar archivo fuente.

Se abrir el editor junto con el archivo


guardado, deberamos ver que ahora
tiene los nmeros de lnea y ha cambiado el color del texto.
Estos colores indicarn si el precompilador entiende la sintaxis de
la instruccin que estamos poniendo.
Hay que tener en cuenta que la primer
columna de la izquierda est reservada para etiquetas (labels), la segunda
columna es para las instrucciones, la
tercera es para los argumentos que
necesitan las instrucciones y, eventualmente, la cuarta es para los comentarios; stos deben estar separados por el carcter ;.
Los comandos del pre-procesador (include, radix, org, equ, list, start/end) no deben estar en la
primera columna.

60

Escribir el programa como en un editor de texto comn usando TAB o SPACE para espaciar y
ENTER para cambiar de lnea.
Agregar END al final para avisarle al pre-procesador que ah termina la compilacin.

COMPILACIN:
Finalizada la edicin del programa hay que compilarlo haciendo click aqu

Aparecer una ventana de dilogo preguntando si quieren direcciones relativas o absolutas, responder absolutas. En la ventana salida (output) se ver el progreso de la compilacin, figurando
en primer lugar las advertencias (warning) y los errores. Hay que corregir los errores de sintaxis
hasta que slo aparezcan advertencias y la leyenda de compilacin exitosa (building succeeded). Las advertencias son generalmente porque faltaron argumentos en las instrucciones y el
compilador tom los valores que tiene por defecto o porque hay registros que estn ubicados en
bancos de memoria diferentes al cero y les avisa que ese registro est en el banco xx.
Si el programa funciona, quiere decir que las advertencias no tienen importancia.
Si el programa no funciona, comenzar a depurarlo verificando las advertencias que hizo el compilador. Si cambian algo del programa hay que compilarlo nuevamente.
Para correr el programa hay que hacer click ac

Si el programa no finaliza nunca, para pararlo hacer click ac

Para resetear el programa se usa este botn (debe estar previamente parado)

Para correr instruccin por instruccin

Para agregar puntos de parada

61

Depurar un programa sin ver el valor de los registros sera imposible, es por eso que el MPLab
tiene una cantidad de herramientas para poder echar un vistazo a lo que ocurre dentro del PIC a
medida que transcurre el programa. Veremos slo las que podran usar ms:
a) Men Ver, opcin Watch:
b) Men Ver, opcin Hardware stack
c) Men Ver, opcin EEPROM
d) Men Debugger, opcin StopWatch
Watch:
Abierta la ventana, conviene configurarla haciendo
click con el botn derecho del mouse, elegir
Properties, solapa Preferences y tildar la opcin
Expand SFR registers, esto permite ver cada
uno de
los bits (flags) que componen los registros del
PIC;
por ejemplo el registro de estado de la ALU
tiene
los flags que indican un desbordamiento (C),
si la
operacin dio cero (Z) o el banco de memoria
en
uso. Para no tener que decodificar el estado de
cada
uno de ellos desde el valor hexadecimal del
registro, con esta opcin se despliegan dentro del
registro que queramos cada uno de esos flags y el
valor
(0 o 1).
Una vez compilado, en la opcin add symbol
aparecen las variables que hayamos usado en
RAM
para el diseo de nuestro programa. La opcin
Add
SFR contiene los registros especiales como el de estado, el de trabajo y los puertos, entre muchos otros.
Esta es la ventana indispensable para la depuracin.
Hardware stack
Si tenemos problemas de lgica, habiendo usado varias llamadas a subrutinas, puede ser que hayamos olvidado algn RETURN y se est llenando la pila. En esta ventana podemos ver cada
una de las llamadas y si regresa o no de cada una de ellas.
EEPROM
Nos muestra el contenido de la memoria permanente de lectura/escritura y permite, adems, escribir en ella. Los valores que escribamos aqu sern puestos en el PIC cuando grabemos el programa en l.
StopWatch
Esta ventana nos muestra cuntos ciclos de instruccin (o tiempo) tard nuestro programa hasta
que par, sea esto porque termin o por una parada programada por nosotros con el smbolo B
rojo que vimos antes.

62

Existen otras herramientas de software para simular el uso de los PIC, algunas ms visuales, pero
como esta es gratuita y est hecha por el fabricante del PIC, me merece ms confianza que las
otras. Ahora resta que usen este software para acostumbrarse a las posibilidades que tiene y que
practiquen porque es una de las bases de la programacin.

63

You might also like