INTRODUCCION
Se entiende por sistemas embebidos a una combinación de hardware y software de computadora, sumado tal vez a algunas piezas mecánicas o de otro tipo, diseñado para tener una función específica. Es común el uso de estos dispositivos pero pocos se dan cuenta que hay un procesador y un programa ejecutándose que les permite funcionar. Esto ofrece un contraste con la computadora personal, que si bien también esta formada por una combinación de hardware y software mas algunas piezas mecánicas (discos rígidos, por ejemplo). Sin embargo la computadora personal no es diseñada para un uso especifico. Si no que es posible darle muchos usos diferentes. Muchas veces un sistema embebido es un componente de un sistema mucho mas grande, como por ejemplo los sistemas de frenos o el sistema de inyección de combustible, en automóviles actuales son sistemas embebidos. Esta combinación de software y hardware puede ser reemplazada en muchos casos porun circuito integrado que realice la misma tarea. Pero una de las ventajas de los sistemas embebidos es su flexibilidad. Ya que a la hora de realizar alguna modificación resulta mucho mas sencillo modificar una líneas de código al software del sistema embebido que reemplazar todo el circuito integrado.
Un uso muy común de los sistemas embebidos es en los sistemas de tiempo real ,entendiéndose por sistemas en tiempo real a aquellos sistemas en los que el control del tiempo es vital para el correcto funcionamiento. Los sistemas en tiempo real necesitan realizar ciertas operaciones o cálculos en un limite de tiempo. Donde ese limite de tiempo tiempo resulta crucial. Un ejemplo claro de un sistema de tiempo real es el control de trafico aéreo.
ESTRUCTURA Y COMPONENTES DEL SISTEMA
Estructura
Las principales características de un sistema embebido son el bajo costo y consumo de potencia. Dado que muchos sistemas embebidos son concebidos para ser producido sen miles o millones de unidades, el costo por unidad es un aspecto importante a tener en cuenta en la etapa de diseño. generalmente, los sistemas embebidos emplean procesadores muy básicos, relativamente lentos y memorias pequeñas para minimizar los costos. En estos sistemas la velocidad no solo está dada por la velocidad del reloj del procesador, sino que el total la arquitectura se simplifica con el fin de reducir costos. Normalmente, un sistema embebido emplea periféricos controlados por interfases seriales sincrónicas, las cuales son muchas veces más lentas que los periféricos empleados en un PC. Como se mostró anteriormente, un sistema embebido debe enfrentar fuertes restricciones de recursos, por tanto normalmente deberá hacer uso de sistemas operativos especiales, denominados de tiempo real (RTOS Real time operating system).Los sistemas embebidos deberán reaccionar a estímulos provenientes del ambiente, respondiendo con fuertes restricciones de tiempo en muchos casos, por lo tanto, un sistema se dice que trabaja en tiempo real si la información después de la adquisición y tratamiento es todavía vigente. Es decir, que en el caso de una información que llega de forma periódica, los tiempos de adquisición y tratamiento deben ser inferiores al período de actualización de dicha información. Un sistema embebido puede o no ser de tiempo de real dependiendo de los requerimientos específicos de la aplicación que se quiere implementar.
Los programas en estos sistemas se ejecutan minimizando los tiempos muertos y enfrentando fuertes limitaciones de hardware, ya que usualmente no tienen discos duros, ni teclados o monitores, una memoria flash reemplaza los discos y algunos botones y una pantalla LCD normalmente reemplazan los dispositivos de interfaz. El software que controla un dispositivo de hardware, por ejemplo n una memoria ROM, Flash o un circuito integrado se conoce como Firmware. Típicamente la programación en estos dispositivos se realiza en lenguaje ensamblador o en lenguaje C, actualmente se han desarrollado algunas máquinas virtuales y otros compiladores que permiten el diseño de programas más complejos. Además se puede encontrar depuradores, simuladores, ases de datos, GUIs, metodologías entre otras herramientas para el diseñoy programación de este tipo de sistemas.
Componentes de un sistema embebido
Un sistema embebido en principio estaría formando por un microprocesador y un software que se ejecute sobre este. Sin embargo este software necesitara sin duda un lugar donde poder guardarse para luego ser ejecutado por el procesador. Esto podría tomar la forma de memoria RAM o ROM, Todo sistema embebido necesitara en alguna medida una cierta cantidad de memoria, la cual puede incluso encontrarse dentro del mismo chip del procesador. Además de esto normalmente un sistema embebido contara con una serie de salidas y entradas necesarias para comunicarse con el mundo exterior. Debido a que las tareas realizadas por sistemas embebidos son de relativa sencillez, los procesadores comúnmente usados cuentan con registros de 8 o 16 bits. En su memoria solo reside el programa destinado a gobernar una aplicación determinada. Sus líneas de entrada/salida soportan el conexionado de los sensores y actuadotes del dispositivo a controlar y todos los recursos complementarios disponibles tiene como única finalidad atender a sus requerimientos. Estas son las únicas características que tienen en común los sistemas embebidos, todo lo demás será totalmente diferente para cada sistema embebido en particular debido a la inmensa diversidad de aplicaciones disponibles.
Arquitectura básica más empleada
Microprocesador
Es el encargado de realizar las operaciones de cálculo principales del sistema. Ejecuta código para realizar una determinada tarea y dirige el funcionamiento de los demás elementos que le rodean, a modo de director de una orquesta.
Memoria
En ella se encuentra almacenado el código de los programas que el sistema puede ejecutar así como los datos. Su característica principal es que debe tener un acceso de lectura y escritura lo más rápido posible para que el
microprocesador no pierda tiempo en tareas que no son meramente de cálculo. Al ser volátil el sistema requiere de un soporte donde se almacenen los datos incluso sin disponer de alimentación o energía.
Caché
Memoria más rápida que la principal en la que se almacenan los datos y el código accedido últimamente. Dado que el sistema realiza microtareas, muchas veces repetitivas, la caché hace ahorrar tiempo ya que no hará falta ir a memoria principal si el
dato o la instrucción ya se encuentra en la caché. Dado su alto precio tiene un tamaño muy inferior (8 – 512 KB) con respecto a la principal (8 – 256 MB)
Disco duro
En él la información no es volátil y además puede conseguir capacidades muy elevadas. A diferencia de la memoria que es de estado sólido éste suele ser magnético. Pero su excesivo tamaño a veces lo hace inviable para PCs embebidos, con lo que se requieren soluciones como discos de estado sólido. Existen en el mercado varias soluciones de esta clase (DiskOnChip, CompactFlash, IDE Flash Drive, etc.) con capacidades suficientes para la mayoría de sistemas embebidos (desde 2 hasta mas de 1 GB). El controlador del disco duro de PCs estándar cumple con el estándar IDE y es un chip más de la placa madre.
Disco flexible
Su función es la de un disco duro pero con discos con capacidades mucho más pequeñas y la ventaja de su portabilidad. Siempre se encuentra en un PC estándar pero no así en un PC embebido. 10
BIOS-ROM
BIOS (Basic Input & Output System, sistema básico de entrada y salida) es código que es necesario para inicializar el ordenador y para poner en comunicación los distintos elementos de la placa madre. La ROM (Read Only Memory, memoria de sólo lectura no volátil) es un chip donde se encuentra el código BIOS.
CMOS-RAM
Es un chip de memoria de lectura y escritura alimentado con una pila donde se almacena el tipo y ubicación de los dispositivos conectados a la placa madre (disco duro, puertos de entrada y salida, etc.). Además contiene un reloj en permanente funcionamiento que ofrece al sistema la fecha y la hora.
CHIP SET
Chip que se encarga de controlar las interrupciones dirigidas al microprocesador, el acceso directo a memoria (DMA) y al bus ISA, además de ofrecer temporizadores, etc. Es frecuente encontrar la CMOS-RAM y el reloj de tiempo real en el interior del Chip Set.
PLATAFORMAS
Linux en sistemas embebidos
Linux está presente en muchas partes. Quizá aún nohaya ganado la batalla en los ordenadores personales, pero definitivamente es el númer uno en el área de los sistemas embebidos. Sin saberlo, nos rodean miles de dispositivos que funcionan con Linux Al contrario de lo que pueda parecer, Embedded Linux no es una versión reducida de Linux. El calificativo «embebido » realmente hace referencia a la funcionalidad de la aplicación, no a la funcionalidad de Linux.La fiabilidad de Linux es consecuencia directa de esta filosofía que lleva implícita la aportación altruista de miles de programadores de todo el mundo observando el código, mejorándolo, cambiándolo y probándolo en miles de configuraciones posibles del sistema. Linux para los dispositivos embebidos comenzó con el soporte del kernel y el compilador para los microprocesadores más populares de 32 bits: x86, ARM, PowerPC, MIPS y SH. Y luego continuó con la aparición de diferentes distribuciones de Linux con soporte para características específicas de los sistemas embebidos. Gracias a la disponibilidad del código fuente, a la ausencia de ‘royalties’ y al soporte de los micros y tecnologías modernas, Linux está actualmente atacando de forma feroz el mercado de los RTOS. 13 Uno de los cambios fundamentales en Linux es la inclusión del proyecto uClinux en el kernel principal. El proyecto uClinux (que puede pronunciarse como "u-cé-linux" [en inglés "you-see-Linux"], aunque en rigor debe escribirse con la letra griega "mu") significa Linux para Microcontroladores. Esta variante de Linux ha sido un pila 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. Al contrario que las variantes de Linux a las que estamos acostumbrados, en los sistemas embebidos no tenemos todas las capacidades del kernel, debido a limitaciones de hardware.
La principal diferencia en estas variantes es la ausencia de MMU (memory management unit o "unidad de gestión de memoria" - lo que hace que un sistema operativo pueda trabajar en modo protegido) integrada en el procesador. Aunque suelen ser sistemas Linux multitarea, no tienen protección de memoria ni otras características asociadas. (Sin protección de memoria, es posible que un proceso aventurero lea los datos de otros
procesos, o incluso que los haga colgarse.) Esto reduce su utilidad en un sistema multiusuario, pero los hace ideales para una agenda electrónica (PDA) de bajo coste o un dispositivo dedicado. Es difícil exagerar la importancia de este cambio de arquitectura en Linux 2.6: hasta el momento, todas las versiones seguían afectadas (por más remotamente que fuera) por las limitaciones inherentes al trabajo inicial de Linus en su Intel 80386. Hay varias líneas nuevas de procesadores embebidos con soporte en Linux 2.6, incluyendo la serie Hitachi H8/300, el procesador NEC v850, y la línea de procesadores embebidos m68k diseñada por Motorola. Éstos últimos son los más familiares para el usuario corriente de Linux, ya que están en el corazón de las agendas Palm Pilot desde el principio (la Palm 1000). Otros modelos, con nombres tan sugerentes como DragonBall o ColdFire, son utilizados en sistemas y placas de evaluación fabricadas por Motorola, Lineo, Arcturus, y otras empresas. Por desgracia, la v2.6 todavía no permite usar otros procesadores m68k más antiguos sin MMU (como los procesadores 68000 utilizados en los primeros Macintosh), pero es bastante probable que surjan proyectos amateur para incluir éstos sistemas y otros parecidos. Aunque no sea parte de la inclusión de uClinux (al disponer de MMU), esta nueva revisión puede usarse también en los procesadores de Axis Communications, la serie ETRAX CRIS (Code Reduced Instruction Set, o "Conjunto Reducido de Instrucciones de Código"). (Hay que señalar que la inclusión de este procesador llegó durante el ciclo de mantenimiento del kernel 2.4 -- bastante después de que saliera la versión 2.4.0.) Es un procesador embebido usado sobre todo en equipamiento de redes. El kernel no incluye todavía soporte para variantes sin MMU, pero varios proyectos externos están ya trabajando en ello. Además de soporte para hardware, hay también mejoras importantes resultantes de la integración de sistemas embebidos en el kernel principal.
Mientras que la mayoría de ellas no son visibles, la robustez general del sistema operativo se ve mejorada por cambios como la capacidad de construir un sistema completo sin soporte de swap.
Windows XP para sistemas embebidos
Aunque Microsoft ha mantenido a los fabricantes de sistemas operativos alternativos a Windows contra la pared en lo que se refiere a equipos de sobremesa, su posición en la batalla por la supremacía en el terreno de los sistemas operativos para dispositivos que no fueran PC era vulnerable. De ahí que Microsoft da un paso más en este sector, lanzando la versión para dispositivos embebidos en la Conferencia para desarrolladores de este tipo de sistemas que se celebra en Las Vegas. Esta decisión parece ir en consonancia con las predicciones que apuntan a una progresiva inclusión de microprocesadores en casi cualquier tipo de aparatos (frigoríficos, coches, etc). Además, con esta iniciativa Microsoft hace frente a la competencia surgida por parte, por ejemplo, de Linux que, según muchos analistas, permite reducir costes, ya que no carga el precio de los royalties. También existe la opción de utilizar un sistema propietario como los desarrollados por la compañía Wind River Systems cuyo punto fuerte es su gran capacidad para trabajar en tiempo real, su alta resistencia a fallos y la posibilidad de procesar comandos de forma inmediata. Sería el caso, por ejemplo, de aparatos médicos que deben ser muy fiables y rápidos.
DOS en sistemas embebidos
Al ritmo que marcha la informática, cualquiera diría que el DOS es un sistema operativo antiquísimo, ya superado en gran medida por otros sistemas operativos de escritorio como Windows y Linux y, en cierta forma, prácticamente olvidado. Como si fuera algo de otro mundo. Sin embargo, hace tan sólo diez años casi cualquier ordenador funcionaba con este sistema.
El DOS está estrechamente ligado al progresivo desarrollo de los microprocesadores de arquitectura x86 de Intel. Y es que es un sistema operativo que hay que conocer porque sigue estando en vigor gracias a su estabilidad. ¿Qué por qué es tan estable? Pues porque se desarrollaba en paralelo con la tecnología de Intel e IBM y porque es un sistema operativo muy simple, monousuario y monotarea. En otras palabras, DOS sólo ejecuta un programa cada vez. Es obvio, que para un ordenador personal el DOS resulta bastante inútil. Pero ¿y para un dispositivo electrónico? La mayoría de ellos sólo tienen que realizar una tarea de forma repetitiva... Además de su reducido tamaño y de los escasos recursos que necesita, por ejemplo ROM-DOS posee algunas características que marcan la diferencia de forma significativa: RXE (Relocatable Executable): En DOS, los programas se cargan en RAM antes de proceder a su ejecución. La tecnología RXE permite convertir un programa estándar en un programa que se puede ejecutar directamente desde ROM. ROM-DOS BUILD Utility: Permite añadir y quitar características al sistema operativo, reduciendo así el tamaño final del kernel. Carga dinámica de drivers de dispositivo: ROM-DOSTM tiene la capacidad de detectar el hardware y cargar drivers de dispositivo de forma dinámica, lo que le permite autoconfigurarse según el entorno. Entre otros aparatos, este sistema operativo podemos encontrarlo en:
• Cámaras digitales
• Dispositivos de captura de datos
• Cajeros automáticos
• Dispositivos GPS
Java para sistemas embebidos
Sun Microsystems, Inc., creadora y máxima defensora de la tecnología Java, amplia su oferta para el mercado de desarrollo embebido con el lanzamiento de dos nuevas ediciones de Java Platform Standard Edition (Java SE). Se trata de una versión "headless" con un tamaño reducido que emplea menos de 23 Mb de espacio de almacenamiento, y de una versión para usuarios de PowerPC.
La tecnología Java es cada vez más utilizada en sistemas embebidos avanzados, debido a sus capacidades inherentes de soporte de red, optimización de dispositivos y procesado de datos. La mayoría de las características de la plataforma Java SE pueden ser ahora empleadas para el desarrollo embebido, gracias a la capacidad cada vez mayor del nuevo hardware disponible en el mercado. La versión "headless" (sin soporte gráfico) de Java SE requiere sólo 23 Mb de espacio de almacenamiento y es ideal para desarrolladores de software para dispositivos embebidos que quieran aprovechar las sólidas capacidades de red y procesamiento, y el rendimiento de la tecnología Java. Por su parte, la plataforma para PowerPC es una versión estable de Java SE diseñada específicamente para el procesador PowerPC, que actualmente está muy extendido entre desarrolladores de dispositivos embebidos a gran escala (no teléfonos móviles). Hay dos tendencias convergentes en el mercado de dispositivos actuales: una es que la potencia y capacidad de escalar del procesador –según dicta la ley de Moore- hace posible la aparición de plataformas más pequeñas y más potentes para su uso en dispositivos embebidos; y la otra es que más y más dispositivos se están conectando a Internet todos los días. Esto significa que el mercado de dispositivos embebidos está evolucionando rápidamente y quizá está convirtiéndose en el principal entorno informático para este siglo", afirma José Manuel Estrada, arquitecto Java en Sun Java SE ofrece a los desarrolladores de dispositivos embebidos la capacidad para desplegar aplicaciones en múltiples plataformas hardware, y cuenta con características como genéricos, plantillas y compiladores que no están disponibles en ningún otro lenguaje de programación. Java Native Interface (JNI) proporciona a los desarrolladores la capacidad de acceder a sus librerías de código C/C++ directamente, sin necesidad de reescribir código. Además, los desarrolladores pueden acceder a un amplio abanico de código libre y de fuente abierta, así como participar junto a otros desarrolladores de software Java en proyectos en comunidad como NetBeans, Tomcat, Apache, Derby y muchos otros. Es importante señalar que las nuevas versiones de Java SE no restan valor a la plataforma Java Platform Micro Edition (Java ME). La tecnología Java ME sigue siendo una plataforma estándar de primera línea para el desarrollo embebido tradicional en dispositivos con poca memoria y potencia de procesador (tales como teléfonos móviles, PDAs, procesadores embebidos en pequeñas impresoras, copiadoras, etc.). Paralelamente a las dos nuevas versiones de Java SE, Sun también ha anunciado un nuevo servicio de ajuste y pruebas para optimizar el rendimiento de la plataforma Java SE en despliegues embebidos
Instalación
El proceso a grandes rasgos consiste en:
1.Saber la arquitectura hardware del dispositivo.
2.Configurar el kernel incluyendo los controladores para esos dispositivos y eliminando todo lo que no nos sirva.
3.Crear el script de configuración y ejecución de la aplicación embebida.
4.Configurar y compilar la busybox incluyendo la aplicación y el script.
5.Compilar el kernel
6.Prueba de ejecución
Conociendo la arquitectura
Para generar el kernel correcto es necesario conocer lo más posible la arquitectura subyacente. Si disponemos del manual o datasheet del dispositivo podemos determinar los controladores necesarios. Si este no es nuestro caso, podemos arrancar con una distribución linux live (Ej. Ubuntu) y determinar que controladores son los necesarios analizando los módulos cargados y el árbol de ficheros generados bajo /sys.
Configuración del Kernel
Ya conocemos nuestro hardware. Ahora necesitamos configurar correctamente el kernel para que tenga una huella pequeña pero con toda la funcionalidad requerida.
1.Seleccionar la arquitectura "más cercana/compatible" a la nuestra (Ej. Pentium-4, Pentium II, etc)
2.Deshabilitamos "Enable loadable modules support", pues queremos inscrutar los controladores dentro de la imagen y no depender de módulos externos.
3.Seleccionar el modo apropiativo. ¿nuestro software interactua mucho con el usuario? Si ese el caso necesitamos poca latencia, luego seleccionamos el modo Apropiativo "Preemption Model->Preemptible Kernel. Si por el contrario nuestro sistema procesa transacciones a modo de servidor es conveniente usar "No force preemption". Por defecto el kernel usa el termino medio, Voluntary Preemption.
4.Reloj. Si nuesta aplicación necesita temporización de alta precisión deberemos de activar el High Resolution Timer (si nuestro hardware también es capaz).
5.Dispositivos de bloque. Activar unicamente los controladores SATA/PATA/IDE de nuestro dispositivos.
6.USB. Es habitual habilitar el uso de USB 2.0 y la clase USB HID para poder usar teclados, ratones, etc. Dehabilitamos todo lo demas.
7.Sistema de archivos. Seleccionamos el sistema de archivos que necesitemos (recomendable sistema de archivos con Jourling, ej. ext3 o reiserfs). En sistemas con poco disco suele usarse a menudo el JFFS2 como sistemas de archivos para memorias flash.
8.Video4Linux. Normalmente se deshabilita.
9.Sound. ¿necesitamos sonido?
Después de seleccionar los controladores que necesitamos estariamos listos para generar una imagen del kernel "normal". En nuestro caso nos interes construir un kernel que después de inicializarse no monte un sistema de archivos dentro de un disco duro (procedimiento normal), sino que monte un sistema de archivos temporal que va comprimido y embebido dentro de la propia imagen del kernel.
Para lograr esto debemos especificar un fichero especial que sirve de guía para generar este sistema de archivos. Analicemos el ejemplo que muestra la ayuda de usr/gen_init_cpio.
Aplicación embebida
El objetivo de generar este kernel es poder correr nuestra aplicación en un sistema embebido. Debemos procurar generar nuestra aplicación teniendo muy en cuenta la arquitectura subyacente y aprovechando todo su potencial. Es recomendable si procede, generar un ejecutable estático e incluir herramientas de depuración remota o diagnósticos (ejecución, estado temperatura, carga de trabajo, logs, etc).
Compilado pues, lo agregamos a la lista de construcción de imagen la imagen con la correspondiente entrada "file". El fichero init invocará nuestra aplicación al final de la configuración.
Compilación del kernel.
Con los deberes hechos, ya podemos construir la imagen del kernel de forma habitual ("make") o según nuestros requisitos (compilación cruzada). Si todo ha ido bien, obtendremos nuestra imagen de kernel lista para ser implantada en nuestro sistema embebido.
GESTIÓN DE PROCESOS Y DEL PROCESADOR
Un microprocesador es una implementación en forma de circuito integrado (IC) de la Unidad Central de Proceso CPU de un ordenador. Frecuentemente nos referimos a un microprocesador como simplemente “CPU”, y la parte de un sistema que contiene al microprocesador se denomina subsistema de CPU.
Los microprocesadores varían en consumo de potencia, complejidad y coste. Los hay de unos pocos miles de transistores y con coste inferior a 2 euros (en producción masiva) hasta de más de cinco millones de transistores que cuestan más de 600 euros.
Los subsistemas de entrada/salida y memoria pueden ser combinados con un subsistema de CPU para formar un ordenador o sistema integrado completo. Estos subsistemas se interconectan mediante los buses de sistema (formados a su vez por el bus de control, el bus de direcciones y el bus de datos).
El subsistema de entrada acepta datos del exterior para ser procesados mientras que el subsistema de salida transfiere los resultados hacia el exterior. Lo más habitual es que haya varios subsistemas de entrada y varios de salida. A estos subsistemas se les reconoce habitualmente como periféricos de E/S.
El subsistema de memoria almacena las instrucciones que controlan el funcionamiento del sistema. Estas instrucciones comprenden el programa que ejecuta el sistema. La memoria también almacena varios tipos de datos: datos de entrada que aún no han sido procesados, resultados intermedios del procesado y resultados finales en espera de salida al exterior.
Es importante darse cuenta de que los subsistemas estructuran a un sistema según funcionalidades. La subdivisión física de un sistema, en términos de circuitos integrados o placas de circuito impreso (PCB) puede y es normalmente diferente. Un solo circuito integrado (IC ) puede proporcionar múltiples funciones, tales como memoria y entrada/salida.
Un micro controlador (MCU) es un IC que incluye una CPU, memoria y circuitos de E/S. Entre los subsistemas de E/S que incluyen los micro controladores se encuentran los temporizadores, los convertidores analógico a digital (ADC) y digital a analógico (DAC) y los canales de comunicaciones serie. Estos subsistemas de E/S se suelen optimizar para aplicaciones específicas (por ejemplo audio, video, procesos industriales, comunicaciones, etc.).
Hay que señalar que las líneas reales de distinción entre microprocesador, micro controlador y microcomputador en un solo chip están difusas, y se denominan en ocasiones de manera indistinta unos y otros.
En general, un SE consiste en un sistema con microprocesador cuyo hardware y software están específicamente diseñados y optimizados para resolver un problema concreto eficientemente. Normalmente un SE interactúa continuamente con el entorno para vigilar o controlar algún proceso mediante una serie de sensores. Su hardware se diseña normalmente a nivel de chips, o de interconexión de PCB, buscando la mínima circuitería y el menor tamaño para una aplicación particular. Otra alternativa consiste en el diseño a nivel de PCB consistente en el ensamblado de placas con microprocesadores comerciales.