universidad nacional abierta ya distancia

Anuncio
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
PROGRAMA DE INGENIERIA ELECTRONICA
208006 – SISTEMAS EMBEBIDOS
OSCAR IVAN VALDERRAMA ARIAS
(Director Nacional)
JUAN CARLOS VESGA FERREIRA
Acreditador
SOGAMOSO
Diciembre de 2009
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
ASPECTOS DE PROPIEDAD INTELECTUAL Y VERSIONAMIENTO
El presente módulo fue diseñado en el año 2008 por el Ing. Armando
Portela Duarte, docente de la UNAD, y ubicado en el CEAD de Barranquilla, el Ing.
Portela es Ingeniero Electrónico.
El presente módulo ha tenido una actualización, echa en el año 2009 por el
Ing. OSCAR IVAN VALDERRAMA ARIAS, quien ha sido tutor de la UNAD en el
CEAD SOGAMOSO, desde año 2005 y que se desempeña actualmente como
director del cuso a nivel nacional.
Este mismo año el Ing. JUAN CARLOS VESGA FERREIRA, tutor del CEAD
Bucaramanga,
Coordinador
Nacional
Tecnología
e
Ingeniería
en
Telecomunicaciones, apoyó el proceso de revisión de estilo del módulo y dio
aportes disciplinares, didácticos y pedagógicos en el proceso de acreditación de
material didáctico desarrollado en el mes de ENERO de 2010.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
INTRODUCCIÓN
El presente curso sobre sistemas embebidos se trata de un curso metodológico al
cual le han sido asignados 3 créditos que de acuerdo al sistema de créditos
académicos, consistente en 144 horas de trabajo académico: 96 horas promedio
de estudio independiente y 48 horas promedio de acompañamiento tutorial
enmarcadas en un campo de formación disciplinario en áreas de la ingeniería
básica.
Con el curso se pretende que los estudiantes se adentren en el mundo de los
sistemas embebidos analizando sus características y capacidades, concentrando
el estudio en las herramientas de desarrollo tanto software como hardware
inherentes a este tipo de sistemas de manera que se familiaricen con los procesos
de diseño, programación y desarrollo de sistemas autónomos.
Los sistemas embebidos conforman un área de la electrónica en continuo
crecimiento y desarrollo, debido a la creciente demanda de sistemas autónomos y
aplicaciones “inteligentes”. Cada día son fabricados millones de circuitos
integrados, microprocesadores, microcontroladores etc. que a su vez serán
empleados en la fabricación de productos y equipos en una variedad de sectores
como por ejemplo aplicaciones militares, electrodomésticos, juguetes, en la
industria, el transporte, etc. La importancia de este curso radica en que se brindan
las herramientas al estudiante para que maneje de manera suficiente el diseño y
desarrollo de aplicaciones empleando estos dispositivos teniendo en cuenta que
día a día se requiere cada vez más de nuevas aplicaciones autónomas específicas
o la mejora continua de las existentes.
El curso de divide en tres unidades didácticas; 1ª Unidad: Conceptos Generales
sobre Sistemas Embebidos, en esta se realizará una introducción general sobre
los sistemas embebidos y sus principales características enfocando el estudio a
los microcontroladores 68HC08 de FreeScale (Motorola); 2ª Unidad: Desarrollo de
Software para Sistemas Embebidos, en esta unidad se sentarán las bases para la
programación de sistemas embebidos empleando tanto lenguajes de
programación de bajo (assembler) como de alto nivel enfocando el estudio al
lenguaje de programación C; 3ª Unidad: Sistemas Operativos Orientados a
Sistemas Embebidos, en esta unidad final se analizan los conceptos referentes a
sistemas operativos y su aplicación en sistemas embebidos enfocándose en el
sistema operativo embebed Linux.
Para el desarrollo del curso se procederá a introducir, a través de la plataforma,
los conceptos y problemáticas que se plantean al trabajar con sistemas
embebidos, el estudiante se encargará de analizar y ampliar estos contenidos con
una visión crítica durante su tiempo de estudio independiente de manera que
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
cualquier duda que resulte de este ejercicio pueda ser disipada por el tutor a
través de foros y cesiones de Chat previamente definidas. Debido a la naturaleza
de los contenidos se realizarán una serie de actividades y talleres tanto
individuales como en grupo, en los que se plantean problemáticas que sean
susceptibles de ser resueltas con el empleo de los sistemas embebidos en
conjunción con la aplicación práctica de los contenidos vistos, obteniendo así una
aplicación funcional. La evaluación de los contenidos dependerá de la activa
participación de los estudiantes en las diferentes actividades planteadas sumada a
las calificaciones automáticas de revisión de conceptos realizadas en línea.
Las temáticas planteadas en el presente curso a manera introductoria son de gran
relevancia puesto que los desarrollos que incluyen sistemas embebidos se
encuentran a la orden del día en cualquier tipo de aplicación por lo tanto
conforman un área de la electrónica muy interesante para enfocar estudios más
profundos.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
INDICE DE CONTENIDO
Unidad
Capítulos
Lecciones
1. Definición e Historia
1. Introducción a los
sistemas embebidos
2. Importancia y áreas de
aplicación
3. Características
4. Preconceptos
5. Fases de diseño
6. Diagrama de bloques de
un sistema embebido.
1. Conceptos
generales sobre
sistemas embebidos
7. Entradas: Sensores,
muestreadores y
2. Componentes principales conversores A/D.
de un sistema embebido 8. Comunicación
9. Unidades de
Procesamiento y Memoria
10. Salidas y conversores
D/A
11. Componentes de una
CPU
12. Arquitecturas más
comunes
3. Unidades centrales de
procesamiento
13. Comparación de los
dispositivos más comunes
14. Microcontroladores HC08
15. Microprocesadores
ColdFire y tarjetas de
desarrollo
1. Diagramas de flujo
2. Programación en lenguaje
Ensamblador (Assembler)
4. Introducción a la
programación de sistemas 3. Notaciones y sintaxis
embebidos
4. Tipos de instrucciones
5. Escribiendo un pequeño
programa
2. Desarrollo de
software para
sistemas embebidos
5. Prácticas básicas y
aplicaciones
6. Programación y puesta en
marcha
7. Modo de ejecución
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
8. Desarrollo de tarjeta de
programación universal
9. Software
10. Software Code Warrior
11.Generalidades de C
12. Fases de procesamiento
de un programa en C
6. Introducción a la
programación en C y
microcontrolador HC08
13. Ejemplos de manejo de
módulos del HC08
14. Programación en
Assembler del HC08
15. Programación en C del
HC08
1. Consideraciones sobre el
hardware
2. Conceptos generales
sobre sistemas operativos
7. Visión general
3. Componentes del sistema
operativo
4. Arranque de un programa
5. Memoria virtual
6. Visión general
7. Tipos de sistemas que
utilizan Linux embebido
3. Sistemas operativos
orientados a sistemas
embebidos
8. Sistema operativo
embedded Linux
8. Arquitectura genérica de
un sistema con Linux
embebido
9. Características del kernel
de Linux
10. Arranque del sistema
11. Metodología de diseño e
implementación
12. uCLinux
9. Implementación de
embedded Linux
13. Pasos básicos para
comenzar con uCLinux
14. Términos relacionados
15. Primeros pasos con
uCLinux
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
LISTADO DE TABLAS
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
LISTADO DE GRÁFICOS Y FIGURAS
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
UNIDAD 1
Nombre de la Unidad
Introducción
Justificación
Intencionalidades
Formativas
Denominación de
capítulos
Conceptos generales sobre sistemas embebidos
Estudio y discusión de algunos temas y conceptos
relacionados con sistemas embebidos.
Al estudiante del curso de sistemas embebidos es
necesario introducirlo en los conceptos básicos de los
sistemas embebidos.
 Reconocer los conceptos básicos de los sistemas
embebidos
 Reconocer los componentes básicos
 Reconocer los elementos básicos de la unidades
centrales de procesamiento
1. Introducción a los sistemas embebidos
2. Componentes principales de un sistema embebido
3. Unidades centrales de procesamiento
CAPITULO 1: INTRODUCCIÓN A LOS SISTEMAS EMBEBIDOS
Lección 1: Definición e Historia.
Los sistemas embebidos son sistemas computacionales aplicados, posiblemente
compuestos también por otro tipo de elementos mecánicos i/o electromecánicos,
aunque están constituidos por la unión hardware – software, se diferencian de
otros sistemas como por ejemplo los computadores personales por el hecho de
estar diseñados para cumplir funciones específicas. Es decir, un sistema
embebido puede pensarse como: “Un sistema cuya función principal no es
computacional, pero independientemente de esto es controlado por un
computador embebido en su interior”1 se entiende por embebido o empotrado
como “oculto” por tanto estos dispositivos de cómputo no son visibles ni
programables por el usuario final. Otro autor define el término con simpleza: “un
sistema embebido es un computador oculto en el interior de otro producto” 2.
A pesar de que se pueden tomar como ciertos los enunciados del párrafo
anterior, es complicado sentar una definición definitiva para los sistemas
embebidos, puesto que gracias al constante desarrollo tecnológico que ha influido
en el aumento de las prestaciones de los diferentes circuitos integrados y a su vez
en el incremento del nivel de integración y complejidad cada vez en espacios más
reducidos, sumando esto a la disminución de los costos de implementación por
economías de escala, se hace posible en la actualidad la existencia de pequeños
computadores (PDA´s, celulares, etc) que pueden realizar una gran cantidad de
aplicaciones y que por ser dispositivos integrados de tamaño reducido podrían
1
2
Wilmshurst Tim. Designing Embedded Systems with PIC Microcontrollers. Elsevier, 2007. p 3.
Sutter Ed. Embedded Systems Firmware Demystified. CMP Books. 2002. p 2.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
también ser clasificados como sistemas embebidos. Aunque existen discrepancias
entre diferentes autores en incluir o no este tipo de dispositivos en la clasificación
de sistemas embebidos.
Se observa que los microcontroladores de 8 bits dominan la mayoría de las
aplicaciones. Un microcontrolador es el núcleo de un sistema electrónico versátil,
de bajo coste y reducido tamaño que es capaz de detectar las señales de entrada
y generar las salidas de un determinado equipo, sistema o instrumento. Los
microcontroladores por su reducido tamaño y costo además del hecho de que son
los dispositivos semiconductores más abundantes de todos en la actualidad,
permiten la fácil implantación de sistemas con “inteligencia” distribuida a lo largo
de sistemas más complejos.
Durante los años 30 y 40‟s los primeros computadores fueron dedicados a tareas
muy definidas, además eran máquinas extremadamente grandes, costosas y
complicadas, tanto en implementación como en funcionamiento en comparación
de las prestaciones, tamaño y costo de los computadores actuales. Con el
transcurrir de los tiempos conceptos como Computadoras, Controladores Lógicos
Programables (PLC), etc. fueron evolucionando de los arreglos de dispositivos
electromecánicos secuenciados tradicionales, pasando por máquinas basadas en
tubos de vacío, llegando a sistemas más modernos y funcionales basados en
tecnologías de cómputo desarrolladas a partir de los avances en dispositivos de
estado sólido.
Figura 1. Vista superficial de un circuito integrado.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
El desarrollo de los sistemas embebidos tiene sus raíces en la invención del
circuito integrado, el desarrollo constante en el campo de la electrónica digital ha
dado lugar a dispositivos cada vez más complejos. Entre ellos los
microprocesadores y los microcontroladores, núcleos principales de cualquier
sistema embebido.
La historia de los microcontroladores inicia en el año 1969, un equipo de
ingenieros japoneses de la compañía BUSICOM llegó a Estados Unidos con una
idea, ellos deseaban usar para sus proyectos menos circuitos integrados de los
que se usaban en las calculadoras. La proposición se hizo a la compañía INTEL.
La solución propuesta presumía el desarrollo de circuito integrado cuyo
funcionamiento sería determinado por un programa almacenado en el mismo
dispositivo. Eso significaba que la configuración sería más simple, pero que
requeriría mucho más memoria de lo que requería el proyecto que propusieron los
ingenieros japoneses.
Después de un tiempo, aunque los ingenieros japoneses probaron soluciones más
sencillas, la idea propuesta por INTEL termino por ser implementada, entonces
nace primer microprocesador. Para transformar esta idea en un producto ya
fabricado, transcurrieron sólo 9 meses para lograr el éxito. INTEL obtuvo los
derechos para vender este "bloque integrado" en 1971. Primero, compraron la
licencia de la compañía BUSICOM, que no tenía idea del tesoro que poseían.
Durante ese año, apareció en el mercado un microprocesador que se llamó 4004,
este fue el primer microprocesador de 4 bits con velocidad de 6 000 operaciones
por segundo.
No mucho tiempo después de eso, la compañía americana CTC pidió a INTEL y a
la Texas Instruments que hiciera un microprocesador de 8 bits. Aunque después a
CTC no le interesó mas la idea, Intel y Texas Instruments siguieron trabajando en
el microprocesador logrando primero de abril de 1972 desarrollar el
microprocesador de 8 bits apareciendo en el mercado con el nombre de 8008.
Podía direccionar 16 Kb de memoria, con un set de 45 instrucciones y una
velocidad de 300.000 operaciones por segundo. Este microprocesador es el
predecesor de todos los microprocesadores de hoy. Intel mantuvo sus desarrollos
y saco al mercado el procesador de 8 bits bajo el nombre 8080, el cual podía
direccionar 64Kb de memoria, con 75 instrucciones, a un precio de 360 dlls por
unidad.
En otra compañía americana, Motorola, comprendieron rápidamente lo que estaba
sucediendo, así que ellos sacaron al mercado su microprocesador de 8 bits, el
6800 y junto con el procesador, Motorola fue la primera compañía en hacer otros
periféricos como el 6820 y el 6850. En ese momento muchas compañías
reconocieron importancia de los microprocesadores y empezaron sus propios
desarrollos.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Un evento muy importante tuvo lugar en la historia de microprocesadores en una
exhibición de WESCON en 1795 en Estados Unidos. La Tecnología MOS anunció
que estaba comercializando los microprocesadores 6501 y 6502 a 25 dlls. cada
uno, y que los compradores podrían adquirirlos inmediatamente. Esto era tan
extraordinario, que algunas personas creyeron que era una estafa, considerando
que los competidores estaban vendiendo el 8080 y el 6800 a 179 dlls. cada uno.
Intel y Motorola bajaron sus precios en el primer día de la exhibición como una
respuesta a su competidor, 69.95 por microprocesador.
Motorola reclama a la Tecnología de MOS el haberles copiado su 6800. La
Tecnología MOS suspende la fabricación del 6501, pero siguen produciendo el
6502. Los 6502 eran microprocesadores de 8 bits, 56 instrucciones y la capacidad
de direccionar 64Kb de memoria directamente. Para reducir el costo, el 6502 se
vuelve muy popular, así que se instala en las computadoras tales como: KIM-1,
Apple I, Apple II, Atari, Comodore, Acorn, Oric, Galeb, Orao, Ultra, y muchas otras.
Y muy pronto aparecieron varios fabricantes del 6502 (Rockwell, Sznertek, GTE,
NCR, Ricoh, y Comodore quienes toman la Tecnología MOS) el cual estaba en su
momento de apogeo y se vendía a una velocidad de 15 millones de procesadores
por año. Otros, sin embargo, no se rindieron. Federico Faggin deja Intel, y
empieza su propio Zilog Inc.
En 1976, Zilog anuncia el Z80. Durante la fabricación de este microprocesador,
Faggin toma una decisión giratoria. Sabiendo que ya se han desarrollado muchos
programas para 8080, Faggin sabia que muchos se quedarían fieles a ese
microprocesador. Así que decide diseñar un nuevo procesador que pueda ser
compatible con 8080, o que sea capaz de desarrollar todos los programas que ya
se habían escrito para el 8080. Además de estas características, se agregaron
muchas otras para que el Z80 fuera un microprocesador muy poderoso. Podía
direccionar 64 Kb de memoria, tenía 176 instrucciones, un gran número de
registros, una opción para refresco de memoria dinámica de la RAM, mayor
velocidad de trabajo etc. El Z80 fue un gran éxito y todos cambiaron del 8080 al
Z80. Puede decirse que el Z80 fue el microprocesador comercializado más exitoso
de ese tiempo. Además de Zilog, también aparecieron otros nuevos fabricantes
como Mostek, NEC, SHARP, y SGS. Z80 estaba en el corazón de muchas
computadoras como en Spectrum, Partner, TRS703, Z-3 etc.
En 1976, INTEL propone una versión mejorada del microprocesador de 8 bits, al
cual nombró 8085. Sin embargo, el Z80 era tan bueno que Intel perdió la batalla.
Aunque más procesadores aparecían en el mercado (6809, 2650, SC/MP etc.), ya
todo estaba decidido. Ya no había grandes mejoras departe de los fabricantes
para hacer algo nuevo, así que el 6502 y el Z80 junto con el 6800 permanecieron
como los representantes principales de los microprocesadores de 8 bits de ese
tiempo.
Con los avances hechos en microprocesadores se logró desarrollar computadoras
cada vez más poderosas versátiles y económicas lo cual además despertó el
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
interés en desarrollar sistemas computacionales aplicados a unas pocas tareas
específicas que agregarían eficiencia y economía a multitud de aplicaciones
específicas por ejemplo los controles por inyección electrónica para motores de
gasolina que redujeron en gran medida las emisiones de contaminantes. Fue
posible entonces construir equipos electrónicos que incluían además unos pocos
circuitos accesorios y un software implementado.
Los diseños electrónicos comenzaron a ser mucho más pequeños y simplificados,
los diseñadores de equipos electrónicos podían realizar mayor cantidad de tareas
en menos tiempo y el tamaño de los equipos se redujo considerablemente; sin
embargo, después de cierto tiempo apareció una nueva tecnología, llamada
microcontrolador que simplifico aun mas el diseño electrónico, al incluir en un
mismo encapsulado el núcleo microprocesador, la memoria y las entradas/salidas.
Un microcontrolador cuesta mucho menos que un circuito equivalente construido a
partir de circuitos integrados “comunes” y además es muy sencillo agregar o
modificar las prestaciones de un dispositivo construido con base en un
microcontrolador simplemente modificando su programa, sin tener que
reconfigurar la electrónica del sistema.
El desarrollo de microcontroladores lo inició la Texas Instruments al realizar su
modelo TMS1000 (1971) diseñado para propósitos de control y automatización,
fue el primer “computador en un chip” puesto que combinaba la existencia de un
MCU (Micro-computer Unit) con otro tipo de dispositivos de soporte como
memorias RAM, ROM, contadores, temporizadores e interfaces de entrada/salida
todos integrados en un solo chip de silicio.
Figura 2. Primera familia de microcontrolador TMS 1000.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
En 1976 Intel introdujo la familia de microcontroladores MCS-48 de 8 bits que
fueron los primeros microcontroladores que ganaron fama y un uso bastante
extendido, fueron integrados en teclados de computadoras personales. Después
de 4 años de continua investigación y desarrollo surge el Intel 8051, un
microcontrolador de 8 bits con memoria EPROM integrada muy comercial,
surgiendo también la familia de Motorola 68HCXX y una serie de fabricantes
incursionaron en el mercado con diferentes familias de microcontroladores, entre
las que se encentran: Hitachi 630x, Zilog Z8, Fairchild F8 (3850), Toshiba TLCS47, NEC V25, MOS Technology 6500.
Por otro lado en los años 70‟s también surgen los denominado circuitos o arreglos
de lógica programable que paralelamente son desarrollados como respuesta a la
necesidad de implementación de circuitos de propósito especifico en aplicaciones
de sistemas embebidos. Dado a los alcances del curso la investigación sobre este
tipo de dispositivos se deja a criterio del estudiante.
Lección 2: Importancia y áreas de aplicación.
Los sistemas embebidos son considerados como el área de aplicación de mayor
importancia de la tecnología de la información en el transcurso de los años
venideros gracias a esta expectativa que ha venido creciendo alrededor de estos
sistemas, surge un término conocido como la era post-PC, éste denota el hecho
de que en el futuro los computadores personales estándares se convertirán en los
sistemas hardware menos dominantes. Los desarrollos en software y hardware
serán empleados cada vez en sistema más pequeños en muchos casos invisibles
al usuario en el orden de facilitar al máximo el empleo de los diferentes productos.
En la actualidad el número de microprocesadores embebidos en un producto
determinado excede la cantidad de los que se pueden encontrar en computador
personal, se espera que esta tendencia continúe en incremento a tal punto que se
predice a manera de ley de Moore, que “para muchos productos en el área de
electrónica de consumo la cantidad de código empleado será doblada cada dos
años”. [Vaandrager, 1998]3.
Este aumento vertiginoso tanto de aplicaciones como en complejidad para los
sistemas embebidos resulta en necesidades de diseño de tecnologías que
soporten el desarrollo de los mismos. Por ejemplo aun es necesaria la mejora
continua tanto de los lenguajes de programación como de las diferentes
herramientas de desarrollo, desarrollar técnicas de diseño e implementación más
óptimas enfocadas en soportar las constantes variaciones y mejoras que se
requieren en las diferentes aplicaciones.
3
Marwedel Peter. Embedded System Design. Springer. 2006. p 9.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
La intencionalidad es entonces que el estudiante se empape de los conceptos y
técnicas actuales que envuelven el desarrollo de sistemas embebidos para que
entre a detectar las falencias y posibles mejoras que puedan ser aportadas en la
optimización del diseño y desarrollo de estos sistemas.
Las aplicaciones de los sistemas embebidos se pueden clasificar básicamente en
los siguientes sectores:
Audio, Automotor, comunicaciones (alambricas y móviles), computadores y
periféricos, control de movimiento, edificios inteligentes, electrónica de consumo,
Industrial, imagen y video, Medico, Militar y aero-espacial, procesamiento digital de
señales, robótica, seguridad, sistemas de autenticación, sistemas de propósito
general y misceláneo.
Se deja la tarea para los estudiantes la investigación de ejemplos de aplicaciones
específicas para los diferentes sectores.
Lección 3: Características.
Los sistemas embebidos son en su mayoría sistemas reactivos es decir que su
funcionamiento depende de la continua interacción con un determinado ambiente
el cual determina las posibles respuestas del sistema, para tal efecto se emplean
determinados sensores o transductores que miden variables físicas y son
convertidas en señales estándar que puedan ser entendidas por el sistema ante
las cuales realizan algún tipo de respuesta empleando distintos tipos de
actuadores dependiendo de la aplicación. Entre las diferentes características que
pueden poseer tenemos:
Confiabilidad:
Una de las principales características que deben cumplir los sistemas embebidos
es la confiabilidad, la implementación de un sistema confiable debe ser
considerada desde un comienzo, no puede dejarse en segundo plano,
dependiendo de la aplicación este aspecto puede llegar a ser primordial, por
ejemplo en aplicaciones aero-espaciales o médicas es imperante la necesidad de
evitar el porcentaje de fallas al máximo. La confiabilidad de un sistema embebido
se mide analizando los siguientes aspectos:



Confiabilidad en el tiempo (Reliability): mide la probabilidad de que el
sistema trabaje correctamente en un instante dado que funciona en el
instante t = 0.
Mantenibilidad, (Maintainability): probabilidad que el sistema vuelva a
trabajar correctamente d unidades de tiempo después de una falla.
Disponibilidad (Availability): probabilidad que el sistema esté funcionando
en el tiempo t, para que esto se dé la confiabilidad y mantenibilidad deben
ser altas.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Seguridad personal: es la propiedad en la que dado el caso de una falla, el
sistema no causará daño.
Seguridad informática: comunicación efectiva, confidencial y autenticada
(encriptación).
Eficiencia:
Otra característica que deben cumplir los sistemas embebidos es la eficiencia en
diferentes aspectos como en el manejo de la energía suministrada, tamaño
reducido del dispositivo, tamaño reducido del código que gobierna el sistema,
minimización del peso, y sobre todo reducir los costos para su producción masiva.
Tiempo Real:
El término tiempo real se refiere a la reacción “inmediata” del sistema ante
estímulos externos predefinidos ya sea que provengan del objeto de control o
mediante interfaces de usuario. Donde se entiende por inmediato a un lapso de
tiempo lo suficientemente corto como para que se dé el correcto funcionamiento
del sistema, una reacción correcta pero tardía no es aceptable. Existen las
llamadas restricciones de tiempo real “duras” (Hard restriction) en las que su
incumplimiento puede resultar en catástrofe. Otro tipo de restricción de tiempo se
puede considerar como blanda (Soft restriction).
Interfaces de usuario:
La mayoría de los sistemas embebidos poseen alguna manera de interactuar con
el usuario como pantallas gráficas, botones, teclados alfanuméricos, sensores, etc.
Lección 4: Preconceptos.
Para abordar la temática del presente curso el estudiante de ingeniería electrónica
debe manejar previamente una serie de conceptos que ha aprendido durante el
transcurso de su carrera, entre los cuales tenemos:
-
Nociones Matemáticas y Físicas.
Electrónica Análoga.
Sistemas Digitales.
Informática y Nociones de Programación.
Lección 5: Fases de diseño.
Existen diferentes formas de abordar el diseño y desarrollo de sistemas
embebidos, es importante seguir ciertas pautas de trabajo y tener en cuenta
factores muy diversos para que el diseño pueda terminarse a tiempo y funcione
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
correctamente, por razones prácticas se observará un enfoque general que puede
ser aplicado en el desarrollo de cualquier sistema embebido. Para tal efecto se
parte analizando la siguiente figura.
Figura 3. Diagrama de flujo general para el diseño de sistemas embebidos.
La metodología desplegada en la figura 3 se encuentra dividida en cuatro fases
principales que van desde la concepción de la idea hasta el funcionamiento final
del dispositivo diseñado y sientan las bases para:



Diseñar un dispositivo libre de defectos de manufactura, que funciona de
manera adecuada y se integra con el sistema.
Diseñar el dispositivo de manera eficiente, sin malgastar recursos ni tiempo.
Planificar el diseño de manera eficiente, crear un cronograma razonable y
asignar los recursos necesarios para las diferentes tareas de manera
ordenada.
Toda actividad de diseño comienza con la identificación y especificación de una
problemática a resolver tomando en consideración los requerimientos software y
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
hardware, esta especificación es muy importante para definir bien los límites de lo
que se quiere implementar. A partir de la especificación se puede definir una
arquitectura con los diferentes componentes que implementan cada función del
sistema. Para el diseño se debe definir el funcionamiento de cada uno de esos
componentes.
Una especificación completa debería comprender los siguientes puntos:









Diagrama en bloques del sistema externo, que muestra como y donde
encaja el dispositivo dentro de un sistema completo.
Diagrama de bloques interno que muestra los principales bloques
funcionales del dispositivo a implementar.
Descripción de las entradas/salidas, incluyendo, interfaces lógicas,
eléctricas, de adquisición y protocolos de comunicación.
Estimaciones de tiempos que se deben cumplir, incluyendo tiempos de
"setup" y "hold" para las entradas/salidas y frecuencias de reloj.
Estimación de la del dispositivo dependiendo del número de elementos
electrónicos necesarios para su implementación.
Especificación física del dispositivo. Tamaño, empaquetamiento,
conectores, etc.
Estimación del consumo de potencia del dispositivo.
Precio estimado del dispositivo.
Procedimientos definiendo el banco de pruebas para la verificación y
validación para el dispositivo.
Después de escribir las especificaciones es importante hacer una revisión con
todos los miembros del equipo. De esta revisión podrán surgir aspectos relevantes
que no fueron tenidos en cuenta individualmente incorporándolos a las
especificaciones. La especificación también incluye la metodología de verificación
del dispositivo o banco de pruebas. Estas muchas veces se dejan para el final del
proyecto y no se definen ni llevan a cabo de manera adecuada.
La especificación es un documento que se presta para ser modificado de acuerdo
con los cambios de requerimientos y a medida que se tiene más información sobre
el proyecto. Una vez que se escribe la especificación se puede utilizar para
seleccionar componentes y tecnologías que se utilizarán para el proyecto.
El proceso de diseño es en general un ciclo, e incluye varios pasos intermedios
como la verificación del diseño que engloba varios pasos menores, y al revisar
pueden surgir detalles que obligan a volver a realizar pasos anteriores.
Dependiendo del dispositivo y tecnología utilizada, pero en general se siguen los
siguientes pasos:
Simulación: es en general un proceso continuo, ya que al simular se pueden
encontrar problemas que hacen volver sobre el diseño y hacer cambios. Las
simulaciones se hacen sobre pequeñas partes del sistema y sobre el sistema
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
completo. Se debe llevar a cabo una simulación funcional, pero también puede
incluir simulaciones de temporizado, consumo de potencia y otros parámetros.
Revisión: En este paso se revisan los resultados de la simulación y se analiza el
comportamiento del dispositivo.
Una vez que se ha quedado satisfecho con el comportamiento del diseño en las
simulaciones se lleva a cabo la implementación física final del dispositivo. En este
punto se verifica la implementación física para asegurarse que su funcionamiento
coincide con las simulaciones hechas anteriormente. En este paso se deben
también evaluar los tiempos, consumo de potencia y cualquier otro parámetro de
importancia.
Si todos los pasos se siguieron correctamente la revisión final debería ser solo una
formalidad. Se verifica que el dispositivo está listo para ser entregado o integrado
a un sistema dado.
La integración y verificación en el contexto del sistema general es muy importante.
Si los pasos se siguieron correctamente, cualquier modificación que surja de esta
integración será en general pequeña y no requerirá grandes cambios. Cualquier
problema o falla que se encuentre debe documentarse y ser analizada así como
los diseños en sí tanto del hardware como del software del dispositivo, para poder
hacer mejoras y/o correcciones en una próxima versión del dispositivo a partir de
esta completa documentación.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
CAPITULO 2: COMPONENTES PRINCIPALES DE UN SISTEMA EMBEBIDO
Lección 6: Diagrama de bloques de un sistema embebido.
Figura 4. Diagrama de bloques de un sistema embebido, Editado de (Designing
Embedded HW)
Los sistemas embebidos más sencillos emplean microcontroladores como
elemento de procesamiento con la ventaja de que el procesador incorpora muchas
de las características y funcionalidades de un computador en un solo integrado, en
la figura 4 se presenta un sistema embebido genérico. La diferencia radica en las
capacidades de estos dispositivos puesto que su CPU (Unidad Central de
Proceso) es mas reducida, poseen una cantidad menor de memoria tanto RAM
como ROM y algunos elementos de Entrada Salida (E/S) que pueden ser
observados en la figura como bloques o subsistemas, éstos le agregan las
funcionalidades requeridas al procesador para diversidad de aplicaciones. Ver
figura 4.
A continuación se analizan rápidamente los diferentes componentes de la figura 4,
para luego entrar a describir de manera mas profunda cada uno de los bloques.
Para comenzar tenemos los dispositivos de E/S (I/O Input-Output en Ingles), los
más comunes son los puertos de E/S digital, normalmente llamados de propósito
general o GPIO (General Purpose I/O), estos puertos se pueden configurar por
software, pin por pin, como entradas o salidas digitales, como entradas se suelen
emplear para leer el estado de interruptores, pulsadores o leer estados digitales de
otro dispositivo. Como Salidas éstos pueden ser empleados para encender o
apagar relés u otros dispositivos o para transportar un estado lógico a otros
dispositivos. Usados conjuntamente tanto entradas como salidas se puede
sintetizar e implementar un protocolo dado para comunicarse con otro integrado.
La mayoría de los microcontroladores poseen otros subsistemas aparte del los
puertos de E/S pero tienen la característica de poder ser convertidos al puertos
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
GPIO si las funcionalidades de estos subsistemas no son requeridas, este hecho
añade gran versatilidad para el uso de microcontroladores en una aplicación dada.
En la figura 4 se observan también un bloque con entradas análogas permitiendo
recibir y muestrear señales provenientes de sensores que miden señales de
diferentes tipos, para propósitos de grabación o simplemente se puede monitorear
señales de voltaje para asegurar el correcto desempeño de un sistema.
Los puertos seriales habilitan al dispositivo para interconectarse con un
computador personal, un módem, otro sistema embebido o de pronto con una red,
existen formas especializadas de comunicación serial conocidas como SPI i I2C,
que proveen una manera simple de expandir las capacidades y funcionalidades de
los microcontroladores, a través de éstas se puede interconectar periféricos como
relojes/calendarios, memorias externas, sensores con interfaces digitales entre
otras.
Los contadores y temporizadores son utilizados para generar interrupciones
internas, regular intervalos para diferentes tareas que se puedan estar ejecutando,
generar señales de reloj para controlar la operación y sincronización de
dispositivos externos, pulsos de control para motores, alternativamente también
pueden ser utilizados para contar pulsos provinentes de otros dispositivos.
Algunos dispositivos incluyen también interfaces de red como puertos USB,
Ethernet o CAN.
Los microcontroladores más completos también incluyen buses de datos trayendo
los buses de direcciones internas para el control y manejo de datos hacia el
mundo exterior, esa funcionalidad le agrega al microcontrolador una gran
versatilidad para la interconexión de una vasta variedad de posibles periféricos de
manera muy similar a lo que lo haría un procesador convencional.
Existe una amplia variedad de microcontroladores (en el orden de los miles,
provenientes de docenas de fabricantes), con capacidades y subsistemas que
varían dependiendo de la aplicación para la cual serán empleados.
Lección 7: Entradas: Sensores, muestreadores y conversores A/D.
Los dispositivos de entrada de los sistemas embebidos juegan un papel primordial
para agregar la funcionalidad requerida ya que gracias a estos el dispositivo de
procesamiento puede entrar a interactuar con el mundo exterior mediante la
obtención de las diferentes señales y datos empleados para su procesamiento y
posterior respuesta o señal de salida.
1. Sensores:
Son dispositivos que al interactuar con alguna variable física normalmente
generan una señal análoga continua proporcional a la magnitud de la variable
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
medida, aunque existen también sensores que entregan información digital. Los
sensores pueden ser diseñados para medir virtualmente cualquier variable física,
peso, aceleración, corriente eléctrica, diferencias de potencial, temperatura
presión, proximidad, movimiento, sensores para medir variables en sustancias
químicas, entre muchos otros.
El diseño y desarrollo de sensores de diversos tipos en las últimas décadas a
posibilitado en gran medida el desarrollo de sistemas inteligentes en muchos
infinidad campos.
2. Muestreadores:
El termino computador digital implica que éste trabaja en el dominio de tiempo
discreto, esto quiere decir que solo puede procesar información discreta en
instantes de tiempo definidos, por lo tanto para que un procesador pueda
manipular señales provenientes de un sensor que entrega información
continuamente (señales análogas) primero debe convertirse estas señales en el
domino del tiempo continuo al dominio de tiempo discreto, éste es el propósito de
los muestreadores, en la fig. 5 se presenta un ejemplo típico de un circuito para
este propósito y la correspondiente señal muestreada.
Figura 5. Circuito de muestreo.
Como se aprecia en la figura el circuito consta esencialmente de un transistor en
cuya base es aplicada una determinada señal de reloj y un condensador. El
transistor básicamente actúa como un interruptor que permite que el condensador
se cargue con el valor del voltaje de entrada Ve (señal análoga) en instantes
definidos por la señal de reloj, el voltaje en el condensador permanecerá
virtualmente sin cambio hasta que el interruptor sea serrado de nuevo. Los
valores almacenados en el condensador se pueden considerar como un elemento
discreto de valores Vx generados a partir de la señal de entrada Ve.
Para que esto sea posible se debe asegurar que el circuito tenga la característica
de poder cambiar el valor de la carga del condensador casi de manera
instantánea, en la práctica lo que ocurre es que el transistor demora un tiempo
suficiente para que el condensador se cargue o descargue y la carga en el
condensador corresponderá al voltaje promedio de entrada durante este periodo.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
3. Conversores A/D:
Siguiendo con el esquema de trabajo digital se tiene que una vez se han tomado
muestras de la señal de entrada en tiempos discretos, estas señales pueden
tomar infinidad de valores en un determinado rango, es decir siguen siendo
señales análogas, el paso a seguir es convertir los valores análogos de entrada a
valores discretos, esta tarea es realizada por los conversores A/D (Análogo a
Digital).
La conversión a digital se realiza en dos fases: cuantización y codificación.
Durante la primera se toma la señal muestreada y a cada uno de los diferentes
niveles o variaciones de voltajes que contiene la señal analógica original se asigna
un valor o nivel de voltaje discreto que depende de la resolución (porción más
pequeña de señal que produce un cambio apreciable en la salida) del conversor,
en este punto la señal pasa a tomar valores discretos en un rango definido de
valores, aproximados a los de la señal original, el valor cuantificado se codifica en
binario en una palabra digital, cuyo número de bits depende de las líneas de salida
del conversor A/D.
Existen diferentes métodos de conversión A/D que varían dependiendo de la
velocidad y la resolución requerida a continuación se expondrá dos esquemas de
conversión representativos para comprender los mecanismos de conversión. Una
conversión A/D directa es realizada empleando un conversor A/D FLASH (FLASH
A/D Converter), éste está conformado por un arreglo de comparadores, cada uno
de los cuales tienen dos entradas (+ y -). Si el voltaje en la entrada positiva excede
el voltaje de referencia en la entrada negativa, la salida de dicho comparador
corresponderá con un valor lógico „1‟ en caso contrario o cualquier otro caso el
valor a la salida del comparador será „0‟ Ver fig. 6.
Figura 6. Esquema del Conversor A/D FLASH.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Se observa de la figura 6 que el valor de referencia de cada una de las entradas () de los comparadores corresponde a un divisor de voltaje a partir de un valor de
referencia estándar, éste enmarca el rango de los posibles valores de entrada que
el conversor puede codificar. El codificador genera valores digitales
correspondientes a la entrada Vx identificando la salida „1‟ más significativa,
siendo el caso en que Vx > Vref, el máximo valor de salida posible independiente
de que tanto excede Vx a Vref en magnitud.
En el caso de que Vx es menor que Vref pero mayor que
3
4
Vref, entonces el
comparador mas significativo (el de mas arriba) genera un „0‟ a la salida y el
siguiente si generará un „1‟ entonces el codificador entregará el valor digital para el
segundo valor mas largo del conversor y así sucesivamente.
Otro esquema de conversión utilizado es el llamado conversor de aproximaciones
sucesivas, el proceso de conversión para este tipo de convertidores se basa en la
realización de comparaciones sucesivas de manera descendente, hasta que se
encuentra la combinación que iguala la tensión entregada por el D/A y la de
entrada, consiste como se puede apreciar en la figura 7 en un comparador en
cuya terminal positiva se encuentra la señal de entrada Vx, en esencia el
funcionamiento de este conversor es la de generar valores binarios en el bloque
lógico de control almacenándolos en el registro de aproximaciones sucesivas, la
operación inicia asignando „1‟ al bit mas significativo de este registro y a los demás
se les asigna „0‟, este valor se introduce al conversor Digital/Análogo (D/A) para
generar un nivel de voltaje análogo correspondiente al valor binario generado, este
voltaje es enviado terminal negativo del comparador.
Figura 7. Esquema del Conversor de Aproximaciones Sucesivas. (editado de
embedded system design)
Si la magnitud de Vx es mayor que la de la señal generada en el conversor D/A se
conserva el valor „1‟ en el registro más significativo, de otra forma se asigna a este
bit un valor „0‟, este proceso se repite con el siguiente bit y así sucesivamente.
Las ventajas de este esquema es la eficiencia del Hardware, la desventaja es la
velocidad puesto que la identificación de cada valor de entrada (Vx) no es
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
instantánea, puesto que para cada valor se requiere que el conversor realice una
serie de aproximaciones antes de encontrar el valor adecuado.
Lección 8: Comunicación.
Los diferentes datos manejados en un sistema embebido deben estar disponibles
para ser comunicados a través de diferentes canales, los canales son entidades
abstractas caracterizadas por propiedades esenciales de los sistemas de
comunicación como la capacidad máxima de transferencia de información y
parámetros de ruido, existen además técnicas y teorías de comunicaciones que se
emplean para hallar la probabilidad de errores en la comunicación pero estos son
temas de otro curso.
Para que exista la comunicación se requiere de un medio físico por el cual se
propagara la información entre los que se tienen medios cableados, medios
ópticos (Fibra óptica), medios inalámbricos (medios de radiofrecuencia, infrarrojos,
etc.).
1. Requerimientos:
Existe una variedad de requerimientos para que se dé la comunicación entre
sistemas embebidos entre los que se tienen los siguientes:
Comportamiento en tiempo real:
En muchas de las aplicaciones es imperante la comunicación inmediata entre los
sistemas como en el caso de procesos industriales de control y automatización en
cambio existen otras en las que no es tan primordial este hecho como en el caso
del Ethernet.
Eficiencia:
Este requerimiento tiene su sentido económico en la implementación de la
comunicación entre diferentes sistemas embebidos por lo tanto es necesario el
desarrollo de diseños eficientes para la conexión de diferentes componentes de un
sistema de control y sus componentes externos.
Ancho de banda apropiado:
Los requerimientos de ancho de banda pueden variar dependiendo de la
aplicación no obstante normalmente es importante evitar al máximo retrasos en la
comunicación, no obstante se debe evitar hacer demasiado costoso el sistema
implementado.
Robustez:
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Dependiendo de la aplicación los sistemas embebidos pueden encontrarse en
ambientes con temperaturas elevadas e interferencias electromagnéticas, los
sistemas deben poseer la suficiente robustez para mantener una comunicación
confiable.
Tolerancia a Fallas:
Es necesario que los sistemas se recuperen de fallas de comunicación de forma
rápida, deben existir mecanismos para reintentar la comunicación en caso de
fallas, no es aceptable el reinicio del sistema como en el caso de los
computadores.
Privacidad:
Este requerimiento se realiza en caso de que se necesite privacidad en la
comunicación, para tal efecto existen diferentes técnicas de encriptación.
2. Métodos de transmisión cableada.
Estos métodos son empleados para lograr la suficiente robustez eléctrica de las
señales transmitidas entre los diferentes integrados de un sistema dado, uno de
los métodos es conocido como señalización de terminal simple (single-ended
signaling) o asimétrica, en éste las señales se propagan a través de un solo cable
(ver figura 8).
Figura 8. Señalización de terminal simple o asimétrica.
El otro terminal se conecta a un nivel de referencia, normalmente se conecta a
tierra; las señales que llevan la información están representadas por diferencias de
potencial con respecto a la referencia. La ventaja de éste método es que una sola
referencia sirve para diferentes señales asimétricas, la principal desventaja es la
susceptibilidad al ruido externo, la información puede ser fácilmente afectada por
interferencias de tipo electromagnético.
Otro método se conoce como señalización diferencial o simétrica, en éste se
requiere un par de hilos por cada señal (ver figura 9).
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Figura 9. Señalización
design).
diferencial o simétrica (editado de embedded system
La señal es codificada de manera que si el voltaje del primer hilo al llegar al
comparador es positivo con respecto al segundo entonces se trata de un „1‟ en
caso contrario se trata de un „0‟. Normalmente cada par de hilos viene entorchado,
es decir, cada par se entrelaza para mantener estable las propiedades eléctricas a
lo largo de toda la longitud de los hilos, reduciendo así, las interferencias creadas
por elementos adyacentes.
Algunas ventajas de este método de transmisión consisten en que el ruido
normalmente se añade de igual forma a ambos hilos y es eliminado casi en su
totalidad en la entrada del comparador, además el valor lógico de la señal solo
depende de la polaridad, no de la magnitud, ya que esta puede variar por factores
como la distancia y la resistencia del hilo y este hecho no afecta la señal
decodificada, no se requiere la existencia de tierras comunes puesto que se trata
de señales diferenciales por lo tanto para comunicar grandes cantidades de
dispositivos por este método no es necesario implementar tierras de mayor
calidad.
La señalización diferencial es empleada por ejemplo en la implementación de
redes basadas en Ethernet.
Lección 9: Unidades de procesamiento y Memorias.
Unidades de procesamiento
Para abordar el tema de procesamiento de información se tendrán en cuenta los
ASIC (Aplication-Specific Integrated Circuit), los dispositivos de lógica programable
y los procesadores. Estas tecnologías presentan un desempeño distinto hablando
del número de operaciones que pueden desempeñar con respecto a su consumo
de energía, siendo primeros en desempeño los ASIC, los segundos son los
dispositivos de lógica programable y por último los procesadores, en contra
prestación los procesadores son los más flexibles en lo que a programación
software se trata, los dispositivos de lógica programable presentan cierta
flexibilidad y los ASIC no son nada flexibles.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
1. ASIC (Aplication-Specific Integrated Circuit)
Los ASICs son circuitos diseñados y desarrollados para aplicaciones específicas
por lo tanto una vez desarrollados no pueden ser modificados, a diferencia de
otros dispositivos como los microcontroladores concebidos para propósitos de uso
general, un ejemplo de este tipo de dispositivos puede ser un integrado diseñado
específicamente para manejar la modulación en un teléfono celular.
Los ASICs son costosos tanto de diseñar como de fabricar pero si la aplicación
requiere un uso realmente eficiente de la energía, procesamiento a una velocidad
superior y además si el mercado se encuentra dispuesto a afrontar los costos o el
producto final se presta para ser vendido en grandes producciones entonces se
justifica su empleo.
Con los avances en la miniaturización y en las herramientas de diseño, la
complejidad máxima, y por ende la funcionalidad, en un ASIC ha crecido desde
5.000 puertas lógicas a más de 100 millones. Los ASIC modernos a menudo
incluyen procesadores de 32-bit, bloques de memoria RAM, ROM, EEPROM y
Flash, así como otros tipos de módulos. Este tipo de ASIC frecuentemente es
llamado Sistema en un Chip, o SoC (System on a Chip), por sus siglas en inglés.
Los diseñadores de ASIC digitales usan lenguajes descriptores de hardware
(HDL), tales como VERILOG o VHDL, para describir la funcionalidad de estos
dispositivos
2. Dispositivos de Lógica programable.
Existen aplicaciones en donde no se justifica el costo de emplear ASICs, por el
costo de desarrollo o por la existencia de un mercado reducido para dicha
aplicación, aunque tampoco es suficiente el empleo de aplicaciones basadas en
software (Microprocesadores), por velocidad o consumo de energía. Los
dispositivos de lógica programable representan una buena solución, si los
algoritmos son implementados de manera eficiente las aplicaciones desarrolladas
pueden llegar a ser tan rápidas como un ASIC, La gran diferencia radica en que la
funcionalidad de éstos puede cambiar por medio de la reprogramación del
dispositivo.
Gracias a las características intrínsecas de los dispositivos de lógica programable,
éstos se pueden emplear en aplicaciones de prototipado rápido, permitiendo los
correspondientes ciclos de diseño, prueba y depuración, obteniendo así un
dispositivo que se comportará de forma similar al sistema final, así no cumpla con
los requisitos de espacio y consumo de potencia deseables, normalmente estos
prototipos se toman como punto de partida para desarrollar aplicaciones finales.
3. Procesadores.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
La ventaja principal de estos dispositivos es su flexibilidad, ya que el
comportamiento del sistema embebido puede cambiarse por completo solo
cambiando el software que rige el sistema, estos cambios se realizan con la
intención de corregir errores de diseño, realizar actualizaciones, mejoras o añadir
funciones al sistema. En esencia es esta la razón de la gran popularidad de estos
dispositivos.
Los procesadores para sistemas embebidos deben ser eficientes, no se necesita
que su set de instrucciones sea compatible con el de un procesador para PC de
hecho se trata de arquitecturas diferentes, por lo tanto manejan un set de
instrucciones mas reducido, a continuación se analizan las diferentes
características que deben tenerse en cuenta para lograr la eficiencia.
Eficiente manejo de la energía: para tal efecto las diferentes variedades de
procesadores abordan el tema empleando diversas técnicas en las que se tiene en
cuenta la operación del sistema, es pues como el sistema puede pasar a modos
de bajo consumo suspendiendo la operación de relojes internos, bloqueando las
salidas o suspendiendo por completo las actividades internas, dado el caso de que
el procesador entre en periodos de inactividad o marcha lenta.
Tamaño de Código: es muy importante minimizar el tamaño del código de los
programas que gobiernan el funcionamiento del procesador por el hecho de que
los procesadores para sistemas embebidos generalmente no cuentan con discos
duros y además la capacidad de las memorias con las que se cuenta normalmente
es reducida, también hay que tener en cuenta que cada comando y ciclo de
ejecución extra requiere un consumo de potencia y como se vio en anteriormente
es necesario mantener un consumo eficiente de energía.
Tiempo de ejecución eficiente: dependiendo de la aplicación se puede requerir que
el sistema embebido ejecute alguna función con limitantes de tiempo extremas sin
la necesidad de emplear elevadas frecuencias de operación, para tal motivo las
arquitecturas pueden ser optimizadas para ciertas aplicaciones, como en el caso
de los DSP (Digital Signal Processor). O se puede ir más allá y desarrollar lo que
se conoce como procesadores de sets de instrucciones específicos. ASIPs
(Application Specific Instruction Set Processor).
Memorias.
Las memorias son dispositivos electrónicos empleados para almacenar
información (datos) y software (programas) con las que el dispositivo de
procesamiento interactúa. Contienen en su interior una tabla que almacena
información en cada uno de sus compartimentos.
1. Funcionamiento.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Como toda tabla, es preciso saber dos de sus dimensiones: el tamaño de cada
uno de sus elementos y el número de elementos de los que dispone.
Normalmente, las memorias convencionales almacenan la información en
elementos de tamaño 1 byte (8 bits). Por lo tanto una memoria se puede ver como
una tabla que contiene un determinado número de bytes. Los elementos de esta
tabla están numerados con números naturales comenzando por el cero. El número
correspondiente a cada una de los elementos se denomina “dirección de memoria”
y se suele representar de forma abreviada por el símbolo “@”. Al conjunto de
números que representan las direcciones de una memoria se le denomina su
“espacio de direcciones”. A manera de ejemplo, la figura 10 ilustra la estructura,
contenido y direcciones de una memoria RAM.
Figura 10. Estructura de la memoria RAM.
Una computadora de 8 bits con 10 líneas de dirección ve a la memoria como una
columna continua de 1024 (ó 2 a la 10) valores de 8 bits. La dirección de la primer
posición de memoria es 00 0000 0000 (2) y la de la última es 11 1111 1111 (2). La
dirección de diez bits se expresa normalmente como dos números de 8 bits que se
vuelcan en cuatro dígitos hexadecimales. En notación hexadecimal, el rango de
estas direcciones va desde $0000 a $03FF.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
El acceso a los datos internos de la memoria viene determinado por el tamaño de
sus celdas o elementos. Tal y como está estructurada, la memoria no ofrece
acceso directo a cualquiera de sus bits, sino que es preciso primero obtener un
byte y posteriormente acceder al bit pertinente. Los procesadores incluyen en su
lenguaje máquina las instrucciones necesarias para poder manipular los bits de un
byte. Si se quiere, por tanto cambiar un bit de un byte de memoria se debe leer el
byte entero, utilizar instrucciones para cambiar su valor, y escribirlo de nuevo en
memoria.
El tamaño de la memoria se mide en múltiplos que no siguen las reglas
convencionales de multiplicación por potencias de 10 sino por potencias de 2. Así,
un kilobyte son 210 bytes o 1024 bytes. Las unidades de medida del tamaño de
memoria así como sus exponentes y los prefijos de su nomenclatura se presentan
en la Tabla 1.
Tabla 1. Unidades de almacenamiento de información en bytes
Prefijo Símbolo Potencia
kilo
K
210
mega
M
220
giga
G
230
tera
T
240
peta
P
250
exa
E
260
zetta
Z
270
yotta
Y
280
Los chips de memoria pueden ser organizados de dos formas o esquemas por
palabras o por bits. En el esquema de organización por palabras se almacenan
por completo nibbles (4 bits), bytes (8 bits), o palabras de un tamaño determinado
son almacenadas en un mismo componente, mientras que en el esquema de
organización por bits, cada bit de una palabra dada se encuentra localizado en un
dispositivo distinto. (ver figura 11)
Figura 11. Dispositivos organizados por bits de 8x1 y organizados por palabras
de 8x8.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Internamente las memorias son implementadas por un conjunto de transistores
diseñados de tal forma que pueden almacenar información. La unidad responsable
de almacenar un bit de información se denomina “celda”. Un chip de memoria no
es más que un circuito que contiene un determinado número de celdas en cuyo
interior se almacena un bit.
EL funcionamiento de la memoria es similar al método utilizado para ordenar la
correspondencia en una oficina postal, a cada byte o palabra de datos se le es
asignada una dirección única y a cada dirección corresponde un solo espacio de
almacenamiento en la memoria. El proceso para almacenar la información en la
memoria se da de la siguiente forma: la unidad de procesamiento envía al
dispositivo la dirección para los datos, el controlador de la memoria encuentra la
ubicación adecuada, por último, el procesador envía los datos a escribir en dicha
dirección o posición de memoria.
La lectura de la información se realiza mediante un proceso semejante: El
procesador envía a la memoria la dirección de los datos solicitados, El controlador
de la memoria encuentra los bits de información contenidos en dicha dirección,
posteriormente los envía al bus de datos al procesador. (ver figura 12). Además
de los buses de dirección y datos el procesador debe notificar a la memoria el tipo
de operación que se va a realizar, para tal efecto deben añadirse las
correspondientes líneas de control que dependen del tipo de memoria y de la
implementación realizada.
Figura 12. Esquema de conexión Unidad de Procesamiento – Memoria
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Normalmente las memorias se encuentran disponibles con la interfase paralela
estándar (bus de datos y direcciones), también se pueden encontrar en interfaces
seriales, existe una variedad de dispositivos que cuentan con interfaces como la
I2C (Inter-IC) o la interfaz SPI (Serial Peripheral Interface) que son protocolos
estándar empleados para la comunicación con diferentes dispositivos, este tema
será tratado en capítulos posteriores.
2. Almacenamiento de datos.
La estructura que ofrece la memoria normalmente es la organización de sus
elementos en bytes. Por tanto, para almacenar los datos que manipula un
procesador es imprescindible saber de antemano su tamaño. El tamaño de
algunos datos básicos viene definido por la arquitectura del propio procesador. Por
ejemplo, el lenguaje máquina de algunas arquitecturas contiene instrucciones
máquina para operar enteros de 32 bits. Esto no quiere decir que el procesador no
pueda manejar enteros de otros tamaños, sino que el dispositivo manipulará estos
de forma mucho más rápida y eficiente. Números de otros tamaños pueden ser
manipulados igualmente pero con un costo mayor en tiempo de ejecución.
Los lenguajes de programación de alto nivel como Java, C o C++ definen un
conjunto de datos denominados “básicos” y un conjunto de mecanismos para
definir datos complejos en base a ellos. Como los programas escritos en estos
lenguajes deben ejecutar en diferentes equipos con diferentes procesadores, es
difícil definir el tamaño de los datos tal que se ajuste a todos ellos. El compilador
se encarga de transformar las operaciones escritas en lenguaje de alto nivel en las
instrucciones más adecuadas para manipular los datos en el procesador
pertinente. La tabla 2 muestra los tipos de datos básicos definidos en C y C++ así
como su tamaño.
Tabla 2. Tipos de datos básicos en el lenguaje C y C++
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Tipo
Tam. Dígitos de
Bits precisión
Rango
Min
Max
Bool
8
0
0
1
Char
8
2
-128
127
signed char
8
2
-128
127
unsigned
char
8
2
0
255
short int
16
4
-32,768
32,767
unsigned
short int
16
4
0
65,535
Int
32
9
-2,147,483,648
2,147,483,647
unsigned
int
32
9
0
4,294,967,295
long int
32
9
-2,147,483,648
2,147,483,647
unsigned
long int
long long
int
32
9
0
4,294,967,295
64
18
-9,223,372,036,854,775,808
9,223,372,036,854,775,807
unsigned
long long
int
64
18
float
32
6
1.17549e-38
3.40282e+38
double
64
15
2.22507e-308
1.79769e+308
long double 96
18
3.3621e-4932
1.18973e+4932
0 18,446,744,073,709,551,615
La regla para almacenar datos en memoria es utilizar tantos bytes como sean
necesarios a partir de una dirección de memoria. En adelante, la posición a partir
de la cual está almacenado un dato se denominará su dirección de memoria. De
forma análoga, cuando se dice que un dato está en una posición de memoria lo
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
que significa es que está almacenado en esa posición y las siguientes que se
precisen.
3. Métodos de direccionamiento.
Generalmente (aunque no necesariamente) una instrucción consta de una parte
de operación y una de dirección, la parte de dirección puede contener la dirección
de un operando utilizado en la ejecución de la instrucción. En otras ocasiones la
parte dirección de la instrucción puede no contener la dirección donde se
encuentra el operando, sino otra dirección donde se encuentra la dirección del
operando. En los diferentes sistemas se emplea una amplia gama de modos de
direccionamiento de los que se consideran algunos a continuación:

DIRECTO. El operando se encuentra en alguno de los registros internos de
la CPU o en la memoria principal. En el direccionamiento directo, la
instrucción indica el registro o la dirección de memoria absoluta que
contiene el operando o donde se debe almacenar el resultado de una
operación.

INDIRECTO. El operando se encuentra en la memoria principal del sistema.
La dirección de memoria de este operando no es dada directamente por la
instrucción, sin embargo, ésta informa del registro o posición de memoria
donde se encuentra almacenada la dirección del operando. En algunos
procesadores, se soportan operaciones tales como post-incremento, postdecremento, pre-incremento, pre-decremento en el valor almacenado en el
registro de direcciones o en la memoria que contiene la dirección del
operando.

RELATIVO. En este caso el operando está en memoria principal, es decir,
por fuera de la CPU. La dirección del operando ha de ser calculada como la
suma del contenido de cierto registro con un valor de desplazamiento.
Normalmente el registro actúa como apuntador. El valor del desplazamiento
va en el formato de instrucción como un valor constante. En el
direccionamiento relativo la parte dirección de la instrucción contiene el
número N. En memoria la dirección del operando se encuentra sumando el
numero N al número del contador del programa.

INDEXADO. Permite tomar un registro interno que le será sumado al
registro base para calcular la dirección de memoria donde se encuentra el
operando. Algunas CPUs permiten tener un valor de desplazamiento, el
cual está almacenado en el formato de instrucción. En el direccionamiento
indexado como en el relativo, la parte dirección de la instrucción contiene
un número N que puede ser positivo o negativo. Sin embargo para utilizar el
direccionamiento indexado, el computador debe estar equipado con un
registro especial empleado para permitir direccionamiento indexado, y
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
denominado naturalmente registro índice. La posición de memoria donde se
localiza el operando se encuentra mediante la suma I + N.

REGISTRO INDIRECTO. Algunos computadores que incorporan la facultad
del direccionamiento de registro indirecto tienen un registro especial, a
menudo llamado registro (P). Este registro contiene la dirección de memoria
del operando. Una instrucción que invoque realmente direccionamiento de
registro indirecto no tiene bits significativos en su parte dirección. En lugar
de ello, la instrucción completa se incluye en los bits asignados a la parte
de operación de la instrucción. Una instrucción típica que use un registro de
direccionamiento indirecto debería especificar "cargar" el acumulador con el
operando localizado en la dirección de memoria dada en el registro (p).

INMEDIATO. En el direccionamiento inmediato, la parte de dirección de la
instrucción contiene no la dirección del operando sino el mismo operando.
Se usa cuando el operando es un valor constante. El tamaño o cantidad de
bits para este operando depende de la cantidad reservada en el formato de
instrucción.

INHERENTE. Ordinariamente una dirección que es parte de una instrucción
se refiere a una posición de memoria. Cuando una instrucción indica una
fuente o un destino de datos y no se direcciona específicamente, ya no se
hace referencia a la posición de memoria, se dice que la instrucción tiene
una dirección inherente.
Lección 10: Salidas y Conversores D/A.
Para las salidas de los sistema embebidos se emplean dispositivos tanto análogos
como digitales, para el caso de dispositivos análogos, las salidas digitales deben
pasar primero por los correspondientes conversores Digital a Análogos (D/A).
Entre los elementos de salida que normalmente son empleados en sistemas
embebidos tenemos:
1. Elementos de Visualización.
Estos son de gran importancia para los sistemas embebidos, son empleados para
desplegar información relevante al usuario, dependiendo de la aplicación pueden
desplegar señales medidas, operaciones, servir de interfaz para la programación
de determinados dispositivos, entre otros.
Existe una gran variedad de dispositivos de visualización gracias al continuo
desarrollo tecnológico en esta área, los más comunes son los displays de 7
segmentos o alfanuméricos fabricados a partir de leds, También se encuentra en
el mercado matrices de leds displays de cristal líquido, llegando a desarrollarse
pantallas táctiles que pueden servir para interactuar directamente con el sistema,
los últimos desarrollos e investigaciones en el tema han arrojado una nueva
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
tecnología conocida como displays orgánicos, a diferencia de tecnologías como
LCD que requieren de luz trasera o Backlight, éstos generan su propia iluminación.
2. Dispositivos electromecánicos.
Estos son actuadores que modifican su entorno, puede tratarse de relays,
motores, electroimanes, cerraduras electromecánicas, electro-válvulas, bobinas,
servomecanismos etc. En muchos casos las señales de control hacia este tipo de
dispositivos debe pasar por una etapa de potencia para evitar el deterioro del
dispositivo de control.
Conversores D/A.
Un conversor Digital a Análogo se encarga, como su nombre lo dice, de convertir
señales digitales en señales analógicas (Corriente Voltaje o carga eléctrica).
Todos los conversores D/A poseen entradas digitales provinentes de buses de
microprocesadores, SPI o I2C, y pueden proveer uno o más canales de salidas
análogas.
Este tipo de conversores se utiliza en reproductores de sonido de todo tipo, dado
que actualmente las señales de audio son almacenadas en forma digital (por
ejemplo, MP3 y CDs), y para ser escuchadas a través de los parlantes, los datos
se deben convertir a una señal analógica. Los conversores digital-analógico
también se pueden encontrar en reproductores de CD, reproductores de música
digital, tarjetas de sonidos de PC, etc.
Como se trata del proceso inverso a la conversión A/D se puede pensar en los
valores digitales discretos a la entrada de conversor, como números obtenidos a
partir de un proceso de muestreo, que se actualizan constantemente en intervalos
determinados por la correspondiente frecuenta de muestreo, obteniéndose a la
salida del conversor voltajes (normalmente) que son una función lineal de dichos
números de entrada. Dado que a cada instante se actualizan los números, la
salida del conversor se mantiene constante entre conversiones, cambiando
automáticamente el voltaje dependiendo del valor digital de cada entrada, esta
operación genera una señal constante por partes (ver figura 13).
Figura 13. Señal de salida de un conversor D/A.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Por su puesto la señal reconstruida no posee las mismas características en el
dominio de la frecuencia que la señal original. Los conversores Digital a Análogo
(D/A) no son dispositivos muy complejos, entre la variedad de esquemas que
existen para la conversión D/A a continuación se expone uno de los más
comunes. En la figura 14 se puede observar el esquema de un conversor D/A
básico de 4 bits.
Figura 14. Conversor D/A.
Este conversor consta de una red de resistencias conectadas a la entrada
negativa de un amplificador operacional configurado como sumador, la tensión de
referencia es introducida por medio de diferentes conmutadores de entrada los
cuales se cierran dependiendo del valor de la entrada digital. Es de tener en
cuenta que los valores de las resistencias varían desde la del bit más significativo
que es la de menor valor, doblándose por cada bit hasta llegar al bit menos
significativo, LSB (Less Significant Bit).
El incremento en la tensión de salida del conversor D/A se presenta por la acción
que tienen las resistencias de las entradas sobre la resistencia de realimentación
del circuito amplificador; la tarea de la red de resistencias es asignar niveles de
voltaje adecuados a la entrada del amplificador. La acción del amplificador
operacional es graduar o ajustar la tensión analógica de salida de acuerdo con
una tabla de correspondencia definida para el conversor, teniendo en cuenta
obviamente el valor de las entradas binarias y la configuración de la red de
resistencias.
Para que este conversor D/A sea preciso hay que tener en cuenta que:
Los valores de resistencia deben ser bastantes precisos.
La tensión de alimentación también debe ser precisa.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
CAPITULO 3: UNIDADES CENTRALES DE PROCESAMIENTO
En el presente capítulo se analizarán diferentes unidades o núcleos de
procesamiento y sus componentes, con la intención de llegar a obtener un
entendimiento básico de las estructuras que forman parte de las diversas
arquitecturas disponibles para así compararlas, justificando el enfoque del curso al
emplear de microcontroladores en especial los HC08 de Motorola como
dispositivos para la correspondiente asimilación y aterrizaje del bagaje teórico
adquirido en los primeros capítulos, también para la realización de las diferentes
prácticas del presente curso.
Lección 11: Componentes de una CPU.
En la siguiente figura se presenta un diagrama de bloques simple para una unidad
de procesamiento en el que se puede apreciar los diferentes componentes que
serán explicados de una forma más amplia a lo largo del presente capitulo.
Figura 15. Diagrama de bloques simple de una unidad de procesamiento.
1. Unidad Aritmético Lógica
La Unidad Aritmético-Lógica (UAL) o ALU (Arithmetic and Logical Unit) como su
nombre lo indica es la encargada de realizar operaciones aritméticas y lógicas
sobre operandos que provienen de la memoria principal y que pueden estar
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
almacenados de forma temporal en algunos de los registros de diversos
propósitos que hacen parte de la propia unidad.
Existen deferentes tipos de ALU dependiendo de la aplicación para la cual se
encuentran especializadas; las hay especializadas en operaciones con números
enteros o en operaciones con números en punto flotante, entre otros.
2. Registros.
Un registro es una memoria de alta velocidad y poca capacidad, integrada al
microprocesador, que generalmente permite guardar y acceder a valores muy
utilizados en operaciones matemáticas. Los registros son la manera más rápida
que tiene un sistema de almacenar datos, su capacidad se mide generalmente por
el número de bits que almacenan; por ejemplo, un "registro de 8 bits" o un "registro
de 32 bits". Generalmente son implementados en un banco de registros,
antiguamente se usaban flip flops individuales, memoria SRAM u formas de
almacenamiento aun más primitivas.
Los registros pueden ser directamente indexados como operandos de una
instrucción, como esta definido en el set de instrucciones. También existen
muchos otros registros que son empleados con propósitos específicos, por
ejemplo el contador de programa.
2.1. Tipos de registros.
Registros de datos: son empleados para guardar números enteros. En algunas
computadoras antiguas, existía un único registro donde se guardaba toda la
información, llamado acumulador.
Registros de memoria: se emplean para guardar exclusivamente direcciones de
memoria. Eran muy usados en la arquitectura Harvard, ya que muchas veces las
direcciones tenían un tamaño de palabra distinto que los datos.




Registros de propósito general GPRs: (General Purpose Registers) pueden
guardar tanto datos como direcciones. Son fundamentales en la
arquitectura Von Neumann. La mayoría de dispositivitos modernos usa
GPRs.
Registros de punto flotante: se empelan para guardar datos en formato de
punto flotante.
Registros constantes: tienen valores creados por hardware de solo lectura.
Registros de propósito específico guardan información específica del
estado del sistema, como el puntero de pila, el registro de estado, el
contador de programa, el registro de instrucción, entre otros.
3. Unidad de Control
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
La unidad de control es la parte de la unidad de procesamiento encargada de leer
las instrucciones en lenguaje de máquina almacenadas en la memoria principal,
además genera las señales de control necesarias para el manejo y coordinación
del resto de las unidades funcionales de un determinado sistema con el fin de
ejecutar las instrucciones leídas. La unidad de control está conformada por:

Contador de programa o PC (Program Counter): es un registro interno del
microprocesador en el que se almacena la dirección de la instrucción que
se está ejecutando. De esta manera, la unidad de procesamiento conoce
cuál es la siguiente instrucción que debe ejecutar. El PC va
incrementándose dependiendo del tamaño de las instrucciones, esto se
mide en espacios de memoria y puede aumentar valores como 1, 2, 3, …
también puede pasar que la instrucción que se ejecute en ese instante
cambie el flujo del programa, saltando a otra dirección distinta.

Registro de instrucción: Al igual que el PC, el registro de instrucción forma
parte de la unidad de control y contiene la instrucción que se está
ejecutando en cada momento.

Decodificador de instrucciones: Se encarga de decodificar la instrucción
para interpretar el tipo de instrucción a ejecutar que se encuentra en el
registro de instrucción, las instrucciones pueden ser de suma,
multiplicación, comparación, entre otros.

Reloj Interno: Señal de reloj a una frecuencia específica que marca cada
ciclo de ejecución del procesador, este junto con otros elementos que
dependen de la arquitectura le proporcionan la velocidad característica a
cada dispositivo.

Secuenciador: Encargada de generar señales de control para la ejecución
de una instrucción que se ha decodificado previamente y comparado con
las instrucciones disponibles de la CPU que se encuentran almacenadas en
una Memoria ROM de la misma CPU.
4. Unidad de Ejecución o Datapath
Es un elemento de la CPU que realiza operaciones y cálculos invocados por
programas en ejecución. A menudo posee su propia unidad de control, registros y
otros componentes, tales como una unidad aritmético-lógica, tambien puede
poseer una unidad de punto flotante. Es común que las CPUs modernas incluyan
múltiples unidades de ejecución, el arreglo más simple es utilizar una para
manejar la interfase de memoria (administración del bus) y otras para realizar
deferentes cálculos.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
5. Memorias.
Existe una variedad de memorias y es posible que exista una combinación de
diferentes tipos de estas en un mismo sistema, dependiendo de las diversas
características que pueda presentar una memoria se analizan a continuación los
diferentes tipos disponibles:
5.1. RAM (Random Access Memory):
Las memorias de acceso aleatorio normalmente son las memorias de trabajo de
los computadores, donde el procesador puede fácilmente almacenar datos
temporalmente, la lectura/escritura en este tipo de memorias se puede hacer en
cualquier posición, es decir, el acceso a cualquier registro para lectura/escritura
implica el mismo tiempo y no depende de lecturas/escrituras previas.
Generalmente son volátiles, esto quiere decir que los datos almacenados durante
el funcionamiento del computador se borrarán al des-energizar o apagar el
sistema.
Existen dos categorías de RAM las estáticas (SRAM) y las dinámicas (DRAM); las
estáticas emplean pares de compuertas lógicas para almacenar cada bit de datos
son las más rápidas, funcionan con una circuitería de soporte simple y tienen un
consumo de energía relativamente bajo. Debido a su baja capacidad se requiere
implementar mayor cantidad de chips dependiendo de la aplicación. Si un
computador personal moderno fuese construido con base en este tipo de memoria
aunque sería bastante rápido resultaría de un tamaño considerable y demasiado
costoso.
Figura 16. Memoria SRAM (Static Random Acces Memory ).
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
DRAM utiliza arreglos de lo que en esencia son la combinación de un capacitor y
un transistor, juntos forman una celda (que representa un bit). El capacitor
almacena el bit de información (0 cuando esta descargado o 1 cuando esta
cargado) mientras que el transistor actúa como switch, esto permite "leer" el
capacitor o cambiar su estado (de 0 a 1 o viceversa). La desventaja es que la
carga se almacena por un periodo reducido antes de empezar a descargarse, es
por esto que se necesita refrescar constantemente los datos en intervalos en el
orden de los milisegundos, este hecho hace que se requiera un soporte adicional
para este tipo de memorias además retraza al microprocesador en el acceso de
los datos.
Figura 17. Memoria DRAM (Dynamic Random Acces Memory ).
A pesar de esto las memorias dinámicas poseen una gran capacidad de
almacenamiento, existe una gran variedad de subespecies de este tipo de
memorias. Acceder a los datos de estas memorias mediante un microcontrolador
generalmente no es viable y ciertamente no es práctico. Para tal efecto hay
microprocesadores que poseen soporte para la conexión de RAM dinámico o se
puede valer de integrados diseñados para cumplir esta función de manera muy
simple.
Los tipos de DRAM que se encuentran actualmente son:
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS





Fast Page Mode DRAM: La idea es tener procesos de lectura/escritura
sucesivos en la misma fila sin tener que realizar por cada lectura/escritura
un procesamiento de la fila como se hace con las anteriores memorias
DRAM.
Extended Data Out (EDO) DRAM: Es similar a la anterior con una
característica adicional, la cual permite que un nuevo ciclo de acceso pueda
ser iniciado mientras se mantiene el dato en la salida del ciclo anterior. Esto
mejora en un 5% la eficiencia de estas memorias.
Synchronous Dynamic RAM (SDRAM): Las memorias vistas hasta el
momento tienen una interfaz de comunicación asíncrona con los demás
periféricos, incluyendo la CPU. Una memoria sincrónica, trabajará con el
reloj del bus del sistema, resultando esto más eficiente. Por cada pulso de
reloj en el bus, se realiza internamente una operación en la memoria. Estas
memorias se conocen con referencias como PC66, PC100 y PC133, donde
el número representa la frecuencia del reloj del bus.
Double Data Rate SDRAM (DDR-SDRAM): La memoria anterior utiliza la
señal de reloj para realizar las diferentes operaciones. Estas operaciones
se dan cuando existe una transición de bajo a alto en la señal de reloj
solamente, es decir, en un flanco de subida. La idea de DDR es realizar
operaciones tanto estimuladas por la transición bajo a alto como por la
transición alto a bajo, es decir, en flancos de subida y bajada, permitiendo
que con la misma señal de reloj, se puedan realizar el doble de
operaciones. Se sigue trabajando con frecuencias de bus de 100, 133, 166
y 200, donde la frecuencia efectiva será 200, 266, 333, 400
respectivamente, por eso el nombre de DDR200, DDR266, DDR333 y
DDR400. En un computador que tiene un bus de datos de 64bits, la tasa de
transferencia en bytes estará dada por 2x(frecuencia_bus)x8 teniendo
velocidades de 1600Mbytes/seg, 2133Mbytes/seg, 2667Mbytes/seg y
3200MBytes/seg para memorias DDR200, DDR266, DDR333 y DDR400
respectivamente.
Otras memorias disponibles son el RAMBUS DRAM, Video RAM, SGRAM,
PSRAM.
5.2. Memoria Caché.
Muchos microprocesadores incluyen en su interior o tienen acceso a lo que se
conoce como caché de datos, se trata de un tipo de memoria que está ubicada
entre el procesador y la memoria RAM y se emplea para almacenar datos que se
utilizan frecuentemente así como algunas instrucciones que serán ejecutadas se
para agilizar este proceso. Normalmente el caché se implementa en memorias
estáticas de alta velocidad y su función principal es ayudar a compensar la lentitud
de las DRAM para darle velocidad al sistema.
5.3. ROM (Read Only Memory).
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Las memorias ROM son OTP (One Time Programmable) es decir solo pueden ser
programadas una sola vez, este tipo de memorias no son volátiles puesto que no
requieren la existencia de alimentación para retener los datos, normalmente son
más lentas que las memorias RAM. Muchos microcontroladores contienen
memoria ROM integrada al chip este hecho reduce los elementos requeridos para
desarrollar sistemas embebidos simplificándose también su diseño.
El propósito principal de la ROM en un sistema dado es el de mantener el código
necesario y en algunos casos datos que se requiere que estén presentes al
arrancar o iniciar un sistema dado. Dicho software generalmente conocido como
firmware es simplemente un programa de computador que se encuentra embebido
en un sistema y contiene la aplicación que hace funcional al sistema, por ejemplo
en un computador el firmware que se encuentra en la BIOS (Basic Input/output
System) normalmente implementado en memorias ROM, contiene el código
necesario que se encarga de inicializar todos los dispositivos de E/S a un estado
conocido. Los fabricantes de computadores normalmente las emplean en sistemas
de soporte o placas madre en los que el firmware es estable y se presenta la
ventaja de reducir los costos de producción.
Figura 18. Memoria ROM (Read Only Memory).
Las memorias ROM en esencia son fabricadas a partir de grandes arreglos de
diodos como se puede apreciar en la figura 18, el estado inicial de la memoria es
como si todos sus elementos de almacenamiento se encontrasen en 1‟s, cada
byte se leerá como 0xFF, el proceso para cargar la información en la memoria se
conoce como “quemar” la ROM por el hecho de que consiste en suministrar la
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
corriente suficiente en los diodos apropiados para “volarlos” o “quemarlos”
entonces se crearán ceros en estas posiciones.
5.4. PROM (Programmable Read-Only Memory).
Muy similares a las ROM con la diferencia de que se trata del mismo arreglo de
diodos pero a cada diodo es conectado en serie un fusible que será el elemento
fundido en el proceso de quemado.
Figura 19. Esquema de los componentes internos de las Memorias PROM
(Programmable Read Only Memory).
5.5. EPROM (Erasable Programmable Read-Only Memory).
Las OTP-ROMs son buenas para la producción en masa de productos
completamente terminados pero en etapas de diseño y depuración resultan un
desperdicio puesto que a cada cambio realizado se requeriría quemar una nueva
memoria y desechar otra. Para tal efecto las memorias EPROM presentan la
característica que pueden ser borradas mediante el efecto de la incidencia de
rayos ultravioleta sobre la superficie del integrado gracias a una ventana ubicada
en el chip (ver figura 20), su desventaja radica en la necesidad de remover el
integrado de su ubicación en el sistema para borrar su contenido, además este
proceso demora muchos minutos dependiendo del dispositivo, luego hay que
volver a quemar el dispositivo y volver a probar el funcionamiento del circuito,
resultando este proceso en tiempos muy lentos de depuración de errores.
Figura 20. Memoria EPROM (Erasable Programmable Read Only Memory).
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Tanto las memorias EPROM como sus predecesoras OTP son raramente
utilizadas en la actualidad además sus capacidades normalmente no exceden 1
Mb.
5.6. EEPROM (Electrically Erasable Programmable Read-Only Memory).
Las memorias de solo lectura eléctricamente borrables también conocidas como
E2PROM son dispositivos que pueden ser borrados y programados “en circuito”
(in-circuit) es decir en la posición en que están implementadas su capacidad es
significativamente menor que la ROM estándar (típicamente algunos Kb) por lo
tanto no están habilitadas para almacenar firmware. En lugar de esto se emplean
normalmente para almacenar parámetros y datos que deben ser retenidos en los
sistemas durante los tiempos de apagado.
Comúnmente los microcontroladores incorporan pequeñas memorias EEPROM
para almacenar diferentes parámetros, esto es de gran utilidad en sistemas
embebidos y puede ser empleado para almacenar parámetros de configuración,
direcciones de red, números seriales, etc.
5.7. Memorias FLASH.
Es la tecnología ROM mas actualizada y es la dominante en el mercado actual,
poseen características de reprogramación como la EEPROM y la gran capacidad
de la ROM, También son conocidos como “FLASH-ROM” o “FLASH-RAM” pero
siendo rigurosos no pertenece a ninguno de estos grupos.
Las memorias FLASH almacenan información en arreglos de celdas de memoria
hechos a partir de transistores de compuerta flotante éstos tienen la capacidad de
almacenar pequeñas cargas durante periodos extendidos de tiempo así no exista
una fuente de energía. Las memorias FLASH internamente se encuentran
divididas por sectores que pueden ser borrados y programados sin afectar el
contenido de los demás, normalmente para que un sector sea escrito primero
debe ser borrado a diferencia de las RAM que pueden ser sobre-escritas por lo
tanto no pueden ser de acceso aleatorio.
Las celdas de memoria tradicionales single-level cell (SLC) manejan un solo nivel
es decir que solo pueden almacenar un bit de información, algunas mejoras se
han implementado obteniendo lo que se conoce como multi-level cell (MLC) estas
pueden almacenar mas de 1 bit por celda seleccionando entre múltiples niveles de
carga aplicada a las compuertas flotantes de dichas celdas.
Figura 21. Memoria FLASH
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
5.8. MMU (Memmory Management Unit).
Es un dispositivo empleado para el manejo y acceso a memoria de datos que son
requeridos por el procesador, entre sus funciones se encuentran la traducción de
direcciones virtuales a direcciones físicas, protección de la memoria, control del
caché y administración de los buses tanto de datos como de direcciones.
6. Bus de datos, direcciones y control.
En una arquitectura dada, el bus es el conjunto de conductores eléctricos en forma
de pistas metálicas impresas sobre una tarjeta, por donde circulan las señales que
corresponden a los datos binarios del lenguaje máquina con que opera la unidad
de procesamiento. Son los encargados de las transferencias internas de datos en
un sistema en funcionamiento. En un bus todos los nodos reciben los datos
aunque éstos se dirijan a nodos específicos, los nodos a los que no van dirigidos
los datos simplemente ignoran dichos datos.
Hay tres clases de buses: Bus de Datos, Bus de Direcciones y Bus de Control. El
primero mueve los datos entre los dispositivos periféricos del sistema, en un
computador por ejemplo hay dispositivos de entrada como el Teclado, el Escáner,
el Ratón, etc.; de salida como la Impresora, el Monitor o la tarjeta de Sonido; y de
Almacenamiento como el Disco Duro, el Diskette o la Memoria-Flash. El Bus de
Direcciones, por otra parte, está vinculado al bloque de Control de la CPU para
tomar y colocar datos en el Sub-sistema de Memoria durante la ejecución de los
procesos de cómputo. El Bus de Control transporta señales de estado de las
operaciones efectuadas por el CPU con las demás unidades.
El número de pistas dedicado a cada uno de los buses está relacionado con el
ancho de canal. Ancho de canal se refiere a la cantidad de bits que pueden ser
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
transferidos al mismo tiempo, es decir, al número de líneas disponibles para mover
datos, controlar dispositivos o direccionar memoria. Una CPU como el MC68000
usa 24 líneas (24 bits) para direccionar la memoria y 16 líneas (16 bits) para
mover datos entre la CPU y la memoria. Es decir, se tiene un ancho de canal de
direcciones de 24 bits y un ancho de canal de datos de 16 bits.
Un bus de datos con n bits, implica que n bits pueden ser transferidos al mismo
tiempo, es decir, en paralelo. Con lo anterior, el procesador MC68000 podrá mover
16 bits a la vez (equivalente a 2 bytes ó 1 word) El ancho de canal establece
también el valor mínimo y máximo que se puede enviar o transferir al tiempo.
Para el bus de direcciones, el "ancho de canal" explica la cantidad de ubicaciones
o direcciones diferentes que el microprocesador puede alcanzar. Si se tiene una
cantidad m de bits o líneas de direcciones, la cantidad de ubicaciones resulta de
elevar 2 a la m potencia. "2" porque son dos las señales binarias, los bits 1 y 0; y
"m potencia" porque las m pistas del bus de direcciones son, en un instante dado,
un conjunto de m bits.
En el MC68000 se puede tener una cantidad de posiciones de memoria
direccionables de: 224 = 16777216. Al número de direcciones que la CPU puede
emplear se le conoce con el nombre de espacio de direcciones de la CPU.
Lección 12: Arquitecturas más Comunes.
La arquitectura de un sistema embebido es una abstracción del dispositivo, esto
significa que se trata de una generalización del sistema que normalmente no
detalla información de implementación ni códigos fuente o diseños de hardware, a
nivel de arquitectura los componentes software y hardware son representados por
elementos ya sea internos o externos al sistema embebido que describen
comportamientos propiedades e interacciones que se pueden dar entre los
diferentes elementos. Dentro del término arquitectura se engloban aspectos como
formato de instrucción, modos de direccionamiento, conjunto de instrucciones,
entre otros.
La información a nivel de arquitectura es representada como estructuras, una
estructura es una representación que contiene un conjunto de información de
diversos elementos, propiedades e interacciones, podría decirse que se trata de
una especie de imagen que enmarca el hardware y el software durante el diseño
y/o puesta en marcha, dadas unas condiciones y un grupo de elementos. Puesto
que es complicado recoger en una sola imagen toda la complejidad de un sistema,
la arquitectura de un sistema embebido normalmente está conformada por más de
una estructura que inherentemente se encuentran relacionadas unas con otras.
Todo sistema embebido cuenta con los siguientes componentes:
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS




Una Unidad Central de Procesamiento (CPU) encargada de procesar la
información.
Memoria para el almacenamiento de Instrucciones y Datos que serán
procesados por la CPU.
Medios de comunicación entre la CPU y la memoria (Buses de
Direcciones, Datos y Control).
Medios de comunicación entre la CPU y el mundo exterior (Buses de
Direcciones, Datos y Control).
La forma en que estos elementos están conectados vienen definidos por las
denominadas arquitecturas Von Neumann y Harvard.
1. Arquitectura Von Neumann.
La arquitectura Von Neumann debe a su nombre al conocido matemático John
Von Neumann, que propuso el concepto de programa almacenado. La idea
principal de esta arquitectura es el empleo del mismo dispositivo de
almacenamiento tanto para las instrucciones como para los datos. Los sistemas
con la arquitectura Von Neumann constan de cinco partes: La unidad aritméticológica o ALU, la unidad de control, la memoria, dispositivo de entrada/salida y el
bus de datos que proporciona un medio de transporte de los datos entre las
distintas partes.
Un dispositivo con arquitectura Von Neumann realiza o emula los siguientes pasos
secuencialmente:




Al encender el sistema se llama la instrucción desde la memoria en la
dirección indicada por el contador de programa y la guarda en el registro de
instrucción.
Se aumenta el contador de programa dependiendo de la longitud de la
instrucción para apuntar a la siguiente.
Se decodifica la instrucción mediante la unidad de control. Ésta se encarga
de coordinar el resto de componentes del ordenador para realizar una
función determinada.
Se ejecuta la instrucción. Ésta puede cambiar el valor del contador del
programa, permitiendo así operaciones repetitivas. El contador puede
cambiar también cuando se cumpla cierta condición aritmética, haciendo
que el ordenador pueda 'tomar decisiones', que pueden alcanzar cualquier
grado de complejidad, mediante la aritmética y lógica anteriores. Luego,
vuelve a ejecutarse el primer paso.
Hoy en día, la mayoría de ordenadores están basados en esta arquitectura,
aunque pueden incluir otros dispositivos adicionales, (por ejemplo, para gestionar
las interrupciones de dispositivos externos como ratón, teclado, etc).
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
2. Arquitectura Harvard.
A diferencia de la arquitectura Von Neuman, la Harvard se caracteriza por la
existencia de dispositivos de almacenamiento diferentes para programas y para
datos, el término proviene de la computadora Harvard Mark I, que almacenaba las
instrucciones en cintas perforadas y los datos en interruptores. La idea es la
existencia de dos buses de datos distintos, uno que controla el acceso a la
memoria donde se almacenan las instrucciones que son ejecutadas por la unidad
de procesamiento y el otro que sirve para acceder a los datos u operandos de
dichas instrucciones.
Una ventaja de esta arquitectura sobre la Von Neumann radica en el empleo de
memorias de acceso de alta velocidad (SRAM) utilizadas como caché tanto para
datos como para instrucciones para mejorar le eficiencia del acceso a estos por
parte del procesador. Por otro lado, tiene el inconveniente de tener que dividir la
cantidad de caché entre los dos, por lo que funciona mejor sólo cuando la
frecuencia de lectura de instrucciones y de datos es aproximadamente la misma.
Esta arquitectura suele utilizarse en DSPs.
3. Arquitectura de la CPU.
Referida propiamente al diseño de la CPU. Normalmente este diseño se basa en
la filosofía CISC (Complex Instruction Set Computer) o RISC (Reduce Instruction
Set Computer). Antes de entrar en detalle de estas filosofías de diseño, conviene
ver algunas definiciones previas.
3.1. Formato de Instrucciones.
Cada procesador puede realizar muchas operaciones con datos que se
encuentran en la memoria. Ellos tienen un conjunto de instrucciones ISA
(Instruction Set Architecture), las cuales sirven para indicarle la realización de una
determinada operación. El procesador toma de la memoria un código que le indica
la operación a realizar, además de tomar de allí otros códigos que le indican de
donde tomar los operandos y más. A este conjunto de códigos se le denomina
formato de instrucción.
Cada formato de instrucción incluye:


Operación a realizar, contenida en un código denominado OpCode (Código
de Operación).
Longitud de la instrucción.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS


Registro o dirección de memoria donde se encuentran los datos. (Modo de
direccionamiento a usar).
Extensiones en el formato de instrucción que sirven para o Colocar valores
de desplazamiento. o Indicar extensiones en el modo de direccionamiento.
o Colocar valores inmediatos o direcciones absolutas.
3.2. Conjunto de Instrucciones.
Un conjunto de instrucciones, repertorio de instrucciones o arquitectura del
conjunto de instrucciones (ISA) es una especificación que detalla las instrucciones
que una CPU de un ordenador puede entender y ejecutar, o el conjunto de todos
los comandos implementados por un diseño particular de una CPU. El término
describe los aspectos del procesador generalmente visibles a un programador,
incluyendo los tipos de datos nativos, las instrucciones, los registros, la
arquitectura de memoria y las interrupciones, entre otros aspectos.
La arquitectura del conjunto de instrucciones (ISA) se emplea a veces para
distinguir este conjunto de características de la microarquitectura, que son los
elementos y técnicas que se emplean para implementar el conjunto de
instrucciones. Entre estos elementos se encuentran las microinstrucciones y los
sistemas de caché.
Procesadores con diferentes diseños internos pueden compartir un conjunto de
instrucciones; por ejemplo el Intel Pentium y AMD Athlon implementan versiones
casi idénticas del conjunto de instrucciones x86, pero tiene diseños internos
completamente distintos.
3.3. Modos de direccionamiento.
Mecanismo que permite conocer la ubicación de un dato o instrucción, es decir, le
dice a la CPU como obtener la dirección efectiva (E.A. = Effective Address) donde
se encuentra el operando. Se definen los siguientes parámetros dentro del modo
de direccionamiento:



Objeto: dato o instrucción que se desea direccionar.
Una CPU dispone de varios modos de direccionamiento.
Objetivos de los modos de direccionamiento:
o Reducir el espacio ocupado en memoria por las instrucciones.
o Permitir la reubicación del código.
o Facilitar el manejo de las estructuras de datos.
3.3.1. Modos de direccionamiento en las instrucciones.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Los operandos y el resultado de una instrucción son accedidos a través de los
modos de Direccionamiento que la CPU posee. Algunos campos del formato de
instrucción, contienen información acerca del modo de direccionamiento empleado
para conocer la E.A. del operando. En la sección 2.6.1 se explicaron los diferentes
métodos de direccionamiento de las direcciones por lo que a continuación solo
serán nombrados a manera de repaso: inmediato, directo, indirecto, relativo,
indexado.
3.4. Filosofía CISC de diseño de CPUs.
Del inglés Complex Instruction Set Computer. Conjunto de microprocesadores
cuyo conjunto de instrucciones se caracteriza por ser muy amplio y permitir
operaciones complejas entre operandos situados en la memoria o en los registros
internos, en contraposición a la arquitectura RISC.
Este tipo de arquitectura dificulta el paralelismo entre instrucciones, por lo que, en
la actualidad, la mayoría de los sistemas CISC de alto rendimiento implementan
un sistema que convierte dichas instrucciones complejas en varias instrucciones
simples del tipo RISC, llamadas generalmente microinstrucciones.
Los CISC pertenecen a la primera corriente de construcción de procesadores,
antes del desarrollo de los RISC. Ejemplos de ellos son: Motorola 68000, Zilog
Z80 y toda la familia Intel x86 usada en la mayoría de ordenadores personales del
planeta. Hay que hacer notar, sin embargo que la utilización del término CISC
comenzó tras la aparición de los procesadores RISC como nomenclatura
despectiva por parte de los defensores/creadores de éstos últimos.
3.5. Filosofía RISC de diseño de CPUs.
En arquitectura computacional, RISC del inglés Reduced Instruction Set Computer
(Computadora de Conjunto de Instrucciones Reducido). Tipo de
microprocesadores con las siguientes características fundamentales:



Instrucciones de tamaños fijos y presentadas en un reducido número de
formatos (modos de direccionamiento simples).
Sólo las instrucciones de carga y almacenamiento acceden a memoria por
datos.
Además, estos procesadores suelen disponer de muchos registros de
propósito general.
El objetivo de diseñar máquinas con esta arquitectura es posibilitar la
segmentación y el paralelismo en la ejecución de instrucciones y reducir los
accesos a memoria. Las máquinas RISC protagonizan la tendencia actual de
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
construcción de microprocesadores. PowerPC, DEC Alpha, MIPS, ARM... son
ejemplos de algunos de éstos.
RISC es una filosofía de diseño de CPU para computadora que esta a favor de
conjuntos de instrucciones pequeños y simples que toman menor tiempo para
ejecutarse. El tipo de procesador más comúnmente utilizado en equipos de
escritorio, el x86, está basado en CISC en lugar de RISC, aunque las versiones
más nuevas traducen instrucciones basadas en CISC x86 a instrucciones más
simples basadas en RISC para uso interno antes de su ejecución.
La idea fue inspirada por el hecho de que muchas de las características que eran
incluidas en los diseños tradicionales de CPU para aumentar la velocidad estaban
siendo ignoradas por los programas que eran ejecutados en ellas. Además, la
velocidad del procesador en relación con la memoria de la computadora que
accedía era cada vez más alta. Esto conllevó a la aparición de numerosas
técnicas para reducir el procesamiento dentro del CPU, así como de reducir el
número total de accesos a memoria.
Lección 13: Comparación de los dispositivos más comunes.
A la hora de escoger un dispositivo para desarrollar una determinada aplicación se
deben tener en cuenta diferentes aspectos que incluyen la revisión de
requerimientos técnicos, presupuestos, etc. La idea es seleccionar un dispositivo
que reúna todas las características que un diseño requiera sin necesidad de
emplear dispositivos sobredimensionados para dicha aplicación. Para facilitar este
hecho a continuación se presentan las características, ventajas y desventajas que
representan los diferentes dispositivos.
1. Arreglos de Compuertas Programables.
Para definir este tipo de dispositivos se puede pensar en un hardware que es
configurado para ser convertido en un sistema digital específico, describiendo su
arquitectura mediante un lenguaje de programación de alto nivel.
Existe una amplia variedad de este tipo de dispositivos entre los que se
encuentran: PLAs (Program Logic Arrays), PAL (Programmable Array Logic),
GALs (Generic Logic Arrays), FPGA (Field Programmable Gate Arrays).
El hardware configurable puede consistir en arreglos múltiples de compuertas
AND de entrada configuradas para alimentar arreglos múltiples de compuertas OR
esto permite la implementación de complejos circuitos de lógica combinacional
utilizando la representación estándar en productos de sumas. Muchos de estos
dispositivos programables además están habilitados para la implementación de
circuitos secuenciales puesto que contienen bloques con flip-flops. Para diseños
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
mucho más avanzados las PFGA pueden ser programadas con algoritmos
extremadamente complejos en el desarrollo de aplicaciones específicas,
normalmente estos sistemas digitales complejos son programados empleando
VHDL (Verilog Hardware Descriptive Language), como su nombre lo dice se trata
de un lenguaje de programación de alto nivel empleado para la descripción de
este tipo de hardware.
Aunque son dispositivos que presentan grandes ventajas y funcionalidades, los
sistemas de desarrollo son un poco costosos sumado al hecho de que sería
sobredimensionado utilizar este tipo de dispositivos en aplicaciones pequeñas que
no requieran una cantidad importante de procesamiento o que no requiera una
cantidad muy grande de pines de entrada/salida.
2. Microprocesadores:
Los microprocesadores son conocidos por ser los principales circuitos integrados
en el interior de los computadores personales, empleados normalmente para
resolver una amplia cantidad de tareas. Los microprocesadores interpretan las
diferentes instrucciones y procesa los datos contenidos en los programas de los
computadores, además se encargan de coordinar las diferentes funciones internas
de los PC, manejo de memoria, manejo de puertos y periféricos, de realizar los
diferentes cómputos requeridos, etc. El microprocesador por si solo no maneja
todo el funcionamiento de un PC, se requiere la existencia de una serie de
integrados a los que entrega instrucciones para que estos se encarguen de
ejecutar acciones dependiendo de su función en el sistema.
Desde la aparición de los microcontroladores se emplean en menor medida en
sistemas embebidos teniendo en cuenta los costos puesto que se requerirían una
serie extra de integrados por ejemplo memorias, conversores A/D, etc, para
obtener la misma funcionalidad de los microcontroladores.
3. Procesadores digitales de Señal (DSPs):
Como su nombre lo indica, un DSP (Digital Signal Processor) es empleado cuando
se requiere realizar complejos análisis de señales en volúmenes considerables y
en tiempos reducidos, también manejan procesamiento de información en punto
flotante de manera eficiente, un ejemplo de este tipo de aplicaciones es el
procesamiento y acondicionamiento de señales de audio en telefonía celular.
Para efectos del curso este tipo de dispositivos son demasiado
sobredimensionados puesto que las aplicaciones que se realizarán a manera de
prácticas y proyectos no requieren toda la velocidad ni el volumen de
procesamiento que un dispositivo de estos puede brindar.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
4. Microcontroladores:
Un microcontrolador (MCU) es un sistema con varios de los subsistemas que
posee un computador, integrados en un solo chip, entre los que se encuentran
puertos de entrada/salida, sistemas de temporización, memorias, una unidad
aritmetico-lógica (ALU) que provee la capacidad de realizar operaciones
aritméticas y lógicas así como la generación de señales de control. Normalmente,
un microcontrolador se considera como un computador integrado en un solo chip
pero con unas prestaciones bastante reducidas, siendo éste optimizado para
aplicaciones específicas, son empleados cuando se requiere una moderada
cantidad de inteligencia local para una determinada aplicación, aunque es posible
realizar operaciones en punto flotante con un microcontrolador, está mejor
calificado para trabajar con números enteros.
Dependiendo de la casa fabricante y de la familia a la que pertenecen los
componentes de los microcontroladores pueden variar, donde por familia se
entiende como grupos de MCUs que se especializan en aplicaciones de diferente
complejidad, entre los elementos que contiene un MCU más comunes se tiene:




Unidad central de procesamiento o CPU. Normalmente con unas
prestaciones muy reducidas a las de un procesador tradicional.
Memoria tanto de programa como de datos. La cantidad es muy reducida
pero suficiente para manejar una aplicación específica. Se incluye memoria
RAM, EPROM, EEPROM y/o FLASH.
Generador de reloj para el funcionamiento y sincronía de todo el MCU.
Periféricos de E/S tales como:
o Puertos de Entrada/Salida.
o Líneas de interrupción externa.
o Conversores A/D y D/A.
o Generadores de base de tiempo.
o Comunicación serial mediante protocolos UART, SPI, I2C, USB,
CAN, LIN, etc.
o Temporizadores de propósito específico, captura de eventos y
generadores de señal PWM.
o Controladores de LCD gráficos y de caracteres.
Como se puede observar, los microcontroladores son los dispositivos mas
completos y mejor dimensionados para el desarrollo de sistemas embebidos de
propósitos específicos que no requieran mayor cantidad de procesamiento. Por lo
tanto desempeñan un papel importante para el desarrollo del presente curso
puesto que forman la base de partida para el entendimiento general de los
diferentes dispositivos y sistemas digitales vistos hasta ahora.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
5. Mezcla de procesamiento con microcontrolador y FPGA:
Debido a que es importante poner en una balanza la complejidad del diseño a
implementar y el hecho de escoger la tecnología mas adecuada para una
aplicación dada, no siempre escoger una sola tecnología es la mejor opción. Las
tendencias actuales en diseños digitales es la de utilizar mezclas como en el caso
de el acople de una FPGA con un microcontrolador.
Lección 14: Microcontroladores HC08
El 68HC08 también conocido como HC08 es una familia de microcontroladores de
8 bits de la casa fabricante Freescale (compañía creada a partir de la división de
semiconductores de Motorola en 2004). Su arquitectura es Von Neumann, es decir
con un solo bloque de memoria.
Los HC08 son microcontroladores de propósito general, cada miembro de esta
familia cuenta con una CPU común que controla diferentes periféricos, facilitando
con ello el diseño de aplicaciones. Entre los periféricos internos que cuentan
estos microcontroladores están: conversores análogos-digitales, módulo de control
de tiempos y sistemas de comunicación como SPI, I²C, USB o SCI o UART entre
otros.
Freescale implementó mejoras a esta familia de microcontroladores resultando la
familia HCS08 que ofrece mejoras en algunas de las instrucciones y agrega otras
nuevas, además en esta mejora los programas que corren en los
microcontroladores pueden ser corregidos empleando un puerto dedicado llamado
BDM (Backgound Debug Module) , que mejora la versatilidad y amplia la gama de
aplicaciones posibles. Existen infinidad de entornos de desarrollo tanto pagos
como libres, para compilar programas realizados en assembler existe un
compilador gratuito de la firma P&E Micro, para compilar en C los compiladores
más utilizados son Freescale Codewarrior (licenciado) o SDCC, un proyecto muy
interesante y funcional que permite compilar código escrito en C para múltiples
plataformas de microcontroladores.
1. Arquitectura.
En la figura 22 se observa los dispositivos de la familia HC08 presentan muchos
de los elementos ya vistos a lo largo de esta unidad otros serán explicados mas
adelante; por el momento basados en la figura 22 solo serán enumeradas las
características generales que presentan esta familia de dispositivos.
Figura 22: Esquema de componentes de la arquitectura de la familia HC08.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS

Control de estado del sitema: (SIM:System Integration Module).
o Modos de bajo consumo (Wait, Stop ).
o LVI (Low Voltaje Inhibit), monitor de VDD Bajo.
o COP(Computer Operating Properly), perro guardian o Watch Dog.
o Detección de Código de operación ilegal.
o Detección de direccionamiento no válido.
o POR: Power On Reset.
o Control de reset interno o externo.
o Retardo de encendido temporizado.
o Control de interrupciones y prioridades.

Memoria:
o Mapeada en su totalidad en un único espacio.
o Indiferencia para guardar datos y programa en cualquier espacio.
o Modo de bajo consumo para almacenamiento en RAM.
o Flash y EEPROM programables internamente.
o 10.000 ciclos de escritura y borrado.
o 10 Años de retención de datos.

Temporización:
o Temporizadores (Timers) de 16 bits multicanal y multifunción.
 Entradas de captura.
 Salidas por comparación.
 Salidas PWM.
o Generadores de base de tiempos para aplicaciones en tiempo real.
o Módulo PLL para trabajar con cristales de baja frecuencia:
 Reducción de EMI (Electro-Magnetic Interference).
 Control de consumo.
o Opcionalmente versiones con reloj interno (minimización de
elementos de montaje).

Comunicaciones:
o UART 7, 8, 9 Bits velocidad programable y detección de errores.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
o
o
o
o

Interfase serie sincrónica SPI hasta 4 MHz (Fbus/2).
USB a 1.5Mbps.
Soporte de Bus CAN.
Buffers de transmisión/recepción.
Entradas y Salidas:
o Conversores A/D de 8/10 bits de aproximaciones sucesivas.
o Puertos de E/S Configurables.
o Pines independientes configurables.
 Pull/ups internos activos/desactivos.
o Interfaz para teclado externo por interrupción, función Wake-up.
A continuación se entra a analizar deferentes aspectos de la arquitectura de los
microcontroladores de la familia HC08:
2. Temporización.
Una fuente de reloj de alta frecuencia (típicamente derivada de un cristal
conectado al MCU) se usa para controlar las secuencias de instrucciones de la
CPU. La mayoría de los HC08 incluyen un circuito PLL en su interior cuya función
es generar frecuencias mas grandes a partir de la frecuencia del cristal, los MCUs
típicos dividen la frecuencia base del cristal por dos o más para obtener un reloj de
frecuencia de bus.
Cada lectura o escritura de memoria toma un período (ciclo) de la frecuencia de
bus, por ejemplo, con un cristal de 4 MHz dividido por 2 obtiene la frecuencia
interna de reloj del procesador de frecuencia de bus de 500 nS. La mayoría de las
instrucciones toman de dos a cinco de estos periodos; como resultado , la CPU es
capaz de ejecutar más de 500.000 instrucciones por segundo.
3. Funcionamiento interno de la CPU.
Todos los MCUs de la familia HC08 incluyen en su interior la CPU08 como unidad
central de proceso, la diferencia entre los dispositivos de esta familia radica en la
cantidad de memoria y los periféricos disponibles.
La CPU08 básicamente está dividida en dos bloques principales: Unidad de
Control y Unidad de Ejecución. La primera contiene una máquina de estados finita
con lógica de sincronización y control. Las salidas de ésta controlan la segunda
unidad, la cual contiene una ALU, registros y una interfaz hacia el bus de datos y
direcciones.
Internamente, la CPU utiliza cuatro fases de reloj para conformar lo que se
denomina un ciclo de ejecución de la CPU o simplemente ciclo de bus, el cual
tiene un periodo igual al periodo de la frecuencia del bus, siendo 4 veces el
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
periodo del cristal/oscilador externo. La frecuencia de bus es la frecuencia del
cristal, oscilador externo o la salida del módulo PLL dividido por 4.
Donde CGMXCLK hace referencia a la frecuencia de entrada al módulo, la cual
proviene directamente del oscilador/cristal externo. CGMVCLK es la frecuencia
generada por el módulo PLL en los MCUs que disponen de él.
4. Consideraciones sobre la pila de la CPU08.
La pila del sistema es una zona de memoria RAM direccionada por el puntero de
pila o SP, la cual sirve para almacenar información temporalmente. El SP siempre
está apuntando a una dirección libre de la pila o stack.
La CPU utiliza la pila para:


Almacenar el contenido del PC cuando se hace un llamado a subrutina
(BSR o JSR) con el fin de poder retornar cuando ella finalice, es decir,
cuando se encuentre la instrucción RTS (Return of Subrutine).
Almacenar el contenido del PC y varios de los registros del modelo de
programación cuando se produce una interrupción de manera que se pueda
retomar la ejecución del programa en donde ésta se presentó. La
finalización de una subrutina de atención a interrupción se da cuando se
ejecuta la instrucción RTI (Return of Interrupt).
Adicionalmente, el programador puede utilizar la pila para:



Almacenar información temporal cuando está realizando operaciones
aritméticas.
Enviar parámetros a las subrutinas.
Retornar parámetros desde una subrutina.
La CPU08 ofrece un conjunto de instrucciones que permiten manipular el puntero
de pila SP con el fin de poder colocar/tomar datos en/desde la pila, incluso, el
programador en cualquier momento podrá reubicar la posición del SP haciendo
uso de la instrucción TXS (transferir H:X a SP). Por compatibilidad con la familia
HC05 el puntero de pila arranca en la dirección de memoria $00FF.
La pila en la CPU08 trabaja como una memoria LIFO (Last Imput First Output)
(último en entrar primero en salir) siendo necesario tener presente este concepto a
todo momento.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
5. Mapa de Memoria del 68HC08
Para la familia HC08 el mapa de memoria se puede apreciar en la figura 23, se
puede apreciar que comienza con los registros de los periféricos (64 bytes),
seguido del espacio para la RAM, después existe un espacio no utilizable por el
usuario empleado para realizar verificaciones de direcciones ilegales, luego sigue
el espacio para la memoria ROM o FLASH, finalmente siguen otros registros de
propósitos específicos (ver figura 23).
Figura 23: Mapa de memoria para la familia 68HC08.
6. Juego de instrucciones.
La familia 68HC05 posee un juego de instrucciones de 85 elementos, sobre esta
base trabaja también la familia 68HC08 pero añadiendo 28 instrucciones que
complementan a las básicas para añadir mayor funcionalidad y eficiencia a estos
dispositivos; por el momento se presentan las instrucciones en la Tabla 3 para que
el estudiante se familiarice con los nombres y su funcionalidad general sin entrar a
especificar su sintaxis y funcionalidad específica, se resaltan en rojo las
instrucciones añadidas a la familia 68HC08.
Tabla 3: Juego de instrucciones de la familia 68HC08:
Transferencia de Datos
LDA, LDX, STA, STX, TAX, TXA, LDHX, MOV,
PSHA, PSHH, PSHX,PULA, PULH, PULX, STHX
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Aritméticas
ADD, ADC, SUB, SUBC, MUL, DAA, DIV
Manipulación de Datos
INCA, INCX, INC, DECA, DECX, DEC, CLR, NEGA,
NEGX, NEG, AIS, AIX, CLRH
Rotación y
Desplazamiento
ROLA, ROLX, ROL, RORA, RORX, ROR, LSLA,
LSLX, LSL, LSRA, LSRX, LSR, ASRA, ASRX, ASR
Manipulación de bits
BSET, BCLR
Lógicas
AND, ORA, EOR, COMA, COMX, COM, NSA
Comparación
CMP, CPX, BIT, TSTA,TSTX, TST, BRCLR, BRSET,
CPHX
Salto condicional
BRA, BRN, BSR, BHI, BLO, BHS, BLS, BPL, BMI,
BEQ, BNE, BCC, BCS, BHC, BHCC, BHCS, BMC,
BMS, BIL, BIH, BGE, BGT, BLE, BLT, CBEQ,
CBEQA, CBEQX, DBNZ.
Salto incondicional
JMP, JSR, RTS
De Control
SEC, CLC, SEI, CLI, SWI, RTI, RSP, NOP, WAIT,
STOP, TAP,TPA, TSX, TXS
A lo largo del curso se explicarán la sintaxis y funcionalidad de algunas de las
instrucciones a manera de ejemplo, es tarea del estudiante buscar en las hojas de
datos y en documentos de la red la manera de utilizar las demás instrucciones
para conocer su funcionalidad y que tenga las bases adecuadas en caso de que
requiera utilizarlas de forma óptima en sus prácticas. El manual de referencia de la
CPU HC08 detalla claramente cada una de las instrucciones que soporta, otra
buena opción es el “Juego de instrucciones del HC08” [19] con explicación
detallada, sintaxis y ejemplos de programación.
7. Modelo de programación.
El modelo de programación de la CPU del HC08 es similar al de su predecesor el
68HC05 agregando algunas mejoras (ver figura 24), también este modelo es
común a toda la familia independientemente de la cantidad de recursos que posea
un dispositivo determinado.
Figura 24. Modelo de programación de la familia de microcontroladores 68HC08.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
A continuación se explica el uso de cada uno de los registros del la figura 24:
Acumulador (A): es un registro de 8 bit de propósito general empleado por la
CPU para mantener operandos y resultados de operaciones aritméticas y lógicas.
Registro Índice (H:X): es un registro de 16 bits empleado para los modos de
direccionamiento indexados en el espacio de memoria de 64 Kb de la CPU,
también puede ser utilizado como acumulador auxiliar. Se diferencia la parte alta
o byte de de mayor peso (H) de la parte baja o byte de menor peso (X) puesto que
existen diferentes comandos y operaciones para manipular cada una. En las
instrucciones indexadas, el registro X provee un valor de 8 bits que es sumado a la
dirección base provista por la instrucción para crear una dirección efectiva. El
valor provisto por la instrucción puede ser de 0, 1 ó 2 bytes de largo.
Apuntador de Pila o Stack Pointer (SP): es un registro de 16 bits que contiene la
dirección de la RAM referida a la posición libre de la pila del sistema (stack) mas
adelante de ahondara en éste. Después de resetear el sistema el SP es cargado
con un valor de $00FF. Cuando un dato es almacenado en la pila, la dirección del
registro SP es decrementa, caso contrario ocurre cuando se toma un dato de la
pila. El SP siempre apunta a una posición libre de la RAM.
Contador de Programa (PC): Es un registro de 16 bits que contiene la dirección
de la siguiente instrucción a ser ejecutada, normalmente la dirección contenida en
el PC se incrementa automáticamente cada vez que se busca una instrucción en
memoria, a excepción de casos como saltos absolutos o relativos, condicional,
incondicional o subrutina, en los que se carga en el PC la dirección donde el flujo
de programa debe continuar su ejecución. Durante el Reset, el contador de
programa (PC) se carga con la dirección contenida en el "Reset Vector" que para
el MC68HC908 se encuentra en la posición $FFFE y $FFFF. La dirección
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
contenida en el vector, es la dirección de la primera instrucción a ser ejecutada
después de salir del estado de RESET.
Registro de Código de Condición (CCR): también conocido registro de estado
de la CPU, es un registro de 8 bits que contiene una máscara de interrupciones y
además almacena 5 indicadores de estado que reflejan el resultado de alguna
operación previa hecha por la CPU. Algunas instrucciones usan a los bits de
estado para tomar decisiones simples dependiendo de su estado.
Las banderas de este registro se pueden apreciar de la figura 24 y son:
Bit de Desbordamiento u Overflow (V): Bandera que indica el desbordamiento
en complemento a dos del resultado de la última operación mediante un „1‟ lógico.
Bit de Acarreo Medio (H): Esta bandera es empleada en operaciones aritméticas
con números decimales codificados en binario o BCD y es afectada por las
operaciones suma ADD o ADE. El bit H se pone en „1‟ cuando se produce un
acarreo del dígito hexadecimal de menos peso en los bits 3-0 al dígito de más
peso en bits 7-4. Luego de la suma binaria de dos valores de 2 dígitos BCD, este
bit de semi-acarreo es parte de la información necesaria para volver el resultado a
un valor BCD válido.
Bit de Máscara de Interrupción (I): Este bit no es una bandera de estado, es un
bit de máscara de interrupción que deshabilita todas las fuentes de interrupción
enmascarables cuando el bit I está en uno. Las interrupciones están habilitadas
cuando este bit está en cero. Cuando cualquier interrupción ocurre, el bit I pasa
automáticamente a uno luego de haber salvado los diferentes registros en la pila,
pero antes el vector de interrupción es buscado. Si una interrupción interna ocurre
mientras el bit I está en uno, la interrupción es almacenada y procesada luego que
el bit I se ponga en cero; de esta manera, no se pierde ninguna interrupción (IRQ)
que se presente cuando el bit está en uno. Luego de haber atendido a una
interrupción, la instrucción retorno desde una interrupción (RTI) provocará que los
registros recuperen sus valores previos. Normalmente, el bit I permanecería en
cero luego que fuese ejecutada la instrucción RTI. Luego de cualquier reset, el bit I
estará en uno y sólo podrá llevárselo a cero por medio de una instrucción.
Bit de Negativo (N): El bit N se pone en „1‟ cuando el resultado de la última
operación aritmética, lógica o de manipulación de datos es negativo. Para los
valores signados según la convención de complemento a dos, se considera que
un número es negativo si el bit más significativo es un uno.
El bit de Cero (Z): El bit Z se pone en „1‟ cuando el resultado de la última
operación aritmética, lógica o de manipulación de datos es cero. Una operación de
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
comparación resta un valor desde la posición de memoria que está siendo
evaluada. Si los valores son iguales antes de la comparación, el bit Z se pondrá en
uno.
Bit de Acarreo/Préstamo (C): El bit C es usado para indicar si ha habido o no
acarreo de una suma o pedido de préstamo como resultado de una resta. Las
instrucciones de desplazamiento y rotación operan sobre y a través del bit C para
facilitar operaciones de desplazamiento de múltiples bytes. El bit C es además
afectado durante las instrucciones de evaluación de bit y de bifurcación.
8. Modos de direccionamiento.
La velocidad de cualquier sistema computacional radica en la habilidad de dicho
sistema para acceder datos e instrucciones en la memoria, esta capacidad la
brindan los diferentes modos de direccionamiento aprendidos. Cada variante de
los modos de direccionamiento debe tener un único código de operación (op-code)
de instrucción.
A continuación se presentan los diferentes modos de
direccionamiento básicos con su correspondiente ejemplo para aclarar su
funcionamiento:
-
Inherente: este tipo de instrucciones no tienen operando puesto que éste se
define en el op-code de 8 bits. Por ejemplo si se quiere borrar el
acumulador se emplea la instrucción CLRA, que es una instrucción de un
solo ciclo para el HC08.
-
Inmediato: las instrucciones que manejan direccionamiento inmediato
tienen dos operandos que siguen inmediatamente al op-code de 8 o 16 bits.
Por ejemplo la instrucción LDA #20 es una instrucción de 2 bytes que
carga el acumulador con el número 20 en dos siclos de reloj.
-
Directo; éstas no poseen la dirección de 8 bits del operando que sigue
inmediatamente al op-code, por lo tanto acceden directamente a los
primeros 256 bytes de la memoria (página directa o página cero). Por
ejemplo la instrucción LDA $40 carga el acumulador con el dato
almacenado en la posición número 40 de la memoria, es una instrucción
de dos bytes y se ejecuta en tres ciclos de reloj.
-
Extendido: éstas proporcionan direccionamiento absoluto a cualquier
posición de los 64Kb del mapa de memoria sin paginar, el op-code requiere
tres bytes mas dos de la dirección del operando. Ejemplo LDA $4000.
-
Relativo: es empleado por las instrucciones de bifurcación condicional, si la
condición de bifurcación es verdad el controlador de programa se agrega al
byte con signo que sigue inmediatamente al op-code de bifurcación
obteniéndose un rango de bifurcación de -128 a +127 bytes, la
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
instrucciones de salto o salto a subrutina se pueden usar para mover el
contador de programa a cualquier posición del mapa de memoria. Ejemplo
BIL LOOP.
-
Indexado: este tipo de direccionamiento es clave para direccionar tablas y
estructuras similares de datos de manera eficiente, los modos básicos para
el direccionamiento indexado son: indexado sin offset por ejemplo LDA ,X,
indexado con offset de 8 bits, por ejemplo LDA $40,X e indexado con offset
de 16 bits, ejemplo LDA $4000,X. El indexado sin offset se conoce en la
mayoría de arquitecturas como el direccionamiento del puntero indirecto.
Hasta ahora estos modos de direccionamiento son compartidos por las familias 05
y 08 a continuación se presentan los modos agregados para la familia HC08:
-
Indexado: puede ser sin offset con incremento posterior o con offset de 8
bits con decremento posterior, son modos de direccionamiento indexado
con post-incremento automático del puntero de índice, por ejemplo:
o Indexado sin offset con incremento posterior:
CBEQ X+, Label.
o Indexado con offset de 8 bits con incremento posterior:
CBEQ $50,X+, Label.
-
-
Stack Pointer: es un tipo de direccionamiento relativo del puntero de pila,
puede ser con offset de 8 bits o con offset de 16 bits. Su trabajo es similar
al modo indexado pero empleando el Stack Pointer en lugar del registro
índice, Por ejemplo:
o Stack Pointer con offset de 8 bits:
STA $10,SP.
o Stack Pointer con offset de 16 bits:
STA $1000,SP.
Mover de Memoria a Memoria: Para este fin se emplea el comando MOV
para mover los datos directamente sin emplear el acumulador, existen
diferentes formas en las que se puede ejecutar esta instrucción
dependiendo del modo de origen y el modo de destino:
o Inmediato a directo, por ejemplo:
MOV #20,$40
o Indexado a directo con incremento posterior, por ejemplo:
MOV X+, SCDR
o Directo a indexado con incremento posterior, por ejemplo:
MOV SCDR, X+
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Se puede tomar por ejemplo la instrucción ADD, ésta toma un operando de
memoria y lo suma con el valor del registro A. En la Tabla 4 se observa que para
diferentes modos de direccionamiento el código de operación es diferente.
Siempre, en un código de máquina, el primer (o primeros) byte es el código de
operación, seguido de los bytes complementarios como información para el modo
de direccionamiento empleado:
Tabla 4. Ejemplo de diferentes modos de direccionamiento con el comando ADD
Instrucción
Modo de
direccionamiento
OpCode Adición
Código de
Máquina
ADD #$45
Inmediato
AB
1
AB45
ADD $50
Directo
BB
1
BB50
ADD $FE00
Extendido
CB
2
CBFE00
ADD ,X
Indexado
FB
0
FB
ADD $45,X
Indexado, offset 8 bits
EB
1
EB45
ADD $79F4,X
Indexado, offset 16 bits
DB
2
DB79F4
ADD $30,SP
StackPointer, offset 8 bits
9EEB
1
9EEB30
ADD
$A47B,SP
StackPointer, offset 16
bits
9EDB
2
9EDBA47B
En la “Guía Didáctica del 68HC08” [20] que se encuentra en Internet (en español)
se pueden encontrar diferentes ejemplos de implementación de los modos de
direccionamiento con su correspondiente explicación detallada.
9. Reset, fuentes de interrupción y enmascaramiento.
La CPU del microcontrolador ejecuta instrucciones de manera secuencial, sin
embargo, en muchas aplicaciones es necesario ejecutar un conjunto de
instrucciones en respuesta a una petición hecha por algún periférico, la cual,
normalmente se hace de manera asíncrona con el programa que se esté
ejecutando. El Reset y las interrupciones son excepciones propias de la CPU08.
Al conjunto de instrucciones que se deben ejecutar en respuesta a una petición de
este tipo se denomina subrutina de atención a la excepción, la cual es llamada por
la CPU después de detectar la excepción o evento.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
El reset es un mecanismo empleado para forzar al sistema del microcontrolador a
ir a un punto de partida conocido (dirección de memoria) de igual manera los
dispositivos de entrada y salida y en general todos los periféricos de un sistema
pasan a un estado inicial después de un reset.
Las siguientes acciones internas ocurren como resultado de cualquier reset del
MCU:
1) Todos los registros de dirección de datos se colocan en cero (como
entradas).
2) El puntero a la pila (SP) es forzado a $00FF.
3) El bit I del CCR se pone en uno inhibiendo a las interrupciones
enmascarables.
4) El latch de interrupciones externas es borrado.
5) El latch de STOP es borrado.
6) El latch de WAIT es borrado.
Cuando el sistema de computadora sale de reset, el contador de programa se
carga con el contenido de las posiciones de memoria más altas; el valor que se
encuentra en la segunda más alta se carga en el byte más significativo del PC y el
valor que se encuentra en la mas alta se carga en el byte menos significativo del
PC. Esto se denomina “búsqueda del vector de reset”.
En este punto la CPU comenzará la búsqueda y ejecución de instrucciones,
comenzando por la dirección almacenada en el vector de reset.
Las siguientes condiciones pueden causar que el MCO se resetee:




Externamente, una señal de entrada activa baja en el pin RESET.
Internamente, al encender la fuente de alimentación (POR: Power On
Reset).
Internamente, expiración de tiempo del cronómetro de vigilancia del
comportamiento apropiado de la computadora (COP: Computer Operating
Properly o Watchdog Timed Out).
Un intento de ejecutar una instrucción desde una dirección ilegal.
9.1. Pin de Reset.
Un pulsador o un circuito externo pueden conectarse a este pin para permitir el
reset manual del sistema.
9.2. Reset al encender la Fuente de Alimentación (Power-On Reset).
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
El reset al encender la fuente de alimentación ocurre al detectarse una transición
positiva sobre VDD. Su uso es estrictamente para la condición de encendido y no
podrá utilizarse para detectar caídas de la tensión de la fuente de alimentación.
Podrá usarse un circuito inhibidor de baja tensión (LVI) para detectar caídas de la
fuente.
El circuito de power-on provee una demora de 4064 ciclos desde el momento en
que el oscilador se ha activado. Si el pin de /RESET exterior permanece en bajo al
expirar el tiempo de los 4064 ciclos de demora, el procesador permanecerá en la
condición de reset hasta que /RESET se coloque en alto.
9.3. Reset por Watchdog Timer.
El sistema de cronómetro de vigilancia del comportamiento apropiado de la
computadora (COP) se propone detectar errores de programas. Cuando se activa
el COP es responsabilidad del programa evitar que un cronómetro de vigilancia
que corre libremente llegue al final de su cuenta. Si llega a completar su cuenta,
sería una indicación de que el programa no ha sido ejecutado por un largo período
de tiempo en la secuencia deseada; entonces se inicia el reset del sistema.
Un bit de control del registro (no volátil) máscara de opciones (MOR) puede usarse
para habilitar o deshabilitar el reset del COP. Si el COP es habilitado, la adecuada
operación del programa debe periódicamente escribir un cero en el bit COPC del
registro de control COPR.
9.4. Reset por Acceso a Dirección Ilegal.
Si el programa es escrito incorrectamente, es posible que la CPU intente saltar o
bifurcar a una dirección en la que no haya memoria. Si esto sucede, la CPU podría
continuar leyendo datos (resultando ser valores impredecibles) e intentaría actuar
en consecuencia si se tratase de programa. Estas instrucciones sin sentido
pueden provocar que la CPU escriba datos inesperados en memoria o registros
diseccionados inesperados. Esta situación se llama desbocamiento.
El MCU posee un circuito detector de direcciones ilegales para evitar la condición
de desbocamiento. Si la CPU trata de buscar una instrucción de una dirección que
no pertenece a la EPROM ($0300 - $07CF, $07F0 - $07FF), ni a la ROM de
prueba interna ($07EE - $07EF), se genera un reset que obliga al programa a
comenzar nuevamente.
9.5. Interrupciones.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Son a veces usadas para interrumpir el procesamiento normal para responder a
algún evento inusual. El MCU puede ser interrumpido por las siguientes fuentes de
interrupción:




Un „0‟ lógico aplicado al pin de interrupción externa (IRQ).
Un „0‟ lógico aplicado a cualquier pin PA3 - PA0 (si la función del puerto de
interrupción es habilitada).
Un pedido de desborde (overflow TOF) o interrupción de tiempo real (RTIF)
desde el sistema de temporización por programa (SWI).
La instrucción de interrupción por programa (SWI).
Si una interrupción se produce mientras la CPU está ejecutando una instrucción,
ésta será completada antes que la CPU responda al pedido de interrupción. Las
interrupciones pueden ser inhibidas en conjunto poniendo un uno en el bit I del
CCR o bien individualmente, poniendo ceros en los bits de control de habilitación
de cada fuente de interrupción. El reset fuerza el bit I a uno y a cero a todos los
bits de habilitación de interrupciones locales a fin de prevenir interrupciones
durante el proceso de inicialización. Cuando el bit I está en uno, ninguna
interrupción (excepto SWI) es reconocida. Aunque pueda registrarse a la fuente de
interrupción su pedido no será atendido hasta que el bit I se ponga en cero.
9.6. Interrupciones Externas.
Las interrupciones externas proceden del pin IRQ o de los bits 3 - 0 del port A, si el
puerto A se ha configurado como puerto de interrupciones. La sensibilidad del pin
IRQ es programable. Disponemos de disparo sólo sensible a un flanco o bien
sensible a flanco descendente y nivel. Se emplea un bit del registro máscara de
opciones (MOR) para configurar la sensibilidad del pin IRQ. El pin IRQ es activo
bajo y las interrupciones del puerto A son activas en alto.
Los microcontroladores a veces incluyen sistemas periféricos dentro de su mismo
chip que pueden generar interrupciones a la CPU. El sistema de temporización
del MCU es un ejemplo de este tipo de periféricos. Las interrupciones internas
trabajan del mismo modo que las externas excepto por que hay vectores de
interrupción separados para cada sistema periférico incluido en el circuito
integrado.
9.7. Interrupciones por Programa (SWI).
La interrupción por programa es una instrucción ejecutable. La acción de la
instrucción SWI es similar a la de una interrupción (bit I) del CCR.
10. Características eléctricas.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
A continuación se presenta una tabla con el resumen de las características
eléctricas absolutas del los MCOs de la familia HC08, para información detallada y
específica de las características eléctricas y térmicas de estos dispositivos,
remitirse a la hoja de datos (data-sheet) del dispositivo de interés.
Tabla 5: Características Máximas de los dispositivos de la familia HC08.
Característica
Fuente de Voltaje
Símbolo
Valor
Unidad
VDD
-0.3 a 6.0
V
VIN
VSS -0.3 a VDD +0.3
V
Voltaje de Entrada
Todos los pines (excepto
IRQ1)
Pin de IRQ1
VSS -0.3 a 8.5
I
 25
mA
Corriente Máxima de Salida
para VSS
IMVSS
100
mA
Corriente Máxima de Salida
para VDD
IMVDD
100
mA
Temperatura
Almacenamiento
TSTG
-55 a 150
°C
Corriente Máxima por Pin
(Excepto VDD y VSS)
de
Lección 15: Microprocesadores ColdFire y tarjetas de desarrollo.
A manera de información se analizan las características de este dispositivo en
caso de algún interés por parte del estudiante para realizar alguno de sus
proyectos. Coldfire es una familia de microprocesadores de la casa fabricante de
semiconductores FreeScale, La arquitectura Coldfire esta diseñada para abordar
aplicaciones avanzadas tanto en el área industrial como aplicaciones generales de
consumo. Está presente desde hace 15 años en el mercado y representa una de
las familias de procesadores de 32 bits más extensas que se encuentra en
continua investigación y desarrollo de nuevos dispositivos, posee variedad de
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
opciones de conectividad. El tamaño del núcleo es lo suficientemente reducido
para permitir la alta integración de memoria y periféricos. Además su conjunto de
instrucciones de longitud variable le permite una optimización de código nativo sin
sacrificar de ningún modo las prestaciones del procesador.
Los módulos MAC y el más avanzado EMAC forman parte del núcleo de los
procesadores de la familia Coldfire V2/V3/V4, proporcionando soporte para
algoritmos de procesado digital de señal. Los módulos MAC/EMAC son una
extensión del multiplicador básico contenido en otras arquitecturas de 32 bits. El
objetivo de esta extensión hardware es proporcionar la ejecución nativa de
operaciones de procesado digital lo más rápido y eficientemente posible dentro de
los límites establecidos por la aplicación.
La arquitectura Coldfire no fue diseñada para procesado digital de alta velocidad,
pero del mismo modo un DSP de altas prestaciones podría ser excesivo dentro de
muchas aplicaciones embebidas. Coldfire con la adición del módulo MAC/EMAC
ocupa el lugar intermedio entre velocidad, complejidad de diseño y funcionalidad.
Los microprocesadores Coldfire son bastante empleados para aplicaciones de
sistemas embebidos porque además de la economía y la facilidad en su
programación, representa ventajas en su empleo como la existencia de
herramientas software y fácil acceso a soporte online, documentación e infinidad
de librerías con aplicaciones en diversas áreas.
Tarjetas de desarrollo.
Las tarjetas de desarrollo son sistemas integrados cuya razón de ser es brindar al
usuario, llámese estudiante, ingeniero o desarrollador, las herramientas
necesarias para diseñar y desarrollar aplicaciones. Normalmente una tarjeta de
desarrollo es una placa de circuito impreso en la que se han implementado
diferentes componentes de uso común a la hora de desarrollar un sistema
embebido además de la electrónica de soporte para programar el dispositivo.
La ventaja de emplear este tipo de trajetas de desarrollo radica en el hecho de que
se cuenta con un hardware de propósito general que brinda el acceso a los
diferentes periféricos del MCU entonces el desarrollo se reduce a la programación
adecuada del dispositivo evitandose la realización de gran parte del hardware en
cada proyecto de diseño.
Entre los componentes que se pueden encontrar en una tarjeta de desarrollo
están:


Interfaces visuales como displays de 7 segmentos, Leds o LCD.
Dispositivos externos para almacenamiento de datos (memorias).
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS






Integrados para manejo de temporización (relojes).
Fuentes de alimentación regulada.
Dispositivos de entrada como Swiches pulsadores o teclados.
Interfaces y conectores para la comunicación manejando diferentes
protocolos (USB, RS232, Ethernet, etc.)
Conectores que habilitan el acceso a los diferentes puertos de E/S del
microcontrolador.
Elementos de salida de potencia como Reles, Dirvers para motores, etc.
En la siguiente figura se presenta un ejemplo de tarjeta de desarrollo:
Figura 25: ejemplo de tarjeta de desarrollo.
ACTIVIDADES DE AUTOEVALUACIÓN DE LA UNIDAD






Que es un sistema embebido?
Cuál es la importancia y la aplicación de un sistema embebido?
Cuáles son las fases de diseño de un sistema embebido?
Cuáles son los componentes principales de un sistema embebido?
Cuáles son los componentes de una CPU?
Cuáles son las características de un microcontrolador HC08?
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
BIBILIOGRAFÍA:
[1]
BARRETT Steven F, Pack Daniel J.Microcontrollers Fundamentals for
Engineers and Scientists. Morgan & Claypool. 2006.
[2]
NOERGAARD Tammy. Embedded Systems Architecture. Newnes. 2005.
[3]
MARWEDEL Peter. Embedded System Design. Springer. 2006.
[4]
CATSOULIS John. Designing Embedded Hardware. O'Reilly. 2005.
[5]
ZURELL Kira.(2000). C Programming for Embedded Systems. R&D Books.
[6]
BARR Michael. Programming Embedded Systems in C and GNU
Development. O‟Reilly. 2006.
[7]
P. RAGHAVAN, Amol Lad, Sriram Neelakandan. Embedded Linux System
Design and Development. Auerbach Publications. 2006.
LINKS
[8] www.freescale.com
[9] http://www.cosmic-software.com/products.php
[10] http://www.uclinux.org/ports/coldfire/
[11] http://www.processorexpert.com/
[12] http://www.embedded.com
[13] http://www.bairesrobotics.com.ar/data/guia68hc08.pdf
[14] http://gem.win.co.nz/mario/hc08/
[15] http://akimpech.izt.uam.mx/Web_jr/ami.htm
[16] http://www.it.uc3m.es/ttao/html/index.html
[17] http://www.lasalle.edu.co/csi_cursos/informatica/teoria/ (Glosario)
[18] http://www.depeca.uah.es/wwwnueva/docencia/ITIEI/sd/index.htm#documentos
[19] www.bairesrobotics.com.ar/data/instrucc0508.pdf
[20] www.bairesrobotics.com.ar/data/guia68hc08.pdf
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
UNIDAD 2
Nombre de la Unidad
Introducción
Justificación
Intencionalidades
Formativas
Denominación de
capítulos
Desarrollo de software para sistemas embebidos
Ya conocidos los conceptos básicos de los sistemas
embebidos se debe conocer el cómo se desarrolla
software para dichos sistemas
Introducir al estudiante del curso en el desarrollo de
software para sistemas embebidos
 Introducir al estudiante en la programación de
sistemas embebidos
 Reconocer el lenguaje programación Assembler
 Introducir al estudiante en el desarrollo de
aplicaciones en sistemas embebidos
 Desarrollar una tarjeta de programación universal
 Introducir al estudiante en la programación de
sistemas embebidos en C
 Introducir al estudiante en la programación del
microcontrolador HC08
4. Introducción a la programación de sistemas embebidos
5. Prácticas básicas y aplicaciones
6. Introducción a la programación en C y microcontrolador
HC08
CAPITULO 4: INTRODUCCIÓN A LA PROGRAMACIÓN DE SISTEMAS
EMBEBIDOS.
En el presente capítulo se presenta la forma de planear y escribir programas para
sistemas embebidos, partiendo desde la concepción misma de la funcionalidad
que realizará el dispositivo a diseñar, se aprenderá a desarrollar diagramas de
flujo y a partir de estos, realizar la programación correspondiente en lenguaje
assembler.
Lección 1: Diagramas de Flujo.
Un diagrama de flujo es la representación gráfica de los pasos o etapas de un
proceso describiendo las secuencias en interacciones de dicho proceso en un
algoritmo, esta representación se basa en el empleo de diferentes símbolos que
representan operaciones específicas, normalmente dichas operaciones se
interconectan con flechas indicando una secuencia de operación, es por tanto que
se conocen como diagramas de flujo, son útiles en programación puesto que
representan de manera gráfica y simple de leer los algoritmos y operaciones que
se requiere implementar en un sistema computacional cualquiera, sirviendo así
como medio de planificación para escribir programas.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Para evitar ambigüedades al momento de descifrar un diagrama de flujo, se han
estandarizado los símbolos que en este tipo de representaciones se emplean
sumado a una serie de reglas y recomendaciones (norma ISO 5807), a
continuación se enumeran los símbolos más comunes y una explicación se su
funcionalidad, ver figura 26:






Ovalo: Normalmente se emplea para indicar el inicio o el fin de un proceso
o algoritmo. En su interior se sitúan materiales, información o acciones para
comenzar el proceso o para mostrar el resultado en el final del mismo
Flecha: Indica el sentido y trayectoria del proceso de información o tarea.
Rectángulo: Es el símbolo más comúnmente utilizado. Se usa para
representar un evento que ocurre de forma automática y del cual
generalmente se sigue una secuencia determinada.
Rombo: Se utiliza para representar una condición. Normalmente el flujo de
información entra por arriba y sale por un lado si la condición se cumple o
sale por el lado opuesto si la condición no se cumple. El rombo además
especifica que hay un salto o bifurcación.
Romboide: en su interior generalmente se sitúa información de apoyo
necesaria para realizar una actividad.
Círculo: Representa un punto de conexión entre procesos. Se utiliza
cuando es necesario dividir un diagrama de flujo en varias partes, por
ejemplo por razones de espacio o simplicidad. Una referencia debe darse
dentro para distinguirlo de otros. La mayoría de las veces se utilizan
números en los mismos.
Ciertas reglas que hay que tener en cuenta a la hora de realizar diagramas de flujo
pueden ser las siguientes:






Debe existir siempre un camino que permite llegar a una solución
(finalización del algoritmo).
Solo debe existir un único inicio del proceso.
Nombrar o etiquetar correctamente los procesos para evitar confusiones.
Solo debe existir un único punto de fin para el flujo de proceso, salvo el
caso de bifurcaciones a partir de rombos.
Se deben evitar los ciclos infinitos que bloqueen el programa y las entradas
que no presentan salidas.
Evitar elementos de generación espontánea, es decir salidas que no son
generadas a partir de una entrada, generalmente son situaciones erróneas.
Figura 26. Figuras empleadas en los diagramas de flujo.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Ejemplo: realizar el diagrama de flujo para una rutina de retrazo de 100 ms.
Figura 27. Diagrama de flujo para una rutina de retrazo de 100 ms.
Como se observa en la figura 27 un simple ejemplo de cómo realizar un diagrama
de flujo para un proceso muy empleado en programación de microcontroladores
como lo es una rutina de retardo, la idea general de este diagrama de flujo es
representar un pedazo de código que realice la funcionalidad requerida, para tal
efecto se inicia un contador que se decrementa de uno en uno hasta que dicho
contador sea cero, el valor con el que se inicia el contador depende del tiempo de
espera que pueda ser implementado en el dispositivo, por ejemplo si dicho tiempo
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
de espera es de 2 ms, entonces el contador se inicia en 50 así al realizar las
iteraciones requeridas para decrementar este valor a cero, la rutina finaliza una
vez se cumple el retrazo requerido. Se puede observar también que en el bloque
con forma de rombo es donde se toma la decisión de finalizar o no el programa.
Lección 2: Programación en Lenguaje Ensamblador (Assembler).
El lenguaje ensamblador marca un buen punto de partida para el estudiante
puesto que representa un estudio profundo de cualquier microcontrolador tanto en
su estructura como en su juego de instrucciones, brindando las bases suficientes
para adentrarse en el mundo de la programación y desarrollo de aplicaciones con
los microcontroladores.
Es recomendable tener presente el manual de referencia ‟CPU08RM.pdf‟ que
puede bajarse de la página del fabricante de los MCU‟s (www.freescale.com). En
él se puede encontrar toda la información relevante para reforzar algunos de los
temas analizados durante el curso como el modelo de programación,
instrucciones, modos de direccionamiento, etc. además se encuentran ejemplos
sobre el uso de algunas instrucciones.
1. El Assembler.
Como es sabido los sistemas computacionales requieren instrucciones de manera
secuencial y así que puedan realizar las funciones para las cuales han sido
diseñados, de otra forma serían inservibles. Estas instrucciones de forma
secuencial forman lo que se conoce como programas. Existen diferentes formas
de escribir programas pero independientemente de esto, los dispositivos
semiconductores de procesamiento lo único que comprenden y procesan es el
lenguaje de máquina.
El lenguaje de máquina está conformado por códigos de instrucción que en
esencia son números representados por series binarias, todos los dispositivos de
procesamiento tienen un código de operación (op.code) para cada una de sus
funciones. Como se ha visto anteriormente se sabe que todas las instrucciones
para cualquier lenguaje de máquina tienen por lo menos dos partes; la primera es
el comando u operación en si, que dice al procesador cuál es la función que se va
a realizar. La segunda parte de la instrucción es el operando, que indica al
procesador donde (posición en memoria) hallar o almacenar los datos y otras
instrucciones que serán manipuladas.
Puesto que para el ser humano manejar este tipo de códigos a la hora de realizar
la programación de los dispositivos resultaría extremadamente tedioso se han
desarrollado diferentes técnicas y lenguajes de programación tanto de alto como
de bajo nivel.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
El lenguaje ensamblador en un lenguaje de bajo nivel ya que es la representación
más directa de los códigos de instrucción mediante nemónicos, un nemónico es un
vocablo que en lenguaje ensamblador representa un código de instrucción binario,
los nemónicos se emplean para facilitar el aprendizaje, por parte del programador,
de los diferentes códigos que soporta un determinado dispositivo. Toda
programación realizada en lenguaje ensamblador debe ser compilada o traducida
a código de máquina para que el dispositivo pueda entenderla.
Para comprender mejor este concepto se presenta el siguiente ejemplo:
Se tiene el siguiente código de máquina en Binario: 10100110 01100001
(Hexadecimal: 0xA661). La representación equivalente en lenguaje ensamblador
es más fácil de recordar: MOV $61; Esta instrucción significa: cargue el
acumulador con el dato almacenado en la posición 61 de la memoria.
Algunos pros y contras sobre el empleo de este lenguaje se enumeran a
continuación:
Pros:

Los programas hechos en lenguaje ensamblador son generalmente más
rápidos en su ejecución que los hechos en lenguajes de alto nivel con
iguales funcionalidades. Al programar cuidadosamente en lenguaje
ensamblador se pueden crear programas que se ejecutan de 5 a 10 veces
más rápido que con lenguajes de alto nivel.

Los programas hechos en lenguaje ensamblador generalmente ocupan
menos espacio de memoria. Un buen programa en lenguaje ensamblador
puede ocupar casi la mitad de espacio que su contraparte en lenguaje de
alto nivel.

Utilizando lenguajes de alto nivel, no es un buen comienzo para aprender
sobre los MCU’s, mas aún, se necesita conocer todas las características de
la arquitectura para poder programar con lenguajes de alto nivel.

Con el lenguaje ensamblador se pueden crear segmentos de código
imposibles de formar en un lenguaje de alto nivel.

A medida que se aprenda a programar en assembler se pueden ir creando
librerías de funciones que se pueden añadir a futuros códigos inclusive
implementar en otro tipo de MCU, facilitándose así mucho el trabajo.

Es bueno conocer el lenguaje ensamblador incluso si se programa en
lenguajes de alto nivel puesto que muchos compiladores permiten la
incrustación de código ensamblador en algún segmento de programa.
Contras:
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS



Programar en lenguaje ensamblador es difícil de aprender, entender, leer,
escribir, depurar y mantener, por eso surgió la necesidad de los lenguajes
compilados.
El lenguaje ensamblador no es 100% portable.
Programar en lenguaje ensamblador toma tiempo.
Lección 3: Notaciones y sintaxis.
Todos los programas en assembler son creados en un editor de texto cualquiera
produciéndose un archivo de texto siguiendo algunas reglas y notaciones, para
empezar en las siguientes tablas se presentan las notaciones de los diferentes
registros de la CPU y los bits del registro de código de condición:
Tabla 6. Notación de los registros del MCU.
Notación
A
CCR
H:X
SP
PC
Registro
Acumulador
Reg. de condición
Reg. Indice
Puntero de Pila
Contador de Programa
Tamaño del registro
8
8
16
16
16
Tabla 7. Notación de los Bits del CCR.
Notación
H
I
N
Z
C
Descripción
Acarreo Medio, Bit 4
Máscara de Interrupción, Bit 3
Bandera de Negativo, Bit 2
Bandera de Cero, Bit 1
Bandera de acarreo, Bit 0
A continuación se realizan ciertas definiciones relevantes a la hora de escribir
programas en assembler:
Líneas de comentario:
Son empleadas por el usuario para documentar el programa que se encuentra
desarrollando, sirven para que en futuras ocasiones pueda comprender que se ha
realizado o en caso de que otra persona entre a analizar el programa. Las líneas
de comentario no deben afectar la programación a la hora de compilar, por lo tanto
para que el compilador las identifique se debe anteponer punto y coma (;) o un
asterisco en la parte mas izquierda de la línea de texto.
Ejemplo:
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
******************************************************************
*
Este es un comentario
******************************************************************
;Este también es un comentario.
LDA
NUM1
*
; Este también es un comentario.
Etiquetas:
También conocidas como identificadores, son nombres para constantes, variables,
direcciones y subrutinas definidos por el programador, los nombres pueden
contener letras mayúsculas y minúsculas también pueden tener números pero no
pueden tener signos de puntuación ni tener más de 10 caracteres. Los nombres
son sensibles a diferencias entre mayúsculas y minúsculas; por ejemplo PuertoA y
puertoA son dos etiquetas diferentes.
Las etiquetas se definen colocándose en la parte más hacia la izquierda de la
línea de código; el ensamblador le asigna internamente un valor igual a la
dirección actual, es importante no definir las etiquetas más de una vez, de lo
contrario el ensamblador registrará un error. La dirección de la memoria se va
actualizando a medida que se van ocupando los bytes ya sea para programa o
almacenamiento de datos.
Otra forma de definir etiquetas es empleando la directiva EQU asignando entonces
el valor que se encuentra en la columna de parámetros, en este caso el espacio
de memoria actual permanece invariable.
Ejemplo:
FLASH
Ten
EQU
EQU
$EE00
10
Expresiones Matemáticas:
El lenguaje ensamblador tiene un desempeño limitado en el campo de las
expresiones matemáticas, solo una operación es permitida por expresión, para
escribir expresiones se debe tener en cuenta que el operador debe estar
separado de los parámetros por espacios en blanco. Los operadores válidos son:
suma (+), resta (-), multiplicación (x), división (/) y módulo (%).
Las anteriores operaciones aritméticas son llevadas a cabo por el ensamblador en
el momento de compilar un código, es decir, el resultado de las expresiones es
convertido directamente en un valor constante o una dirección de memoria. Una
aplicación de las expresiones puede ser el acceso a un parámetro de varios
bytes, por ejemplo, si se supone que NUM es una variable está declarada como
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
de 4 bytes, para acceder cada byte individualmente se emplearía NUM, NUM + 1,
NUM + 2, NUM + 3.
Ejemplo:
NUM
DS
LDA
LDA
4
NUM + 3
NUM
; Se reserva 4 Bytes para NUM.
; Se carga el LSB en el Acumulador.
; Se carga el MSB en el Acumulador.
Es de tener en cuenta que el ensamblador asigna el primer byte para el byte más
significativo (MSB), seguido por los menos significativos.
Para evitar confusiones por parte del estudiante a la hora de escribir código en
assembler a continuación se resumen las convenciones que se emplean a la hora
de escribir la programación en assembler.















Cualquier texto que se encuentre después de un símbolo (;) es considerado
como un comentario.
Un asterisco en la posición más hacia la izquierda define toda la línea como
un comentario.
Las instrucciones del juego de instrucciones de la CPU pueden ser escritas
en mayúsculas o minúsculas.
Todas las etiquetas son sensibles a las mayúsculas, no pueden tener más
de 10 caracteres ni signos de puntuación.
La definición de las etiquetas debe hacerse en la parte más hacia la
izquierda de una línea de código, el uso de dos puntos (:) después de una
etiqueta es opcional.
Las operaciones o directivas deben ir precedidas de un espacio en blanco o
TAB horizontal.
Los parámetros de las instrucciones deben ir separados por espacios en
blanco, comas o TAB‟s horizontales.
El direccionamiento inmediato se especifica al emplear el símbolo #
precediendo un parámetro constante.
Las constantes Binarias son precedidas por el símbolo %.
Las constantes Hexadecimales son precedidas por el símbolo $.
Los números serán decimales excepto los que son precedidos por % o $.
Las expresiones matemáticas se restringen a una sola operación y puede
ser +, -, x, / y %.
Las operaciones matemáticas deben separarse de los parámetros por
espacios en blanco.
Si al final de un registro se coloca una letra H o L significa que se trata de la
parte alta o baja correspondientemente, es decir los 8 bits mas significativo
(parte alta) o los 8 menos significativos (parte baja).
Una letra „n‟ inmediatamente después de un registro indica la posición o bit
„n‟ de dicho registro.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Lección 4: Tipos de Instrucciones.
En esta sección se analizarán los diferentes tipos de instrucciones que poseen los
MCU‟s de la familia HC08 describiendo sus características y funcionalidades,
queda como tarea para el estudiante revisar la sintaxis y funcionamiento
específico de las instrucciones que emplee en sus prácticas enfatizando el estudio
en las banderas que afecta una determinada instrucción y como puede emplearse
este hecho para los propósitos y funcionalidad de los programas que se desean
desarrollar.
1. Instrucciones de transferencia.
Las instrucciones de transferencia o movimiento de datos que se pueden observar
en la tabla 3 de la sección 3.4.6 se encargan de realizar movimiento de datos
entre los diferentes registros y memorias del MCU, esto se realiza ya que durante
la ejecución de un programa, los operandos y las direcciones se encuentran en la
memoria mientras que el procesador no sabe nada de las operaciones que va a
realizar, por lo tanto la función de un programa es la de cargar los datos y
direcciones necesarios para que se realicen las tareas que de debe cumplir el
MCU para las cuales ha sido realizado el programa.
El movimiento de datos se puede realizar de 3 maneras diferentes:
1. De un registro del procesador a la memoria.
2. De la memoria a los registros del procesador
3. De un registro del procesador a otro registro del procesador.
Entre las instrucciones de transferencia de datos existen:
Instrucciones de Carga: Son las encargadas del movimiento de datos desde la
memoria a los registros del procesador, se realiza una operación de entrada de
datos mediante la lectura desde la memoria y posterior carga de uno o más bytes
en el correspondiente registro del procesador, las instrucciones que copian dos
bytes siguen la convención de cargar el dato más significativo primero.
Entre las instrucciones de carga se tienen: LDA, LDX, LDHX.
Instrucciones de Almacenamiento: Son responsables del movimiento de datos
desde los registros del procesador a memoria, se realiza una operación de salida
de los datos de los registros mediante la lectura desde el registro del procesador y
posterior carga de uno o más bytes en la posición de la memoria correspondiente.
Entre las instrucciones de almacenamiento se tienen: STA, STHX, STX.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Instrucciones de transferencia: Se encargan del movimiento de datos de un
registro del procesador a otro, entre las instrucciones de transferencia se tienen:
TAX, TXA.
2. Instrucciones Aritméticas.
Se trata de un sub-grupo de instrucciones que emplean la unidad aritmético-lógica
para realizar operaciones aritméticas empleando como parámetros los contenidos
tanto del acumulador como de alguna posición de la memoria, el resultado de
dichas operaciones realizadas se almacenan en el acumulador o en la posición de
memoria dependiendo de lo estipulado por la instrucción. Entre las instrucciones
aritméticas existen:
Instrucciones de Suma: Encargadas de sumar el contenido del acumulador con
los contenidos en alguna posición de memoria o registro, los datos son guardados
en el acumulador. Entre las instrucciones de suma se tienen ADC, ADD.
Instrucciones de Resta: Encargadas de restar el contenido del acumulador con
los contenidos en alguna posición de memoria o registro, los datos son guardados
en el acumulador. Entre las instrucciones de resta se tienen: SUB, SUC.
Multiplicación (MUL): Esta instrucción multiplica los 8 bits del registro índice (X)
por los ocho bits del acumulador, obteniéndose un número de 16 bits sin signo
encadenando el registro índice con el acumulador, después de la operación X
contiene los bits mas significativos del resultado de 16 bits.
División (DIV): Esta instrucción divide un número de 16 bits sin signo (dividendo)
contenido entre los registros encadenados H (índice parte alta) y el acumulador,
entre un número de 8 bits (divisor) contenido en X (índice parte baja). El cociente
se almacena en el acumulador y el divisor queda inalterado.
3. Instrucciones de Manipulación de Datos.
Son empleadas para realizar alguna operación fija o estándar sobre un dato
determinado, entre este tipo de instrucciones existen:
Instrucciones de Incremento: Son una clase especial de instrucciones de
adición, su función es incrementar en una unidad el operando sobrescribiendo
éste con el resultado de la operación. Entre las instrucciones de incremento se
tienen: INCA, INCX, INC.
Instrucciones de Decremento: Son una clase especial de instrucciones de resta,
su función es decrementar en una unidad el operando sobrescribiendo éste con el
resultado de la operación. Entre las instrucciones de incremento se tienen: DECA,
DECX, DEC.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Instrucciones de Negación: Estas instrucciones cambian en signo de un dato
que se encuentre en el acumulador o en una determinada posición de memoria,
este cambio de signo se realiza empleando la operación de negación binaria en
complemento a dos. Específicamente estas instrucciones lo que hacen es restarle
el operando a cero sobrescribiendo éste con el resultado. Entre las instrucciones
de negación se tienen: NEGA, NEGX, NEG.
4. Instrucciones de Rotación y Desplazamiento.
La familia HC08 soporta varios tipos de operaciones de rotación y desplazamiento
de datos, tanto del tipo aritmético como del tipo lógico, las operaciones de
desplazamiento están basadas en los principios de funcionamiento de los registros
de desplazamiento, en donde los datos se mueven bit por bit hacia la derecha
(hacia el LSB) o hacia la izquierda (hacia el MBS).
El desplazamiento lógico consiste en la introducción de un „0‟ en alguno de los
extremos de la palabra (dato) empujando al resto de los bits una posición hacia la
dirección contraria (ver figura 28.). Por otro lado el desplazamiento aritmético es
similar al lógico con la excepción de que cuando el desplazamiento es hacia la
derecha (hacia el LSB) el signo se mantiene, es decir, en lugar de introducir un „0‟
se realiza una copia del bit de signo (MSB) la cual es introducida para realizar el
desplazamiento, manteniéndose así el signo (ver figura 28.).
La rotación de datos en una forma especial de desplazamiento, cuando se realiza
lo que ocurre es que el dato a la salida del desplazamiento es retroalimentado a la
entrada del registro, la rotación puede ser en ambos sentidos.
Figura 28. Formas de Rotación y desplazamiento en la familia HC08.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Entre las instrucciones de rotación y desplazamiento se tienen: ROLA, ROLX,
ROL, RORA, RORX, ROR, LSLA, LSLX, LSL, LSRA, LSRX, LSR, ASRA, ASRX,
ASR.
5. Instrucciones lógicas:
Se trata de un sub-grupo de instrucciones que emplean la unidad aritmético-lógica
para realizar operaciones lógicas empleando como parámetros los contenidos
tanto del acumulador como de alguna posición de la memoria, el resultado de
dichas operaciones realizadas se almacenan en el acumulador o en la posición de
memoria dependiendo de lo estipulado por la instrucción. Entre las instrucciones
lógicas se tienen: AND, ORA, EOR, COMA, COMX, COM, NSA.
6. Instrucciones de Comparación.
Son un grupo especial de instrucciones que solamente afectan la bandera de
estados (reg. CCR), ningún dato es modificado por estas instrucciones puesto que
únicamente su función es la de comparar dos números y modificar las banderas
de estado dependiendo de la relación que exista entre éstos. Estas instrucciones
son usadas exclusivamente en conjunto con las instrucciones de bifurcación
condicional como preparación para una bifurcación condicional.
Dados dos números A y B; La comparación entre estos se realiza mediante una
sustracción puesto que al restar dos números se puede conocer si A > B, si el
resultado de A – B es un número positivo, o si son iguales si A – B = 0, o si A < B
si el resultado de A - B es un número negativo.
La diferencia de las instrucciones de comparación con respecto de la resta común
radica en el hecho de que los operandos no son modificados como en el caso de
la resta que carga el resultado en el acumulador.
Hay instrucciones especiales para la comparación directa de un número con cero
la ventaja de estas es que solo es necesario entregar el parámetro que se va a
comparar puesto que se supone que el otro es cero.
Entre las instrucciones de comparación se tienen: CMP, CPX, BIT, TSTA, TSTX,
TST, BRCLR, BRSET, CPHX.
7. Instrucciones de Salto.
Este tipo de instrucciones se encargan de controlar o alternar el flujo del programa
cambiándolo a cualquier posición de la memoria que sea direccionable, las
instrucciones de salto cargan directamente el contador de programa (PC) con una
dirección de 16 bits, dirección en la cual se ubica la siguiente instrucción a ser
ejecutada (dirección de destino).
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Este tipo de saltos son incondicionales, puesto que pueden alterar el flujo del
programa cada vez que son ejecutadas y son empleadas en los programas cada
vez que se requiera un cambio absoluto del flujo del programa. Este tipo de
instrucciones son empleadas normalmente en un código seguidas de una etiqueta
que identifica la dirección a donde se realiza el salto. Entre las instrucciones de
salto incondicional se tienen: JMP, JTS, RTS.
8. Instrucciones de Bifurcación (Branch).
Las instrucciones conocidas como bifurcaciones, a diferencia de las de salto no
cargan al PC directamente con la dirección de la memoria donde se encuentra la
siguiente instrucción a ejecutar sino que esta es calculada a partir de el contador
de programa, estas instrucciones emplean un modo de direccionamiento relativo.
Todas las instrucciones de bifurcación realizarán una comprobación de alguna
expresión de tipo booleano para determinar si la bifurcación será tomada o se
continuará el flujo normal del programa, estas instrucciones generalmente vienen
por pares, es decir, si por ejemplo existe una instrucción que revisa si el número
es igual a cero también existe su complementaria que revisa que el número no sea
igual a cero (BEQ y BNE). Las instrucciones de bifurcación se clasifican en los
siguientes grupos funcionales: incondicionales, condicional simple, condicional sin
signo, y condicional con signo.
Las incondicionales son dos en especial; BRA (Branch Always) y BRN (Branch
Never) la primera siempre pasará la comprobación por lo cual siempre realiza la
bifurcación, por el contrario la segunda nunca lo hará, esta es útil en el caso que
se realiza una depuración de código para reemplazar otra instrucción de
bifurcación o en el caso de ciclos de temporización para realizar retardos.
Las instrucciones de bifurcación condicional simple realizan la comprobación de
cualquier bit de la bandera de estados (reg, CCR). Las condicionales sin signo no
tienen en cuenta el bit de signo (MBS), es decir toman los valores de 8 o 16 bits
como magnitudes es decir solo revisan la relación entre dos palabras de datos sin
signo.
Caso contrario de las instrucciones de bifurcación con signo en las que la
comprobación se realiza entre parejas de datos teniendo en cuenta la perspectiva
de magnitudes con signo en complemento a dos.
Entre las instrucciones de bifurcación se tienen: BRA, BRN, BSR, BHI, BLO, BHS,
BLS, BPL, BMI, BEQ, BNE, BCC, BCS, BHC, BHCC, BHCS, BMC, BMS, BIL, BIH,
BGE, BGT, BLE, BLT, CBEQ, CBEQA, CBEQX, DBNZ.
9. Instrucciones de control.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
En algunos casos es necesario manipular los bits de la bandera de estado
(registro CCR) ya sea para ponerlos en „1‟ o en „0‟ antes de realizar alguna
operación para asegurar el correcto funcionamiento de otra instrucción diferente.
Entre las instrucciones de control se tienen: SEC, CLC, SEI, CLI, SWI, RTI, RSP,
NOP, WAIT, STOP, TAP, TPA, TSX, TXS.
Lección 5: Escribiendo un pequeño programa.
A continuación se realizará de forma metódica la solución a un pequeño problema
de programación, comenzando con la definición de los requerimientos de la
aplicación, seguido de la correspondiente documentación mediante un diagrama
de flujo, hecho esto, se escribirá el programa empleando un editor de texto
estándar escribiendo los nemónicos correspondientes para cada bloque del
diagrama de flujo.
La función del programa a realizar consiste en hacer que el microcontrolador
revise un pin de alguno de sus puertos configurado como entrada, este pin estará
conectado a un pulsador que pondrá el pin a tierra cuando se encuentre
presionado. Cuando el microcontrolador detecte que el pulsador ha sido
presionado debe poner en alto otro pin configurado como salida para encender un
LED por 1 segundo, el tiempo que se mantenga presionado el pulsador no debe
afectar el tiempo en que el LED es encendido por lo tanto éste solo se volverá a
encender una vez el pulsador ha sido soltado y presionado de nuevo.
El montaje del circuito de prueba se realiza haciendo las conexiones necesarias
para que funcione el MCU (revisar sección de montaje); además se conecta el
pulsador en configuración pull down al pin menos significativo (LSB) del puerto A
mientras el Led es conectado al pin más significativo (MSB) empleando una
configuración pull up.
1. Diagrama de flujo Programa principal.
En la figura 29 se presenta el diagrama de flujo correspondiente a la aplicación
que se desea programar. Como se puede apreciar el diagrama de flujo contiene la
mayoría de los bloques descritos anteriormente y cumple con las reglas
necesarias para evitar ambigüedades.
El flujo del programa es simple pero no es algo trivial, ya que no se puede lograr la
misma funcionalidad de manera sencilla con componentes discretos, se requeriría
una serie de integrados externos para realizar la temporización, en ello radica la
conveniencia de utilizar un microcontrolador gobernado por un programa ya que
éste entra a reemplazar el empleo de diferentes integrados para realizar la misma
funcionalidad.
Para escribir un programa en lenguaje ensamblador a partir del diagrama de flujo,
el programador debe desarrollar una serie de instrucciones que desempeñarán las
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
funcionalidades especificadas en cada bloque del diagrama. El paso a seguir con
este ejemplo es tomar cada uno de los bloques presentando una opción para la
programación con la correspondiente explicación de las instrucciones empleadas.
Se recomienda al estudiante hacer uso de los manuales de referencia para
consultar los nemónicos de los diferentes comandos.
Figura 29. Diagrama de flujo de la aplicación. Revisar
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Para empezar se debe inicializar el microcontrolador configurando los puertos del
mismo de acuerdo a las necesidades de la aplicación, en este caso se configuran
los pines del puerto A del MCU como entradas a excepción del pin 7 que se
empleará como salida para encender el led. La primera precaución que hay que
tener en cuenta es la de poner el pin configurado como salida (Bit 7, puerto A
(MSB)) en „1‟ para mantener el LED apagado hasta que se detecte la condición de
encendido.
Los nemónicos correspondientes a esta parte del diagrama de flujo se presentan a
continuación:
PORTA
DDRA
TEMP1
EQU $00
;Asignación Directa Dirección del puerto A
EQU $04
;Asigna Dirección control de dato, puerto A
EQU $C0
;Asigna Posición de memoria temporal(1 byte)
ORG $0300
;El Programa empezará en Dir $0300
INIT
LDA #$80
;Empieza la inicialización
STA PORTA
;El LED se apagará
STA DDRA
;Pone el bit 7 del puerto como salida
* El resto de pines del puerto se configura como entrada
El puerto A del HC08 es configurado desde dos registros; el registro de datos y el
registro de configuración o control de dato, $0000 y $0004 respectivamente, el
primero contiene los datos que se cargarán en cada uno de los pines del puerto y
el segundo contiene los bits de configuración del puerto, es decir determina si
cada pin es una entrada („0‟) o una salida („1‟).
Para una información más
detallada sobre los puertos se recomienda al estudiante revisar la sección de
puertos I/O en las hojas de datos de la familia HC08 o del dispositivo en particular
con que se encuentre trabajando.
En la programación se emplean etiquetas (PORTA DDRA TEMP1) para obtener
acceso directo a estas direcciones la siguiente instrucción (ORG) indica al
compilador únicamente la dirección de memoria desde donde se comenzará a
almacenar el programa.
La instrucción LDA #$80, de acuerdo con las convenciones aprendidas y el set de
instrucciones del MCU, lo que realiza es cargar el acumulador empleando
direccionamiento inmediato (#) con el dato $80 (%10000000), este dato se carga
en el acumulador con la intención de cargarlo posteriormente en el registro de
datos y en el registro de configuraciones del puerto A.
De acuerdo con el diagrama de flujo, a continuación se realiza la operación de
revisión del pin que se encuentra conectado al pulsador para conocer su estado,
para tal efecto se carga el puerto A en su totalidad en el acumulador y luego se
realiza la operación lógica AND para comparar el bit de interés (LSB) con un valor
alto („1‟ lógico).
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
TOP
LDA PORTA
AND #$01
; Carga el puerto A en el acumulador
; Prueba el bit-0
La acción representada por el primer rombo del diagrama de flujo se realiza con el
comando BEQ (bifurcación si es igual), si el resultado de la operación AND es „0‟
lógico es decir que al comparar el puerto A con $01 resulta que los números son
iguales se realiza la bifurcación devolviéndose hacia la etiqueta TOP creándose un
lazo de espera hasta que el pulsador sea presionado. En caso de que se detecte
que se ha presionado el pulsador, se continúa normalmente con la siguiente
instrucción.
BEQ TOP
; Lazo hasta que bit0 = 1.
La siguiente instrucción en caso de detectarse que el pulsador ha sido presionado
es un salto a la subrutina de espera para evitar rebotes.
JSR
DLY50
; Retardo de 50 ms para los rebotes
La subrutina de retardo se emplea en dos ocasiones para esta aplicación, como
retardo anti-rebote y para determinar el tiempo de 1 seg que será encendido el led
en caso de ser presionado el pulsador. El correspondiente diagrama de flujo y
detalle de programación de esta subrutina se presenta posteriormente.
A continuación del retardo anti-rebote se enciende el Led empleando el siguiente
comando:
BCLR 7, PORTA
; Enciende el LED (bit-7 del Puerto A)
Es de tener en cuenta que debido a la forma de conexión del Led (Pull Up) se
requiere que en el pin al que se encuentra conectado sea puesto en un estado
bajo o „0‟ lógico para hacer que la corriente circule por éste, encendiéndolo así.
Una vez el Led es encendido, el flujo del programa indica que debe existir un
retardo de un (1) segundo en el cual el Led debe permanecer encendido, para tal
efecto es emplea nuevamente la subrutina de retardo pero esta vez puesto que se
requiere que el retardo sea aun mayor y teniendo en cuenta que la subrutina
creada genera un retardo de 50 ms, se debe realizar un lazo que se repita 20
veces para completar 1 segundo. Los comandos empleados se presentan a
continuación:
DLYLP
LDA #20
JSR DLY50
DECA
BNE DLYLP
BSET 7,PORTA
;El Decimal 20 se carga en el acumulador
;Retardo de 50 ms
;se decrementa el acumulador en una unidad
;Si el acumulador no es cero ir a DLYLP.
;Apaga el LED
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
El programa finaliza de acuerdo con los requerimientos establecidos con una
rutina de espera hasta que el pulsador sea soltado para evitar que se detecte otra
orden de encendido del Led antes de haberse soltado y vuelto a presionar, los
comandos son los siguientes:
OFFLP BRSET 0,PORTA,OFFLP
JSR DLY50
BRA TOP
; Lazo hasta interruptor abierto
; Retardo antirebote.
; Ir a espera para el siguiente cierre del
; interruptor.
2. Diagrama de Flujo Subrutina de Espera 50 ms.
Como es sabido, una subrutina se trata de un programa generalmente corto que
es ejecutado varias veces a lo largo de un programa mayor la intención es escribir
este programa una sola vez y llamarlo desde el programa principal cada vez que
sea requerido empleando los comandos bifurcación a subrutina (BSR) o salto a
subrutina (JSR).
Figura 30. Diagrama de flujo de la subrutina de retardo de 50 ms.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Las instrucciones de salto y bifurcación a subrutina lo primero que hacen es
guardar automáticamente en las posiciones de memoria RAM temporales de la
pila la dirección de la instrucción inmediatamente siguiente con la intención de
retornar con el comando RTS a esta dirección una vez se ha ejecutado la
subrutina. La función RTS hace que la CPU recupere de la dirección de retorno
previamente guardada.
Por otro lado como se observa en el diagrama de flujo de la subrutina la primera
acción es guardar el acumulador para volver a cargarlo una vez se ha terminado la
subrutina, esto se realiza ya que éste puede cambiar durante la ejecución de la
subrutina y generar resultados no esperados una vez se vuelve al programa
principal.
Como se observa en la figura 30, la subrutina de retardo involucra un lazo interno
(INNRLP) dentro de otro lazo (OUTRLP). El lazo interno consiste en dos
instrucciones que se ejecutan 256 veces antes que X alcance el valor de $00
nuevamente, terminando con la bifurcación BNE, esto suma 6 ciclos a 500 ns por
256 ciclos, lo que es igual a 0.768 ms para el lazo interno. Realizando los cálculos
del caso se deduce que el lazo externo debe realizarse 65 veces; el tiempo total
para de ejecución para el lazo externo resulta 65*(1536 + 9) o 65*(1545) =
100.425 ciclos de 500 ns es decir 50.212 ms. Sumando las demás instrucciones
del lazo externo, se añaden un total de 21 ciclos así que el tiempo total de
ejecución de la subrutina DYL50 es 50.223 ms incluyendo el tiempo que requiere
la instrucción JSR para llamar a la subrutina.
Otra opción más eficiente sería utilizar el temporizador interno con que cuenta el
MCU en este caso no se requeriría realizar todos estos cálculos para cuadrar el
tiempo basados en los ciclos de instrucción y además la CPU estaría libre para
ejecutar otras acciones durante un retardo de este tipo.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
CAPITULO 5: PRÁCTICAS BÁSICAS Y APLICACIONES.
En el presente capítulo se presentarán diferentes aplicaciones prácticas basadas
en las características de microcontroladores de la familia HC08, para tal efecto
primero se exponen los requerimientos necesarios para llevar a cabo el montaje y
programación de los MCU‟s se presentará también el montaje de una tarjeta de
programación para microcontroladores de la familia HC08, esta tarjeta de fácil
realización y economía, proporcionará al estudiante una herramienta sencilla para
programar y probar el funcionamiento de las diferentes aplicaciones propuestas.
Seguidamente se abordará el tema del software CodeWarrior; que ha sido
escogido por resultar el software mas completo que permite explorar al estudiante
tanto la programación en assembler como la programación en C contando además
con herramientas de simulación, compilación y depuración que apoyarán la
profundización y puesta en práctica de los conceptos aprendidos durante el curso.
Lección 6: Programación y Puesta en Marcha.
Para programar lo MCU‟s de la Familia HC08 de freescale se deben tener en
cuenta diferentes aspectos tanto físicos (hardware) como de software; en la
presente sección se describe estos requerimientos y se presentan opciones
funcionales entre la variedad de posibilidades existentes.
1. Programación de Microcontroladores de la Familia HC08.
A continuación se darán a conocer esquemas de conexión necesarios tanto para
llevar a cabo la programación del los MCU‟s de la Familia HC08 como para la
puesta en marcha de dichos dispositivos.
Los microcontroladores de la familia HC08 cuentan con un modo de ejecución,
llamado modo usuario, el cual permite el acceso a todos los recursos del sistema
es decir que se pueden manipular características como el acceso a memoria,
manejo de interrupciones, entre otros. También existe un modo de trabajo
especializado en la programación y depuración de los MCU‟s conocido como el
Modo Monitor.
1.1. Modo monitor.
El modo monitor es una aplicación desarrollada para la familia de MCU‟s de 8 Bits
ubicada en la memoria ROM de los dispositivos, que permite la programación de
aplicaciones en la memoria no volátil así como la depuración simple de los
programas implementados por los desarrolladores, permite la ejecución de
comandos provenientes del PC (Host), tales comandos son empleados para el
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
acceso a cualquier posición de memoria o para descargar los programas en la
memoria Flash o RAM.
Este programa se ejecuta en modo usuario y se requiere de una serie de
condiciones en algunos de los pines del MCU para activarlo después de un Power
On Reset (POR). Se deben tener en cuenta los siguientes aspectos a la hora de
trabajar en modo monitor:




Para la comunicación con el PC solo se emplea uno de los pines de E/S, el
cual intercambia su configuración (entrada o salida) mientras emula el
protocolo serial hacia el PC.
Durante el modo monitor debe existir una señal de reloj externa cuya
frecuencia sea suficiente para que en el MCU se pueda alcanzar la tasa de
baudios con la que se comunica con el PC.
Muchos de los MCU‟s de esta familia deben ser adecuadamente
polarizados para su correcto funcionamiento en modo monitor.
Algunas características de seguridad son deshabilitadas al entrar en modo
monitor, entre las que se tiene COP (Computer Operation Properly), SWI
Instruction y FLASH Protection.
Cabe aclarar que el modo monitor no es una sustitución de sistemas mas
sofisticados que permiten la completa emulación de los dispositivos, pero si es una
forma económica de interconectar los MCU‟s con un PC para el envío de
comandos de manera serial realizando labores de lectura, escritura y depuración
simple en los registros y memoria del MCU.
Para entrar en modo monitor se requiere:


Un Software adecuado en el PC que se encargue de la comunicación y
programación.
Un cable serial y un POD (Circuito de Polarización y de soporte para la
comunicación serial) empleados para brindar la polarización y señales
adecuadas así como para la transmisión de comandos desde el PC.
1.2. Señales del Modo Monitor.
La interfaz física del modo monitor emplea hasta nueve pines para configurar el
MCU y establecer la comunicación serial, entre los que se encuentran:
VTST/IRQ: El modo monitor siempre entra después de un POR (Power On Reset)
con un voltaje alto (entre 7 y 9Vdc) que se conoce como Vtest en el pin IRQ del
MCU. Éste voltaje habilita la lógica de selección y demás condiciones de
operación del modo monitor.
COM/PTA0: Teniendo en cuenta que algunos M68HC08 no cuentan con una
interfaz asíncrona serial dedicada (SCI), entonces se ha implementado en la ROM
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
de estos dispositivos un protocolo serial basado en software, diseñado
específicamente para la comunicación con un PC vía puerto serial empleando el
protocolo RS-232 a una tasa de baudios estándar, 9600 baudios normalmente.
Para tal fin se emplea generalmente el pin PTA0 multiplexado en el tiempo como
transmisor y receptor, algunos dispositivos emplean para el mismo propósito el pin
PTB0.
Señales de Selección de Modo: A parte del Vtest aplicado al pin de IRQ otros 4
pines son empleados para configurar el estado de operación del modo monitor.

Dos de estos MOD0/MOD1: Estos pines se emplean para seleccionar el
modo monitor y deben ser fijados a un nivel adecuado de a cuerdo con los
requerimientos.

DIV4: Si este pin se encuentra en un estado lógico „alto‟ se configura la
frecuencia del bus a un valor equivalente a la frecuencia externa dividida
entre 4. Si por el contrario se encuentra en un estado „bajo‟ la frecuencia
externa solo se divide entre dos.

SSEL: (Serial Select). Este pin decide en que forma los bytes de seguridad
son transferidos al MCU. La programación siempre es serial y usualmente
los bytes de seguridad son transmitidos de esta forma.
Un arreglo estándar para las señales de selección de modo puede
apreciarse en la siguiente figura:
Figura 31: Arreglo estándar para las señales de selección.
OSC: Teniendo en cuenta que la comunicación serial es generada por el fimware
del modo monitor mas que por una interfaz serial dedicada, se requiere que el reloj
interno del bus sea forzado a una frecuencia que pueda generar las tasas
estándar que cualquier computador pueda „reconocer‟. La entrada OSC1 puede
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
ser manejada por un oscilador de cristal o puede emplearse una red RC
conectada a los pines OSC1 y OSC2, la frecuencia del resonador requerido
depende del tipo de dispositivo; por tanto se debe acudir a la hoja de datos del
dispositivo específico para información mas detallada.
RESET: La entrada de reset es requerida normalmente para operaciones de
depuración sofisticadas, mas no para programación y depuración simple, en este
caso el pin de Reset se conecta a la alimentación (Vdd) a través de una
resistencia de Pull-Up. En algunos dispositivos en modo monitor se puede aplicar
un voltaje Vtest después de haber entrado en modo monitor para permitir al pin de
IRQ volver a su función de interrupción siendo empleado así para propósitos de
depuración.
Ground/Vss: El pin Vss debe ser conectado a la tierra del sistema anfitrión (PC)
así suministrar el voltaje de referencia adecuado para la polarización y
comunicación propias del modo monitor.
Conexiones Para VDD y VSS: Los pines para la polarización de los MCU‟s HC08
son VDD y VSS correspondientemente para polarización y tierra en algunos de los
MCU‟s pueden existir varios de estos pines cuya función es la de polarizar o servir
de referencia para recursos del MCU como conversores A/D, generadores de reloj,
etc.
La forma de conexión ideal es colocar un condensador electrolítico (1uF) o de
tantalio (10uF) lo mas cerca posible del pin de VDD, si se emplean condensadores
electrolíticos es recomendable colocar uno cerámico (0.1uF) en paralelo, o si no
se dispone de condensadores electrolíticos ni de tantalio, se recomienda al menos
colocar el condensador cerámico de acuerdo con la siguiente figura.
Figura 32: Polarización recomendada para pines del MCU que van a VDD.
1.3. Conexiones (Pod‟s) MON08.
MON08 se conoce al hardware que conecta el PC con el circuito de la aplicación o
destino, existen del tipo comercial para todos los presupuestos, incuso existen
notas de aplicación del fabricante que describen la forma de implementar
hardware de este tipo de forma sencilla para aplicaciones no muy sofisticadas.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Una interfaz muy empleada para estos propósitos se presenta en la figura 33, se
observa un arreglo que provee los elementos necesarios para configurar el MCU
MC68HC908 en modo monitor además brinda el soporte para llevar a cabo la
comunicación bi-direccional a partir del puerto PTA0 con un PC.
Es posible obtener el voltaje de prueba Vtest de la bomba de carga del integrado
MAX-232 sin afectar su funcionamiento ya que esta señal no consume corriente
por parte del pin IRQ.
Figura 33: Arreglo para habilitar el modo monitor para MCU‟s HC08.
En la tabla 8 se presentan los pines de conexión MON08 para los MCu‟s mas
comunes; para MCu‟s específicos se debe acudir a la hoja de datos
correspondiente.
Tabla 8: Pines requeridos para el modo monitor de diferentes MCU‟s.
Vtst
COM
MOD0
MOD1
DIV4
SSEL
GP/GT
IRQ
PTA0
PTC0
PTC1
PTC3
PTA7
JL/JK
IRQ
PTB0
PTB1
PTB2
PTB3
NC
KX
IRQ
PTA0
PTB0
PTB1
NC
PTA1
MR
QB/QY/QT AB32 JB16
IRQ
IRQ
IRQ
IRQ
PTA0
PTA0
PTA0 PTA0
PTC3
PTA1
PTC0 PTA1
PTC4
PTA4
PTC1 PTA2
NC
NC
PTC3 PTA3
PTC2
NC
NC PTE3
1.4. Frecuencia Vs Tasa de baudios para comunicación serial.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Normalmente se encuentra en las hojas de datos de la familia HC08 que se
emplean osciladores de 4,1952 MHz para conseguir tasas de 9600 bps con el pin
DIV4 puesto a tierra, otras frecuencias de trabajo también son posibles en la
siguiente tabla se presentan algunas de éstas.
Tabla 9: Relación de la tasa de Baudios con respecto a la configuración del reloj
externo.
Frecuencia
2,4576 MHz
4,9152 MHz
4,9152 MHz
7,3728 MHz
9,8304 MHz
9,8304 MHz
14,7456 MHz
14,7456 MHz
19,6608 MHz
29,4912 MHz
Reloj de Bus Tasa de Baudios
1.2288 MHz
4800
2.4576 MHz
9600
1,2288MHz
4800
3,6864 MHz
14400
4.9152 MHz
19200
2,4576 MHz
9600
7,3728 MHz
28800
3,6864 MHz
14400
4,9152 MHz
19200
7,3728 MHz
28800
DIV4
Low
Low
High
Low
Low
High
Low
High
High
High
Es posible aprovechar las conexiones existentes en un circuito o aplicación si
previamente se ha realizado la adecuada planificación durante el diseño del
mismo reduciendo así la cantidad de pines requeridos para entrar en modo
monitor (Conexión MON08) este concepto se puede observar en la siguiente
figura:
Figura 34: Arreglo estándar para habilitar el modo monitor para MCU‟s HC08 en la
aplicación.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Como se puede observar las señales de selección de modo pueden ser fijadas
directamente en la aplicación mediante resistencias de pull-up o pull-down según
sea el requerimiento. Estos pines una vez programado el MCU en la misma
aplicación pueden ser utilizadas como entradas o salidas activas en bajo o en alto
dependiendo del diseño realizado.
Figura 35: Arreglo de posibles osciladores que pueden ser implementados.
Una señal de reloj adecuada (Normalmente hasta de 9.8 MHz) siempre debe ser
aplicada al pin OSC1 ya sea a través de la interfaz MON08 o mediante elementos
fijos en el circuito de la aplicación final. La mejor forma de proporcionar la señal
de reloj externa es mediante un oscilador de cuarzo (figura xxa), una forma alterna
mas económica basada en un arreglo de un cristal una resistencia y un par de
condensadores se puede apreciar en la figura 36b, un método poco recomendable
por su baja precisión para la generación de la señal de reloj se realiza mediante un
arreglo RC que puede ser encontrado en las hojas de datos de los dispositivos.
En el caso de las señales de alimentación y tierra, es requisito que la interfaz
comparta la señal de tierra para brindar un correcto voltaje de referencia, en caso
de que la aplicación no posea su propia fuente de poder, la interfaz MON08 debe
proveerla teniendo en cuenta los requerimientos de corriente de la aplicación.
Lección 7: Modo de Ejecución.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Este es el modo en el cual la CPU ejecuta normalmente el programa almacenado
en la memoria FLASH, teniendo como origen la dirección almacenada en el Vector
de RESET ($FFFE:$FFFF). Para la puesta en marcha de un dispositivo los
requerimientos en hardware son más simples que los necesarios para la
programación, éstos se presentan a continuación:

Polarización del MCU (VDD y VSS): Se requiere el mismo esquema de
conexión presentado anteriormente, es importante conectar todos los pines
que requieran polarización por ejemplo en VRFEH y el VRFEL son
requeridos para establecer los umbrales de comparación del conversor A/D.

OSC1 y OSC2: Son señales importantes para el funcionamiento de los
MCU‟s puesto que se trata de sistemas secuenciales es primordial una
señal de reloj. Se puede utilizar cualquiera de las alternativas presentadas
anteriormente teniendo en cuenta siempre la hoja de datos del dispositivo
en uso.

Pines de Selección de Modo (MOD0, MOD1, DIV4, SSEL): Estos pines ya
no son requeridos para establecer condiciones especiales por lo tanto su
comportamiento se rige conforme al lo especificado en las hojas de datos
del dispositivo (módulos, interrupciones, puertos de E/S, etc.).

Pin de Reset: Si no se requiere llevar al MCU a RESET es recomendable
colocar un condensador a tierra en este pin. Por ningún motivo se debe
colocar a VDD puesto que puede ocasionar un corto circuito cuando se
polariza en circuito o cuando se realice un Reset interno.

Pines CGMXFC y VREG: Para los MCU que disponen de módulo PLL se
debe instalar un filtro en el pin CGMXFC, además en algunos MCU‟s (ver
su hoja de datos) se debe colocar un condensador cerámico (0.1uF) en el
pin VREG, se recomienda también que la polarización del oscilador sea
VREG no VDD a menos que no funcione entonces toca utilizar VDD.
Figura 36: Configuración recomendada para los pines de VREG, RESET Y
CGMXFC.
Lección 8: Desarrollo de Tarjeta de Programación Universal.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
La tarjeta de desarrollo que se presenta a continuación se encuentra basada en la
sección anterior referente al Modo monitor de la familia HC08 de Free-Scale, que
a su vez se encuentra basada en la nota de aplicación AN2317/D (Low-Cost
Programming and Debugging Options for M68HC08 MCUs) que puede ser
encontrada en el sitio Web de la empresa: www.freescale.com
La implementación de la tarjeta de programación universal es sencilla puesto que
se trata de un arreglo compacto que provee las señales estándar estudiadas
anteriormente, necesarias para trabajar en modo monitor con diferentes
microcontroladores pertenecientes a la familia HC08. La idea es que esta tarjeta
pueda ser utilizada en conjunto con una regleta de montajes (Proto-Board) u otros
circuitos complementarios en los que se encuentren las conexiones necesarias
para las diferentes clases de microcontroladores y aplicaciones a implementar.
A continuación se presenta el esquemático de la tarjeta de Programación:
Figura 37: Esquemático tarjeta de programación para microcontroladores de la
familia HC08.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
El circuito consta de una etapa de regulación obteniéndose 5Vdc a partir de una
fuente de 12Vdc con su correspondiente interruptor y Led indicador de encendido,
una etapa para la comunicación con el Pc conformada por los integrados MAX232
y 74HC125 y el conector DB-9 para poder implementar la comunicación propia del
modo monitor es decir Half-Duplex empleando un solo pin del Microcontrolador.
La tarjeta cuenta con dos tipos de osciladores externos que pueden ser
seleccionados con el Jumper JP1; uno de una sola pieza (4 pines), éste presenta
mayor estabilidad y es habilitado con un Jumper en la posición 1-2 de JP1. El otro
arreglo consta de un cristal con resistencia y condensadores de acople (posición
2-3 de JP1), en lugar de un cristal fijo se pueden colocar un par de Pin Headers
para ubicar cristales de diferentes valores dependiendo de la aplicación. A su vez
se cuenta con un arreglo de resistencias en configuración Pull-Up y Pull-Down
utilizadas para configurar el modo monitor en los pines correspondientes de
acuerdo con la tabla 8.
Los interruptores tipo Dip (S1) sirven para deshabilitar las señales que no sean
requeridas ya sea durante la programación, depuración y/o puesta en marcha de
la aplicación, por ejemplo si se utiliza el oscilador de 9.8 MHz, además de colocar
el Jumper JP1 en las posiciones 1-2 se debe deshabilitar el interruptor 2 ya que
éste pertenece al arreglo necesario para utilizar el otro arreglo de oscilador.
El diseño del circuito impreso correspondiente al esquemático de la figura 38 se
presenta a continuación:
Figura 38: Diseño del circuito impreso para la tarjeta de programación.
Se puede observar en la figura que se ha habilitado un pin para el acceso a la
fuente de 12 Vdc para el caso de que sea necesario este voltaje en el proyecto
(Relés, motores, etc). Además se ha diseñado la tarjeta con un conector lateral de
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
12 pines en forma de regleta de una sola fila, las conexiones de pueden realizar
de diferentes formas: se pueden soldar los pines para que sobresalgan por debajo
de la tarjeta permitiendo el acceso de las diferentes señales mediante el montaje
de la tarjeta en una Proto-Board, también se puede cablear hacia una Proto-Board
o circuito mediante la soldadura de pinheads de conexión, a su vez se pueden
utilizar circuitos impresos diseñados de manera que sean compatibles con este
conector o también puede ser utilizado un cable configurado adecuadamente a
partir de este conector para obtener una interfaz estándar MON-08 en caso de ser
requerida.
En la figura 39 se observa los pines requeridos para obtener el conector de la
interfaz MON-08:
Figura 39: Conector estándar de la interfaz MON-08.
Lección 9: Software.
Para programar un MCU se requiere un programa de computador que convierta
los comandos de un determinado programa realizado en ensamblador, C, C++ o
Basic, entre otros, a código de máquina; este proceso se conoce como
compilación. A su vez el programa debe enviar al dispositivo los códigos de
máquina una vez han sido compilados a través de un POD como el descrito en la
sección anterior.
Existen diferentes opciones a la hora de seleccionar el software que se empleará
para programar los dispositivos, algunos mas completos y con mayores
prestaciones que otros, esto se ve reflejado en el costo de determinada
herramienta, aunque pueden conseguirse versiones de prueba con limitación en el
tamaño del programa a realizar así como también puede conseguirse software
libre.
Independientemente del Software seleccionado el proceso de Escribir Programas,
Compilación y posterior programación de dispositivos es similar para todas las
herramientas se debe acudir a la ayuda y/o tutoriales del mismo teniendo en
cuenta configurar adecuadamente los diferentes parámetros para lograr
programar, simular y realizar depuración satisfactoriamente en un determinado
dispositivo.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Entre los parámetros que se deben tener en cuenta a la hora de programar un
dispositivo en la mayoría de herramientas están:

Dar un nombre adecuado al proyecto.

Dirección donde se guardará dicho proyecto.

Seleccionar el dispositivo de destino (Tipo de MCU) con que se trabajará.

Especificar en el editor de texto el lenguaje de programación que será
empleado.

Especificar tipo de conexión al dispositivo.
Una vez configurado el proyecto se puede empezar a escribir el programa
correspondiente al proyecto y seguidamente compilar, simular, depurar y
programar el dispositivo escogido, haciendo uso de los manuales y hojas de datos
tanto de los dispositivos como del software.
A continuación se presentan diferentes opciones de software que se puede
emplear con sus características:
CODE-WARRIOR: Code Warrior Development Studio es un Ambiente de
Desarrollo Integrado IDE (Integrated Development Environment) que contiene
todas las herramientas necesarias para completar cualquier proyecto de desarrollo
de sistemas embebidos, incluye: editores de texto, compiladores tanto para
assembler como para C y C++, depuradores, librerías de variadas aplicaciones.
CodeWarrior es ahora desarrollado y distribuido por Freescale, existen diferentes
versiones que según sus prestaciones aumenta su costo, afortunadamente hay
versiones de prueba que limitan el tamaño del código que puede ser
implementado pero suficientes para que los estudiantes puedan empezar a
realizar sus prácticas.
Para mayor información Y/O bajar el programa se puede visitar el siguiente link:
http://www.freescale.com
WinIDE: es también un ambiente de desarrollo integrado (IDE) para Windows
(Win), el cual posee herramientas de programación para dispositivos,
programación en lenguaje ensamblador, simulación en circuito o sin chip, es
desarrollado por la compañía PE-micro, de manera gratuita como una herramienta
de desarrollo para microcontroladores de diferentes tipos, tanto de 8-bits como de
16 y 32 bits. Para la línea de 8-bits, han desarrollado los algoritmos de casi todos
los microcontroladores de la familia HC08 o por lo menos los más utilizados como
los microcontroladores de la serie JK, JL, GP y los muy utilizados, serie QT y QY.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
La desventaja que presenta el uso de este programa es que para cada tipo de
microcontrolador hay que bajar e instalar una versión diferente del programa.
Para mayor información Y/O bajar el programa se puede visitar el siguiente link:
http://www.pemicro.com
CROSSWARE: es una compañía dedicada al desarrollo de software como
compiladores de C y C++, simuladores de Assembler, depuradores y herramientas
hardware para sistemas embebidos, posee aplicaciones para distintos tipos de
dispositivos entre los que se encuentra la familia 68xxx de Motorola. El software
de esta compañía tiene un costo relativamente elevado para principiantes pero de
su página Web pueden bajarse versiones estudiantiles de evaluación limitadas por
tiempo de hasta 12 meses.
Para mayor información Y/O bajar el programa se puede visitar el siguiente link:
http://www.crossware.com
SDCC - Small Device C Compiler: Es un compilador de código ANSI - C que
puede ser empleado para dispositivos de diferentes fabricantes entre los que se
encuentran: Intel 8051, Maxim 80DS390, Zilog Z80 y la familia Motorola 68HC08.
También se trabaja en la compatibilidad con los MCU‟s de Microchip de las series
PIC16 y PIC18. SDCC es un programa libre de código abierto que se distribuye
bajo licencia GNU General Public License (GPL).
Para mayor información Y/O bajar el programa se puede visitar el siguiente link:
http://sdcc.sourceforge.net/
Otras dos opciones que pueden ser tenidas en cuenta son:


http://www.imagecraft.com/
http://www.cosmic-software.com
Lección 10: Software Code Warrior.
En la presente sección se presenta de manera resumida la forma de crear,
compilar y depurar un proyecto utilizando el Software Code Warrior (CW) de FreeScale. Para tal efecto el estudiante debe bajar el instalador del software de la
página del fabricante (www.freescale.com) y seguidamente instalarlo, las
características mínimas requeridas para el PC son:



Procesador de 1GHz Intel Pentium o compatible.
512 MB de RAM (recomendado 1GB).
Mínimo 2 GB de espacio libre en Disco Duro.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS


Puerto Serial DB9.
Sistema Operativo Microsoft Windows 2000, XP o Vista.
El software instala automáticamente la versión de evaluación, no es necesario
registrarla, esta licencia permite el desarrollo de proyectos como si se tratase de la
versión profesional, por un periodo de 30 días, una vez cumplido este lapso la
licencia trabaja como la edición especial que es libre permanentemente pero tiene
limitaciones en el tamaño del código en C que puede ser escrito (hasta 32KB para
MCU‟s HC08 y 64KB para ColdFire) suficientes para aplicaciones didácticas
introductorias.
1. Creando un Proyecto.
Se ejecuta el Ambiente de Desarrollo Integrado (IDE) mediante la siguiente ruta:
Inicio > Programas > CW For Microcontrollers Vxx. > CodeWarrior IDE. Una vez
arranca el programa se despliega la siguiente ventana de dialogo:
Seguidamente se selecciona el botón para la creación de un proyecto nuevo
(Create a New Project) continuación aparece una ventana de dialogo de
dispositivos y conexiones
(Device and Connection). Se selecciona algún
dispositivo de las diferentes familias desplegadas y el tipo de conexión.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Para efectos prácticos esta prueba y muchas de las aplicaciones serán realizadas
empleando el MCU MC68HC908JL3; además para esta primera prueba se
selecciona en conexiones la opción „Full Chip Simulation’ presionando a
continuación el botón „siguiente‟.
Seguidamente viene la ventana de parámetros del proyecto (Project Parameters);
en el cuadro „Project name’ se asigna un nombre a cada proyecto creado, por
defecto el CW asigna un nombre pero es conveniente asignar un nombre
significativo para futuras revisiones.
El IDE asigna la extensión .mcp al proyecto automáticamente así como también
crea una carpeta con el nombre del proyecto en la ubicación asignada en el
cuadro „location’ esta puede ser una ubicación por defecto o la que asigne el
usuario empleando el botón set…. Se selecciona como lenguaje de programación
„Absolute assembly‟ para ser soportado por el proyecto de la misma forma si se va
a realizar programación en „C‟ se selecciona en la casilla correspondiente.
En este punto se puede seleccionar el botón „Finalizar‟ tomándose los demás
parámetros por configurar por defecto.
Si se opta por el botón „Siguiente‟, por el momento se deben seleccionar las
opciones por defecto que presenten las siguientes ventanas de dialogo. Se
recomienda leer los letreros explicativos que presenta el asistente para tener una
idea de lo qué significa cada opción.
Figura 40: Ventana principal del IDE CodeWarrior.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
2. Escribiendo un programa
Una vez creado el proyecto aparece la ventana principal del ambiente de
desarrollo (ver Fig 40), donde el CW crea automáticamente una serie de carpetas
y archivos que forman parte del proyecto proporcionando definiciones y códigos de
inicialización básicos, por ejemplo se puede observar en la carpeta „includes’ un
archivo con el nombre del dispositivo y la extensión .inc (MC68HC908JL3.inc) en
el se encuentran contenidos los nombres de los puertos y registros asociados a
las direcciones de memoria del microcontrolador guardando una correspondencia
con los nombres que se encuentran en las hojas de datos y manuales de
referencia del fabricante.
Como ejemplo se presenta la definición del Puerto B del MCU escogido:
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
En la carpeta „sources‟ se almacenan los archivos y funciones que forman parte
del programa principal en especial el CW genera el archivo „main.asm‟ que
contiene por defecto una rutina con un ciclo infinito, ésta contiene un macro que
alimenta el WatchDog. A continuación se realizará una rutina en el que el montaje
del proyecto y sus correspondientes procesos de compilación, depuración y
simulación.
Para tal efecto a continuación se presenta el código que será utilizado:
LOOP0
LOOP1
LOOP2
LDA #$FF
INCA
CMP #3
BNE LOOP1
LDA #$FF
LDHX #$1234
LDHX #$4321
LDHX #0
LDX #$FF
INCX
CPX #4
BNE LOOP2
JMP LOOP0
; A = $FF
;A=A+1
; A = 3?
; Salto a LOOP1 si A!=3.
; A = $FF = 255
; H:X = $1234
; H:X = $4321
; H:X = $0000
; X = $FF
;X=X+1
; X = 4?
; Salto a LOOP1 si A!=4.
; Salto a LOOP0 (Se Repite el Ciclo)
Las líneas de código anteriores tienen el propósito de ayudar a familiarizar al
estudiante con algunas de las instrucciones empleadas para la manipulación de
los registros. Como se observa en los comentarios el flujo del programa es el
siguiente; se inicializa A = $FF luego se incrementa hasta 3 haciendo uso de la
instrucción BNE con la que compara A con 3 en caso de ser diferente (¡=) salta
hasta la etiqueta LOOP1 realizando un ciclo finito hasta que A sea igual a 3
entonces el programa prosigue con la siguiente instrucción que es la de cargar de
nuevo registro A con $FF, seguidamente se emplea la instrucción LDHX con 3
valores diferentes ($1234, $4321 y $0000), a continuación se carga la parte baja
del registro H:X con $FF realizándose un ciclo similar al realizado con el registro A
pero utilizando otro valor de comparación, al finalizar este ciclo la instrucción JMP
LOOP1 vuelve a ejecutar todo de nuevo de manera indefinida.
3. Compilando y Simulando un Proyecto.
Para compilar y simular este código debe ser insertado en el archivo main.asm a
partir de la etiqueta llamada ‘mainLoop:’; seguidamente teniendo en cuenta que se
ha escogido previamente como tipo de conexión la opción „Full Chip Simulation‟ se
debe guardar el proyecto y emplear los botones „make‟ y „debug‟ en este orden,
ver la Figura 41.
Figura 41: Herramientas de compilación y depuración del IDE del CodeWarrior.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Al compilar en caso de que existan errores en el código, la herramienta presenta
las correspondientes alertas, con un clic sobre cada error automáticamente se
indica el lugar o la línea de código que presenta el error. En caso de no
presentarse errores de compilación se puede proceder con la herramienta Debug;
se abre una nueva ventana llamada „True-Time Simulator & Real-Time Debugger‟
que será empleada para simular la ejecución del programa compilado.
En la ventana de simulación y depuración (ver Fig 42) se cuenta con diferentes
herramientas con las que se puede ejecutar el código y comprobar su correcto
funcionamiento, entre otras aplicaciones con esta interfaz se puede ejecutar la
aplicación paso a paso, insertar puntos de quiebre (Break Points), resetear,
modificar variables registros y puertos, también se puede interactuar con los
módulos TIMER, ADC, IRQ y demás módulos que posea en MCU en uso.
Figura 42: Ventana de Simulación y depuración.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Como se observa en la figura hay diferentes módulos que presentan información
de diferente índole, como el mapa de memoria con la información almacenada en
ella, los valores cargados en los registros, etc. En la barra de „Debug’ se observan
los iconos encargados del control de la ejecución de las instrucciones durante una
simulación:
Run:
Correr la aplicación hasta encontrar un BreakPoint
Single Step:
Correr la aplicación paso a paso.
Step Over:
Correr una subrutina sin entrar en ella.
Step Out:
Correr hasta salir de una subrutina en curso.
Halt:
Parar la Simulación.
Reset:
Reiniciar.
Al correr la aplicación paso a paso se puede ir observando las instrucciones que
se van ejecutando, así como los registros y banderas que van siendo modificados
dependiendo del tipo de instrucción ejecutada.
4. Programando un dispositivo.
Para programar un dispositivo se sigue un procedimiento similar al realizado para
simular una aplicación; la diferencia radica en que se debe cambiar el tipo de
conexión dependiendo del tipo de POD de programación que se valla a utilizar;
para el caso del circuito descrito anteriormente se selecciona la opción „MON08
Interface‟ en la ventana principal del ambiente de desarrollo.
Figura 43: Selección del tipo de conexión para la programación de dispositivos.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Al ejecutar el Debug se abre una ventana de opciones en la que se configuran
parámetros como la tasa de transferencia, puerto de comunicación y otros
parámetros que deben ser configurados adecuadamente para la correcta
comunicación entre el PC y el MCU.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
CAPITULO 6: INTRODUCCIÓN A LA PROGRAMACIÓN EN C y
MICROCONTROLADOR HC08.
El leguaje ensamblador es ideal cuando se desea controlar y configurar el
microcontrolador en forma precisa, de manera bastante “cercana al hardware” y
con la máxima eficiencia en el uso de la memoria, pero presenta la desventaja de
que el hecho de actualizar o crear una mejor versión del mismo programa, se
torna complicado, sobre todo si es un programa extenso.
Por esta razón la mayoría de los programadores prefieren utilizar lenguajes de alto
nivel como el lenguaje C, para realizar sus códigos. Este lenguaje nos permite
crear rutinas, procesos matemáticos y lógicos con mayor facilidad, programas que
en ensamblador son extensos, en lenguaje C se disminuye considerablemente la
cantidad de líneas de código necesarias.
Algunas ventajas de emplear el lenguaje de programación C:




En C se pueden crear códigos portables.
Facilita el mantenimiento del código.
El código en C es fácil de entender y de escribir.
Es independiente de la plataforma.
La última ventaja tiene sentido en la medida que se puede utilizar códigos o
rutinas realizadas en ANSI C en diferentes dispositivos a diferencia de los códigos
y rutinas en assembler ya que éstos varían en gran medida dependiendo del las
diferencias en los juegos de instrucciones inherentes a los dispositivos a la hora
de migrar de plataformas.
Lección 11: Generalidades de C.
En el presente capítulo no se pretende enseñar a programar en C, sino presentar
y analizar las características más importantes del lenguaje de programación C, su
sintaxis y gramática que servirán para sentar las bases necesarias a la hora de
emplear los recursos y posibilidades que el C pone a disposición de los
programadores de sistemas embebidos.
1. Presentación del lenguaje.
En la actualidad una de las constantes en la implementación de sistemas
embebidos es el lenguaje de programación C, más que ningún otro, es por tanto
que se ha convertido en el lenguaje y a su vez en una especie de estándar mas
empleado por infinidad de programadores en el mundo de los sistemas
embebidos.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
El lenguaje C presenta muchas ventajas: es reducido y fácil de aprender, además
virtualmente hay compiladores disponibles para cada tipo de procesador existente.
C presenta el beneficio de independencia de procesador característica que
permite al programador concentrarse más en sus aplicaciones y algoritmos que
en detalles de determinada arquitectura de procesadores.
Posiblemente una de las fortalezas del C sobre otros lenguajes de programación
es que aunque se trata de un lenguaje del alto nivel y los beneficios que ello
representa, puede considerarse también como un lenguaje de bajo nivel puesto
que suministra a los programadores de sistemas embebidos el control directo
sobre el hardware, esta es una característica que solo el C brinda, dejando el
lenguaje ensamblador en un segundo plano, utilizándose este más como código
adjunto al código en lenguaje de alto nivel, principalmente para la inicialización del
sistema, para escribir pedazos de código extremadamente eficientes, ultra
compactos o simplemente códigos que no pueden ser escritos de otra forma.
2. Funciones.
En C se conocen como funciones a las partes elementales de un programa que se
realizan con la intención de Modularizar o dividir un programa muy grande en
una serie de módulos más pequeños y manejables. En los diferentes lenguajes de
programación a estos módulos se conocen como subprogramas, rutinas,
procedimientos, etc. La idea es que un programa grande sea dividido en un
conjunto de subprogramas o funciones, además que exista una función principal
(main) que „llame‟ a las demás funciones para su ejecución y estas a su vez
puedan „llamar‟ funciones más específicas y así sucesivamente.
Entre las ventajas de dividir un programa en funciones se tienen:



Modularización: una función realiza una tarea muy específica manteniendo
su extensión (líneas de código) reducida y manejable. Además cada
función puede ser „llamada‟ varias veces en un mismo programa incluso
puede ser reutilizada en otros programas. Las funciones por lo general son
desarrolladas y comprobadas por separado.
Ahorro: tanto de memoria como de tiempo de desarrollo en la medida que
una misma función puede ser empleada varias veces en un mismo
programa reduciéndose así tanto el tiempo de escritura como el de
depuración.
Independencia: una función mantiene una independencia del resto del
programa con respecto a los datos que maneja, mediante la definición
adecuada de una interfaz o comunicación con las funciones que la llaman
o las que llama no teniendo acceso a información que no le compete,
evitándose la introducción de errores por la modificación de variables
repetidas y demás errores que pueden introducirse en códigos que se
encuentran funcionando correctamente.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
2.1. Nombre, Valor de Retorno y Argumentos.
Una función en C se asocia a un Nombre o Etiqueta que es empleado para
referirse a esta por el resto del programa, éstas son llamadas por el programa
principal o por alguna función de mayor rango, mediante la inclusión de su nombre
y Argumentos en alguna de sus líneas de código. Los argumentos son datos de
entrada para las funciones y son enviados a estas encerrándolos en un paréntesis
al lado del nombre de una función dada.
Por ejemplo se tiene la función de nombre „pot‟ que calcula la potencia de „a‟
elevado a „b‟ de dos números; para llamar esta función se puede escribir la
siguiente sentencia:
pot(a,b);
En este ejemplo se observan los argumentos a y b entre paréntesis que
constituyen los datos necesarios para hallar un resultado la función conocida como
„pot‟. El resultado de esta operación se conoce como Valor de Retorno, este se
encuentra disponible ya que aparece sustituyendo el nombre de la función en el
mismo lugar donde se ha realizado la llamada, en el ejemplo no se hace nada con
el valor de retorno. Otro ejemplo donde si es empleado el valor de retornos puede
ser el siguiente:
cantidad = pot(a+5,b) *unidades
En este caso el primer argumento „a‟ sumado a 5 es elevado a „b‟ y el resultado
(valor de retorno) es multiplicado por la etiqueta „unidades‟ el resultado obtenido
finalmente es almacenado en la posición de memoria identificado por la etiqueta
„cantidad‟.
Para poder llamar a una función se requiere que la Definición de ésta aparezca
en alguna parte del mismo archivo o de otro archivo fuente; la definición no es más
que el conjunto de instrucciones necesarias para que la función realice una tarea
definida cada vez que sea llamada. Además la definición incluye el tipo de valor
de retorno y de cada uno de los argumentos de entrada esto se conoce con el
nombre de Declaración. Siguiendo el ejemplo de la función „pot‟:
double pot (double base, double exponente)
{
double resultado;
…
resultado = …;
return resultado;
}
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
En la primera línea la palabra double seguido del nombre de la función „pot‟ indica
el tipo de valor de retorno de ésta (punto flotante con 15 cifras de precisión).
Seguidamente y entre paréntesis está la definición de los argumentos (ambos
double). A continuación se abren las llaves ({ }) que contienen el código de la
función, en la primera sentencia se observa la declaración de la variable resultado
(double) seguida de las sentencias necesarias para calcular el resultado y
finalmente con la sentencia return se devuelve resultado al programa o función
que ha llamado a la función „pot‟.
Las variables „base‟ y „exponente‟ han sido declaradas en la cabecera por tanto no
es necesario declararlas de nuevo como si es necesario hacerlo con la variable
„resultado‟ puesto que no ha sido declarada. Cuando la función „pot‟ es llamada
adecuadamente, los valores de los argumentos son cargados en sus
correspondientes variables.
Una función también debe ser Declarada antes de ser Llamada. La declaración
de una función puede realizarse empleando la primera línea de la definición de la
que pueden suprimirse los nombres de los argumentos mas no sus tipos
incluyendo al final el punto y coma. Por ejemplo:
double pot (double, double);
2.2. La función Main.
Todo programa escrito en C debe incluir un programa o función Principal que es la
que controla la iniciación y ejecución del programa en general, es conocida como
la Función Main y presenta la siguiente forma:
void main (void)
{
sentencia 1
sentencia 2
…
}
Una porción de código encerrada entre llaves ({ }) se conoce como sentencia
compuesta o bloque, es un modo de agrupar sentencias individuales de modo que
se comporten como sentencias únicas para tal efecto todo el cuerpo de una
función debe ir comprendido entre las llaves de apertura y cierre.
3. Tokens.
En el vocabulario del lenguaje C existen seis clases de componentes sintácticos
(Tokens) entre los que se tienen: palabras clave, etiquetas, constantes, cadenas
de caracteres, operadores y separadores. El compilador descompone el texto que
encuentra en un programa dado en los diferentes Tokens ignorando ciertos
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
componentes como comentarios y separadores, entre otros, a partir de esta
descomposición genera el código de máquina correspondiente.
3.1. Palabras Claves de C.
Como en cualquier lenguaje de programación existe una serie de palabras
reservadas o „Clave‟ que el programador no puede emplear como etiquetas (ni de
variables ni de funciones). Estas palabras indican la ejecución de tareas muy
específicas, teniendo un significado especial para el compilador.
El lenguaje C está formado por un conjunto pequeño de palabras clave
(reservadas) o comandos (keywords), y una serie de operadores. Existen 32
palabras clave, en comparación con las 150 del BASIC o 200 que poseen otros
lenguajes, como el COBOL y el PASCAL. Estas palabras son:
Auto, break, case, char, const, continue, default, do, double, else, enum, extern,
float, for, goto, if, int, long, register, return, short, signed, sizeof, static, struct,
switch, typedef, union, unsigned, void, volatile, while.
3.2. Etiquetas.
Como es sabido, las etiquetas o Identificadores son nombres con los que se hace
referencia a variables o funciones. En lenguaje ANSI C existen ciertas reglas a la
hora de seleccionar los nombres para las variables y funciones:
1. Las etiquetas se forman solo con secuencias de letras minúsculas de la a a
la z, mayúsculas de la A a la Z y dígitos del 0 al 9.
2. El carácter subrayado (_) es considerado como una letra más.
3. No pueden contener espacios en blanco ni otros caracteres diferentes de
los ya citados, p.e. (* , ; . : - + , etc).
4. El primer carácter debe ser una letra o un símbolo de subrayado (_), nunca
un dígito.
5. Se hace distinción entre mayúsculas y minúsculas, por tanto la etiqueta
BASE es diferente de base y de Base.
6. Son permitidas etiquetas de hasta 31 caracteres de longitud.
Es aconsejable seleccionar nombres que describan o permitan identificar el tipo de
funciones o variables que representa, empleando tantos caracteres como sea
necesario pero siguiendo las anteriores reglas, esto simplifica enormemente tanto
el proceso de programación como el de depuración de errores.
3.3. Constantes.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Las variables como su nombre lo indica pueden cambiar dependiendo de las
instrucciones ejecutadas por un programa, a diferencia de éstas, las constantes se
mantienen invariables durante toda la ejecución de un determinado programa, un
ejemplo típico es el Número  (3.141592654) el cual puede aparecer varias veces
en las instrucciones de un programa. Para declarar las constantes se emplea el
cualificador const indicando que una variable no puede cambiar de valor. Ejemplo:
const int i = 10
En C se encuentran distintos tipos de constantes:

Numéricas: son valores del tipo entero o de punto flotante, también puede
tratarse de constantes binarias, octales o hexadecimales.

Caracteres: cualquier carácter individual encerrado en apostrofes („‟) es
considerado como un carácter constante, en realidad es tomado como un
entero entre 0 y 255 o -127 y 127 dependiendo el sistema de acuerdo con
la tabla de equivalencia en código ASCII.

Cadenas de Caracteres: Se trata de un conjunto de caracteres
alfanuméricos encerrados en comillas p.e. “caracter” o “esto es una
cadena”.

Simbólicas: éstas tienen un nombre o etiqueta como las variables pero no
cambian de valor a lo largo de la ejecución del programa, es conveniente
nombrarlas con textos solo en mayúsculas para distinguirlas de las
variables.
3.4. Operadores.
Son símbolos especiales, en algunas ocasiones conjuntos de dos caracteres que
indican operaciones a realizar con las variables y/o constantes de un programa
obteniéndose un resultado, entre los operadores se tienen:

Aritméticos: (+, -, *, /, %) los operadores aritméticos son bastante intuitivos
por tanto solo se explicará el operador % resto de la división entera que
como su nombre lo indica solo se aplica a la división de enteros y su valor
de retorno es el sobrante de una división de enteros p.e. si se tiene la
expresión 23%4 el resultado será 3.

Asignación: (=, +=, -=, *=, /=) La función de estos operadores es la de
escribir en el espacio de memoria de una determinada variable el resultado
de alguna expresión o el valor de otra variable, es por tanto que el símbolo
„=‟ no indica una igualdad matemática sino mas bien una sustitución, es
importante resaltar que debido a la naturaleza de los operadores de
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
asignación, no puede existir expresiones del lado izquierdo de éstos, solo
variables.
Los demás operadores indican operaciones recurrentes sobre las variables
al lado izquierdo de las expresiones su funcionalidad se muestra en los
siguientes ejemplos:
Distancia += 1
equivale a: distancia = distancia +1
rango /= 2.0 equivale a: rango = rango / 2.0

Incrementales: (++, --) son operadores que incrementan o disminuyen en
una unidad a la variable a la que afectan, en una expresión, estos
operadores pueden ir antes o después de la variable a la que afectan, el
significado es distinto ya que si se encuentran antes el operador actúa
sobre la variable antes de ejecutar la expresión, por el contrario si se
encuentran después de la variable ésta aumenta o disminuye en una
unidad después de ejecutarse la expresión.

Relacionales: (==, <, >,<=, >=, !=) Este tipo de operadores se emplean a la
hora de realizar comparaciones entre dos expresiones, el resultado
obtenido de evaluar expresiones con estos operadores solo pueden ser
binarios puesto que al comparar solo se pueden obtener dos soluciones; o
se cumple la expresión (verdadera) o no (falsa). La forma general de
empleo de estos operadores es la siguiente:
expresión1 op expresión2
Donde op puede ser alguno de los operadores: == (igual que), < (menor
que), > (mayor que), <= (menor o igual que), >= (mayor o igual que), ¡=
(distinto que). El procedimiento normal es evaluar primero las expresiones
por aparte y luego compararlas a ver si cumplen con una determinada
relación; si se cumple el resultado es 1 caso contrario el resultado es 0.

Lógicos: (&&, II, !) son operadores binarios que permiten combinar los
resultados de los operadores relacionales comprobando que se cumplen
diferentes condiciones o que se cumple una u otra. Los operadores lógicos
disponibles en C son && conocido como and, el operador II conocido como
or, y el operador ! conocido como not o negación.
3.5. Separadores.
Los separadores se constituyen por uno o varios espacios en blanco, tabuladores,
y caracteres de nueva línea, estos ayudan al compilador a descomponer un
programa en sus diferentes Tokens así como a mejorar la organización y
legibilidad de un programa.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
3.6. Comentarios.
Así como en el assembler se emplean comentarios a lo largo del programa para
hacerlo mas entendible, del mismo modo se puede comentar sobre la forma en
que un programa es realizado ya sea para ayudar en futuras modificaciones como
para el entendimiento del mismo por parte de otras personas. Es de tener en
cuenta que los compiladores ignoran por completo las partes del programa que
son catalogadas como comentarios.
En C los comentarios son encerados entre los caracteres „/*‟ y „*/‟ a su vez todo lo
que va después de los caracteres „//‟ hasta el final de la línea se considera también
como comentario y es ignorado por el compilador.
3.7. Expresiones y Sentencias.
Una expresión es una combinación de variables, constantes y operadores, las
expresiones son equivalentes al resultado obtenido de aplicar los operadores a los
operandos, es decir; en el momento de la ejecución de un programa, donde se
encuentren expresiones serán sustituidas por sus resultados.
Las expresiones definidas forman parte de entidades de rango superior conocidas
como sentencias, las cuales pueden ser entendidas y ejecutadas como unidades
completas, pueden además incorporar expresiones de distinto tipo (lógicas,
aritméticas,…).
Lección 12: Fases de Procesamiento de un Programa en C.
A continuación se presentan las diferentes etapas que hacen parte del
procesamiento de un programa en C hasta obtener el código de máquina
correspondiente también conocido como código objeto.
1. El Pre-procesador.
Este es un componente característico de C es decir que no lo poseen otros
lenguajes de programación su tarea es actuar sobre el programa fuente antes que
el compilador, convirtiéndolo en otro archivo fuente “predigerido”. En general las
transformaciones realizadas por el pre-procesador incluyen:




Eliminación de los comentarios.
Sustitución se las constantes simbólicas por sus valores reales.
Inclusión en el archivo fuente el contenido de los archivos declarados con
las sentencias #include <archivo> (a estos archivos se les suele llamar
cabeceras)
Sustituir en el archivo fuente las macros declaradas con sentencias #define
(p.e. #define CIEN 100).
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
2. El Compilador.
Su misión consiste en traducir a lenguaje de máquina el programa escrito en
lenguaje C, contenido en uno o más archivos fuente entregados por el preprocesador, generando lo que se conoce como un archivo objeto, algunos
compiladores pasan por una fase intermedia en lenguaje ensamblador. También
puede detectar errores durante la compilación presentando un mensaje
dependiendo del error.
3. El enlazador
Un archivo objeto está escrito en código máquina, pero no puede ser ejecutado
por si solo, puesto que le falta código que se encuentra en otros archivos que lo
complementan. El enlazador se encarga de generar un ejecutable binario, a
partir del contenido de los archivos objetos y de diferentes Librerías. Más
específicamente el enlazador toma los archivos de código objeto, generados en
los primeros pasos del proceso de compilación y la información de los demás
recursos necesarios (Librerías), remueve recursos que no son necesarios y enlaza
el código objeto con las librerías utilizadas produciendo finalmente un archivo
ejecutable.
4. Librerías.
Las Librerías no son mas que funciones precompiladas, que contienen el código
necesario para realizar funciones especificas, a las que el archivo fuente llama.
Estas librerías son realizadas para mantener el lenguaje lo más sencillo posible
pero brindando las herramientas y funciones estándar que cualquier programador
pueda necesitar.
Estas funciones están agrupadas en un conjunto de librerías de código objeto, que
constituyen la llamada librería Estándar. La llamada de estas librerías se realiza
de la misma manera que a cualquier función por lo tanto deben ser declaradas
antes de ser llamadas por el programa, para tal efecto se emplea la sentencia
#include.
Un ejemplo de librería es la llamada ‘stdio’ (Standar Imput/Output) que posee
diferentes funciones tanto para leer como para escribir datos de diferentes
dispositivos periféricos como teclados, unidades de almacenamiento, pantallas,
impresoras, etc.
5. Tipos de Datos Fundamentales.
Con la intención de maximizar la eficiencia del manejo de memoria en C se puede
trabajar con datos de diferentes tipos dependiendo de la aplicación entre los que
se tienen: caracteres alfanuméricos, números enteros, números reales con parte
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
entera y parte fraccionaria etc. Admitiéndose diferentes rangos de precisión y
signo (+ o -), todo esto con la intención de que el compilador reserve espacios de
memoria suficientes para las variables declaradas como alguno de los tipos. En la
tabla 2 de la sección „Almacenamiento de Datos‟ de la unidad 1 se presentan los
diferentes tipos de datos, rangos y signo que pueden ser empleados en C.
Entre los tipos de datos que se pueden apreciar en la tabla 2 tenemos los tipos
char o caracteres alfanuméricos, int o números enteros, float o números reales,
también conocidos como de punto flotante. Los números enteros pueden tener
signo + o - (signed) o simplemente ser no negativos (unsigned). Las palabras short
y long hacen referencia al rango en que se definen los enteros; similarmente para
los reales están las palabras double y long con un significado un poco distinto.
Es de tener en cuenta que cuando en C hay una expresión en las que dos
constantes y/o variables de distinto tipo se encuentran relacionadas mediante un
operador; el compilador convierte el operando de menor rango para igualarlo con
el de mayor rango teniendo en cuenta el siguiente orden:
Long double > double > float > unsigned long > long > unsigned int > int > char
De la misma forma el compilador asigna a la variable resultado de una expresión
el tipo predominante en dicha expresión, hecho que hay que tener en cuenta
cuando en una expresión predomina un tipo de menor rango puesto que se puede
perder información en futuras operaciones con esta variable.
Estas características del compilador son conversiones implícitas y son
transparentes para el programador aunque éste puede realizar conversiones
explicitas precediendo el tipo que se quiere asignar entre paréntesis a la
constante, variable o expresión. Ejemplo:
x = (int) 1.7 + (int) m;
6. Modos de Almacenamiento.
El modo de almacenamiento de una variable en C es una característica que
determina en que momento es creada una variable, en que puntos se tiene acceso
a ésta y en que momento deja de existir.
En C existen 4 modos de
direccionamiento que serán explicados a continuación:
1. auto: o modo automático es el modo por defecto para las variables que son
declaradas dentro de un bloque de código {…} por lo tanto no es necesario
escribir la palabra auto. Cada variable auto se crea al iniciar a ejecutarse
un bloque dado y deja de existir cuando éste termina de ejecutarse, por
tanto solo son „visibles‟ en el bloque que están definidas y en otros bloques
anidados en el mismo aunque pueden ser ocultadas en bloques anidados
mediante la declaración de una variable dentro de estos con el mismo
nombre.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Es de tener en cuenta que estas variables no son inicializadas por defecto
es decir que antes de que el programa les asigne un valor estas pueden
contener datos aleatorios de operaciones anteriores en el espacio de
memoria que se les ha asignado.
Un ejemplo que ilustra el modo de almacenamiento automático:
{
int i=1, j=2;
…
{
float a=6., j=3.;
…
j=j+a
…
}
…
…
// se declaran e inicializan i y j
// se declara j nuevamente pero tipo float
// ocultando la j tipo int para este bloque
// anidado.
// la variable i=1 si puede ser accesada
// Fuera del bloque, j tipo float no existe
// la variable j=2 tipo int puede ser
accesada
}
2. extern: son variables globales es decir que existen a lo largo de todo el
programa y pueden ser accesadas por cualquier función que se encuentre
en el archivo, son definidas al comienzo de todo el programa fuera de
cualquier bloque o función. Estas variables son inicializadas en cero por
defecto.
Pueden ser utilizadas para transmitir valores entre funciones pero esta
práctica no es recomendable, también estas variables pueden ser ocultadas
mediante la declaración de una variable con el mismo nombre al interior de
un bloque.
3. static: las variables static pueden ser declaradas dentro de un bloque como
las auto pero conservan su valor durante distintas ejecuciones del este
bloque a lo largo del programa, es decir, que no son borradas de la
memoria durante la ejecución del programa como las extern. Se inicializan
en cero por defecto.
Se pueden definir variables static extern la cuales solo son accesibles para
funciones y bloques que se encuentren desde que son definidas hasta el fin
del archivo; es una forma de controlar la accesibilidad a una variable.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Las funciones por defecto presentan un modo extern pero el acceso a éstas
también puede ser controlado mediante una definición static por lo tanto
solo será accesible para funciones definidas después de esta y hasta el
final del archivo.
4. register: este modo es una especie de recomendación para el compilador
con la intención de que solo si es posible, ciertas variables sean guardadas
en los registros de la CPU para que los cálculos con éstas sean ejecutado
de manera más ágil. Es de tener en cuenta que para las funciones no
existen los modos de almacenamiento register ni auto.
7. Control del Flujo de ejecución.
Teniendo como principio la ejecución Secuencial de los programas, es decir que
sus sentencias se ejecutan una tras otra en orden desde la primera hasta la
última. Algunas veces es necesario no seguir el flujo del programa en orden sino
saltar a partes del programa que serán ejecutadas en casos específicos, para tal
efecto C cuenta con sentencias especiales que se clasifican en dos grupos las
Bifurcaciones, sentencias que según ciertas condiciones pueden ser elegidas dos
o mas opciones, y por otro lado están los Bucles, sentencias que permiten la
ejecución cíclica de conjuntos de instrucciones el numero de veces que sea
requerido por la aplicación.
7.1. Bifurcaciones.
Entre las bifurcaciones tenemos:

Operador Condicional: Está compuesto por tres operandos que cumplen
con la siguiente notación general:
expresión_1 ? expresión_2 : expresión_3;
Este operador se ejecuta de la siguiente forma: se evalúa la expresión_1, si
el resultado de dicha expresión es trhue, se ejecuta la expresión_2; caso
contrario se ejecuta la expresión_3.

Sentencia IF: esta permite la ejecución o no de una sentencia simple o
compuesta dependiendo de una determinada condición. Su forma general
es la siguiente:
if (expresión)
sentencia;
Primero se evalúa la expresión si el resultado es true se ejecuta la
sentencia en caso contrario se salta la sentencia a la siguiente línea del
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
programa teniéndose en cuenta que la sentencias pueden ser simples o
compuestas (bloques {…}).

Sentencia IF … ELSE: esta permite una ejecución de una parte u otra del
programa dependiendo del valor de verdad de la expresión entre
paréntesis.
if (expresión)
sentencia_1;
else
sentencia_2;
Se evalúa la expresión si es verdadera se ejecuta la sentencia_1, saltando
sentencia_2 hasta la siguiente línea de comando, si por el contrario la
expresión es falsa se ejecuta la sentencia_2 directamente saltándose
sentencia_1.

Sentencia IF … ELSE Múltiple: con esta sentencia se puede realizar
ramificaciones múltiples ejecutando solo una de diferentes partes de un
programa según se cumpla una entre „n‟ condiciones.
if (expresión_1)
sentencia_1;
else if (expresión_2)
sentencia_2;
else if (expresión_3)
sentencia_3;
else if (…)
…
[else
sentencia_n;]
Se evalúa expresión_1 si es verdad se ejecuta sentencia_1, si es falsa se salta
sentencia_1 evaluándose expresión_2 y así sucesivamente; si ninguna de las
expresiones es verdadera se ejecuta entonces la sentencia_n que se conoce
como la opción por defecto que a su vez puede ser una sentencia nula (;)

Sentencia SWITCH: Similar a la sentencia IF … ELSE múltiple pero con
importantes diferencias, su forma general es la siguiente:
switch (expresión) {
case expresión_cte_1:
sentencia_1;
case expresión_cte_2:
sentencia_2;
…
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
case expresión_cte_n:
sentencia_n;
[default
sentencia]
}
Se evalúa expresión se tiene en consideración el resultado de esta expresión
si dicho valor coincide con el valor constante expresión_cte_1 entonces se
ejecuta sentencia_1, sentencia_2, … ,sentencia.
Si coincide con
expresión_cte_2 entonces se ejecutan todas las sentencias a partir de la
sentencia_2.
Si no coinciden ninguna de las expresiones constantes entonces solo se
ejecuta la sentencia por defecto si solo se desea ejecutar una de las sentencia,
se emplea la sentencia brake al final de cada sentencia para dar por terminada
la sentencia switch.
Si se desea ejecutar determinada sentencia para diferentes valores de
expresión se pueden colocar varios case expresión_cte seguidos. (case
expresión_cte1: case expresión_cte_2:…)
8. Bucles.
Los bucles pueden repetir cíclicamente la ejecución de determinadas líneas de
código de un programa bien sea un número definido de veces o hasta que se
cumpla una determinada condición lógica o aritmética, las tres herramientas que
presenta C para tales efectos son:

Sentencia WHILE: Esta permite ejecutar repetidamente una instrucción o
bloque de instrucciones mientras se cumpla una determinada condición, su
forma general es la siguiente:
while (expresión_de_control)
sentencia;
Sentencia se ejecutará siempre que al evaluarse „expresión_de_control‟
resulte verdadera es de señalarse que en „sentencia‟ alguna variable que
también intervenga en „expresión_de_control‟ debe ir cambiando para evitar
que el programa entre en un bucle infinito.

Sentencia FOR: La forma general del FOR en C es la siguiente:
for (inicialización, expresión_de_control, actualización)
sentencia;
Al ejecutarse una sentencia FOR primeramente se inicializa una variable a
conveniencia de la aplicación, seguidamente y de forma general se tienen
en cuenta las variables inicializadas para evaluar la „expresión_de_control‟,
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
siempre que esta resulte verdadera se ejecutará „sentencia‟ después se
realiza la actualización que puede consistir en el incremento de contadores
o la actualización de variables y retornará a evaluar la
„expresión_de_control‟ hasta que esta sea falsa.

Sentencia DO WHILE: Funciona de modo similar que la sentencia WHILE
con la diferencia de que la evaluación de la „expresión_de_control’ se
realiza al final del bucle después de haber ejecutado una vez al menos las
sentencias entre las llaves, estas se seguirán ejecutando mientras que
„expresión_de_control’ sea verdadera, a continuación la forma general de
esta sentencia:
do
sentencia;
while (expresión_de_control);
El punto y coma se debe colocar después del paréntesis para diferenciar
esta línea de una con una sentencia WHILE normal.
9. Sentencias break, continue, goto.
Como se observó anteriormente la sentencia break interrumpe el bucle donde se
encuentre incluida, aunque la expresión de control correspondiente sea verdadera.
La sentencia continue hace que el programa comience el siguiente ciclo del bucle
donde se encuentre aunque no haya completado la ejecución completa de una
sentencia compuesta o bloque.
La sentencia goto etiqueta hace saltar al programa a punto donde se haya escrito
la etiqueta correspondiente.
Lección 13: Ejemplos de manejo de módulos del HC08.
En el presente capitulo se presenta de manera ilustrativa a partir de un ejemplo
específico el procedimiento a seguir para abordar el desarrollo de programas,
tanto en assembler como en C, que manejarán los diferentes módulos y periféricos
que ofrecen los microcontroladores de la familia HC08.
El ejemplo propuesto consiste en utilizar uno de los pines de conversión
Análogo/Digital del microcontrolador para introducir una señal de voltaje que varíe
entre 0 y 5 voltios y a partir de esta señal definir el ciclo útil de una señal PWM
generada en el Modulo TIM (TIMER INTERFACE MODULE) con la intención de
conectar un LED en este y observar la variación de la intensidad dependiendo de
la posición del potenciómetro.
1. Reuniendo Información de los Módulos del MCU.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Para empezar con el desarrollo del programa, primero es necesario documentarse
sobre el uso de los módulos que se vallan a implementar, en este caso el módulo
de conversión análogo digital (ADC) y el módulo temporizador (TIM). Para tal
efecto se acude a las hojas de datos del dispositivo a utilizar, en este caso el
microcontrolador MC68HC908JK3, en capitulo anterior se presentan las
características, configuraciones, registros que utiliza y descripción de
funcionamiento del módulo ADC, Igualmente se encuentra la información relevante
para el módulo TIM. A partir de esta información y de manera ilustrativa a
continuación se extracta información esencial sobre el módulo ADC, si se desea
complementar se debe acudir a la hoja de datos.
1.1. Características del ADC (MC68HC908JK3).






12 canales de conversión con entrada multiplexada.
Conversión por aproximaciones lineales.
Resolución de 8 bits.
Conversión única o continua.
Bandera o interrupción de conversión completada.
Reloj de conversión seleccionable.
1.2. Registros del ADC.
Los registros empleados por el ADC son los siguientes:



ADSCR: ADC status and control. Estado y control del ADC.
ADR: ADC Data Register. Registro de datos del ADC.
ADICLK: ADC Imput clock Register. Registro de entrada de Reloj.
Figura 44: Registros del ADC.
1.3. Descripción funcional del módulo.
El voltaje de entrada al conversor es digitalizado empleando el método de
aproximaciones sucesivas, una vez la conversión es realizada, el dato se guarda
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
en un registro especial del conversor (ADR), a su vez puede o activar una bandera
o generar una interrupción dependiendo del registro de configuración del ADC
(ADCR).
Si el voltaje de entrada es igual que Vdd (alimentación del uC) la salida es $FF si
la entrada es igual a Vss (tierra) la salida del ADC es $00, los voltajes que se
encuentren entre Vdd y Vss son convertidos linealmente entre estos valores
empleando una resolución de 8 bits. Es importante tener en cuenta que el voltaje
de entrada al conversor nunca debe exceder el voltaje de alimentación del uC.
Cuando la conversión A/D es continua, los valores digitales son guardados en el
registro ADR continuamente sin importar si estos datos han sido leídos o no,
después de cada conversión el Bit COCO es puesto en alto („1‟) además puede
generar una interrupción en la CPU cuando este Bit se encuentra en un estado
lógico bajo; la conversión continúa indefinidamente hasta que el Bit ADCO es
puesto en un valor lógico bajo („0‟).
1.4. Registro de Estado y Control (ADSCR).
A continuación se describen la función de los diferentes Bits del registro ADSCR:

AIEN: ADC Interupt Enable Bit.
Cuando se encuentra en „alto‟ se activa la generación de interrupciones
después de cada conversión, ésta señal de interrupción cambia su estado
lógico a „0‟ cuando el registro de datos es leído o cuando se ha escrito en el
registro ADSCR. Una señal de reset pone en estado bajo a este Bit.
1 = Interrupción del ADC habilitada.
0 = Interrupción del ADC deshabilitada.

COCO: Conversions Complete Bit.
Cuando el Bit AIEN se encuentra en „0‟ el Bit COCO es configurado como
de solo lectura y es activado (puesto en „1‟) cada vez que se completa una
conversión. Este Bit cambia su estado lógico a „0‟ cuando el registro de
datos es leído o cuando se ha escrito en el registro ADSCR. Una señal de
reset pone en estado bajo a este Bit. Cuando AIEN se encuentre en „1‟, El
Bit COCO es de solo lectura y siempre se encuentra en „0‟.
1 = Se completó la conversión (AIEN = 0).
0 = No se ha completado la conversión (AIEN = 0).

ADCO: ADC Continuous Conversion Bit.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Si se encuentra en „1‟ el ADC realizará conversión de datos de manera
continua actualizando en ADR cada vez que sea realizada una conversión,
en el caso de que se encuentre en „0‟, solo se realiza una conversión. Una
señal de reset pone en estado bajo a este Bit.
1 = Conversión continua.
0 = Una sola conversión A/D.

ADCH [4:0]: ADC Chanel Select Bits.
Estos forman un campo de 5 Bits empleados para la selección de uno de
los canales del conversor de acuerdo con la siguiente tabla:
Tabla 10: Bits de selección del ADC.
Nota 1: La conversión será nula si se seleccionan canales sin uso.
Nota 2: Los niveles de voltaje suministrados por nodos de referencia interna como
se especifica en la tabla son empleados para verificar la operación del ADC tanto
durante su producción como para aplicaciones de usuario.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
1.5. Registro de Datos (ADR).
En este registro de 8 bits se cargan los valores que generados cada vez que se
completa una conversión.
1.6. Registro de selección del Reloj (ADICLK).
Con este registro se configura la frecuencia de reloj con la que el ADC va a
trabajar. Emplea un campo de 3 Bits con los que se selecciona la razón de división
con la que se genera el reloj interno del ADC. En la siguiente tabla se presentan
las configuraciones disponibles.
Tabla 11: Configuración de la razón de división de la Frecuencia de entrada al
ADC.
Una vez se ha consultado la documentación del módulo ADC se conoce la forma
de configurarlo y utilizarlo, de igual forma para este ejemplo queda como tarea
para el estudiante realizar la documentación para el uso del módulo TIM, esta
información puede ser encontrada en el Capitulo 8 de las hojas de datos del
dispositivo en uso.
Lección 14: Programación en Assembler del HC08.
Haciendo uso del correcto procedimiento que incluye desarrollo de diagramas de
flujo se genera el código correspondiente a resolver la problemática planteada.
Dado que el estudiante debe estar familiarizado con este proceso de desarrollo a
continuación solo se presenta el código realizado para esta aplicación, se debe
proceder a analizarlo, haciendo uso de los comentarios y del manual de referencia
del dispositivo para consultar los nemónicos utilizados y así poder comprender la
función de las diferentes líneas de comando escritas.
Para escribir el programa en assembler se generó un nuevo proyecto siguiendo
los pasos descritos en la sección 5.3.1 referente al software CodeWarrior, es
importante tener en cuenta que el software genera todos los archivos que se
requieren para programar de forma sencilla y estructurada.
Para escribir el código además del manual de referencia de la CPU 08, se empleó
el archivo MC68HC908JK3.inc, en este archivo es realizado por el CodeWarrior ,
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
en el se encuentran declaradas las etiquetas de todos los registros de control de
los diferentes módulos, vectores de interrupción, mascaras y mapa de memoria
del microcontrolador en uso, facilitando la tarea del programador así que no es
necesario redefinir nuevas etiquetas para asignar los espacios de memoria,
registros de control, mascaras etc. que pueda utilizar el programa. Para tal efecto
el Linker o enlazador se encarga de procesar todas las etiquetas empleadas.
En este caso, para generar la señal PWM se debe seleccionar un valor de
frecuencia fijo, basándose en la información sobre en módulo TIM en las hojas de
datos, se sabe que la frecuencia de una señal PWM generada a partir del módulo
temporizador depende del valor cargado en el registro TMOD, éste representa el
periodo de dicha señal. Al calcular este periodo se debe tener en cuenta el valor
del pre-escalador; Si se requiere generar una señal a una frecuencia de 500 Hz
con un valor del pre-escalador (PS) de 4, se emplea la siguiente ecuación:
TMOD 
t  f xtal 1 / 500  4.9152 x106

 153  $0099
22 PS
2 2 4
Por otro lado el ancho del pulso de la señal (Ciclo util) se debe cargar en el
registro TCH0, éste depende de la posición del potenciómetro que traducido a
valores digitales puede ir en el rango de 0 a 255 pero como el periodo de la señal
generado por el contador es 153, se debe normalizar el valor adquirido por el ADC
utilizando una simple regla de tres 153  255 como TCHO  ADR entonces:
TCHO 
ADR 153
255
Teniendo en cuenta estas observaciones a continuación se presentan las líneas
de código de una forma de solucionar el problema planteado:
;*******************************************************************
;* This stationery serves as the framework for a user application. *
;* For a more comprehensive program that demonstrates the more *
;* advanced functionality of this processor, please see the
*
;* demonstration applications, located in the examples
*
;* subdirectory of the "Freescale CodeWarrior for HC08" program *
;* directory.
*
;*******************************************************************
; Include derivative-specific definitions
INCLUDE 'derivative.inc' ; Directiva para incluir texto de
otros
archivos.
; derivative.inc incluye la declaración de
; periféricos (MC68HC908JK3.inc)
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
;
; export symbols
;
XDEF _Startup
; Directiva para definición de etiquetas globales
para ; el enlazador.
ABSENTRY _Startup
; Directiva que especifica el punto de
entrada de la
; aplicación Assembler.
;
; variable/data section
;
ORG RAMStart
PER_PWM: EQU $0099
;
; code section
;
ORG ROMStart
; Insert your data definition here
; Definición de variable: Periodo.
; Directiva que fija el PC en el valor que
; representa la etiqueta adyacente.
_Startup:
LDHX #RAMEnd+1
TXS
; Se Inicializa el Stack Pointer(#RAMEnd+1).
CLI
; Se habilitan las Interrupciones.
INICIO
BSET CONFIG1_COPD, CONFIG1
; Se desabilita el WatchDog
JSR INIT_PORTS; Salto a rutina de inicialización demódulos
BCLR TSC_TSTOP, TSC ; Se activa el contador ('0' en el bit TSTOP
del TSC).
ESPERA
BRA ESPERA
; Espera mientras ocurre una interrupción.
;===========================
; INICIALIZACIÓN DE PUERTOS
;===========================
INIT_PORTS
LDA
STA
ADICLK.
LDA
STA
ADSCR.
#%00100000; Configuración del Reloj del ADC (ExtCLK/2).
ADICLK
; Se carga la configuración del Reloj en
#%00100000; Se habilitan la conversión continua del ADC.
ADSCR
; Se carga la configuración del ADC en
MOV #%00110000,TSC ; Se Reinicia y detiene el Contador del TIM.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
LDHX #PER_PWM ; Se carga el valor del periodo de la señal PWM
en H:X.
STHX TMOD
; Se transfiere el valor al registro módulo
contador.
MOV #%11011010,TSC0; Se configura el registro de control del
canal CH0
; (PTD4).
RTS
; Retorna de la subrutina.
;=================================
;INTERRUPCION DEL TIM POR OVERFLOW
;=================================
TIMOvr_INT
BCLR TSC_TOF, TSC
; Se reconoce la interrupción.
RTI
; Retorna de la interrupción.
;====================================
;INTERRUPCION DEL TIM POR COMPARACION
;====================================
TIMCH0_INT
BCLR TSC0_CH0F,TSC0 ; Se reconoce la interrupción.
LDX #ADR
; Se carga el valor del ciclo util en X.
LDA #PER_PWM ; Se carga el valor del periodo en A.
MUL
; Se efectua la multiplicación [X:A] <= X x A.
PSHX
; Se guarda la parte alta del resultado de MUL en
SP.
PULH
LDX #$FF
DIV
STA TCH0L
RTI
; Se carga en H el valor de X pre-cargado en SP.
; Se carga el divisor (256) en X.
; Se efectua la división A <= [H:A]/X.
; Se carga el valor del ciclo útil en TCH0
; Retorna de la interrupción.
;===============================================
;VECTOR DE INTERRUPCIÓN POR OVERFLOW DEL TIM
;===============================================
ORG
JMP
INT_TIMOvr
TIMOvr_INT
;===============================================
;VECTOR DE INTERRUPCIÓN POR COMPARACION DE TCH0
;===============================================
ORG
INT_TIMCH0
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
JMP
TIMCH0_INT
;===============================================
;VECTOR DE INTERRUPCIÓN DE RESET
;===============================================
ORG
DC.W
INT_RESET
_Startup
; Reset
En este ejemplo se observa el uso de interrupciones para la generación de la
señal PWM, para lo cual en el programa o rutina principal luego de configurar e
inicializar los puertos y módulos a emplear, se entra en un ciclo de espera (modo
de bajo consumo) mientras que ocurren las interrupciones, estas están definidas al
final del programa mediante vectores que generan los saltos a las
correspondientes rutinas programadas dependiendo de su tipo y función.
Lección 15: Programación en C del HC08.
De forma análoga y teniendo en cuenta las mismas variables y observaciones
presentadas para la programación en assembler a continuación se presenta la
solución del problema pero utilizando el lenguaje de programación C.
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
/*===========================*/
/* Variables Globales */
/*===========================*/
unsigned int PER_PWM = 153;
/*===========================*/
/* Declaración de Funciones */
/*===========================*/
void init_ports (void);
void timovr_int (void);
void timch0_int (void);
/*===========================*/
/* Programa Principal */
/*===========================*/
void main(void) {
EnableInterrupts;
/* enable interrupts */
CONFIG1 = 1;
/* Deshabilita el watchdog */
init_ports();
/* Configura ADC y TIM */
for(;;) {
/* Ciclo interminable */
/* Espera interrupciones */
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
}
/* Salta nuevamente al ciclo for */
}
/*===========================*/
/* Inicialización de Módulos */
/*===========================*/
void init_ports (void){
ADICLK = 32;
/* Se carga la configuración del Reloj del ADC en
ADICLK */
ADSCR = 32;
/* Se carga la configuración del ADC en ADSCR */
TSC = 48;
/* Se Reinicia y detiene el Contador del TIM
*/
TMOD = PER_PWM;
/* Se carga valor al registro módulo contador */
TSC0 = 218;
/* Se configura el registro de control del canal CH0 */
}
/*==============================================*/
/* Interrupción del TIM por Overflow (Periodo) */
/*==============================================*/
interrupt 6 void timovr_int (void){
TSC &= ~TSC_TOF;
*/
}
/* Se reconoce la interrupción del TIM por overflow
/*===============================================*/
/* Interrupción del canal 0 del TIM (Cicli Util) */
/*===============================================*/
interrupt 4 void timch0_int (void){
TSC0 &= ~TSC0_CH0F;
/* Se reconoce la interrupción del TIM por
comparación en TCH0*/
TCH0L = (PER_PWM * ADR)/256; /* Normalización del valor del Ciclo Util.*/
}
ACTIVIDADES DE AUTOEVALUACIÓN DE LA UNIDAD







Cuáles son los símbolos de un diagrama de flujo y que significa cada uno?
Que es Assembler?
Describa los diferentes tipos de instrucciones de Assembler.
Cuáles son los modos de ejecución del HC08?
Que es CodeWarrior?
Cuáles son las principales características del lenguaje C?
Describa las características del ADC (MC68HC908JK3).
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
BIBILIOGRAFÍA:
[1]
BARRETT Steven F, Pack Daniel J.Microcontrollers Fundamentals for
Engineers and Scientists. Morgan & Claypool. 2006.
[2]
NOERGAARD Tammy. Embedded Systems Architecture. Newnes. 2005.
[3]
MARWEDEL Peter. Embedded System Design. Springer. 2006.
[4]
CATSOULIS John. Designing Embedded Hardware. O'Reilly. 2005.
[5]
ZURELL Kira.(2000). C Programming for Embedded Systems. R&D Books.
[6]
BARR Michael. Programming Embedded Systems in C and GNU
Development. O‟Reilly. 2006.
[7]
P. RAGHAVAN, Amol Lad, Sriram Neelakandan. Embedded Linux System
Design and Development. Auerbach Publications. 2006.
LINKS
[8]
[9] http://www.cosmic-software.com/products.php
[10] http://www.uclinux.org/ports/coldfire/
[11] http://www.processorexpert.com/
[12] http://www.embedded.com
[13] http://www.bairesrobotics.com.ar/data/guia68hc08.pdf
[14] http://gem.win.co.nz/mario/hc08/
[15] http://akimpech.izt.uam.mx/Web_jr/ami.htm
[16] http://www.it.uc3m.es/ttao/html/index.html
[17] http://www.lasalle.edu.co/csi_cursos/informatica/teoria/ (Glosario)
[18] http://www.depeca.uah.es/wwwnueva/docencia/ITIEI/sd/index.htm#documentos
[19] www.bairesrobotics.com.ar/data/instrucc0508.pdf
[20] www.bairesrobotics.com.ar/data/guia68hc08.pdf
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
UNIDAD 3
Nombre de la Unidad
Introducción
Justificación
Intencionalidades
Formativas
Denominación de
capítulos
Sistemas operativos orientados a sistemas embebidos
Estudio y discusión de sistemas operativos orientados a
sistemas embebidos
Luego de conocer la programación de sistemas
embebidos se debe introducir al estudiante del curso en la
implementación de sistemas operativos orientados a
sistemas embebidos
 Reconocer los conceptos básicos de los sistemas
operativos orientados a sistemas embebidos
 Reconocer las características del sistema operativo
embedded Linux
 Implementar un sistemas operativo embedded
Linux (uCLinux)
 Reconocer los diferentes emuladores de
micorcontroladores.
7. Visión general
8. Sistema operativo embedded Linux
9. Implementación de embedded Linux
CAPITULO 7: VISIÓN GENERAL.
Muchas definiciones acerca de lo que es un sistema embebido ya se han
presentado en capítulos anteriores, algunas hablan del número tareas realizables,
o, de las limitaciones de Hardware y Software, otras del desempeño y
confiabilidad, masividad de consumo, finalmente las que hablan de los costos. 4 y
5. Todas en algún momento pueden ser válidas pero no son generalizables,
debido a que un sistema embebido responde a una necesidad y con base en esta
es diseñado.
Como es sabido en la mayoría de los casos los sistemas embebidos deben
reaccionar a estímulos del ambiente que los circunda con restricciones en el
tiempo, en otras palabras el tiempo que toman en adquirir y procesar una señal
debe ser menor al tiempo en que dicha información es actualizada “tiempo real”.
Aunque un sistema embebido puede o no ser de “tiempo real”, es imperante que
los programas en este tipo de sistemas cumplan con características específicas
para que las tareas a realizar se ejecuten minimizando tiempos muertos y
optimizando el uso de los recursos físicos. Al hablar de sistemas operativos
orientados a sistemas embebidos con las limitaciones de Hardware existentes y
4 Tammy Noergaard EMBEDDED SYSTEMS ARCHITECTURE a Comprehensive Guide for Engineers
and Programmers. Elsevier 2005 p, 5,6
5 Antonio Nadal Galiana Llinares Sistemas Embebidos p.7
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
dependiendo de los requerimientos de la aplicación que se quiera implementar, se
deberá hacer uso de sistemas operativos especiales.
Lección 1: Consideraciones sobre el Hardware.
Aunque en varios casos podemos encontrar los sistemas embebidos como parte
de un sistema o producto más grande, un sistema embebido se conforma de
varias unidades funcionales para realizar eventualmente una o varias tareas,
deberá entonces contar con componentes Hardware capaces de procesar toda la
información de acuerdo con la finalidad que se le quiera dar al sistema.
Teniendo en cuenta lo anterior se analiza brevemente a manera de repaso los
componentes de Hardware que pueden ser encontrados en los sistemas
embebidos.

Microprocesador / Microcontrolador:
Encargado de realizar las principales operaciones de cálculo del sistema.
Ejecuta código para realizar una determinada tarea y dirige el
funcionamiento de los demás elementos que le rodean.

Bloques de Memoria Volátil y No Volátil:
La primera es utilizada para almacenar datos empleados para realizar
diferentes tipos de operaciones, cálculos principalmente, la segunda se
utiliza para guardar los programas y parámetros necesarios para la
operación del sistema.
Si en la implementación se utiliza un MCU es posible que la memoria se
encuentre en el interior del microcontrolador, si ésta es insuficiente se
añade un integrado de memoria externo.

Módulos de Comunicación I/O:
Son todos los dispositivos encargados de introducir, extraer, o manejar
información del sistema entre ellos encontramos diferentes dispositivos que
manejan todas las formas de comunicación estándar, administradores de
dispositivos, memorias, puertos E/S, conversores A/D y D/A etc.

Disco duro:
Se les encuentra cuando se debe manipular volúmenes de información
altos, tienen algunas
desventajas como: menor velocidad de
lectura/escritura que una memoria, consumo relativamente más alto, mayor
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
tamaño. Pero brindan la capacidad da almacenar datos en el orden de los
Gigabytes.
Otra buena opción es utilizar discos duros de estado solido, que ofrecen
capacidades de algunos Gygabytes, pero con todas las ventajas que
ofrecen las memorias de semiconductores.

LCD / GLCD:
Son dispositivos utilizados como interfaz con el usuario, por ejemplo
pantallas de cristal líquido, los LCD sólo soportan caracteres alfanuméricos
básicos, mientras que los GLCD soportan gráficos en escala de grises y los
más avanzados, colores.
Una vez vistas las herramientas de las que se dispone, sólo resta decir que la
escogencia del Hardware debe ceñirse a un plan especifico de tal modo que la
necesidad quede plenamente satisfecha, pero, sin incurrir en el sobredimensionamiento innecesario del sistema a realizar. Para hacer un diseño
correcto del Hardware, se pueden utilizar diversas técnicas contenidas en los
libros especializados en diseño de aplicaciones embebidas, o hacerlo de manera
intuitiva pero sin perder de vista el motivo del desarrollo ni el plan a seguir.
Lección 2: Conceptos Generales sobre Sistemas Operativos.
Una abstracción muy común es decir que el Software es la parte intangible de todo
sistema computacional, sin el Software un sistema computacional sería
básicamente inútil, éste le brinda las capacidades de almacenar, procesar,
desplegar,
recuperar información e interactuar con el medio circundante
empleando sus periféricos.
Los Componentes de Software son programas desarrollados con un propósito
particular, normalmente se trata de unidades independientes, y tienen su propia
estructura e implementación, aunque pueden trabajar en asociación con otros,
bajo ciertos requerimientos y restricciones. Entre ellos se puede encontrar
sistemas operativos, procesadores de texto, programas para control industrial,
juegos entre otros.
1. Software de Sistema y de Aplicación.
El Software puede dividirse en dos tipos, programas de sistema, que en esencia
manejan la operación del sistema mismo y programas de aplicación que son los
que desempeñan las actividades que el usuario o la aplicación requieren.
El propósito del Software de sistema es controlar la operación del sistema
computacional y brindar apoyo a otros programas, en esta categoría encontramos
principalmente a los sistemas operativos, librerías para el tratamiento de gráficos
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
como OpenGL, programas para el control y monitoreo de variables sensadas,
entre otros.
El Software de aplicación lo conforman todos los programas que le permiten a un
usuario la utilización de un sistema computacional para realizar una tarea
específica, entre ellos para el caso de computadores personales encontramos
programas de comunicación de datos, paquetes de oficina, diseño gráfico, cálculo,
finanzas, correo electrónico, compresión de archivos, paquetes multimedia, etc; en
el caso de sistemas embebidos serían los algoritmos programados para que el
sistema realice una función especifica diferente del manejo de recursos.
2. Definición de Sistema Operativo (SO).
Como es sabido en la actualidad los sistemas computacionales pueden consistir
en una serie de dispositivos como procesadores, memorias, unidades de
almacenamiento, displays y periféricos agregando cierto nivel de complejidad al
sistema en sí, es por tanto que escribir programas que mantengan el
funcionamiento de todos estos elementos de una forma correcta es una tarea
extremadamente complicada.
En este punto es claro que es poco probable que un programador pueda manejar
satisfactoriamente todas estas variables a la hora de realizar una aplicación, es
entonces donde surge la necesidad de hacer el manejo de recursos y la
complejidad del Hardware transparente para el programador. Una solución a este
inconveniente es la existencia de un Software base que maneja todos estos
elementos y además provea al programador una interfaz o “Máquina Virtual” más
fácil de entender y de programar, este Software se conoce como el Sistema
Operativo.
Un Sistema Operativo (SO) es el componente Software fundamental de un
sistema computacional, tiene la responsabilidad de administrar, coordinar las
actividades y de compartir los recursos de Hardware apropiadamente.6 El SO
dispone de privilegios que no tienen los programas de usuario con respecto del
manejo de recursos y además provee el soporte necesario para cargar y ejecutar
todos los programas de aplicación. 7
3. Tipos de Sistemas Operativos.
6 http://en.wikipedia.org/wiki/Operating_system
7 Norman Matloff Overview of Functions of an Operating System University of California, Davis
(May 30, 2001)
http://heather.cs.ucdavis.edu/~matloff/Architecture/SupportMaterial/OSOverview.html
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Existen varias formas de clasificar a los sistemas operativos, entre estas se tiene,
según su estructura, según los servicios que ofrecen y según la forma en que
ofrecen estos servicios.
3.1. Clasificación por Estructura (Visión Interna).
Según Alcal92, se deben tener en cuenta dos necesidades principales al momento
de diseñar un SO, una es la del usuario y la otra la del Software. La primera se
refiere a la confiabilidad, rapidez, facilidad de aprender y utilizar, entre otras. Las
de Software agrupan aspectos como el mantenimiento, seguridad, tolerancia a
fallos, eficiencia, entre otras.
A continuación se presentan diferentes estructuras que emplean los sistemas
operativos actuales dependiendo de su funcionalidad.
3.1.1. Estructura Monolítica.
Es la estructura empleada en los primeros sistemas operativos, básicamente
consta de un solo programa compuesto por varias rutinas enlazadas entre sí, de
forma que pueden comunicarse unas con otras. Las características principales de
estos SO‟s son:

Los módulos se compilan por separado, finalmente son unidos por un
enlazador, generando una buena definición de parámetros de enlace entre
las rutinas existentes.

Las rutinas de manejo de los diferentes recursos carecen de protecciones y
privilegios.

Debido a que generalmente son hechos a la medida de la aplicación son
eficientes y rápidos, por esto mismo son poco flexibles a la hora de soportar
diferentes ambientes de trabajo o aplicaciones.
3.1.2. Estructura Jerárquica.
En esta misma estructura están basados la mayoría de los sistemas actuales. A
medida en que aumentaban las necesidades de los usuarios y se perfeccionaban
los sistemas se fue requiriendo una mayor organización y funcionalidad de los
sistemas operativos.
En este tipo de estructuras cada parte, contiene subpartes, todas a su vez están
organizadas por niveles. Con la estructura jerárquica se divide el SO en pequeñas
partes, de tal forma que cada una de ellas se encuentre perfectamente definida y
con una interfaz clara con respecto al resto de elementos. El primero de estos
SO‟s fue THE (Technische Hogeschool, Eindhoven) su estructura es la siguiente.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Figura 45: Estructura Jerárquica.
Usuarios
Archivos
Entrada/ Salida
Comunicaciones
Memoria
Gestión CPU
Hardware
La figura 46 muestra otra representación de la estructura jerárquica, que es
conocida como la estructura en anillos. En esta cada capa tiene una puerta que
permite al nivel inferior comunicarse con el superior, se puede observar que los
anillos más centrales son los más protegidos de accesos no deseados desde las
capas más externas, de hecho, las capas más internas son las más privilegiadas.
Figura 46: Organización Jerárquica en anillos.
Interprete de
Comandos
Aplicación
de Usuario
Gestión de la información
spool
Gestión Memoria
Gestión de E/S
Gestión
CPU
3.1.3. Máquina Virtual.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Este es un tipo de SO que presenta una interfase para cada proceso, mostrando
una máquina que parece idéntica a la máquina real subyacente. Estas máquinas
virtuales son simulaciones del Hardware con su modo nucleo/usuario, E/S,
interrupciones, etc. El objetivo de máquinas virtuales es el de integrar distintos
sistemas operativos creando la sensación de tener varias máquinas diferentes.
El núcleo de estos SO se denomina monitor virtual y su tarea es llevar a cabo la
multiprogramación, mostrando a los niveles superiores tantas máquinas virtuales
como se necesiten. Estas máquinas virtuales son una réplica de la máquina real,
de manera que en cada una de ellas se pueda ejecutar un SO diferente. ver la
figura 47.
Figura 47: Maquina Virtual.
Usuario
Usuario
DOS
Windows
Hardware
Hardware
Usuario
Linux
Virtual
Hardware
Virtual
Virtual
Hardware
Hardware
Virtual
3.1.4. Cliente-servidor (Micro Kernel).
Es el tipo más reciente de sistemas operativos, puede ser ejecutado en la mayoría
de las computadoras sin importar su capacidad de procesamiento, Además es un
sistema de propósito general y cumple con las mismas funciones que los sistemas
operativos convencionales.
El núcleo se encarga de establecer la comunicación entre los clientes y los
servidores. Los procesos pueden ser tanto servidores como clientes dependiendo
de la aplicación. El núcleo sólo provee funciones básicas de memoria,
entrada/salida, archivos y procesos, dejando a los servidores proveer la mayoría
de servicios a los que el usuario final o programador pueda acceder, de esta forma
se brinda mayor flexibilidad al usuario final y a las posibles aplicaciones con las
que se trabajará. Estos servidores deben tener mecanismos de seguridad y
protección que a su vez, serán filtrados por el núcleo que controla el Hardware.
3.2 Clasificación por Servicios.
En esta clasificación se tiene en cuenta: el número de usuarios, la cantidad de
tareas que atiende y el número de procesadores del servidor. Al observar la figura
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
48 se observa la clasificación más comúnmente empleada y conocida desde el
punto de vista del usuario final.
3.2.1. Mono-usuarios.
Los SO monousuarios son aquéllos que solo soportan a un usuario a la vez, sin
importar el número de procesadores que posea el sistema o del número de
procesos pueda ejecutar al mismo tiempo. Por ejemplo, los Computadores
personales típicamente se encuentran en esta clasificación.
3.2.2. Multi-usuarios.
Estos son capaces de atender a más de un usuario a la vez, ya sea por medio de
varias terminales conectadas a una computadora, como los Mainframes o por
medio de sesiones remotas en una red, de nuevo, sin importar el número de
procesadores ni de tareas simultaneas que puedan ejecutar los usuarios.
3.2.3. Mono-tareas.
Los sistemas mono-tareas solo permiten una tarea a la vez por usuario. Puede
darse el caso de un sistema multi-usuario y mono-tarea, en el cual se admiten
varios usuarios al tiempo pero cada uno de ellos sólo puede realizar una tarea a la
vez.
3.2.4. Multi-tareas.
Los sistemas multitarea permiten al usuario realizar varias tareas o procesos;
estos procesos permanecen activos, en espera, suspendidos, o se eliminan en
forma alternativa, según la prioridad que se les haya concedido, o se pueden
ejecutar en forma simultánea. Por ejemplo, un usuario de PC puede estar
escribiendo una carta mientras escucha una canción, al tiempo que descarga un
archivo, etc. Es común encontrar en ellos interfaces gráficas orientadas al uso de
menús y el ratón, lo cual simplifica la operación del usuario.
Figura 48: Sistemas operativos Clasificados por servicios.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Monousuarios
Número de
usuarios
Multiusuarios
Monotareas
Número de
Tareas
Multitareas
Uniproceso
Número de
Proceso
Simétricos
Multiproceso
Asimétricos
3.2.5. Uni-proceso.
Un SO uni-proceso es aquél que sólo puede manejar un procesador de la
computadora, de tal forma que si la computadora dispusiese de más de uno no
podría aprovechar todas las capacidades del Hardware. El ejemplo más típico de
este tipo de sistemas es el DOS y MacOS.
3.2.6. Multi-proceso
La técnica de multiprocesamiento consiste en hacer funcionar varios
procesadores en forma paralela para obtener un poder de cálculo mayor que el
obtenido al usar un procesador de alta tecnología o al aumentar la disponibilidad
del sistema (en el caso de fallas del procesador). Un sistema multi-proceso debe
tener capacidad de gestionar la repartición de memoria entre varios procesadores.
Además este tipo de sistemas operativos son diseñados para distribuir la carga de
trabajo entre los diferentes procesadores. Generalmente estos sistemas trabajan
de dos formas: simétrica o asimétricamente. Cuando se trabaja de manera
asimétrica, el SO selecciona uno de los procesadores que funcionará como
procesador maestro y se ocupa de distribuir la carga a los demás procesadores,
que reciben el nombre de esclavos. Cuando se trabaja de manera simétrica, los
procesos se reparten entre los procesadores disponibles, teniendo, teóricamente,
la mejor distribución y equilibrio de la carga de trabajo.
3.3. Clasificación por la Forma de Ofrecer Servicios (Visión Externa).
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Esta clasificación corresponde a una visión externa, de cómo el usuario accede a
los servicios. Bajo esta clasificación hay dos tipos principales: Sistemas
Operativos de Red y Sistemas Operativos Distribuidos.
3.3.1. Sistemas Operativos de Red.
Los sistemas operativos de red tienen la capacidad de interactuar con SOs en
otras computadoras a través de un medio de transmisión para intercambiar
información. Para poder utilizar esta característica es necesario que el usuario
conozca los comandos del SO y la ubicación de los recursos a los que desea
acceder.
3.3.2. Sistemas Operativos Distribuidos.
Los sistemas operativos distribuidos abarcan los servicios de los de red, logrando
integrar recursos. Por ejemplo, impresoras, unidades de memoria, unidades
ópticas, etc. en una sola máquina virtual a la que el usuario accede en forma
transparente. De tal forma que el usuario no necesita saber la ubicación de los
recursos, sino que los conoce por su nombre y simplemente los usa como si todos
ellos fuesen locales a su estación de trabajo.
3.4. Sistemas Fijos.
Los sistemas fijos son sistemas operativos diseñados para funcionar en equipos
pequeños, como los asistentes personales digitales (PDA), celulares de nuevas
generaciones, dispositivos electrónicos autónomos o con autonomía reducida
(sondas espaciales, robots, vehículos con ordenador embebido, etcétera). En
consecuencia, una característica esencial de los sistemas fijos es su avanzada
administración de energía y su capacidad de funcionar con recursos muy
limitados. Los principales sistemas fijos de "uso general" para PDA son los
siguientes:
 PalmOS

Windows CE / Windows Mobile / Window Smartphone
3.5. Sistemas de Tiempo Real (RTOS)
Los sistemas de tiempo real se utilizan principalmente en la industria y son
sistemas diseñados para funcionar en entornos con limitaciones de tiempo. Un
sistema de tiempo real debe tener capacidad para operar en forma fiable según
limitaciones de tiempo específicas; en otras palabras, debe tener capacidad para
procesar adecuadamente la información recibida a intervalos definidos claramente
(regulares o de otro tipo).
Estos son algunos ejemplos de sistemas operativos de tiempo real:
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS

OS-9.

RTLinux (RealTime Linux).

QNX.

VxWorks.
Lección 3: Componentes del Sistema Operativo.
El SO está compuesto por un conjunto de paquetes de Software que pueden
utilizarse para gestionar las interacciones con el Hardware y con los programas de
aplicación. Por lo general este conjunto de Software incluye los siguientes
elementos:
1. El núcleo o Kernel.
Es el componente Software central de la mayoría de los sistemas operativos se
encarga de facilitarle a los distintos programas el acceso al Hardware del sistema,
en otros términos es el encargado de gestionar los recursos a través de la
comunicación entre procesos y/o llamadas de servicio del sistema.
Esta
capacidad de gestión de recursos del Kernel se basa en el diseño de sistemas
computacionales como una serie de niveles de abstracción en los cuales cada
nivel soporta su funcionamiento en los servicios que le brinda el nivel
inmediatamente inferior, desde este punto de vista el Kernel es simplemente el
nombre que se da al nivel de abstracción más bajo implementado en Software, es
decir el más cercano al Hardware.
Figura 48: Diagrama de abstracción del Kernel.
Teniendo en cuenta que los recursos de un sistema son limitados, el Kernel se
encarga de decidir qué programa puede hacer uso de un dispositivo Hardware y el
tiempo en que lo puede hacer.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
El núcleo tiene como función básica garantizar la carga y ejecución de los
procesos, el manejo de las entradas/salidas del sistema y de brindar una interfaz
entre este y los programas de usuario. Entre otras el Kernel realiza las siguientes
Funciones:



Comunicación entre programas y Hardware.
Gestión de los diferentes programas informáticos (Tareas o Procesos).
Gestión del Hardware (memoria, procesador, periféricos y dispositivos de
almacenamiento).
2. Tipos de Kernel.
El Kernel puede clasificarse en función del tamaño y de las funcionalidades que
posea. Realmente, y pese a seguidores incondicionales en un modelo u otro,
existe una tendencia básica a reducir el tamaño del núcleo proporcionando menos
funcionalidades, que son desplazadas a módulos que se cargan en el momento de
la ejecución. En función a esta idea existen tres tipos fundamentales de Kernel:

Kernel monolítico:
Todas las funcionalidades posibles están integradas en el sistema. Se trata
de un programa de tamaño considerable que se debe recompilar por
completo cada vez que se añade una nueva función. Esta es la estructura
original de Linux. Por tratarse de una técnica clásica y desfasada el creador
de Linux fue muy criticado.

Kernel modular :
Se trata de la tendencia actual de desarrollo. En el Kernel se centran las
funcionalidades esenciales como la administración de memoria, la
planificación de procesos, etc. Sin embargo no tiene sentido que el núcleo
de un sistema operativo englobe todos los elementos requeridos para
comunicarse con todas los posibles periféricos de un sistema teniendo en
cuenta la gran variedad tanto de modelos como de fabricantes disponibles.
En otros sistemas operativos esto se soluciona con unos archivos
proporcionados por el fabricante de los dispositivos llamados Drivers. En
Linux se creó una interfaz adecuada para posibilitar el desarrollo de
módulos que cumplieran esas funcionalidades. Esos módulos pueden ser
compilados por separado y añadidos al Kernel durante el tiempo de
ejecución.

Estructura de micro-Kernel:
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Esta técnica pretende reducir a su mínima expresión el Kernel, dejando a
los niveles superiores el resto de las funcionalidades. Existen algunos
Kernels que lo utilizan, por ejempo el Hurd, Se trata del último Kernel GNU
llamado a sustituir a Linux como núcleo del sistema operativo. Aunque esta
estrategia de diseño es tan antigua como la modular, no ha sido tenida en
cuenta hasta ahora debido a las limitaciones de rendimiento que presenta
3. Intérprete de comandos (Shell).
Este posibilita la comunicación con el SO a través de un lenguaje de control
basado en comandos que se introducen por el usuario a través de un teclado, p.e.
printf, la respuesta del SO se presenta a través de algún periférico o display, estos
comandos permiten al usuario controlar los periféricos sin conocer
específicamente las características del Hardware utilizado, así como la gestión de
las direcciones físicas, etc. Se interactúa con la información de la forma más
sencilla posible sin gráficas, solo texto.
4. El sistema de archivos.
Un sistema de archivos es una base de datos de propósito especial implementada
para el almacenamiento, organización y recuperación de archivos de datos; en
otras palabras, es un método de organización y almacenamiento de archivos de
datos en las diferentes unidades de almacenamiento con las que pueda contar un
sistema dado, la finalidad del sistema de archivos es la de hacer fácil la ubicación
y acceso de los mismos, normalmente los archivos son registrados en una
estructura arbórea.
5. Funciones de un Sistema Operativo.
El objetivo fundamental de un SO es gestionar los recursos Hardware del sistema
computacional permitiendo que se ejecuten concurrentemente diferentes
programas evitando los conflictos que puedan existir en el acceso de cada uno de
estos programas a los recursos que requieran para ejecutarse, el objeto final no es
mas que el de facilitar el manejo de sistema y permitir que el uso de los recursos
sea lo más eficiente posible. Un SO desempeña las siguientes funciones básicas:
5.1. Suministro de una interfaz al usuario.
La interfaz es la parte del SO que permite la comunicación del usuario con éste,
creando la posibilidad de cargar los programas, acceder a los archivos y muchas
otras tareas, entre las interfaces existentes están las que se basan en comandos,
las que emplean menús y las interfaces gráficas de usuario GUI (sigla en inglés).
5.2. Administración de recursos.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Mediante los procesos de administración de recursos se gestiona por parte del SO
los recursos de Hardware y redes existentes en un sistema dado haciendo esta
labor transparente para el usuario, la finalidad es distribuir todas las tareas para el
uso eficiente de los recursos manteniendo así todos los componentes físicos lo
más ocupados que sea posible, evitando cuellos de botella que afecten el
rendimiento del sistema. Entre las tareas a realizar se encuentran:
5.2.1. Administración del procesador.
El SO administra la distribución del procesador entre los distintos programas por
medio de un algoritmo cuya implementación depende completamente del tipo de
SO, según el objetivo específico de la aplicación.
5.2.2. Gestión de la memoria de acceso aleatorio.
El SO se encarga de gestionar el espacio de memoria asignado para cada
aplicación y para cada usuario, si resulta pertinente. Cuando la memoria física es
insuficiente, el SO puede crear una zona de memoria en el disco duro,
denominada "memoria virtual". La memoria virtual permite ejecutar aplicaciones
que requieren una memoria superior a la memoria RAM disponible en el sistema.
Sin embargo, el acceso a esta información es mucho más lento.
5.2.3. Gestión de entradas/salidas.
El SO permite unificar y controlar el acceso de los programas a los recursos físicos
y periféricos en general a través de los drivers (también conocidos como
administradores periféricos o de entrada/salida).
5.3. Administración de archivos.
El SO gestiona la lectura y escritura en el sistema de archivos, y las autorizaciones
de acceso a archivos de aplicaciones y usuarios. Se trata de programas que se
encargan de la administración de los archivos de forma estructurada, controlando
la creación, borrado y acceso de archivos de datos y de otros programas, esto
implica que debe mantener el registro de la ubicación física de la información que
pueda encontrarse en cualquier dispositivo de almacenamiento que pertenezca al
sistema.
El sistema de archivos responde a las necesidades de almacenar volúmenes de
información por largos periodos, esta información debe sobrevivir a un corte
abrupto de cualquier proceso que la pueda utilizar en un momento dado, además
debe existir la posibilidad de que distintos procesos puedan accederla
simultáneamente.
5.4. Administración de tareas:
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Mediante esta funcionalidad el SO administra las tareas informáticas de los
usuarios finales, estos programas se encargan de controlar las áreas de la CPU a
la que pueden accesar las tareas de usuario y definen el tiempo en que pueden
usarlas; esto se hace con la finalidad de distribuir la capacidad de procesamiento
de la CPU interrumpiendo el tiempo y recursos de ésta dependiendo la prioridad
de la tarea a realizar. La administración de tareas requiere entre otras:




Crear y/o terminar tareas.
Suspender y/o reanudar tareas.
Proveer mecanismos para la sincronización de tareas.
Proveer mecanismos para la comunicación entre tareas.
En resumen, el SO se encarga de que las aplicaciones se ejecuten sin problemas
asignándoles los recursos que éstas necesiten para funcionar correctamente.
5.5. Servicios de soporte:
Estos servicios dependen de la implementación específica del SO (Mac, Unix,
Windows, Software libre, o en el caso del curso, sistemas embebidos). Estos
servicios de soporte suelen consistir en:





Actualización de versiones.
Mejoras de seguridad.
Inclusión de alguna nueva utilidad (un nuevo entorno gráfico, un
asistente para administrar alguna determinada función, etc.).
Controladores para manejar nuevos periféricos (este servicio debe
coordinarse a veces con el fabricante del Hardware).
Corrección de errores de Software.
No todas las utilidades de administración o servicios forman parte del SO, además
de éste, hay otros tipos importantes de Software de administración de sistemas,
como los sistemas de administración de base de datos o los programas de
administración de redes. El soporte de estos productos deberá proporcionarlo el
fabricante correspondiente (que no tiene porque ser el mismo fabricante del SO).
5.6. Administración de autorizaciones:
El SO se encarga de la seguridad relacionada con la ejecución de programas y
acceso de archivos garantizando que los recursos sean utilizados sólo por
programas y usuarios que posean las autorizaciones correspondientes.
Lección 4: Arranque de un Programa.
Cuando se solicita la ejecución de un programa, desde la línea de comandos
(Shell) se reconoce el comando y realiza una Llamada de Sistema solicitándole al
OS correr el programa. En este momento el SO es quien está corriendo. Éste
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
busca en el directorio de disco la ubicación física del archivo, lo localiza y lee su
encabezado, el cual contiene información sobre el tamaño del programa junto con
una lista de los segmentos de datos utilizados por éste, entre otros.
A continuación el OS revisa la Tabla de Asignación de Memoria para encontrar
una región o regiones libres suficientemente grandes para el programa en tramite,
se necesita espacio para cargar las instrucciones del programa así como para
datos como variables, tablas, vectores,etc. y la pila. (Cabe anotar que el OS
previamente ha cargado todos los programas actualmente activos en la memoria,
por tanto tiene un registro de las partes de la memoria están libres y las que no).
Si, hay espacio disponible entonces se carga el programa, se actualiza la tabla de
asignación de memoria y se crea una Tabla de Páginas.
Seguidamente el OS revisa cierta parte del programa llamada Punto de Entrada,
la cual indica donde inicia la ejecución. Ahora el OS está listo para iniciar la
ejecución del programa. Localiza el apuntador de pila (Stack Pointer) en el lugar
escogido en el paso anterior. Finalmente arranca el programa por medio de una
instrucción tipo salto (JMP) dirigida al Punto de Entrada. (El OS guarda de
antemano un registro de valores, incluyendo el valor del Stack Pointer)4
1. Time-Sharing.
Time-sharing implica tener varios programas o al menos uno en varias instancias
corriendo de tal manera que da la impresión de simultaneidad. Dado que el
sistema sólo cuenta una CPU, sólo puede correr un programa a la vez.
La ilusión de multiproceso se logra haciendo que todos los programas corran por
turnos, estos turnos reciben el nombre de Quantum o Ranura de Tiempo (Timeslice). Siendo éste de una corta duración, por ejemplo 40mS. Por ejemplo, si
tenemos tres programas corriendo a, b, c y cada uno corre durante 40mS primero
a luego b y después c, repitiéndose en forma ciclica. Debido a que un ciclo dura
tan poco tiempo, para un humano parecería que todos los programas corren al
mismo tiempo.
Recordemos que el SO es un programa más, así que esta organización no puede
lograrla por si solo (debido a que está inactivo mientras otro programa corre), se
requiere que por Hardware se genere una interrupción periódica y a través de esta
es que se genera la división de tiempos. Por lo general estas franjas generadas
por el Hardware son muy cortas, lo que se suele hacer es implementar en el OS
un temporizador por Software. Por ejemplo si el Hardware genera franjas de
10mS, pero se necesitan franjas de 40mS, el OS espera que sucedan cuatro
franjas y allí se realiza el cambio de aplicación.
Antes de hacer un cambio de programa el OS guarda toda la información
relacionada con la aplicación en curso, PC, Stack Pointer, Registro de estado del
procesador, etc. Para que al momento de volver a ejecutar este programa se haga
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
bajo idénticas condiciones. Seguidamente carga los datos correspondientes para
la siguiente aplicación y así sucesivamente.
El SO cuenta con otra herramienta llamada Tabla de Procesos, en ella están
registrados los estados de todos los programas en curso, hay dos estados básicos
activo (RUN) e inactivo (SLEEP), El SO escoge sólo los programas en estado
activo para cargarlos.
Los programas que están es estado inactivo es porque esperan una señal,
generalmente la respuesta de un módulo E/S, cuando esta señal ocurre se genera
una interrupción que le avisa al SO que este programa debe cambiar de estado,
éste cambia y se continua con el programa que estaba en curso, y el que cambió
de estado se ejecuta cuando le llegue su turno4.
Lección 5: Memoria Virtual.
El manejo de la Memoria Virtual tiene ciertos objetivos que ayudan a mantener el
desempeño del equipo. Los principales son, superar las limitaciones de memoria
física, liberar al compilador y al enlazador de tener que saber que parte de la
memoria está libre cuando un programa corre, habilitar seguridad, habilitar
Sharing, entre otros.
Antes de continuar la explicación de como se logran estos objetivos, se retoma el
concepto de Tabla de Páginas (Page Table) de la cual se hizo mención
anteriormente; cuando el SO carga un programa a la memoria, divide la parte de
texto (instrucciones) y la de datos, seguidamente encuentra lugares libres de la
memoria donde colocarlas. Estas partes reciben el nombre de páginas del
programa, a su vez las regiones de memoria que tienen el mismo tamaño, páginas
de memoria.
El SO crea la Tabla de Páginas, que es un arreglo en memoria de las
correspondencias que existen entre las páginas de programas y las de memoria.
Para cubrir las limitaciones de memoria el SO inicialmente sólo carga una parte
del programa a la memoria, el resto lo deja en el disco. Las páginas de programa
que no son cargadas son reportadas en la tabla de páginas, marcadas como no
residentes y se guarda su ubicación en el disco. Si en algún momento se necesita
una de ellas el procesador genera una interrupción interna, el SO la trae del disco
y se continua con el curso del programa. Cuando una página no residente es
traída a la memoria, una residente es guardada en el disco, de tal forma que
siempre hay un espacio disponible para otra.
La característica de seguridad que brinda la memoria virtual consiste en que la
tabla de páginas además registrar los datos ya mencionados, también guarda una
lista de permisos que tiene cada programa sobre cada página en particular. Si un
programa trata de acceder a una página que no le corresponde la CPU produce
una interrupción y el SO detiene la ejecución de ese programa y lo quita de la
tabla de procesos.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Sharing se refiere a la habilidad de permitir a dos o más usuarios acceder a un
mismo programa, en este caso es muy importante mantener la memoria. Para
hacer esto, se cargan las instrucciones y se mantienen iguales para los usuarios,
pero se generan páginas de datos independientes para cada uno.
Con los procesos anteriormente explicados se hace evidente que el compilador y
el enlazador no necesitan verificar que parte de la memoria está libre, ya que el la
administración de la memoria virtual secciona y vuelve a unir el programa y los
datos según sea necesario4.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
CAPITULO 8: SISTEMA OPERATIVO EMBEDDED LINUX
El curso se inclina por la implementación del sistema operativo Embedded Linux
en sistemas embebidos, aparte del hecho de que el código fuente del Kernel de
Linux, librerías y demás utilidades asociadas se encuentran disponibles de manera
gratuita, en la actualidad se trata del sistema operativo más empleado en
aplicaciones con sistemas embebidos en el mundo entero, sin saberlo nos rodean
aplicaciones y sistemas embebidos que funcionan bajo Linux. Entre las que se
pueden encontrar PDA‟s, celulares, reproductores de audio y video, servidores,
Firewalls y concentradores wireless, entre otras.
La razón del éxito de Linux en este campo radica en las ventajas y características
de fiabilidad y estabilidad que presenta a la hora de implementar las aplicaciones y
al hecho de que por la filosofía inherente a Linux y al proyecto GNU en general,
este sistema es probado en miles de configuraciones, corregido y mejorado
gracias al aporte desinteresado por parte de miles de programadores alrededor del
mundo.
Lección 6: Visión general.
En un principio los sistemas embebidos en su mayoría eran desarrollados con
códigos propietarios escritos en assembler partiendo de cero, es decir, los
programadores debían escribir los códigos de los controladores (drivers) de los
dispositivos Hardware e interfaces para cada sistema a implementar, sus
capacidades eran muy específicas dejando las características multitareas a
niveles muy bajos o nulos, conforme las aplicaciones aumentaban su complejidad
esta tarea de hacía mas difícil.
El Linux para sistemas embebidos surgió como respuesta a esta problemática,
inicialmente consistía en el soporte para el Kernel y un compilador para los
microprocesadores de 32 bits más populares de la época como x86, ARM y Power
PC, entre otros, continuaron así diferentes distribuciones de Linux con soporte de
aplicaciones específicas para sistemas embebidos, en la actualidad gracias a la
disponibilidad del código fuente y al carácter de Software libre, Embedded Linux
se encuentra atacando fuertemente el mercado de los Sistemas Operativos de
Tiempo Real (RTOS).
Cuando se habla de Linux se pueden generar ambigüedades, por lo tanto se debe
hacer diferencia entre lo que se conoce como el Kernel de Linux, el sistema Linux
o alguna distribución específica de Linux. Entiéndase el Kernel de Linux como el
núcleo del sistema operativo Linux escrito originalmente por el científico
informático Linus Torlvalds, actualizado y mejorado por miles de programadores
en el mundo, por otro lado un sistema Linux se refiere a un sistema completo que
corre sobre un Kernel de Linux junto con una serie de programas de aplicación
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
libres (GNU) aunque se hace la salvedad de que también se puede tratar de
Software no libre o la combinación de ambos, se conoce como distribución Linux
cuando un sistema completo es diseñado a la medida de una aplicación específica
o se basa en una distribución disponible p.e: Ubuntu Linux, Devian GNU/Linux,
Red Hat Enterprice Linux, etc.
Al contrario de lo que se puede pensar, Embedded Linux no se trata de una
versión reducida del sistema operativo Linux que se emplea en los PC‟s, mas bien
se aprovecha el hecho de que Linux es altamente modular y además posee un
mecanismo de selección de componentes muy completo, entonces basándonos
en este hecho y en la configuración Hardware de un sistema, se pueden
seleccionar solo los componentes necesarios y suficientes. En este sentido, el
termino ‘Embedded’ se refiere entonces a la funcionalidad de la aplicación mas no
a la funcionalidad del Linux en sí; es decir, típicamente se refiere más que a un
sistema completo, a la distribución de un sistema Linux (el núcleo Linux
combinado con algunas otras utilidades) enfocado a aplicaciones embebidas por
tanto pueden ajustarse a las limitaciones de Hardware, una instalación típica de
Linux embebido puede ocupar en promedio 2 Mb de memoria.
Uno de los cambios fundamentales en Linux es la inclusión del proyecto uClinux
(Linux para Microcontroladores) en el Kernel principal. Esta variante de Linux ha
sido un pilar fundamental para su aceptación en el mercado embebido, y su
inclusión en la versión oficial debería aumentar aún más el desarrollo en este
campo.
Lección 7: Tipos de Sistemas que Utilizan Linux Embebido.
En esta sección en lugar de clasificar los sistemas embebidos en segmentos de
mercado como el aeroespacial, telecomunicaciones, electrónica de consumo, etc.
Serán clasificados por criterios que aporten alguna información sobre la estructura
del sistema. A continuación se presenta esta clasificación:
1. Tamaño.
Existen diferentes factores para clasificar un sistema embebido teniendo en cuenta
el tamaño, uno de ellos es el tamaño físico que puede llegar a ser en un momento
dado un determinante de las capacidades del sistema en cuestión, por otro lado se
tiene en cuenta el tamaño o capacidades de los dispositivos que componen el
sistema embebido, esto incluye la velocidad del procesador, tamaño de la
memoria y de la capacidad de almacenamiento permanente (disco duro o memoria
Flash).
En lo referente al tamaño se manejan tres rangos o categorías de sistemas:

Pequeños: Caracterizados por una CPU de baja potencia con un mínimo de
4MB de memoria ROM y entre 16 y 32 MB de RAM, esto no quiere decir
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
que Linux no se pueda ejecutar en espacios de memoria inferiores aunque
esto requiera un mayor esfuerzo a una mínima ganancia teniendo en
cuenta los actuales precios de las memorias.

Medios: Caracterizados por contener una CPU de mediana potencia con un
mínimo de 32 MB de ROM o mas, y entre 64 y 128 MB de RAM. La
mayoría de sistemas de electrónica de consumo como PDA‟s,
Reproductores de MP3, etc. Caen en esta clasificación, muchos de estos
pueden contar con unidades de almacenamiento secundarios, estos
sistemas cuentan con el poder suficiente para ejecutar diferentes tareas
simples o al menos una que requiera muchos recursos.

Grandes: Son sistemas que cuentan con procesadores muy poderosos
combinados con grandes cantidades de memoria RAM y unidades de
almacenamiento permanente, se emplean usualmente en ambientes donde
se requieren grandes cantidades de cálculos como por ejemplo Switches
para telecomunicaciones, simuladores de vuelo y muchas otras
aplicaciones. El diseño de estos sistemas depende básicamente de su
funcionalidad más que en factores como costos, tamaño o recursos que
quedan relegados a un segundo plano.
La anterior clasificación excluye a los procesadores con una arquitectura de
memoria menor a 32 bits a correr con Linux, aunque no obstante se
encuentren en la red proyectos de investigación que pueden haber generado
puertos de Linux que hayan funcionado en procesadores de 16 bits, se trata de
casos muy puntuales y no existe el soporte suficiente, con mayor razón para
procesadores de 8 bits que no existe soporte alguno para Linux, cualquier
incursión sería mera investigación.
2. Limitantes de Tiempo.
Existen dos tipos de limitantes de tiempo:

Rigurosas: Estas requieren que la respuesta del sistema se limite a unas
franjas predefinidas de otra forma eventos no deseables y hasta
catastróficos pueden ocurrir. Se emplea el término catastrófico en el
sentido de que existen sistemas en los cuales cualquier falla puede
desembocar en accidentes o pérdidas humanas. Por ejemplo un sistema
de seguridad de una guillotina mecánica en el que una cámara de video
apunta a las hojas de corte, debe detectar la presencia del color de los
guantes que utilicen los empleados y detener su función inmediatamente
no puede esperar a que se ejecute otra rutina o que se termine alguna
acción de lo contrario alguien puede perder una mano. Un sistema de este
tipo se conoce como un sistema de “tiempo real duro”. También existen
sistemas de “Tiempo Real Blandos” cuando las aplicaciones tienen
requisitos de tiempo rigurosos pero la falla del sistema no desemboca en
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
una catástrofe por ejemplo un sistema de telefonía celular puede soportar
uno que otro fallo en la señal pero no es aceptable que esto ocurra
constantemente.

Suaves: estas pueden tener variados requerimientos pero generalmente
aplican en sistemas en los que los tiempos de respuesta no son tan críticos
por ejemplo una PDA puede tardarse unos segundos mientras carga una
aplicación y no afectar al usuario.
3. Adaptabilidad de Funciones de Red.
Esta característica define si un sistema puede ser conectado a una red, en la
actualidad gracias a las economías de escala y a la estandarización de los
componentes de red, además las demostradas capacidades de red del Linux se
podría esperar y de hecho hay la posibilidad de que cualquier sistema se pueda
accesar a través de la red. Electrodomésticos simples como una nevera, una
tostadora o una cafetera pueden ser manipulados por medio de la red.
4. Interacción con el Usuario.
El grado de interacción con el usuario puede cambiar de sistema en sistema por
ejemplo una PDA o teléfono celular pueden basar su funcionamiento en la
interacción con el usuario por medio de una interfaz gráfica, por otro lado un
sistema de control industrial puede constar solo de Led‟s y botones, como también
existen sistemas que no presentan medios de interacción de ningún tipo, por
ejemplo el sistema de navegación automática de un avión.
Lección 8: Arquitectura Genérica de un Sistema con Linux Embebido.
En la figura 49 se presenta un diagrama de bloques de la arquitectura genérica un
sistema embebido con todos los elementos requeridos, para que este Hardware
pueda correr bajo Linux debe contar con unas características mínimas que se
listan a continuación:




Linux requiere una CPU de por lo menos 32 bits que contenga una unidad
de administración de memoria (MMU).
La suficiente capacidad de memoria RAM para acomodar el sistema.
Algunos puertos de E/S mínimos requeridos para la programación y
puesta en marcha del Sistema así como para su depuración.
El Kernel debe disponer de alguna unidad de almacenamiento permanente
para cargar el Sistema de Archivos Raíz.
Figura 49: Arquitectura de un sistema de Linux Embebido Genérico.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Aplicaciones
Librerías
Linux Kernel
Abstracciones de Nivel Superior
Sistema de
Archivos
Protocolos
de Red
Interfaces de Nivel Inferior
Hardware
Inmediatamente arriba del Hardware se encuentra el Kernel de Linux que así
como cualquier Kernel al estilo Unix se encarga del manejo del Hardware, es decir
maneja los diferentes dispositivos, gestiona el acceso a los puertos E/S, controla
el cronograma de los procesos y la memoria compartida, así como la distribución
de las diferentes señales, entre otras tareas administrativas, además provee
niveles de abstracción superiores al servicio del Software de aplicación. Es de
esperar que cualquier aplicación que emplee alguna interfase de programación de
aplicaciones API (Application Programming Interface) suministrada por el Kernel,
pueda ser portable a todas las arquitecturas soportadas por dicho Kernel con muy
pocos o ningún cambio.
Dentro del Kernel se diferencian dos niveles de servicios que proveen la
funcionalidad de las aplicaciones requeridas, el Espacio del Kernel y El espacio de
Usuario. El espacio del Kernel lo conforman las interfaces de nivel inferior que son
específicas a la configuración del Hardware sobre el que funciona el Kernel y
provee el control directo de los recursos para tal efecto se emplea un API
especifico dependiendo del tipo de Hardware, la razón es que típicamente los
servicios de los niveles más bajos manejan operaciones específicas de la CPU, de
la memoria y de las interfaces básicas a los dispositivos que se estén empleando.
Por otro lado a pesar de que el manejo de los recursos de diferentes plataformas
se maneja de manera distinta; serán igualmente accesibles empleando un API en
común para niveles de abstracción más altos del Kernel (Espacio de Usuario), es
decir que sobre los servicios de bajo nivel suministrados por el Kernel, los
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
componentes de alto nivel suministran una abstracción común a todos los
sistemas del tipo Unix, éstos incluyen procesos, archivos, y señales. Estas
abstracciones de alto nivel a diferencia de las de bajo nivel se mantienen
constantes independientemente de la plataforma donde corra el Kernel a menos
se trate de casos muy puntuales.
En algunas ocasiones el Kernel necesita entre estos dos niveles de abstracción lo
que se puede llamar componentes de interpretación que comprendan e
interactúen con información provenientes de o hacia determinados dispositivos.
Los sistemas de archivos y protocolos de red son ejemplos de entidades con las
que el Kernel requiere interactuar para que un intercambio de información pueda
existir de forma adecuada.
Durante la operación normal, el Kernel requiere un sistema de archivos bien
estructurado y almacenado permanentemente conocido como El Sistema de
Archivos Raíz. A partir de este, el Kernel carga las aplicaciones iniciales para
poder correr el sistema, a su vez acude a este cada vez que se vallan a cargar
otras aplicaciones. El Sistema de Archivos Raíz puede almacenarse y operarse
desde algún dispositivo Hardware de almacenamiento, de red o puede cargarse
en la memoria RAM durante el arranque del sistema y ser operado desde allí.
Siguiendo con el análisis de la figura 49 se tiene que los servicios que exporta el
Kernel normalmente no son aptos para que sean utilizados directamente por los
programas de aplicación, en su lugar las aplicaciones soportan su funcionamiento
en librerías y otras aplicaciones del sistema que proveen API‟s y servicios
abstractos que en si son las que interactúan con el Kernel para obtener las
funcionalidades deseadas. La principal librería empleada por la mayoría de las
aplicaciones se trata de la librería de C GNU, glibc. Uno de los principales
inconvenientes de esta librería es su tamaño por lo cual para sistemas embebidos
se pueden emplear librerías como Qt, XML o MD5, que proveen varias utilidades y
API‟s funcionales para variedad de propósitos diferentes.
Lección 9: Características del Kernel de Linux.
El Kernel o núcleo se define como el corazón del sistema operativo, encargado de
que el Software y el Hardware de un sistema embebido puedan trabajar juntos, a
pesar de que conforma una pequeña parte del sistema operativo, el Kernel tiene el
trabajo mas importante de todos que es el de mantener todo lo demás trabajando
de manera sincronizada.
Se puede pensar en él como en el administrador de recursos que provee una
variedad de abstracciones de Software a través de las cuales los programas de
aplicación piden acceso a los recursos del sistema sin la necesidad de
comunicarse directamente con el Hardware, teniendo principal influencia en la
asignación de tiempos al uso de recursos por parte de los programas, entre los
que se encuentran el procesador del sistema, la memoria RAM disponible, así
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
como también se encarga del acceso indirecto de los periféricos que puedan
pertenecer a la plataforma seleccionada.
Las capacidades enmarcadas en un Kernel en particular son configuradas cuando
dicho Kernel es compilado, la configuración del Kernel permite la remoción de
soporte de capacidades innecesarias u obsoletas que se sabe jamás serán
usadas. Por ejemplo si un sistema no presenta dispositivos de red, se puede
remover todos los archivos de sistema que presten soporte para red.
1. Arquitectura del Kernel de Linux.
Aunque se han desarrollado diferentes versiones del Kernel, en cierta forma la
arquitectura básica se ha mantenido. El Kernel de Linux se puede dividir en los
siguientes subsistemas:







Nivel de Abstracción de Hardware.
Administración de Memoria.
Planificación.
Sistema de Archivos
Subsistema de E/S.
Subsistema de Red.
IPC.
A continuación se presentan cada uno de ellos junto con algunos detalles de su
uso en sistemas embebidos.
1.1. Nivel de Abstracción de Hardware (HAL).
Este se encarga de virtualizar el Hardware para que los drivers puedan ser
portados de manera fácil sobre cualquier plataforma. Linux fue inicialmente
diseñado para correr sobre el procesador x86, no obstante con el transcurrir del
tiempo se han desarrollado soporte para otras plataformas, Linux aun no posee un
API estándar que le permita migrar fácilmente a otras plataformas aunque la idea
se encuentra en desarrollo para las nuevas versiones del Kernel. Entre las
plataformas soportadas por la versión 2.6 del Kernel de Linux se encuentran:







MIPS.
PowerPC.
ARM.
M68K.
CRIS.
V850.
SuperH.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Por otro lado el HAL tiene soporte para los siguientes componentes Hardware.








Procesador, Caché y MMU.
Configuración del Mapa de Memoria.
Soporte para manejo de Interrupciones y Excepciones.
DMA.
Temporizadores.
Consola del Sistema.
Manejo de Buses de Datos.
Manejo de Alimentación.
1.2. Administración de Memoria.
Es el responsable de manejar y controlar el acceso a los recursos de memoria
física del sistema, provee de espacios de memoria dinámica a subsistemas del
Kernel, como drivers, archivos de sistema. Además implementa el software
necesario para brindar memoria virtual para aplicaciones de usuario, esta es
utilizada como forma de hacer el sistema confiable evitando que la información de
las aplicaciones de usuario puedan corromper otras aplicaciones y mucho menos
afectar los espacios de memoria donde puedan encontrarse archivos de sistema.
El Kernel de Linux divide la memoria disponible en páginas típicamente de 4KB,
todas se pueden accesar por el Kernel, algunas de éstas son empleadas por éste
para su funcionamiento, estos espacios no pueden ser utilizados ni son accesibles
por ninguna aplicación, las demás son utilizadas por las aplicaciones. Cuando una
aplicación se va a ejecutar, no es cargada en su totalidad en la memoria, solo las
páginas utilizadas son intercambiadas entre la memoria y el dispositivo de
almacenamiento permanente.
1.3. Planificación.
El planificador (Scheduler) de Linux suministra las capacidades al sistema de
realizar multi-tareas, es un componente en constante evolución a través de las
diferentes versiones del Kernel la idea es que este brinde una política de
planeación de tareas determinística o predictiva para que se puedan soportar
aplicaciones en “tiempo real”. A continuación se describen las instancias de
ejecución realizadas por el Scheduler.

Hilo del Kernel: Son procesos que no poseen contexto de usuario solo se
ejecutan al interior del kernel durante su ciclo de vida.

Proceso de Usuario: Cada uno tiene su propia dirección y espacio asignado
gracias a la memoria virtual. Estos entran en modo Kernel cuando una
llamada de sistema, interrupción o excepción se ejecutan, es importante
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
añadir que cuando un proceso entra en modo Kernel utiliza una pila
completamente diferente con respecto a la pila del Kernel.

Hilo de Usuario: Estos hilos son entidades de ejecución diferentes que se
encuentran estructuradas en un solo proceso de usuario, por lo tanto
comparten el espacio para datos entre otros recursos, no obstante manejan
diferentes direcciones de pila.
1.4. Sistema de Archivos.
En Linux los diferentes sistema de archivos son administrados por un nivel
llamado el Sistema de Archivos Virtual (VSF: Virtual File System), éste
proporciona una visión consistente de los archivos que se encuentren en los
posibles dispositivos de almacenamiento empleando niveles de abstracción que
hacen transparente al usuario detalles del dispositivo físico y de la lógica del
sistema de archivos.
Cualquier dispositivo que corre bajo Linux ya sea un sistema embebido o un
servidor, necesita al menos de un sistema de archivos la razón radica en el hecho
de que las aplicaciones poseen diferentes imágenes de programa y por lo tanto
necesitan tener un sistema de archivos que las almacene, de la misma forma así
se trate de aplicaciones de bajo nivel, son accedidas a través de archivos.
Es necesario para cada sistema Linux contar con un sistema de archivos principal
conocido como el Sistema de Archivos Raíz que es cargada durante el arranque
del sistema, después otros archivos pueden ser cargados a través de éste. Si por
alguna razón no es posible cargar el Sistema de Archivos Raíz se interrumpe el
arranque y el sistema no puede ser cargado.
Además de soportar sistemas de archivos basados en discos, Linux puede
soportar sistemas de archivo especializados basados en memorias Flash o ROM
que pueden llegar a se de utilidad en sistema embebidos. También existe soporte
para sistemas de archivos lógicos o pseudo-lógicos que pueden ser utilizados para
depuración u obtención de información del sistema, los siguientes son algunos de
los sistemas de archivos embebidos comúnmente utilizados:

EXT2: Sistema de archivos clásico que utiliza una amplia base de usuario.

CRAMFS: Sistema de archivos comprimido de solo lectura.

ROMFS: Sistema de archivos de solo lectura.

RAMFS: Sistema de archivos de lectura/escritura basado en memorias.

JFFS2: Sistema de archivos específico para almacenamiento en flash.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS

PROCFS: Pseudo sistema de archivos utilizado para obtener info del
sistema.

DEVFS: Pseudo sistema de archivos utilizado para mantener los archivos
de los dispositivos.
1.5. Subsistemas de Entrada/Salida.
Este brinda una interface simple y uniforme para los dispositivos de la plataforma,
entre los tipos de dispositivos soportados se encuentran:



Dispositivos de caracteres que soportan dispositivos secuenciales.
Bloques de dispositivos para el soporte de dispositivos de acceso aleatorio,
son indispensables para la implementación de sistemas de archivos.
Dispositivos de Red que soportan una variedad de dispositivos a nivel de
enlace.
1.6. Subsistemas de Red.
Uno de los fuertes del Linux es un soporte robusto para varios protocolos de
comunicación en red.
1.7. IPC.
Los mecanismos de Comunicación Inter Procesos (IPC) son los encargados de la
comunicación entre el Kernel y los demás proceso activos para que en conjunto se
puedan realizar las funciones correctamente.
Lección 10: Arranque del Sistema.
Es importante comprender adecuadamente el arranque del Linux, a continuación
se describe el proceso que brindará un entendimiento de los diferentes elementos
que lo conforman lo que servirá a la hora de compilar un sistema de Linux
embebido. En el arranque del sistema intervienen principalmente tres
componentes Software: el gestor de arranque (Bootloader), el Kernel y el iniciador
de procesos (Init Process).
1. Fase del gestor de arranque.
El Bootloader es el primer Software que se ejecuta una vez se arranca el sistema,
desempeña una inicialización de bajo nivel del Hardware y de algunos puntos de
prueba para luego cargar la imagen del Kernel seguido del código de inicialización
del Kernel delegandole el control desde este punto, el gestor de arranque depende
altamente de la plataforma Hardware empleada. A continuación se presenta la
secuencia de pasos ejecutada por el gestor de arranque:
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
1.1. Inicialización de Hardware.
Normalmente incluye:
1. Configurar la velocidad de la CPU.
2. Inicialización de la memoria (Determinación del tamaño de memoria
disponible, borrado de la misma y configuración de registros).
3. Encendido del caché disponibles.
4. Configuración del puerto serial para el arranque de la consola.
5. Realización de diagnósticos de Hardware, esto se conoce como POST:
Power On Self-Test diagnostics.
Una vez estos pasos se han completado satisfactoriamente, el paso a seguir es el
de cargar el Kernel de Linux.
1.2. Descarga de la imagen del Kernel y el Disco RAM inicial (Initrd).
El gestor de arranque requiere localizar la imagen del Kernel que dependiendo de
la aplicación se puede encontrar en un Disco Duro, una memoria Flash o alguna
ubicación en la red. Cualquiera que sea el caso se requiere cargar la imagen en la
memoria, si se encuentra comprimida (en la mayoría de los casos) debe ser
descomprimida.
Si también se encuentra presente un Disco RAM Inicial (Initrd) el gestor de
arranque también debe cargarlo en la memoria, el Initrd se trata de un sistema de
archivos temporal que emplea el Kernel durante el inicio del sistema típicamente
para hacer los arreglos necesarios para que el sistema de archivos raíz pueda ser
cargado.
Se resalta que la dirección de memoria donde el Kernel es cargado es designada
por el gestor de arranque dependiendo de lo que lee del encabezado de la imagen
del kernel, normalmente para las imágenes de Kernel se emplean archivos .ELF
(Executable and Linkable Format) que contienen un encabezado con información
referente al archivo.
1.3. Configurando Argumentos.
La transferencia de argumentos es una opción poderosa soportada por el Kernel
de Linux. Linux genera medios genéricos para la transferencia de argumentos al
Kernel a través de cualquier plataforma. Normalmente el gestor de arranque
configura un área de la memoria inicializándola con las estructuras de datos
requeridas (que pueden ser identificadas por el Kernel) para que la transferencia
de argumentos se presente solo es necesario cargar los valores deseados en
estas estructuras.
1.4. Saltando al Punto de Entrada del Kernel.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
El punto de entrada del Kernel es asignado por el enlazador cuando se compila el
Kernel una ves el gestor de arranque salta hacia el punto de entrada del Kernel se
culmina su trabajo en la mayoría de los casos entonces el Kernel entra a disponer
del espacio en memoria utilizado por este, se debe tener en cuenta este aspecto a
la hora de el diseño del mapa de memoria del sistema.
1.5. Arranque del Kernel.
El arranque del Kernel se puede dividir en dos etapas:

Inicialización específica de la plataforma/CPU.
Si se está portando el Linux a una plataforma específica, esta sección es muy
importante porque presenta una serie de pasos necesarios en el portado o
migrado del BSP (Board Suport Package). En sistemas embebidos BSP se trata
del código de soporte de una board especifica y normalmente hace parte del
gestor de arranque de un sistema. La inicialización de la plataforma consiste en
los siguientes pasos:
1. Configurando el ambiente para la ejecución de la primera rutina en C: el
punto de entrada del Kernel se trata de una rutina en assembler que
dependerá específicamente de la plataforma. El nombre de esta función
varía pero normalmente se encuentra en un archivo llamado head.s y
realiza lo siguiente:
a. Activar el MMU de la plataforma: Muchos de los gestores de
arranque no trabajan con MMU por lo tanto la dirección virtual
concuerda con la física; por otro lado el Kernel es compilado con la
dirección virtual. por tanto se requiere que en máquinas que no
tienen el MMU activado, se active, así el Kernel puede empezar a
utilizar la dirección virtual normalmente.
b. Realizar la inicialización del Caché, esta labor también depende de la
plataforma.
c. Configurar BSS (block started by symbol) colocándola en cero.
d. Configurar la pila para que la primera rutina en C pueda ser
invocada. La primera rutina en C es la función start_kernel()que se
encuentra en init/main.c Esta es una función mas grande que realiza
una serie de procesos hasta que termina en una tarea de marcha
lenta (la primera tarea en el sistema que tiene una identidad de
proceso igual a 0). Esta función invoca el resto de las inicializaciones
de la plataforma que se describen a continuación
2. La función setup_arch(): realiza la inicialización de la plataforma/CPU
especifica para que las demás inicializaciones puedan ser invocadas de
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
forma segura esta función es altamente dependiente de la plataforma, se
pueden describir algunas funcionalidades en común:
a. Reconocimiento del Procesador. Se realizan los arreglos requeridos
por este procesador.
b. Reconocimiento de la Placa, igualmente se realizan los arreglos
requeridos por la placa.
c. Análisis de los parámetros de la línea de comandos transferidos al
Kernel
d. Identificación si el Disco Ram ha sido configurado por el gestor de
arranque para que el Kernel después pueda cargarlo como el
Sistema de Archivos Raíz.
e. Llamada de funciones Bootmem, estas se refieren a la memoria
inicial que el Kernel puede reservar para diferentes propósitos antes
de que el código de paginado disponga de toda la memoria. Por
ejemplo se puede utilizar un espacio reservado previamente por el
Bootmem para manejar el DMA.
f. Se Llama la función de inicialización de paginado que toma el resto
de la memoria para el ajuste de las páginas de memoria del sistema.
3. Inicialización de las Excepciones – la función trap_init(): esta función ajusta
los manejadores de excepciones referentes al el Kernel específico. Previo a
esto si una excepción ocurre la respuesta depende de la configuración de la
plataforma.
4. Inicialización del proceso del manejo de interrupciones – la función
init_IRQ(): esta función inicializa el controlador y los descriptores de
interrupciones (estos son estructuras de datos empleadas por el BSP para
asignar interrupciones). Nótese que las interrupciones no se encuentran
habilitadas en este punto esto es responsabilidad del individuo; los drivers
contienen las líneas que habilitan las interrupciones durante su inicialización
pero son cargados luego. Por ejemplo la inicialización del timer se
asegurará de que su interrupción es habilitada.
5. Inicialización de Timers – La función time_init(): Esta inicializa la señal del
temporizador Hardware para se comience a generar la señal de reloj con la
cual funciona el sistema.
6. Inicialización de la consola – La función console_init(): Esta inicializa el
dispositivo serial como una consola. Una vez esta está activada, todos los
mensajes de arranque son presentados en la pantalla del sistema si la
posee, de lo contrario será enviada por el puerto serial. Para imprimir un
mensaje desde el Kernel se emplea la función printk().
7. Calculando ciclos de espera para la plataforma – la función
calibrate_delay(): Esta función es utilizada para implementar esperas de
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
microsegundos dentro del Kernel utilizando la función udelay(), ésta oscila
por algunos ciclos hasta obtener los microsegundos especificados por el
argumento para esto el número del ciclos de reloj por microsegundo deben
ser conocidos por el Kernel y la función calibra el número de ciclos de
espera, se basa en las interrupciones del timer asegurando que los ciclos
de espera trabajan de forma uniforme para cualquier plataformas.
 Inicialización del Sub-sistema.
La mayoría de las inicializaciones del subsistema son realizadas durante la
ejecución de la función start_kernel(), al final de esta el Kernel crea otro proceso
llamado el proceso de inicio que realiza el resto de la inicialización (drivers,
llamadas de inicio, carga del sistema de archivos raíz y salto al espacio de
usuario) este proceso es el que se convierte en el proceso 0.
Incluye:
 Inicialización del Scheduler.
 Inicialización del administrador de memoria.
 Inicialización del VSF.
1.6. Inicialización de Drivers.
La inicialización de drivers es realizada después de que la administración de
memoria y de procesos se encuentran activas, esto es realizado en el contexto del
proceso de inicio.
1.7. Carga del Sistema de Archivos Raíz.
Teniendo en mente que el Sistema de Archivos Raíz es el principal, es decir, se
trata del sistema de archivos en donde otros archivos del sistema pueden ser
cargados. El registro de carga es un proceso importante durante la etapa de
arranque en la medida en que el Kernel puede comenzar la transición de este a
espacio de usuario. El bloque que contiene el sistema de archivos raíz puede ser
codificado en el Kernel cuando éste es compilado o puede ser transferido como un
argumento en una línea de comando del gestor de arranque utilizando la etiqueta
“root=”. Los siguientes son tres tipos de sistemas de archivo raíz que pueden
encontrarse en sistemas embebidos:



El Disco RAM Inicial.
Sistemas de archivos basados en Redes que emplean NFS (Network File
System).
Sistema de archivos basado en memorias Flash.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Los sistemas de archivos raíz normalmente son utilizados para compilaciones de
depuración los otros dos para compilaciones de producción. El disco RAM simula
un dispositivo de bloque utilizando la memoria del sistema; también puede ser
utilizado para cargar sistemas de archivos generando una imagen de éstos, el
disco RAM puede ser utilizado como Raíz (Initrd). Initrd es un concepto poderoso
y tiene una amplia gama de usos especialmente en las primeras etapas de diseño
de Linux Embebido cuando no se cuenta con un driver para Flash pero las
aplicaciones se encuentran listas para hacer pruebas. Si se quiere que el Kernel
cargue un Initrd, se debe configurar el Kernel durante el proceso de compilación
con la opción CONFIG_BVLK_DEV_INITRD. Como se sabe la imagen del Initrd es
cargada solamente con la imagen del Kernel; éste debe transferir la dirección de
inicio y final del Initrd empleando argumentos en líneas de comandos. Una vez
realizado esto el Kernel cargará un sistema de archivos raíz cargado en el Initrd.
A pesar de la utilidad el Initrd una vez se ha utilizado es desechado, la necesidad
de utilizar Initrd radica en el hecho de que se requiere para cargar otro sistema de
archivos, a simple vista parece innecesario pero teniendo en cuenta que para
cargar un sistema de archivos desde un dispositivo de almacenamiento se
requiere el driver del éste, pero este driver se encuentra en el sistema de archivos
raíz del Kernel que no ha sido montado, este inconveniente se convierte en la
paradoja de la gallina y el huevo, la solución es incluir el driver como un módulo en
el Initrd, una vez que éste es cargado entonces el módulo del driver puede ser
accedido entonces si se puede cargar la raíz desde el dispositivo y se desecha el
Initrd.
1.8. Realizando la llamada inicial (Initcall) y liberando la memoria inicial.
Si se observa el script del enlazador de cualquier arquitectura, este tendrá una
sección de arranque, el inicio y fin de esta sección se marca con: __init_begin e
__init_end. La idea de este espacio es el de contener texto y datos que puedan
ser desechados una vez el sistema ha arrancado y ya no sean necesarios. Un
ejemplo de esto puede ser las funciones de inicialización de drivers. La idea de
colocar todas estas funciones juntas es la de que el bloque de memoria ocupada
por estas sea significativo como para que quede disponible en forma de páginas
libres.
Linux también proporciona una forma de agrupar funciones que deben ser
llamadas durante el arranque del sistema, esto se logra declarando las funciones
con la directiva __initcall, Estas funciones automáticamente serán llamadas
durante el arranque por lo tanto no requieren ser insertadas en el código de
arranque.
1.9. Moviéndose hacia el espacio de Usuario.
El Kernel que se ejecuta en el contexto del proceso de arranque salta al espacio
de usuario superponiéndose (empleando la función execve) con el ejecutable de la
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
imagen de un programa especial conocido como Init. Este ejecutable normalmente
se encuentra en la Raíz en el archivo /sbin.
1.10. Inicialización del Espacio de Usuario.
El espacio de usuario depende de la distribución que se utilice, la responsabilidad
del Kernel se limita a la transición del proceso de arranque; lo que hace el proceso
de arranque y como inicia los servicios depende de la distribución. A continuación
se presenta el modelo genérico de Linux que asume que el proceso de inicio es
/sbin/init, y es muy similar a la secuencia de inicialización de la variante de UNIX
conocida como V UNIX.

El proceso /sbin/init y el /etc/inittab.
El proceso Init es muy importante para el Kernel, cumple con las siguientes
características:
 Nunca puede ser eliminado, Linux provee una señal llamada SIGKILL que
puede terminal la ejecución de cualquier proceso pero no puede hacerlo
con el proceso Init.
 Cuando un proceso inicia otro proceso éste se convierte en el hijo del
proceso inicial, esta relación es importante puesto que si el padre es
eliminado antes que el hijo, el Init adopta al proceso huérfano.
 El Kernel informa el comienzo de eventos especiales por medio de señales,
por ejemplo si se presiona Ctrl-Alt-Del en el teclado del sistema, esto hace
que el Kernel envíe una señal al proceso Init que por lo general provoca un
apagado general.
El proceso Init puede ser configurado en cualquier sistema utilizando el archivo
inittab que normalmente se encuentra en la siguiente dirección: /etc. El Init lee
éste archivo y realiza las acciones descritas en éste de forma secuencial. Init
también decide el estado del sistema, que se conoce como nivel de ejecución
(Run Level) y es mandado al inittab como un argumento, si no se envía
ninguno se emplea el nivel de ejecución designado por defecto, entre los
niveles de ejecución disponibles están:
0.
1.
2.
3.
4.
5.
6.
Sistema en alto.
Modo de Mono-Usuario (para propósitos administrativos).
Modo Multi-Usuario con capacidades de red restringidas.
Modo Multi-Usuario completo.
Sin Uso.
Modo Gráfico (X11™).
Estado de Reinicio.
El archivo Inittab tiene un formato especial compuesto generalmente por los
siguientes detalles:
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
 El nivel de ejecución por defecto.
 Las acciones a realizar cuando Init se mueve a nivel de ejecución.
Normalmente se invoca el script /etc/rc.d/rc con el nivel de ejecución
como argumento.
 El proceso que necesita ser ejecutado durante el arranque, normalmente
se trata del archivo /etc/rc.d/rc.sysinit.
 Init puede volver a la “vida” un proceso si esto se encuentra configurado
en el archivo Inittab. Esta característica se emplea por ejemplo en el
proceso de autenticación una vez que el usuario ha cerrado la sesión y
se quiere volver a ingresar.
 Acciones para manejar eventos especiales como Ctrl-Alt_Del o una falla
de energía.

El archivo rc.sysinit.
Este realiza la inicialización del sistema antes de que los servicios sean
iniciados, en un sistema embbebido este archivo realiza lo siguiente:




Carga sistemas de archivos especiales como proc, ramf, entre otros.
Crea directorios y links si es necesario.
Designa el nombre del Host para el sistema.
Ajusta la configuración de red del sistema.
1.11. Iniciando los Servicios.
Como se ha mencionado previamente el script /etc/rc.d/rc se responsabiliza de
iniciar los servicios. Estos se definen como una función que controla un proceso
del sistema. Al utilizar los servicios, un proceso puede ser detenido, reiniciado o
en funcionamiento, entonces su estado puede ser requerido. Los servicios
normalmente se encuentran en directorios basados en niveles de ejecución, y se
comportan dependiendo del nivel de ejecución seleccionado. Después de
desempeñar los pasos anteriores, en Init inicia un programa de autenticación,
puede ser a través de un administrador de ventas en el display gráfico
El código inicial de arranque del Kernel también presenta diferencias que
dependen de la plataforma donde se ejecute, éste gestiona su propia inicialización
antes de generar el ambiente apropiado para la ejecución de código en C. Una
vez se han realizado estas labores, el Kernel salta a la parte independiente de la
arquitectura star_Kernel() que a su ves inicia la funcionalidad de alto nivel del
Kernel, carga el Sistema de Archivos Raíz y el proceso de inicialización general.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
CAPITULO 9: IMPLEMENTACIÓN DE EMBEDDED LINUX
Lección 11: Metodología de Diseño e Implementación.
El diseño e implementación de un sistema con Linux embebido puede ser llevado
a cabo con una metodología definida, el proceso incluye diferentes tareas, algunas
pueden ser realizadas en paralelo algunas pueden incluso ser omitidas en caso de
que se emplee alguna distribución de Linux
1. Creando un Sistema Linux de Destino (Target).
Un sistema de este tipo es creado, mediante la configuración y enlazado de los
componentes de sistema apropiados; es de resaltar la necesidad en la mayoría de
los casos de un sistema anfitrión (host) en el que normalmente se desarrollan las
aplicaciones para luego ser cargadas y/o depuradas en el sistema embebido
(Target), un host puede tratarse de estaciones de trabajo que funcionen bajo
alguna distribución de Linux o cualquier otro sistema operativo como Unix o
Windows (Vista, XP, 2000,NT, 98 etc.)
Figura 50: Enlace Host/Target.
HOST
Ambiente de
Desarrollo
Cross-Plataforma
TARGET
- Bootloader.
- Kernel
-Sistema de
Archivos Raíz
Se debe tener en cuenta que independientemente del sistema empleado como
Host se deben utilizar herramientas de desarrollo enfocadas al Hardware o Target
a emplear y si es el caso que estas herramientas presenten características que
permitan la implementación en sistemas Cross-Plataformas, por ejemplo la
implementación de un sistema con Linux embebido desde una estación de trabajo
que corre bajo Windows. Ver figura 50.
Existen cuatro pasos principales para crear un sistema Linux de Destino:

Determinar los Componentes del Sistema Requeridos:
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Se debe crear una lista con lo elementos realmente necesarios antes de
aventurarse a buscar las posibles opciones que puedan presentarse en un
momento dado, pues si no se tiene claro lo que se requiere, será muy
complicada la selección debido a la gran oferta tanto de Software como de
Hardware que hay disponible.

Configurar el Kernel:
Se debe seleccionar una versión del Kernel y una configuración relevante
de esta, teniendo en cuenta en lo posible emplear versiones actualizadas y
que funcionen de manera estable, evitándose así errores (Bugs) que
agregan inestabilidad al sistema y que puedan haber sido arreglados en
versiones actualizadas.
Se puede apuntar en términos de estabilidad el hecho de que aun en la
actualidad se utiliza la versión 2.4 del Kernel en sistemas embebidos, a
pesar de las nuevas versiones disponibles, esto se debe a que los
ingenieros que lo usan, encuentran comodidad con su uso y no ven
necesidad de utilizar uno mas actual puesto que sus diseños funcionan
correctamente. Independientemente de la versión y configuración
seleccionada es recomendable mantener la misma configuración del Kernel
durante el desarrollo del proyecto para evitar que etapas ya funcionales
entren en conflicto al realizar cambios.
Una vez configurado el Kernel es hora de compilarlo (Build) este proceso
requiere varios pasos y genera mas de una imagen del Kernel. Puede que
algunos de los componentes generados no sean necesarios en otros
aspectos del desarrollo del proyecto, pero se recomienda configurar y
estructurar todos los componentes del Kernel tan pronto como sea posible
para que éstos soporten todos los requerimientos durante el desarrollo y
evitar así estar realizando cambios que puedan afectar el funcionamiento
del sistema en general.

Estructurar el Sistema de Archivos Raíz:
El Sistema de Archivos Raíz de un sistema con Linux embebido es similar a
la encontrada en una estación de trabajo o servidor corriendo bajo Linux
con la excepción de que contienen un set de aplicaciones mínimo, así como
las librerías y archivos relacionados justos para correr el sistema
adecuadamente.
A este punto se asume una adecuada selección de los componentes
requeridos del sistema y no se recomienda retirar ninguno de lo contrario la
especificación del Sistema de Archivos Raíz se verá afectada. Es por tanto
importante que durante la etapa de determinación de los componentes se
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
estime de manera lo mas precisa posible el tamaño de cada uno de los
componentes el Sistema de Archivos Raíz.
Otra forma de realizar esta labor puede ser mediante pruebas iterativas
añadiendo componentes como librerías y herramientas a medida que se
desarrolla el proyecto pero es una forma que demanda mas trabajo.

Configurar el Arranque del Sistema:
Las tareas que quedan pendientes tienen relación con la configuración de
los dispositivos de almacenamiento y el Software que gestiona el arranque
del sistema (Bootloader), es en esta etapa donde Kernel, Sistema de
Archivos Raíz y Bootloader entran a interactuar. Aunque el arranque
depende de la arquitectura del sistema, la metodología para empaquetar y
arrancar un sistema es similar para diferentes arquitecturas, lo que varía es
el tipo de Bootloader
y éste depende también de la unidad de
almacenamiento desde donde se carga el sistema.
2. Sistema de archivos y módulos
El sistema de archivos es el encargado de realizar la organización y
almacenamiento de los archivos en los diferentes dispositivos disponibles en el
sistema. En función de las características del dispositivo de almacenamiento y del
tipo de información que se va a guardar es preferible utilizar un sistema de
archivos u otro. Linux da soporte a varios sistemas de archivos, dentro de los mas
utilizados se encuentran ext2, ext3, reiserfs, etc. Estos sistemas de archivos son
manejados por una capa denominada Sistema de Archivos Virtual (VFS, del inglés
Virtual File System). Esta capa de abstracción provee una visión consistente de
los datos almacenados en diferentes dispositivos del sistema. Esta visión es
lograda separando el nivel de usuario de los sistemas de archivos, utilizando
llamadas estandars al sistema, permitiendo sistemas de archivos lógicos sobre
cualquier dispositivo físico. Por lo tanto esta capa abstrae los detalles físicos del
dispositivo permitiendo un acceso a los mismos a través de archivos de una
manera consistente.
Por debajo de esta capa VFS, el kernel interactúa con dispositivos de E/S a través
de controladores de dispositivos (del inglés devices drivers). Estos
controladores se encuentran incluidos en el kernel y consisten en estructuras de
datos y funciones que controlan uno o más dispositivos como discos rígidos,
teclados, mouses, monitores, interfaces de red, dispositivos SCSI. Observamos
esta estructura que ha sido descripta por Bovet en el siguiente gráfico.
Figura 51: Estructura descrita pot Bovet.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Uno de los propósitos fundamentales de los controladores de dispositivos es aislar
los programas de usuario del acceso a estructuras de datos críticas del kernel y
dispositivos de hardware. Además, un controlador de dispositivo oculta al usuario
la complejidad y variabilidad de un dispositivo hardware. Por ejemplo, un programa
que quiere escribir datos en un disco rígido no tiene en cuenta si el mismo posee
sectores de 512 bytes o 1024 bytes. El usuario simplemente abre el archivo y
realiza el comando de escritura. El controlador manejará los detalles y aislará al
usuario de las complejidades y riesgos de programar directamente sobre el
dispositivo de hardware. Estos controladores proveen la representación de los
dispositivos a través de archivos, en GNU/Linux y sistemas operativos Unix todo
hardware es representado por un archivo.
Linux posee la capacidad de agregar y quitar componentes del kernel en tiempo
de ejecución. Como hemos descripto anteriormente, el kernel Linux posee una
estructura de kernel monolítico, con una interfaz para agregar y quitar módulos de
controladores de dispositivos dinámicamente luego del arranque del mismo. Esta
característica no solo agrega flexibilidad al usuario, sino que además, en sistemas
embebidos adquiere una especial importancia debido a su capacidad de
actualización y adaptación a dispositivos de E/S nuevos.
3. Sistema de archivos raíz
Todo dispositivo, ya sea que se encuentre en un sistema embebido o una PC de
escritorio, necesita al menos un sistema de archivos. Dos razones que describe
Yaghmoun son las siguientes:

Las aplicaciones poseen programas separados, independientes por
ende necesitan espacio de almacenamiento en un sistema de archivos.

Los dispositivos de bajo nivel también son accedidos mediante archivos.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
De esto se desprende la necesidad de poseer un sistema de archivos maestro, un
sistema de archivos raíz (RFS, del inglés Root Filesystem).
El RFS es una estructura de directorios jerárquica en donde se almacenan las
aplicaciones, librerías y archivos relacionados para ejecutar el sistema. Estos
archivos pueden ser binarios, contener solo datos o también vincularnos con
estructuras de datos haciendo de nexo con los dispositivos de E/S que hemos
descripto en el punto anterior.
El RFS de un sistema Linux embebido y de un Linux de escritorio o servidor no
varían demasiado, solo que el primero es reducido por evitar un consumo excesivo
de recursos. Este sistema de archivos raíz es montado al momento del arranque
de Linux.
Posee una estructura en forma de árbol, en donde todos los directorios se
desprenden del directorio principal denominado raíz y simbolizado con una barra
inclinada (/). La siguiente figura nos muestra este tipo de estructura.
4. Compilación nativa y cruzada
En el proceso de desarrollo de un sistema GNU/Linux embebido se debe realizar
en un primer punto las configuraciones correspondientes de los componentes que
formarán parte del sistema embebido (kernel, los módulos del mismo, el sistema
de archivos raíz, etc), luego de esto, el paso previo a la prueba del sistema es la
etapa de compilación.
Cuando se realiza el desarrollo de una aplicación, usualmente se compila en una
computadora tipo PC, ya que dicha aplicación será ejecutada por un sistema de
características de hardware similares. Otra práctica habitual ocurre cuando se
desea añadir soporte extra al kernel Linux, ya sea para hardware o para
protocolos de red, en este caso se realiza la compilación en la misma
computadora donde luego será ejecutado.
Este tipo de compilación, en donde el software es compilado y ejecutado en una
misma arquitectura de hardware se denomina compilación nativa.
Esta alternativa es la más utilizada, y se la denomina de este modo aún si la
aplicación ha sida compilada en un equipo diferente al que luego la ejecutará
siempre y cuando la arquitectura de hardware sean compatibles. Un ejemplo de
esto son las aplicaciones compatibles para microprocesadores AMD e Intel.
En el caso de los equipos que frecuentemente se utilizan para sistemas
embebidos, poseen recursos de hardware limitados y específicamente diseñados
para realizar cierto tipo de tareas. Por este motivo, en general, no es una buena
alternativa compilar un sistema completo utilizando el hardware del sistema
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
embebido.
En este punto es donde surge la necesidad de realizar la compilación del sistema
embebido en una computadora cuyos recursos no sean escasos. Es común hoy
en día tener una PC capacidades de procesamiento de 3 Ghz y 2GB de memoria
RAM, lo que supone una gran ahorro de tiempo al momento de realizar pruebas y
cambios de configuraciones, solo basta diseñar un "ambiente" que le permita al
compilador producir código ejecutable para un microprocesador diferente al que se
está utilizando.
La compilación de software que será ejecutado en una arquitectura diferente, por
ende incompatible, a la que está produciendo el código ejecutable se denomina
compilación cruzada y este "ambiente" que permite realizar la misma se
denomina entorno de compilación cruzada o entorno de desarrollo cruzado.
Yaghmoun describe este proceso identificando al equipo que realiza la
compilación mediante el término Host o Huesped y al dispositivo que ejecuta el
software, como sistema Target u Objetivo.
5. Entorno de compilación cruzada
Para implementar un entorno de compilación cruzada es necesario un conjunto de
librerías, utilitarios y binarios. En la bibliografía relacionada con sistemas
GNU/Linux embebido a este conjunto de componentes se los denomina toolchain
components.
Estos componentes son:



Compilador C : compilador de C básico, generador de código objeto
(tanto del kernel como de aplicaciones)
Librería C: implementa las llamadas al sistema mediante APIs.
Binutils: conjunto de programas necesarios para la compilación,
enlazado, ensamblado y depuración de código. Entre otros, los binarios
principales son: ld (GNU linker), as (GNU assembler).
Lección 12: uCLinux.
Pronunciado ”you-see-linux”, el nombre de µClinux viene de la combinación de la
letra griega µ con la letra C y el nombre Linux. µ designa pequeño o micro, C
indica controlador y Linux obviamente del popular sistema operativo. µClinux fue
portado inicialmente en el procesador Motorola DragonBall MC68328. El primer
sistema objetivo con µClinux fue una PalmPilot usando la board TRG SuperPilot.
µClinux es un derivado del kernel 2.0 de Linux destinado para microcontroladores
y microprocesadores sin unidades de administración de memoria (MMUs). µClinux
hoy en día incluye las versiones 2.4 y 2.6 del kernel de Linux con las debidas
modificaciones o extensiones. Incluso, gracias a la popularidad que están tomando
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
los sistemas embebidos, µClinux ha sido incluido en la versión principal del kernel
de Linux, la 2.6.
El hecho de que µClinux haya sido creado para soportar microprocesadores sin
MMU, hace que la multitarea sea difícil de implementar. La mayoría de los
archivos binarios y código fuente del kernel han sido reescritos para compactar y
reducir el código base. Todo esto significa que el kernel de µClinux es mucho más
pequeño que el kernel original de Linux 2.0, mientras que mantiene las principales
ventajas de este último como son: estabilidad, capacidad superior en redes, y
excelente soporte en el sistema de archivos. Entre las características que
sobresalen a primera medida se puede destacar que µClinux cuenta con API de
Linux común, además de tener un tamaño muy pequeño, de hecho menor a los
512 KB cuando se ha compilado. µClinux viene equipado con un stack completo
TCP/IP, junto con el soporte para muchos protocolos de red adicionales. La
mayoría de los protocolos de red están implementados y son funcionales.
Además, es un sistema operativo apto para Internet y sistemas embebidos, donde
no se necesita de una arquitectura de alto desempeño. Se tiene soporte para
varios sistemas de archivos tales como: NFS, ext2, fat32, romfs, jffs y muchos más
gracias al sistema de archivos virtual que desciende de Linux.
1. Razones para usar µClinux
Las siguientes características muestran porque µClinux puede ser usado en
aplicaciones embebidas de alta complejidad con limitantes en la arquitectura.

Linux: Conectividad IP incluida, fiabilidad, portabilidad, manejo de
numerosos sistemas de archivos, software libre o gratuito.

Peso liviano: se puede obtener un kernel de Linux 2.6 en menos de 300kb,
además, los binarios son mucho más pequeños con la librería µClibc.

Ejecución en el lugar (XIP): No se necesita cargar los ejecutables en la
memoria RAM ya que se pueden correr directamente desde la memoria
ROM. Sin embargo la ejecución será más lenta que si lo ejecuta
normalmente.

Más barato: Los núcleos ARM sin MMU son aproximadamente un 30% más
pequeños. Un gran número de aplicaciones en sistemas embebidos no
necesitan MMU.

Rápido: con µClinux, los cambios de contexto son bastante rápidos.

Acceso del usuario al hardware: Las aplicaciones de usuario pueden
acceder al sistema entero, incluyendo registros de dispositivo.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS

APIs de Linux completas: Se pueden usar la mayoría de llamadas de
sistema con algunas excepciones. Las aplicaciones que vienen con la
distribución µClinux ya han sido portadas.

Características completas del kernel 2.6: Estabilidad, núcleo apropiativo,
drivers, entre otros.

Multitarea: Soporte completo para ejecución de tareas múltiples. Claro está,
con algunas limitaciones.

Procesadores soportados: M68K, ARM7, MIPS, entre otros.
µClinux se usa especialmente en procesadores sin MMU. Incluso, en algunos
casos es mejor usarlo en procesadores con MMU en lugar de Linux por razones
de desempeño, ya que desactivar esta unidad puede traer mejoras en el
rendimiento de aplicaciones orientadas a sistemas embebidos. Aunque una gran
cantidad de trabajo ya se ha hecho y la mayoría de aplicaciones ya han sido
exportadas, alguna experiencia o aprendizaje es definitivamente necesaria cuando
se va a iniciar un proyecto nuevo usando µClinux.
2. Diferencias entre Linux y µClinux
µClinux proviene del sistema operativo Linux. En vista de que este sistema
operativo soporta procesadores que no cuentan con MMU, varias son las
diferencias que existen entre él y su padre.


No hay administración de memoria virtual: La diferencia definitiva y más
prevaleciente entre µClinux y Linux es la falta de administración de memoria
virtual (VM). Bajo Linux, la administración de memoria virtual es llevada a
través de la unidad MMU que los procesadores tienen. µClinux ha sido
creado para sistemas que no cuentan con tal unidad y por lo tanto no hace
uso de memoria virtual.
Diferencias en el kernel: µClinux tiene algunas diferencias en su kernel muy
relacionadas principalmente por el hecho de no haber una MMU en el
procesador. Por ejemplo, no se podrá hacer uso del soporte de paginación
que ofrece una unidad de MMU. El sistema de archivos TMPFS no funciona
en µClinux debido a que él confía en las características que la VM le puede
brindar. Similarmente, los formatos estándar de ejecutables (elf, a.out, etc.)
no funcionan ya que estos también hacen uso de la VM que no está
disponible en µClinux. Para solventar este problema, los archivos
ejecutables deben tener un formato plano, el cual es un formato ejecutable
condensado que almacena solo código ejecutable y datos, además de las
reubicaciones necesarias para cargar el ejecutable en memoria.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS

Asignación de memoria: µClinux ofrece una elección de dos asignadores de
memoria del núcleo. Al principio puede no parecer obvio por qué es
necesario un asignador alterno de memoria del núcleo, pero en los
sistemas µClinux la diferencia es clara. El asignador predeterminado del
núcleo bajo Linux es un método de asignación basado en potencias de dos.
Esto le permite operar más rápido y encontrar velozmente áreas de
memoria del tamaño correcto para satisfacer peticiones de asignación.
Desafortunadamente, bajo µClinux, las aplicaciones deben ser cargadas
dentro de la memoria que está fuera del alcance de este asignador. Para
entender las consecuencias de esto, especialmente para asignaciones
grandes, considérese una aplicación que requiera una asignación de 33KB
para ser cargada; realmente se le asigna la siguiente potencia de dos, que
es 64KB. Los 31KB de espacio adicional asignado no pueden ser utilizados
eficazmente.
Este orden de desperdicio de memoria es inaceptable en la mayoría de
sistemas µClinux. Para remediar este problema, un asignador alternativo de
memoria se le ha creado al kernel de µClinux. Este es comúnmente
conocido como page alloc2() o kmalloc2(), dependiendo de la versión del
núcleo.

Aplicaciones y procesos: Otra diferencia entre Linux y µClinux es la falta de
la llamada de sistema fork(). Esto puede requerir bastante trabajo de parte
del desarrollador cuando está portando aplicaciones que usan fork(). La
única opción bajo µClinux es usar vfork().
3. Librería estándar C
El SO Linux hace uso de la librería estándar C junto con un gran número de
librerías tanto estáticas como dinámicas que permiten a las aplicaciones hacer uso
de los diferentes servicios que ofrece el SO. La librería C para Linux llamada glibc
es de gran tamaño y por lo tanto no es apta para un sistema embebido que por lo
general está limitado en memoria.
Por fortuna el proyecto µClinux ha creado la librería µClibc, la cual cumple en gran
parte, con la funcionalidad de la librería tradicional pero con un tamaño mucho
menor. Actualmente µClibc es mantenido por un proyecto aparte de nombre
similar.
4. Distribución µClinux
Hoy en día, µClinux se puede encontrar como una distribución, es decir, no solo
viene el código del kernel sino también una serie de aplicaciones ya portadas para
él, además de configuraciones para una gran variedad de procesadores y
vendedores de sistemas de desarrollo para µClinux. También existe en esta
distribución librerías para µClinux como µClib, entre otros. La distribución está en
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
capacidad de ayudar al usuario a configurar todo el software necesario para el
sistema embebido.
El sistema operativo µClinux al igual que su padre, ofrece grandes características
en cuanto a portabilidad, estabilidad, conectividad además de otras características
más específicas del sistema operativo µClinux. Además cuenta con todo el
código fuente a la mano para realizar alguna modificación o adaptar el sistema
operativo a determinada arquitectura que actualmente no se soporte.
µClinux es un sistema operativo apto para sistemas embebidos con muy pocos
recursos de memoria y procesadores de bajo desempeño, y que son usados en
aplicaciones especificas que no requieren de alta capacidad computacional como
control industrial, monitoreo remoto, celulares, sistemas de audio y video
portátiles, y muchas otras más. Aspectos como la multitarea, redes de
comunicación y acceso directo al hardware del sistema son factores determinantes
que cualquier sistema embebido móvil debe poseer.
Actualmente µClinux es soportado por muchos programadores en todo el mundo,
los cuales están mejorando las prestaciones de este sistema operativo. Esto
puede ser un punto a favor si en algún momento se piensa en realizar
modificaciones al núcleo para mejorar las prestaciones, en especial, en todo lo
relacionado con el bajo consumo.
Con µClinux se tiene la facultad de poder tener un buen sistema operativo en una
arquitectura que normalmente no es soportada por otros sistemas operativos,
incluso aquellos que son propietarios como Windows, Unix y otros.
Lección 13: Pasos básicos para comenzar con uClinux
Los pasos básicos para comenzar con uClinux, (http://www.uclinux.org). Son:

Selección de Hardware: Si no se posee un kit de desarrollo se debe
adquirir uno para el procesador que se está interesado en implementar. Se
pueden encontrar muchos Kit de desarrollo diferentes para los
procesadores soportados en http://www.ucdot.org/search.pl? topic = 9.
También se puede utilizar un emulador.

Toolchain: Si ya se dispone del kit de desarrollo un emulador:
- Conecte el hardware necesario.
- Vaya a http://www.uclinux.org.Lea la información que allí se encuentra.
- Vaya a http://www.uclinux.org/pub/uClinux/uclinux-elf-tools/ y descargar
los binarios de los toolchains para su arquitectura (leer en la página cómo
instalarlos).

Distribución-uClinux
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
- Vaya a http://www.uclinux.org/pub/uClinux/dist/ y descargue la "distribución de
código fuente completo" (leer en la página de cómo se puede desempaquetar y la
forma de compilar una primera imagen).
- Lea el README en el directorio principal uClinux-dist, así como cualquier
documento que crea que será útil en uClinux-dist/Documentation/, especialmente
los HOWTO‟s de que podrían estar allí para su plataforma/arquitectura y las
FAQ‟s.
http://www.ucdot.org. Se trata de un portal de Internet para todo lo concerniente a
uClinux.
Lección 14: Términos relacionados
1. Toolchains components

Compilador C GNU(gcc): compilador C usado para generar código objeto.

Librería C GNU: esta librería implementa las llamadas al sistema, API,
como open, read. Pueden ser, glibc, uClib, u otras.

Binutils (binary utilities): conjunto de programas necesarios para
compilar/enlazar/ensamblar y realizar otras tareas de debugging. Los
binarios principales son: ld (GNU linker), as (GNU assembler). Otros son:














addr2line - Converts addresses into filenames and line numbers.
ar - A utility for creating, modifying and extracting from archives.
c++filt - Filter to demangle encoded C++ symbols.
gprof - Displays profiling information.
nlmconv - Converts object code into an NLM.
nm - Lists symbols from object files.
objcopy - Copys and translates object files.
objdump - Displays information from object files.
ranlib - Generates an index to the contents of an archive.
readelf - Displays information from any ELF format object file.
size - Lists the section sizes of an object or archive file.
strings - Lists printable strings from files.
strip - Discards symbols.
windres - A compiler for Windows resource files.
2. Librerías C
Dadas las limitaciones de recursos de los sistemas embebidos, el tamaño de la
librería C y su funcionalidad es un punto clave a tener en cuenta para la selección
de la misma. Su tamaño y funcionalidad son variables directamente
proporcionales, por esto, debemos utilizar una librería cuya relación tamañofuncionalidad sea aceptable.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Existen varias opciones de librerías C para el dispositivo objetivo:
 glibc (GNU C library): buena performance, acorde a estándares y buena
portabilidad, demasiado grande para sistemas embebidos.

uClibc: librería muy liviana, diseñada para pequeños sistemas embebidos.
De 2 a 4 veces mas liviana que glibc. Su origen proviene del proyecto
uClinux, desarrollado para microprocesadores que no poséen MMU
(memory managment unit). La librería, sin embargo, se ha convertido en un
proyecto independiente y da soporte a procesadores con o sin MMU o FPU
(float point unit). uClib provee la mayoría de las funcionalidades de glibc.

Newlib

klibc (kernel C library): diseñada para usar en initramfs, no es lo
suficientemente elaborada para soportar aplicaciones de BusyBox.
Aquí se describen brevemente definiciones de términos generalmente utilizados
en textos sobre sistemas GNU/Linux embebidos

Cross-compilation: la compilación cruzada es el proceso mediante el cual
se realiza la compilación en una PC, denominada host (huesped), para ser
ejecutado sobre otra arquitectura de hardware, denominado target
(objetivo). Se realiza una compilación cruzada sobre un sistema, cuando
este produce ejecutables para otro sistema. Esto sucede cuando el sistema
target no posee el conjunto de herramientas de compilación nativas o
cuando el sistema host es más rápido o posee mejores recursos (cpu,
memoria, etc).
Figura 52: Cross-compilation
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS

Toolchain: conjunto de herramientas, binarios y librerías necesarias para
realizar la compilación cruzada (binutils, gcc, glibc).

Virtual file system(VFS): En Linux existen varios sistemas de archivos,
estos son administrados por una capa denominada VFS. El VFS provee
una vista consistente de los datos almacenados sobre varios dispositivos
del sistema. Esto lo hace separando la vista del usuario del FS utilizando
llamadas de sistema standard, permitiendo implementar sistemas de
archivos lógicos sobre dispositivos físicos.

ELF:Executable Linkage Format, es un tipo de formato ejecutable dentro de
los formatos binarios, otros son COFF, flat format (usados en sistemas
MMU-less).

Board Support Package o Hardware Abstraction Layer (BSP o HAL):
conjunto de programas usados para inicializar los dispositivos de hard
sobre la placa e implementar rutinas específicas de la placa que puedan ser
usada por el kernel y los drivers. Es en realidad una capa de abstracción
del hardware denominada también HAL (hardware abstraction layer). Esta
capa oculta los detalles específicos del procesador y del hardware de la
placa al resto del SO, por lo tanto la portabilidad de drivers sobre múltiples
placas y cpu's es extremadamente simple.

BusyBox: es un conjunto de comandos, los más comunes, que serán
almacenados en el RFS del sistema embebido, se lo denomina como "la
navaja suiza de los sistemas embebidos".

Buildroot: herramienta que se utiliza para crear el entorno de compilación
cruzada (cross-compilation environment) y el sistema de archivos raíz.

Endian: es una descripción de diferentes sistemas, hace referencia al
orden en que se almacenan físicamente los bytes (2 bytes), si el byte más
significativo (MSB) se almacena después o antes que el byte menos
significativo (LSB).

Big endian: se almacena de la forma en que se lo leería, es decir, primero
MSB y luego LSB.

Little endian: se almacena de manera inversa, es decir, primero LSB y
luego el MSB.

Middle endian: sistemas en los que se utiliza ambos modos (bigendian y
littleendian).
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS

initramfs(init ram filesystem): es un nuevo concepto que reemplaza a initrd,
initramsf es usado a partir del kernel 2.6

MIPS is one of the first RISC CPU architectures invented around 1985. It
was a radical design which removed many features deemed unnecessary,
since the goal was to get the best possible performance from a limited
transistor count. Back then, MIPS were powerful general purpose CPUs,
and very successful in that role, until they lost ground to systems based on
cheap mass-produced Intel-compatible CPUs. Later on, the simple and
elegant design allowed to create a wide range of low power CPUs targeted
for embedded applications. Today, MIPS is a popular architecture for
embedded systems, with a strong presence in various networked devices,
and spanning a range from 32-bit at 100 MHz to 64-bit at 1.2 Ghz. The
current top-end is arguably the SC5832 made by SiCortex, a compact
supercomputer with 5832 CPU cores dissipating 600 mW each.

MTD: Las MTD (Memory Technology Devices) son memorias flash, RAM y
chips similares, utilizados para almacenar sistemas de archivos en
dispositivos embebidos. En la configuración del kernel, es una opción que
provee soporte genérico para drivers MTD.
3. Tipos de Kernel

Realtime (RTOS): El espacio de direcciones es plano o lineal, no posee
protección de memoria entre las aplicaciones y el Kernel, es decir, el núcleo
del Kernel, el subsistema del Kernel y las aplicaciones comparten el mismo
espacio de memoria. Se denominan Realtime debido a que no hay
sobrecarga por llamadas al sistema, pasaje de mensajes o copia de datos.
(Sin protección de memoria).

Monolítico: está diferenciado el espacio de memoria de usuario y Kernel.
Las aplicaciones que operan en el espacio de usuario lo hacen sobre
direcciones de memoria virtuales por lo tanto no pueden corromper la
memoria de otras aplicaciones o del Kernel. Sin embargo, los componentes
del Kernel comparten el mismo espacio de direcciones y por ende, un driver
o módulo mal programado puede causar la inestabilidad del sistema. La
mayoría de los SO Unix son de este tipo.

Microkernel: hace uso de un pequeño SO que provee los servicios básicos
y el resto del kernel se ejecuta como aplicaciones. La clave del microkernel
surge a partir de un esquema robusto de pasaje de mensajes. (Protección
de memoria)

Módulos: Los módulos del Kernel que se cargan dinámicamente son
fragmentos de código del Kernel que no fueron incluidos (enlazados-linked)
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
directamente en el Kernel. Se compilan separadamente, pueden ser
cargados o removidos del Kernel que se está ejecutando.
Lección 15: Primeros pasos con uClinux
Esta lección analizará las opciones de software solamente (emuladores)
disponibles para ejecutar el sistema operativo uClinux. uClinux es una versión de
Linux para CPUs sin memoria virtual o un MMU (Memory Management Unit) y por
lo general orientadas a sistemas embebidos con muy poca memoria o
almacenamiento permanente.
1. ¿Por qué usar un emulador para ejecutar uClinux?
La gran cosa sobre los emuladores que se debaten aquí es que son libres. La
calidad y la fiabilidad de las herramientas de desarrollo se pueden medir de
antemano lo que es una gran ventaja en la pre-planificación del proyecto.
Si es posible, se debe elegir un emulador que se asemeja mucho a la CPU
seleccionada. Esto le da la ventaja de probar las herramientas de desarrollo y, a
su vez, la recepción de datos significativos sobre los requisitos de memoria flash y
los requisitos de ROM. En algunas circunstancias, el desarrollo puede comenzar
en el emulador antes incluso de que hardware real esté disponible. Un buen
ejemplo es el proyecto leox que ha hecho la mayor parte utilizando el emulador
TSIM:
La depuración también puede ser una tarea simple en el entorno virtual de un
emulador. Es posible controlar totalmente la emulación de la CPU permitiendo el
acceso a la información de depuración que no puede ser posible con el hardware
real. Un emulador puede rastrear los accesos a memoria y la ejecución de código
a un nivel más alto lo que ayuda para encontrar ese error difícil de alcanzar en el
software o sistema operativo.
Emuladores puede permitir a los desarrolladores experimentar con diferentes
opciones de rendimiento y su efecto en la usabilidad. Algo que puede ser útil para
determinar los requisitos de rendimiento del hardware de destino. Los Emuladores
también pueden ayudar a determinar los requisitos de flash y de memoriaToda
esta información puede ser útil al principio del proceso de desarrollo.
2. Criterios para la elección de un emulador
Al elegir un emulador hay una serie de cosas a considerar. En primer lugar, se
debe seleccionar un emulador que emule la CPU que pueden ser objeto de
examen de la forma mas veraz, y si es posible, se desarrollará utilizando las
mismas herramientas. Esto aumentará la pertinencia de cualquier trabajo realizado
en el emulador.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Cuanto más cerca de un emulador es el hardware de destino mejor. Esto significa
emulación de puertos serie, temporizadores y otros dispositivos se encuentran en
el hardware de destino.
Uno de los déficit mas grandes de los emuladores disponibles para ejecutar
uClinux es la falta de una verdadera emulación de dispositivos de red. Aunque es
posible ejecutar redes en puertos serie emulados a través de PPP o SLIP, sería
mucho más interesante disponer de un dispositivo de red emulado.
3. Qué opciones existen
Una búsqueda en la red para un emulador revelará una lista enorme de
posibilidades. Sólo dos de las infinitas posibilidades que se discutirá en detalle
aquí. Estos emuladores ya están bien soportados por uClinux y ofrecen una buena
cobertura de las opciones embebidas de las CPU‟s objetivo.
El primer emulador, de hecho, el emulador que ayudó a crear las primeras
versiones de uClinux es Xcopilot. Xcopilot es un emulador de PalmPilot que se
ejecuta en Unix/X11. Ofrece emulación del temporizador, puertos serie, teclado
táctil y pantalla LCD junto con la emulación de Motorola 68000 (m68k).
El segundo es el emulador ARMulator que es parte del depurador GNU gdb.
Actualmente, el ARMulator ofrece una consola serie, junto con muchos posibles
emulaciones ARM incluyendo big endian, little endian y emulaciones thumb.
4. Conseguir Xcopilot
Xcopilot se puede obtener de muchos lugares. La más actualizada de las fuente
para el uso de Xcopilot con uClinux es la versión en el CVS en cvs.uclinux.org.
cvs -d:pserver:anonymous@cvs.uclinux.org:/var/cvs login
Simplemente presiona enter en la contraseña del sistema y, a continuación,
ejecute:
cvs -d:pserver:anonymous@cvs.uclinux.org:/var/cvs checkout xcopilot
Una versión bastante reciente puede ser descargada desde:
http://www.uclinux.org/pub/uClinux/utilities/xcopilot-0.6.6-uc0.tar.gz
La compilación de Xcopilot es simple:
./configure
make
make install
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Proporcionando todas las bibliotecas correctas en su lugar, el resultado será un
Xcopilot que está listo para usar.
Una copia de la m68k-elf-tools serán necesarias para crear Kernels uClinux y
binarios para Xcopilot. Estos pueden ser obtenidos a partir de:
http://www.uclinux.org/pub/uClinux/m68k-elf-tools/
Siga las instrucciones para instalar los binarios precompilados, o para los
interesados, construir los instrumentos de la fuente proporcionada.
5. Conseguir el BGF/ARMulator
El BGF / ARMulator para su uso con uClinux está disponible en:
http://www.uClinux.org/pub/uClinux/utilities/armulator/
Esta página contiene toda la información necesaria para construir gdb para el uso
con el ARMulator y uClinux. Hay incluso una selección de los binarios
precompilados uClinux que se puede ejecutar en el ARMulator una vez que esté
construido e instalado.
Una copia arm-elf-tools serán necesarias para crear kernels uClinux y los binarios
para la ARMulator/ GDB. Estos pueden ser obtenidos a partir de:
http://www.uclinux.org/pub/uClinux/arm-elf-tools/
Una vez más, siga las instrucciones para instalar los binarios precompilados o
construir estos desde la fuente proporcionada.
6. Construcción de la Fuente uClinux
La forma más fácil para empezar con la fuente de uClinux es tomar las fuentes de
distribución de uClinux completas desde:
http://www.uclinux.org/pub/uClinux/dist/
Este es un archivo bastante grande que proporciona tanto los núcleos 2.0.39 y
2.4.17, junto con una buena selección de aplicaciones, la mayoría de los cuales
han sido portadas a uClinux. También ofrece configuraciones prefabricadas, tanto
para Xcopilot y el ARMulator/GDB que se pueden seleccionar en el menú de
configuración.
El mecanismo para la construcción de cualquiera de los objetivos es
esencialmente el mismo, sólo la selección de los objetivos es diferente.
En primer lugar extraer el tarball uClinux-dist:
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
gunzip < uClinux-dist-20020701.tar.gz | tar xzf cd uClinux-dist
make xconfig
Seleccione 'Target Platform Selection' elija un destino. 3com/Xcopilot para el
objetivo Xcopilot o GDB/ARMulator para la ARMulator. Seleccione la versión del
kernel que desee utilizar y use UC-libc como la biblioteca de 'C'. Guardar y salir.
Aquí hay un ejemplo de un xconfig para Xcopilot:
Figura 53: xconfig para Xcopilot
Cuando la configuración ha terminado de configure el árbol de código fuente:
make dep
make
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Cuando esto se completa, la recién construida imágen binaria estará listo para ser
ejecutado en el emulador elegido.
7. Corriendo uClinux en Xcopilot
Hay un poco de configuración necesarios para ejecutar uClinux en Xcopilot. Desde
el directorio raíz del código fuente de uClinux-dist haga lo siguiente.
mkdir ~/.xcopilot
ln -s `pwd`/images/pilot.rom ~/.xcopilot
Xcopilot ya está listo para utilizarse. Sólo tienes que escribir "xcopilot" y debería
estar en funcionamiento el emulador uClinux xcopilot. Aquí está una captura de
pantalla de lo que se espera.
Figura 54: emulador uClinux xcopilot
Los comandos se pueden introducir en la consola serie que se ejecuta en la
ventana de terminal. Echa un vistazo en todo el sistema de archivos, /dev, /bin y
/etc Se verá como una muy reducida versión de Linux / Unix.
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
Xcopilot tiene varias opciones de depuración. El más simple es el depurador
predeterminado. Conectese con el depurador con:
telnet localhost 2000
Aquí teclee help para ver los comandos de depuración disponibles. Las opciones
disponibles incluyen la detención/ inicio de la CPU y la traza de la ejecución a un
archivo.
8. Corriendo uClinux en el BGF/ARMulator
Desde el directorio raíz del código fuente de uClinux-dist haga lo siguiente.
ln -s images/romfs.img boot.rom
Ahora ejecute el arm-elf-gdb en el núcleo adecuado, aquí es una sesión de
ejemplo:
arm-elf-gdb -n linux-2.*.x/linux
GNU gdb 5.0
Copyright 2000 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "--host=i686-pc-linux-gnu --target=arm-elf"...
(gdb) target sim
Loaded ROM boot.rom
Loaded ROM boot.rom
Loaded ROM boot.rom
Loaded ROM boot.rom
Connected to the simulator.
(gdb) load
Loading section .text, size 0x77b84 vma 0x2000000
Loading section .rodata, size 0x8ddb vma 0x2077b84
Loading section .data, size 0x8fc8 vma 0x2080a60
Start address 0x2000000
Transfer rate: 4507960 bits in <1 sec.
(gdb) run
En cualquier punto se puede hacer break en el depurador con ^C, establezca
puntos de ruptura (break points) y examine la memoria y las variables. Break
points se pueden establecer antes de escribir "run" para coger el inicio temprano
del núcleo. A paso a través de los principios de la secuencia de arranque del
núcleo establecer un punto de ruptura en start_kernel. Por ejemplo:
...
(gdb) break start_kernel
(gdb) run
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS
9. Resumen
Mientras un emulador nunca reemplazara el hardware real, puede desempeñar un
papel importante en el desarrollo. Puede ser útil para la formación y la
experimentación y también puede ayudar con el desarrollo y depuración de las
características del nuevo sistema operativo.
Los emuladores mencionados aquí sirven para dar al usuario una comprensión
fuerte de uClinux y su aplicación. No sólo pueden ser utilizados como un asistente
de aprendizaje, pero también pueden proporcionar una base práctica para la
construcción de dispositivos reales.
Un emulador puede jugar una parte importante en un conjunto de herramientas
para desarrolladores y puede ser llamados cada vez que llene una necesidad
inmediata.
10. Otros Emuladores
There are quite a few other emulators that can run uClinux to varying degrees.
LEON Sparc Emulator (TSIM)
Reasonable support included in the uClinux-dist sources.
NEC v850e
Quite good support with a selection of emulators available. The gdb based
simulator is the easiest to use and is also supported in the uClinux-dist sources.
Coldfire Emulator
Capable of running the Arnewsh/5206 image from the uClinux-dist.
SWARM (Software ARM)
Basic support for this emulator is included in the uClinux-dist.
http://www.skyeye.org/index.shtml
SkyEye is an Open Source Software Project (GPL Licence). Origin from
GDB/Armulator, The goal of SkyEye is to provide an integrated simulation
environment in Linux and Windows. SkyEye environment simulates/emulates
typical Embedded Computer Systems (Now it supports a series ARM, MIPS,
PowerPC, Blackfin, Coldfire, and SPARC architecture based microprocessors).
You can run some Embedded Operation System such as Embedded Linux,
uClinux, uc/OS-II (ucos-ii) etc. in SkyEye, and analysis or debug them at source
level.
ACTIVIDADES DE AUTOEVALUACIÓN DE LA UNIDAD


Que es un sistema operativo?
Describa los tipos de sistema operativo
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD
ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA
CONTENIDO DIDÁCTICO DEL CURSO: 208006 – SISTEMAS EMBEBIDOS








Cuáles son los componentes de un sistema operativo?
Que es el Kernel? Describa los tipos
Cuáles son las principales características del sistema operativo Linux?
Que es uCLinux?
Cuáles son las diferencias entre Linux y uCLinux?
Cuáles son las razones para usar uCLinux en sistemas embebidos?
Describa los paso básicos para implementar uCLinux
Que es un emulador?
BIBILIOGRAFÍA:
[1] BARRETT Steven F, Pack Daniel J.Microcontrollers Fundamentals for
Engineers and Scientists. Morgan & Claypool. 2006.
[2] NOERGAARD Tammy. Embedded Systems Architecture. Newnes. 2005.
[3] MARWEDEl Peter. Embedded System Design. Springer. 2006.
[4] CATSOULIS John. Designing Embedded Hardware. O'Reilly. 2005.
[5] ZURELL Kira.(2000). C Programming for Embedded Systems. R&D Books.
[6] BARR Michael. Programming Embedded Systems in C and GNU Development.
O‟Reilly. 2006.
[7] P. RAGHAVAN, Amol Lad, Sriram Neelakandan. Embedded Linux System
Design and Development. Auerbach Publications. 2006.
LINKS
[8] www.freescale.com
[9] http://elserver.forknetar.org/harpo///////uch/seminario/escrito//archivos//seminario-uch.nav/node28.html
[10] http://www.cosmic-Software.com/products.php
[11] http://www.uclinux.org/ports/coldfire/
[12] http://www.processorexpert.com/
[13] http://www.embedded.com
[14] http://www.bairesrobotics.com.ar/data/guia68hc08.pdf
[15] http://gem.win.co.nz/mario/hc08/
Descargar