Linux para Sistemas Embebidos - ASTROINGENIERIA/ASTROUFRO GitHub Wiki
Introducción
El Internet de Las Cosas (IoT) es una fuente de inspiración para visionarios e ingenieros, compuesta por una red de computadores de miles de millones de dispositivos conectados, los cuales permanentemente recolectan, analizan y entregan datos en tiempo real. Este paradigma promete ser la clave de una nueva era en las tecnologías de la información.
Los dispositivos que componen actualmente IoT presentan una serie de nuevos requerimientos y proporcionan funcionalidades que antiguamente no estaban presentes en los sistemas embebidos. La conectividad, a través de redes celulares, en una de ellas, pero además se requieren herramientas de administración remota, configuración de software, actualizaciones, eficiencia energética, seguridad, etc.
La dinámica de requerimientos presente en sistemas embebidos requiere generar un modelo distinto para construir las herramientas de software que operan este nuevo paradigma de hardware conectado.
¿Por qué usar Linux en Sistemas Embebidos?
Linux debutó como Sistema Operativo de Uso General (GPOS) para la arquitectura de PC x86. Impulsado por el nacimiento de Internet, Linux permaneció fiel a sus orígenes como GPOS, en base a tres aspectos principales, los mismos que contribuyeron al porqué Linux no fue considerado inicialmente como un sistema operativo (SO) para sistemas embebidos:
- Sistema de Archivos: Linux es un SO basado en archivos, el cual requiere un sistema de archivos sobre un dispositivo de almacenamiento en bloques con derechos de lectura y escritura. Los dispositivos de almacenamiento en bloques son normalmente discos duros magnéticos giratorios, los cuales presentan una serie de componentes mecánicos, los cuales no son muy prácticos para sistemas embebidos.
- Unidad de Manejo de Memoria (MMU): Linux es un SO multitarea, el switch entre tareas requiere que los procesos individuales tengan un espacio privado de direcciones de memoria, el cual puede ser fácilmente mapeado en la memoria física, cuando el proceso esta corriendo en la CPU. Los microcontroladores que han sido usados normalmente en aplicaciones embebidas, no poseen este tipo de unidad de memoria.
- Tiempo Real: Algunos sistemas embebidos que ejecutan aplicaciones críticas podrían requerir respuestas donde el tiempo es un factor importante y linux lamentablemente no incluye la funcionalidad tiempo-real como parte de su kernel principal.
Sin embargo, los avances en las tecnologías de los semiconductores a ayudado a superar todas estas limitaciones mencionadas anteriormente. Memorias flash confiables y de bajo costo, poderosos sistemas-on-chip (SoC) que incluyen uno o mas núcleos de CPU con MMU y dispositivos periféricos en un solo chip, etc. han logrado despertar el interés de los ingenieros en reemplazar los microcontroladores por estos chips para sus soluciones embebidas.
Hoy en día, se observa un crecimiento explosivo por el uso de Linux en sistemas embebidos en diferentes industrias. Algunas de las razones de este crecimiento se mencionan a continuación:
- Royalies : Linux puede ser desarrollado sin ningun tipo de royalty.
- Soporte de Hardware: Linux soporta una gran variedad de dispositivos de hardware, incluyendo la mayoría de las architecturas de CPUs: ARM , Intel x86, MIPS, PowerPC y sus respectivas variantes de 32 y 64 bits.
- Redes: Linux soporta una gran variedad de protocolos de red. Aparte de TCP/IP, prácticamente cualquier protocolo de la capa física esta implementado.
- Modularidad: El Stack de Linux está compuesto por varios paquetes de software. Los usuarios pueden personalizar el Stack para que se ajuste exactamente a sus requerimientos.
- Escalabilidad: Linux puede escalar desde sistemas simples de una CPU hasta sistemas multicore, con grandes memorias, varias interfaces de red, etc.
- Código Fuente: Tanto el código fuente del Kernel de Linux, asi como el de sus paquetes de software incluidos en el Stack del sistema operativo (Linux OS Stack), está dosponible en forma libre.
- Soporte para Desarrolladores: Debido a sus caracteristicas de Open Source, Linux cuenta con una gran cantidad de desarrolladores activos, los cuales dan soporte rápidamente a eventuales nuevos dispositivos de hardware.
- Soporte Comercial: Existe un número creciente de vendedores de software y hardware, incluyendo a todos los productores de semiconductores y vendedores de software independientes que actualmente ofrecen productos y servicios de soporte para Linux.
- Herramientas: Linux provee miles de herramientas para desarrollo de software, que van desde compiladores para prácticamente todos los lenguajes de programación hasta un número creciente de herramientas para el moniteoreo de rendimiento y profiling, las cuales son importantes para el desarrollo de sistemas embebidos.
Linux en Sistemas Embebidos (Landscape)
Existen en general diversos tipos de sistemas embebidos. La gran variedad de dispositivos de hardware, involucra la tarea de adaptación del software, en especial el software del sistema operativo, el cual debe contemplar los mecanismos de abstracción a través de sus bibliotecas e interfaces de aplicaciones (API). No existe un sólo sistema que se ajuste a los requerimientos
Distribuciones
Algunas de las distribuciones de Linux para Sistemas Embebidos son:
-
Android
-
Angström Distribution : La distribución Angström en el último tiempo se ha vuelto un recurso muy importante para proyectos debido a la creciente lista de tarjetas de desarrollo que soporta. Angström es una comunidad que comenzó como un grupo de desarrolladores que trabajaban en los proyectos OpenEmbedded, OpenZaurus, y OpenSimpad. Angström ha estado usando las herramientas de OpenEmbedded desde el principio, pero ahora se esta adaptando la estructura y arquitectura del proyecto Yocto.
-
OpenWrt : Es un sistema operativo orientado a dispositivos embebidos para el ruteo del tráfico de redes y un sistema de archivos root creado con Buildroot. OpenWrt soporta una amplia gama de dispositivos de hardware y tarjetas de desarrollo. OpenWrt esta pensado para sistemas the funcionan sin una intervención humana regular, y donde su configuración se puede realizar a través de sofisticadas interfaces web.
Algunas versiones embebidas de distribuciones completas de Linux son:
- Debian - http://www.emdebian.org
- Fedora - https://fedoraproject.org/wiki/Embedded
- Gentoo - https://wiki.gentoo.org/wiki/Project:Embedded
- SUSE - https://tr.opensuse.org/MicroSUSE
- Ubuntu - https://wiki.ubuntu.com/EmbeddedUbuntu
Herramientas de Desarrollo
En vez de utilizar una distribución Linux para Sistemas Embebido hecha, uno puede construir su propio Linux OS stack con herramientas de desarrollo para sistemas embebidos. Esto le da al desarrollador un mejor control y flexibilidad, pero también requiere un esfuerzo mayor.
-
Baserock : Es un proyecto de código abierto que proporciona: (a) un sistema de compilación (build system) para distribuciones de Linux , (b) un entorno de desarrollo, y (c) un workflow de desarrollo en un sólo paquete. Las principales características de Baserock son:
-
Git como base para manejar prácticamente todo, desde las instrucciones hasta los artefactos para la compilación.
-
Compilación nativa para evitar la complejidad de los entornos de compilación cruzada.
-
Compilaciones (builds) distribuidas para múltiples sistemas y maquinas virtuales. Actualmente Buildroot soporta compilaciones para las arquitecturas x86, x86_64, y ARMv7
-
-
Buildroot : Es un sistema de compilación (build system) para generar Sistemas Linux Embebidos utilizando GNU Make y un conjunto de makefiles para crear un toolchain para la compilación cruzada, un root file system, un kernel image y un bootloader image. Buildroot esta orientado a sistemas embebido con pocos recursos y soporta varias arquitecturas de CPU. Sus opciones de configuración se limitan a:
- uClibc: es una biblioteca para la compilación cruzada. En comparación a GNU C Library (glibc), uClib es mucho mas compacta y optimizada para sistemas embebidos de pocos recursos. UClibc soporta casi todas las arquitecturas de CP, asi como tambien bibliotecas compartidas (shared libraries)y threading.
- BusyBox: es un conjunto básico de aplicaciones (utilities) para el uso desde la consola.
-
OpenEmbedded : Es un framework de compilación compuesto por herramientas (tools), datos de configuración (configuration data), y recetas (recipes) para crear una distribución de Linux para Sistemas Embebidos. En el corazón de OpenEmbedded está el ejecutor de tareas BitBake que administra el proceso de compilación. Históricamente, OpenEmbedded se creó uniendo el trabajo del proyecto OpenZaurus con las contribuciones desde otros proyectos como Familiar Linux y OpenSIMpad. OPenEmbedded ha sido usado para desarrollar una gran variedad de proyectos de sistemas embebidos, el más notable es el proyecto OpenMoko dedicado a proporcionar stack completa de software libre para teléfonos móviles. OpenEmbedded, el Proyecto Yocto, y la Distribución Angström tienen todos las misma raíces y se complementan mutuamente de diferentes formas.
-
El Proyecto Yocto : Yocto no es un proyecto aislado, sino que representa una familia de proyectos open source que son administrados bajo el "paraguas" de Yocto. Uno de ellos es Poky, la distribución de referencia del Proyecto Yocto, la cual incluye el sistema de compilación de OpenEmbedded y una amplia gama de metadata. El espectro de soluciones Linux para sistemas embebido es muy amplio. Aquí sólo hemos mencionado a los proyectos de software libre más activos. Existen también una serie de productos comerciales que complementan la oferta. Un número creciente de estas empresas utilizan a Yocto como plataforma base (upstream), y utilizan las herramientas de Yocto para crear sus lineas de productos.
¿ Por qué es dificil hacer un Linux a la medida?
El construir y mantener un sistema operativo no es una tarea fácil. Diferentes apectos de un sistema operativo tienen que ser considerados para obtener un sistema computacional funcional. Entre las componentes principales tenemos:
-
Bootloader : Es la primera pieza de software responsable de (a) inicializar el hardware, (b) cargar el Kernel del sistema operativo en la RAM, (c) e iniciar el Kernel. E Bootloader normalmente tiene varias fases (multistaged), y su primera fase reside en la memoria no-volátil. La primera fase carga después a la segunda fase desde el módulo de almacenamiento que este acoplado (attached), como por ejemplo una memoria flash, un disco duro, etc.
-
Kernel : Como su nombre lo dice, corresponde al corazón del sistema operativo. El Kernel administra los recursos de hardware del sistema y provee una abstracción de del hardware para otros software, a través de sus APIs. Las principales funciones del Kernel son: (a) administración de la memoria, (b) administración de dispositivos y (c) responder a las llamadas de sistema (system calls) de aplicaciones de software. La forma en que estas funciones son implementadas depende directamente de la arquitectura del procesador, de los dispositivos periféricos, y de otras configuraciones de hardware.
-
Device Drivers : Son parte del Kernel y proporcionan aplicaciones de software con acceso a los dispositivos de hardware de una forma estructurada, a través de llamadas al sistema (system calls). A través de los Device Drivers, las aplicaciones de software pueden configurar, leer y escribir en los dispositivos de hardware.
-
Life Cycle Management : Desde el encendido hasta el apagado, un sistema computacional presenta diferentes estados, durante los cuales provee de distintos conjuntos de servicios a las distintas aplicaciones de softaware. El Life Cycle Management determina el estado en el que esta corriendo un servicio y en que orden estos servicios deben ser iniciados para mantener la consistencia del sistema. Una parte importante de esta componente es la administración de la energía (power managemente), la cual se encarga de colocar el sistema en ahorro de energía cuando no se requiere toda la funcionalidad de este.
-
Application Software Management : El software de aplicacionesy la bibliotecas conforman la mayor parte del software instalado en un sistema típico, y es el que proporciona la funcionalidad al usuario final. Normalmente, varios cientos o miles de paquetes de software son necesarios para generar un sistema 100% funcional.
Linux y la gran cantidad de paquetes de software disponibles son como ladrillos de un gran kit de construcción, y cuyo armado puede ser una tareas abrumadora.