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:[email protected]:/var/cvs login Simplemente presiona enter en la contraseña del sistema y, a continuación, ejecute: cvs -d:pserver:[email protected]:/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/