Vous êtes sur la page 1sur 214

ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

INSTITUTO TECNOLÓGICO DE
MORELIA

DEPARTAMENTO DE INGENIERÍA ELECTRÓNICA

ASIGNATURA
SISTEMAS OPERATIVOS EMBEBIDOS

Realizado por:
Dr. Alain Manzo Martínez

Enero – Junio 2016 Morelia, Michoacán

1
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

TEMAS

UNIDAD 1 INTRODUCCIÓN A LOS SISTEMAS OPERATIVOS EMBEBIDOS


1.1 INTRODUCCIÓN A LA PLATAFORMA BEAGLEBONE BLACK
1.1.1 HARDWARE SOBRE BEAGLEBONE BLACK
1.1.2 INSTALACIÓN DEL BEAGLEBONE BLACK
1.1.3 CONEXIONES DE RED
1.1.4 COMUNICANDO CON EL BBB
1.1.5 LABORATORIO 1
1.2 EXPLORANDO SISTEMAS LINUX EMBEBIDOS
1.2.1 ARRANQUE DEL BEAGLEBONE BLACK
1.2.2 ESPACIO DEL KERNEL Y ESPACIO DE USUARIO
1.2.3 SYSTEM V INIT (SysVinit)
1.2.4 MANEJO DEL SISTEMA LINUX
1.2.5 LABORATORIO 2
1.2.6 VARIABLES DE ENTORNO
1.2.7 MANEJO DE PAQUETES
1.2.8 PROCESOS DE LINUX
1.2.9 AJUSTE DEL INTERNET SOBRE USB
1.2.10 LABORATORIO 3

UNIDAD 2 SISTEMAS EMBEBIDOS Y MANEJO DE PERIFÉRICOS


2.1 INTRODUCCIÓN
2.1.1 AJUSTANDO LA FRECUENCIA DEL CPU DEL BBB
2.2 LENGUAJES BASADOS EN SCRIPTS
2.2.1 BASH
2.2.2 PERL
2.2.3 PYTHON
2.3 LENGUAJES COMPILADOS
2.3.1 JAVASCRIPT y NODE.js
2.3.2 JAVA
2.3.3 C/C++
2.4 GLIB Y SYSCALL
2.5 COMPILACIÓN CRUZADA Y EL IDE ECLIPSE
2.5.1 INSTALACIÓN DE LAS HERRAMIENTAS
2.5.2 IDE ECLIPSE
2.6 ENTRADAS/SALIDAS DE PROPÓSITO GENERAL
2.6.1 HEADERS SOBRE EL BEAGLEBONE BLACK
2.6.2 SALIDA DIGITAL GPIO
2.6.3 ENTRADA DIGITAL GPIO
2.6.4 AJUSTES DE CONFIGURACIÓN DE LOS GPIOS

2
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

2.6.5 CONTROL DE GPIOS CON C/C++


2.6.6 ÁRBOL DE DISPOSITIVO LINUX
2.7 ENTRADAS/SALIDAS ANALÓGICAS
2.7.1 ENTRADAS ANALÓGICAS
2.7.2 SALIDAS ANALÓGICAS
2.8 TEMAS AVANZADOS SOBRE GPIOS
2.8.1 LINUX epoll
2.9 BUSES DE INTERFACES
2.9.1 I2C
2.9.2 SPI
2.9.3 UART
2.9.4 CAN
2.10 APLICACIONES
2.10.1 APLICACIÓN SPI
2.10.2 ACTUADORES
2.10.3 SENSORES ANALÓGICOS
2.10.4 TECLADO MATRICIAL Y LCD

UNIDAD 3 SERVICIOS DE RED EMBEBIDOS


3.1 INTRODUCCIÓN
3.2 MANEJO DE SERVICIOS
3.2.1 CONEXIÓN SERIAL DEL BBB A COMPUTADORA PERSONAL
3.2.2 INICIANDO UN SERVICIO PERSONALIZADO SOBRE EL ARRANQUE
3.2.3 CONEXIÓN BLUETOOTH
3.3 INTERNET DE LAS COSAS
3.3.1 EL BEAGLEBONE BLACK COMO UN SERVIDOR WEB
3.3.2 CLIENTE WEB CON C++
3.3.3 EL BEAGLEBONE COMO UN SENSOR WEB
3.3.4 EL CLIENTE/SERVIDOR EN C++
3.3.5 BEAGLEBONE Y Wi-Fi
3.3.6 DIRECCIÓN IP ESTÁTICA
3.4 INTERFACES DE USUARIO CON EL BEAGLEBONE
3.4.1 CÓMPUTO DE RED VIRTUAL
3.4.2 INTRODUCCIÓN A Qt EN EL BEAGLEBONE
3.4.3 DESARROLLO DE UNA APLICACIÓN IU REMOTA

BIBLIOGRAFÍA

3
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

UNIDAD 1

INTRODUCCIÓN A LOS SISTEMAS


OPERATIVOS EMBEBIDOS

4
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

1.1 INTRODUCCIÓN A LA PLATAFORMA BEAGLEBONE BLACK


BeagleBone Black (BBB) es una plataforma compacta, de bajo costo, que ejecuta Linux
(código abierto) y que puede ser usada para construir aplicaciones complejas que se
interconectan con software de alto nivel y circuitos electrónicos de bajo nivel. Esta
plataforma es ideal para proyectos de creación de prototipos y diseño de productos que
toman ventaja de la potencia y libertad de uso que tiene Linux, combinado con el acceso
directo a puertos de entrada y salida (I/O) y buses, permitiendo la interconexión con
componentes electrónicos, módulos y dispositivos USB. Las características de la plataforma
BBB son:
1. Es poderosa, ya que ésta contiene un procesador que puede desempeñar hasta 2
billones de instrucciones por segundo.
2. Es de bajo costo, disponible por tan sólo 55 dólares.
3. Soporta muchas interfaces estándar para dispositivos electrónicos.
4. Usa poca potencia, consumiendo entre 1W (sin hacer nada) y 2.5W (uso pico).
5. Es expandible a través del uso de tarjetas madre y dispositivos USB.
6. Está soportada por una amplia comunidad de innovadores y apasionados.
7. Es de hardware abierto y soporta herramientas y aplicaciones de software abierto.
BBB corre el sistema operativo Linux, lo cual significa que se pueden usar muchas
librerías de código abierto y aplicaciones directamente con éstas. La disponibilidad de
manejar software de código abierto habilita la plataforma para la interconexión con
dispositivos tales como cámaras USB, Teclados y adaptadores WIFI en proyectos propios.
La plataforma BBB está formada por la integración de un microprocesador de alto
desempeño sobre una placa de circuito impreso (PCB) y un ecosistema de software
extensivo. El PCB físico no es un producto completo, es un diseño de referencia de prototipo
que se puede usar para construir un producto completo. Es una plataforma de hardware
abierto lo cual significa que se puede descargar y usar el hardware esquemático del BBB en
diseños de productos propios. De hecho, a pesar de la impresionante capacidad de la
plataforma BBB, ésta no expone completamente todas las características e interfaces del
microprocesador Sitara AM335X de Texas Instruments.
Una impresionante característica del BBB es que su funcionalidad puede ser extendida
mediante tarjetas madre, llamadas “capas”, que se conectan a los dos conectores columna
negros (headers 2x23, P8 y P9). El usuario puede diseñar sus propias capas y adjuntarlas con
seguridad a la plataforma BBB usando los conectores anteriores. En adición, muchas capas
son disponibles para compra que pueden ser usadas para expandir la funcionalidad del BBB.
BBB está perfectamente situado para la integración de software de alto nivel y
electrónica de bajo nivel en cualquier tipo de proyecto. Si se está planeando un sistema de
manejo para el hogar automatizado, o trabajo de arte interactivo conectado a internet, BBB

5
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

tiene la potencia de procesamiento para hacer lo que sea que se pueda imaginar en un
dispositivo embebido. La mayor ventaja de BBB sobre los sistemas embebidos tradicionales
tales como Arduino, PIC y microcontroladores AVR, es aparente cuando aprovechas el
sistema operativo Linux en tus proyectos. Sin embargo, la mayor desventaja es que el
sistema operativo Linux no fue diseñado para procesamiento de tiempo real. Su kernel o
núcleo no tiene derecho preferente (preemptive), lo cual significa que una vez que el
procesador inicia la ejecución del código del kernel este no puede ser interrumpido. Por lo
tanto, en su estado por default, BBB no es una plataforma ideal para aplicaciones de
sistemas de tiempo real.
1.1.1 HARDWARE SOBRE BEAGLEBONE BLACK
La Tabla 1.1 y la Figura 1.1 detallan el núcleo del sistema del BBB. El primer conjunto de
características (1–8), identifica y describe los sistemas clave sobre el BBB. El BBB está
basado en un microprocesador de Texas Instruments Sitara AM335x Cortex A8 ARM. Éste
es un procesador RISC (Reduced Instruction Set Computing) el cual puede ejecutar 2000
millones de instrucciones por segundo corriendo a 1000MHz. El siguiente conjunto de
características (9–19) identifica los varios conectores sobre el BBB, sus características físicas
y sus funciones.

Tabla 1.1 Tabla de los subsistemas y conectores sobre el BBB.

Función Físico Detalles


Procesador AM335x Poderoso procesador Texas Instruments Sitara 1GHz ARM-
A8.
2 x PRUs Unidades de Tiempo-Real programables.
Máquina Gráfica El procesador tiene una máquina gráfica 3D que es capaz de
renderizar 20 millones de polígonos por segundo.
Gráficos Enmarcador HDMI El enmarcador convierte la interface LCD disponible sobre el
procesador AM335x en una señal HDMI.
Memoria 512MB DDR3 La cantidad de memoria del sistema afecta el desempeño y
el tipo de aplicación que se puede correr en la tarjeta.
Almacenamiento eMMC (MMC1) Tiene una unidad de 2/4 GB Embedded Multi-Media Card
(eMMC) y una unidad para SD Card sobre la plataforma. El
BBB puede arrancar sin una SD Card.
Manejo TPS65217C Tiene un complejo IC para el manejo de potencia (PMIC) el
de Potencia cual tiene 4 reguladores de voltaje LDO para la alimentación.
Este IC es controlado vía I2C.
Procesador Ethernet PHY (10/100) Puede ser inmediatamente conectado a una red (soporta
Ethernet DHCP). La interface física LAN8710A conecta el conector
físico RJ45 al microprocesador ARM.
LEDS 7 x LEDS LED de alimentación (azul), 4 LEDS de usuario (azul), y 2 LEDA
sobre el socket de Ethernet (amarillo = enlace 100M,
verde=tráfico).
Botones 3 x Botones Botón de alimentación ON/OFF, Botón de Reset para resetear
el BBB, y botón de arranque para elegir modo eMMC o SD
card.

6
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Conectores
Salida de Video Micro-HDMI (HDMI-D) Para conectar un monitor o televisión. Suporta resolución
hasta 1280x1024 a 60Hz. Puede correr 1920x1080 pero solo
a 24Hz. Tiene soporte HDMI CEC.
Salida de Audio Puede usarse un adaptador para hacer la conversión a un
(HDMI-D) Jack regular de audio de 3.5mm.
RED Ethernet (RJ45) 10/100 Ethernet vía un conector RJ45. No contiene WIFI
sobre la plataforma.
Alimentación DC 5V de DC (5.5mm) Conector para alimentación.
SD Card Micro-SD (MMC0) Slot para 3.3V micro-SD Card. BBB puede arrancar a partir de
este slot o también lo usa para almacenamiento.
Debug Serial Conector de 6 pines (UART0) Usado con un cable TTL3V3 para conectar a la
(6x0.1”) consola serial del BBB (no es conector JTAG).
USB 1xUSB 2.0 cliente (USB0) Conecta a una computadora personal y puede
(mini-USB) alimentar y/o comunicar al BBB.
USB 1xUSB 2.0 Host (USB1) Para conectar periféricos USB al BBB. Puedes usar USB
(USB-A) Hub para agregar más de un dispositivo USB.
P8 y P9 Dos 2x23 conectores 92 pines en dos conectores que son multiplexados para
conectores de 0.1” hembra proporcionar acceso a las características de la Tabla 1.2. No
expansión toda la funcionalidad está disponible al mismo tiempo. Puede
ser usado para conectar capas.
Otro Debug JTAG Hay espacio para un conector JTAG. JTAG permite debug la
plataforma, pero requiere hardware y software adicional.
Otra Conectores de Pilas Es posible soldar pines y usarlos para conectar pilas.
alimentación

Fig. 1.1 BBB vista superior e inferior.

7
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

La Tabla 1.2 detalla varias de las entradas y salidas que están disponibles en los
conectores P8 y P9. Hay 92 pines en total sobre estos conectores; sin embargo, no todos
están disponibles para entrada/salida de propósito general (GPIOS). Varias de las
conexiones tienen una configuración fija.
Tabla 1.2 Tabla de la funcionalidad disponible sobre los conectores P8 y P9.

Conectores de Expansión P8 y P9 Hay 92 pines que son multiplexados. No toda la


funcionalidad listada abajo está disponible
simultáneamente. Tener precaución.
GPIO 65xGPIOS El número máximo de GPIOs es 65. Todos los
GPIOS toleran 3.3V. Si se usan buses o interfaces
el número de GPIOS se reduce.
Salida Analógica 8xPWM Las salidas moduladas por ancho de pulso
(PWM) permiten enviar un tipo de variable de
salida analógica (0-3.3V). PWM puede ser usado
para controlar servomotores. Hay 8 pines que
pueden entregar este tipo de salida.
Entrada 7xEntradas Hay 7x12-bit a 1.8V entradas analógicas que
Analógica Analógicas están siempre disponibles sobre los conectores.
Se pueden usar para leer variables de sensores,
pero teniendo cuidado de no exceder 1.8V.
Fuente de 5V, 3.3V, 1.8V 5V y 3.3V alimentan el BBB y 1.8V sirve de voltaje
Alimentación de referencia para las entradas analógicas. Hay 8
pines en los conectores que son tierra.
Temporizadores 4xTemporizadores Pueden ser usados para generar señales de reloj
externas para interconectar dispositivos.
Buses 2xI2C I2C es un bus digital que permite conectar varios
módulos al mismo tiempo. Hay dos buses
públicos y un bus adicional privado.
4xUART Usados para comunicación serial entre dos
dispositivos. UART0 es el conector de Debug
serial.
2xCAN El bus CAN es usado como red de área de
controlador, casi siempre en procesos
industriales o vehículos para comunicar entre
varios sistemas de redes.
2xSPI La interface periférica serial proporciona un
enlace de datos serial síncrona sobre distancias
cortas. Usa una configuración maestro/esclavo y
requiere de 4 alambres para la comunicación.
GPMC El controlador de memoria de propósito general
es usado para conectar dispositivos de memoria

8
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

externa como FPGAS o ASICS. Este bus rápido


tiene conflicto con el eMMC sobre el BBB.
2xMMC Los buses de interfaces son usados para
conectar la micro-SD Card y el eMMC al
procesador.
LCD Útil para pantallas LCD. Esta interface tiene
conflicto con el enmarcador HDMI.
2xMcASP Puerto serial de audio de propósito de general.
El puerto serial de audio multicanal es conectado
al enmarcador del HDMI.

1.1.2 INSTALACIÓN DEL BEAGLEBONE BLACK


Para probar el BBB, la primera cosa que se debe de hacer es conectar la plataforma a
una computadora usando el cable USB suministrado. Después de alimentar la plataforma,
el BBB se conectará a la computadora en modo USB cliente. Una vez conectada la
plataforma, el manejador de archivo, tal como el explorador Windows, desplegará el
contenido de la partición FAT del BBB, tal como se muestra en la Figura 1.2.

Fig. 1.2 Contenido de la partición FAT del BBB.

El equipo BeagleBone.org ha puesto una excelente guía HTML para empezar a


utilizar el BBB. Se debe dar doble clic al archivo START.htm para desplegar la guía dentro
de un buscador web, ver Figura 1.3. Para instalar los drivers de la plataforma se deben de
seguir los pasos que se muestran en la guía con el objetivo de instalar la versión correcta
(descargar e instalar el driver “BONE_D64.exe” para sistemas de 64bits). Bajo Windows se
pueden recibir mensajes de precaución de certificación de driver en múltiples ocasiones.
Continuar con el proceso y no dar clic en Cancelar. Bajo Windows 8 es necesario dar un
reinicio en modo solución de problemas para deshabilitar la “la firma de driver de
aplicación”. Una vez que este proceso está completo, varios dispositivos nuevos están
disponibles sobre la computadora, por ejemplo, se pueden tener los siguientes:

9
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 1.3 Guía START.htm para empezar a utilizar el BBB.

 Acceso a la partición FAT del BBB (como una memoria USB).


 Acceso serial al BBB usando un nuevo driver serial de dispositivo.
 Un dispositivo Linux USB Ethernet/RNDIS (para internet sobre USB). RNDIS se usa
para especificación de la “Interface de Controlador de RED Remota”.
El manejador de dispositivos de Windows, ver Figura 1.4, despliega estos nuevos
dispositivos. Para la instalación de la plataforma en computadoras con Linux o Macintosh,
hay pasos similares que se deben de seguir en la guía antes mencionada.

Fig. 1.4 Dispositivos disponibles en la computadora al instalar drivers del BBB.

10
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

1.1.3 CONEXIONES DE RED


Hay tres maneras principales para conectar y comunicar con el BBB sobre la red,
cada una con sus propias ventajas y desventajas. La primera de ellas es usar “Internet sobre
USB” cual crea una LAN virtual “privada” usando un simple cable USB. La segunda manera
es usando Ethernet regular, y la tercera es usar un cable cruzado de Ethernet. Conectar el
BBB sobre una red puede trastrabillar a un principiante. Esto es usualmente sencillo si se
está trabajando en una red doméstica con control de la propia red. Sin embargo, en redes
complejas, tal como la de universidades, se pueden tener múltiples subredes para
comunicación alámbricas e inalámbricas. En estas redes complejas, las restricciones de
enrutamiento pueden hacer difícil la conexión del BBB a la red, hasta imposible, sobre
Ethernet Regular. Todos los tres métodos son convenientes para conectar el BBB a
computadoras con OS de Windows, Macintosh y Linux.
1.1.3.1 Internet sobre USB
Las distribuciones BBB estándar proporcionan soporte para internet sobre USB
usando el dispositivo Linux USB Ethernet/RNDIS. Para usuarios nuevos, y para usuarios
dentro de infraestructuras de redes complejas, este método es probablemente la mejor
manera para empezar con el BBB. Para este método solo se necesita el BBB, el cable USB y
acceso a una computadora, idealmente con niveles de acceso de administrador.
NOTA: Por default, con Internet sobre USB, el BBB tiene una dirección IP fija 192.168.7.2 y
la computadora personal tiene la dirección fija 192.168.7.1.
Por ejemplo, si se ha instalado correctamente los drivers del BBB bajo Windows, se
debe tener ahora una nueva conexión de red (Equipo - Panel de Control – Redes e Internet
– Centro de Redes y Recursos Compartidos – Cambiar Configuración del Adaptador). La
Figura 1.5 muestra una típica ventana de conexiones de redes bajo Windows. En este caso,
“Conexión de Área Local” es el dispositivo Linux USB Ethernet/RNDIS. La computadora se
mantiene conectada a la LAN regular, cual proporciona acceso a internet, y a una nueva LAN
“privada” que contiene solo a la computadora (192.168.7.1) y el BBB (192.168.7.2). Se
puede abrir un buscador web y conectarse al servidor web del BBB tecleando 192.168.7.2
en la barra de dirección, tal como se muestra en la Figura 1.6.
En este punto se puede conectar el servidor web del BBB usando un buscador web,
de manera que se tenga completamente una red privada funcional; sin embargo, se puede
también querer que el BBB tenga acceso completo a internet, para eso se pueden descargar
archivos y actualizar el software de Linux directamente sobre el BBB. Para hacer esto, se
necesita compartir el adaptador de red de la computadora, de manera que el tráfico a partir
del BBB pueda ser ruteado a través de la computadora al internet. Bajo Windows se siguen
los siguientes pasos:

11
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Figura 1.5 Nueva conexión de Red con Internet sobre USB.

Fig. 1.6 Conexión con el BBB mediante buscador web.

 Elige el adaptador de red de la computadora que proporciona el acceso a internet.


Da clic en el botón derecho y elige “Propiedades”.
 En el dialogo que aparece, a mano izquierda, dar clic en la pestaña “Uso Compartido”
y habilita la opción “Permitir que los usuarios de otras redes se conecten a través …”
 En el espacio debajo de “Conexión de Red Doméstica” elige la LAN privada del BBB
(en este caso Conexión de área local) y da clic en ACEPTAR (ver Figura 1.7 para estos
primeros tres pasos).
 Da clic con el botón derecho sobre la LAN privada del BBB y selecciona
“Propiedades”.

12
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

 Sobre la opción “Protocolo de Internet versión 4 (TCP/IPv4)” dar doble clic. En el


dialogo que aparece selecciona “Obtener una dirección IP automáticamente” y
habilita “Obtener la dirección del servidor DNS automáticamente”.
 Da clic en ACEPTAR dos veces para guardar la configuración (ver Figura 1.8 para
estos pasos).

Fig. 1.7 Configuración para compartir la LAN de la computadora, pasos 1-3.

Fig. 1.8 Configuración de la LAN privada del BBB, pasos del 4-6.

Si todo va bien, no notarás nada de diferencia en este punto y debes ser capaz de
recargar la página web que fue mostrada en la Figura 1.6. El impacto de los pasos anteriores
se verá reflejado cuando se abra una conexión terminal al BBB.
NOTA: El uso de algunos antivirus bloquean el uso compartido de la LAN de la computadora,
sino funciona la configuración anterior, deshabilita el antivirus de tu computadora.

13
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

1.1.3.2 Ethernet Regular


Por Ethernet “regular”, se refiere a conectar el BBB a una red de la misma manera
en cómo se conecta una computadora usando una conexión alámbrica. Para un usuario
doméstico y alimentación doméstica para el BBB, el uso de Ethernet regular es
probablemente la mejor solución para trabajar en red con el BBB. El tema principal es la
complejidad de la Red. Si se tiene el conocimiento de la configuración de la Red y se tiene
el acceso a los ajustes del rúter, entonces por mucho es la mejor configuración. Si el rúter
de red está distante de la computadora, se puede usar un pequeño switch de red.
Alternativamente, se puede comprar un punto de acceso inalámbrico, con ruteado
multipuerto inalámbrico, lo cual es útil para aplicaciones con el BBB inalámbricas y también
para extender el rango de la red inalámbrica.
El primer reto con esta configuración es encontrar el BBB sobre la red. Por default,
el BBB está configurado para solicitar una dirección IP de Protocolo de Configuración de
Huésped Dinámica (DHCP por sus siglas en inglés). En un ambiente de red doméstica este
servicio es usualmente proporcionado por un servidor DHCP que está corriendo sobre el
Modem-Firewall-Router-LAN (o alguna configuración similar) que conecta la red doméstica
a un Proveedor de Servicio de Internet (ISP por sus siglas en inglés).
Los servidores DHCP emiten direcciones IP dinámicamente a partir un repertorio de
direcciones para un intervalo de tiempo fijo, llamado “tiempo de concesión”, cual es
especificado en la configuración DHCP. Cuando esta concesión expira, el BBB es asignado a
una diferente dirección IP la próxima vez que se conecte a la red. Es posible establecer una
dirección IP estática para el BBB, de manera que ésta sea fija cada vez que el BBB sea
conectado. Este tema será tratado más adelante.
Hay pocas maneras diferentes para encontrar la dirección IP dinámica del BBB. A
continuación se explican estas maneras:

 Usa un buscador web para accesar a tu rúter doméstico (casi siempre en las
direcciones 192.168.1.1, 192.168.0.1, o 10.0.0.1). Accede a la cuenta y ve sobre el
menú “Estado” para la “Tabla DHCP”. Se debe de ver una entrada que detalla la
dirección IP asignada, la dirección MAC física, y el tiempo de concesión restante
para el dispositivo con el nombre huésped “beaglebone”.
 Usa una herramienta de escaneo de puertos como nmap para Linux o Zenmap para
Windows. El comando nmap –T4 –F 192.168.1.* escaneará para
dispositivos en una sub-red. Se debe buscar por una entrada que tenga tres o cuatro
puertos abiertos (por ejemplo, 22 para SSH, 80 para la guía del BBB, 8080 para el
servidor web Apache y 3000 para el Cloud9 IDE).
 Se puede usar una conexión “serial sobre USB” para conectar el BBB y teclear
ipconfig para encontrar la dirección IP. La dirección es la inet addr asociada
con el adaptador eth0.

14
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Una vez que se tiene la dirección IP, se puede probar que ésta es válida ingresándola
en la barra de dirección de un buscador web. La página mostrada debe ser igual a la de la
Figura 1.6.
1.1.3.3 Cable Cruzado de Ethernet
Un cable cruzado de Ethernet es uno que ha sido modificado para habilitar a dos
dispositivos Ethernet conectarse juntos directamente, sin la necesidad de un switch de
Ethernet. Este cable puede ser comprado o puede realizarse en casa. Muchas computadoras
tienen una función de detección cruzada automática (Auto-MDIX) que habilita un cable
regular de Ethernet para ser usado. Similar a la configuración de red “Internet sobre USB”,
este tipo de conexión puede ser usada cuando no se tiene acceso a la infraestructura de la
red y/o donde la configuración de red “Internet sobre USB” no está trabajando
correctamente.
1.1.4 COMUNICANDO CON EL BBB
Una vez que se tiene el BBB conectado a la red, la siguiente cosa por hacer es
establecer comunicación con el BBB. Se puede conectar el BBB usando ya sea una conexión
serial sobre USB, USB-to-TTL, o una conexión de red, tal como se discutió anteriormente. La
conexión de red debe ser el foco principal, ya que este tipo de conexión proporciona al BBB
acceso completo a internet. La conexión serial es generalmente usada como una conexión
especial cuando se llegan a presentar problemas con la conexión de red.
NOTA: Por default una cuenta súper usuario en Angstrom, Debian y Arch Linux tiene nombre
de usuario “root” y ningún password (sólo presionar ENTER). Ubuntu no tiene un súper
usuario para acceder al sistema, para acceder teclea “ubuntu” con el password “temppwd”.
1.1.4.1 Conexión Serial sobre USB
Si están instalados los drivers del BBB, el Gadget Serial Device permitirá conectar el
BBB directamente usando un programa emulador terminal. Las conexiones seriales son
particularmente útiles cuando el BBB está cerca de una computadora y conectado vía un
cable USB. Este es un método de comunicación especial que se utiliza cuando algo va mal
con la configuración de red o servicios software en el BBB.
Para conectar el BBB vía comunicación serial, se necesita un programa terminal.
Varias aplicaciones para Windows están disponibles en la red, tal como, “RealTerm” y
“PUTTY”. Para conectar el BBB sobre una conexión serial USB se necesita conocer la
siguiente información:

 Número de Puerto. Se puede encontrar mediante la apertura de la ventana de


Administrador de Dispositivos (ver Figura 1.4) en la sección “Puertos (COM y LPT)”.
La Figura 1.4 captura un ejemplo, donde el “Gadget Serial” está listado como COM4.
Este será diferente en otras máquinas.

15
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

 Velocidad de la Conexión. Por default se necesita ingresar una velocidad de 115200


baudios para conectarse con el BBB.
 Otra información. Data bits = 8; Stop bits = 1; Parity = none; y Flow Control =
XON/XOFF.
En la Figura 1.9 se muestra un ejemplo de la configuración anterior usando el
programa PUTTY. Para guardar la configuración coloque un nombre de sesión de manera
que esté disponible cada vez que el BBB se conecte a la computadora. Después de que se
abre la terminal es importante presionar ENTER cuando la ventana aparece. Cuando se
conecta el BBB con OS Debian se debe de ver sobre la terminal la salida de la Figura 1.10.

Fig. 1.9 Configuración de la conexión Serial sobre USB usando el programa PUTTY.

Fig. 1.10 Salida de la Terminal cuando se establece la comunicación Serial sobre USB.

Una vez en la Terminal, para ingresar remotamente hay que teclear el nombre de
usuario “root”. No hay password así que sólo se teclea ENTER.
1.1.4.2 Conexión Serial con el Cable USB-to-TTL de 3.3V
Para este tipo de conexión serial se necesita un cable especializado. El cable serial
USB-to-Serial UART TTL es un accesorio que es útil cuando hay problemas con la distribución

16
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

de Linux sobre el BBB. Este cable se conecta al pin 6 del conector J1 que está al lado del
conector P9 sobre el BBB. El alambre negro del cable es conectado al pin 1 y el alambre
verde debe quedar cerca del conector USB. Solo se utilizan tres pines sobre el BBB, el pin 1
es Tierra (negro), el pin 4 recibe (naranja) y el pin 5 transmite (amarillo). El cable maneja
señales de voltaje de 3.3V y contiene un chip que requiere drivers de instalación para la
computadora creando un nuevo puerto COM.
Una vez instalado el cable, nuevamente se requiere abrir la ventana de
Administrador de Dispositivos de Windows para encontrar cual puerto COM está asociado
con el dispositivo llamado “USB Serial Port”. Para abrir una sesión de conexión serial se
llevan a cabo los mismos pasos de configuración descritos en la sección anterior.
1.1.4.3 Conexión a través de SSH (Secure Shell)
SSH es un protocolo de red muy útil para comunicación encriptada segura entre
dispositivos de redes. Se puede usar una terminal cliente SSH para conectar el servidor SSH
que está corriendo sobre el puerto 22 del BBB, lo cual te permitirá hacer lo siguiente:

 Ingresar remotamente al BBB y ejecutar comandos.


 Transferir archivos hacia y del BBB usando el protocolo de transferencia de archivos
SSH (SFTP por sus siglas en inglés).
 Conexiones Forward X11 que permiten realizar computación de red virtual.
Por default, la distribución Linux del BBB corre un servidor SSH (sshd sobre Debian y
Dropbear sobre Angstrom) que está ligado al puerto 22. Hay pocas ventajas de tener un
servidor SSH disponible como el método por default por el cual se pueda ingresar
remotamente al BBB. En particular, se puede abrir el puerto 22 del BBB a Internet usando
la funcionalidad de reenvío del puerto del rúter. Tienes que asegurar de poner el password
sobre la cuenta de usuario raíz antes de hacer esto. Hecho lo anterior, puedes remotamente
ingresar a tu BBB desde cualquier parte del mundo si conoces la dirección IP del BBB. Un
servicio llamado “DNS Dinámico” que está soportado en la mayoría de los rúters, le permite
al rúter registrar la última dirección con un servicio online. El servicio online mapea un
nombre dominio de tu elección a la última dirección IP que tu ISP te ha dado. El servicio DNS
dinámico usualmente tiene un costo anual y te proporciona una dirección de la forma
alainBBB.servicename.com.
Se puede usar el programa PUTTY para conectar el BBB usando comunicación Serial
sobre USB. PUTTY es una consola de emulador de terminal serial y SSH cliente que puede
ser usado para conectar el BBB sobre la red. PUTTY las siguientes características:

 Soporta conexión serial y SSH.


 Este programa se instala con una aplicación llamada “psftp” que habilita la
transferencia de archivos hacia y del BBB sobre la red de tu computadora.

17
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

La Figura 1.11 muestra los ajustes de configuración de la comunicación SSH usando


PUTTY. Se elige SSH como el tipo de conexión; se ingresa la dirección IP 192.168.7.2 del BBB
si se está usando internet sobre USB; Poner el puerto 22 por default; guardar la sesión con
un nombre para uso futuro. A continuación, dar clic para abrir la terminal y escribir el
username (root) y el password (root). Se puede recibir una alerta que previene de ataques
y que puede ser de preocupación en redes inseguras. Aceptar la Firma y continuar. La Figura
1.12 muestra la terminal de salida cuando se ingresa remotamente al BBB.

Fig. 1.11 Configuración de la comunicación SSH usando PUTTY.

Fig. 1.12 Terminal de salida al ingresar remotamente al BBB.

1.1.4.4 Transfiriendo Archivos usando PUTTY/psftp sobre SSH


La instalación de PUTTY también incluye el protocolo de transferencia de archivo
(ftp) que habilita la transferencia de archivos hacia y del BBB sobre la conexión de red. Se
puede correr la aplicación “psftp” (protocolo de transferencia de archivo seguro PUTTY) con
18
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

sólo teclear psftp en el campo de texto de comandos de inicio de Windows. En el prompt


psftp> se puede conectar el BBB tecleando open root@192.168.7.2. La
computadora será referida como una máquina local y el BBB es referido como la máquina
remota. Cuando se teclea un comando prácticamente se está emitiendo sobre una máquina
remota. Después de establecer comunicación se está situado sobre el directorio “home” de
la cuenta de usuario. Por lo tanto, bajo la distribución de Linux Debian, si se está conectado
como root se está situado sobre el directorio /root.
1.1.5 LABORATORIO 1
Para transferir un archivo simple C:\Users\Name\Documents\SONGS.txt
de una computadora local hacia el BBB se pueden utilizar los siguientes pasos:
psftp: no hostname specified; use “open host.name” to connect
psftp> open root@192.168.7.2
Using username “root”. Debian GNU/Linux 7
Remote working directory is /root
psftp> lcd c:\Users\Name\Documents
New local directory is c:\Users\Name\Documents
psftp> mkdir nuevo
mkdir /root/nuevo: OK
psftp> cd nuevo
Remote directory is now /root/nuevo
psftp> put SONGS.txt
local:SONGS.txt => remote:/root/nuevo/SONGS.txt
psftp> dir SONGS.*
Listing directory /root/nuevo
-rw-r--r-- 1 root root 457 Apr 23 20:17 SONGS.txt
Los comandos que tienen el prefijo l refieren a comandos emitidos por la máquina
local, es decir, lcd (local change directory) o lpwd (local print working directory). Para
transferir un archivo simple, el comando put es usado cual transfiere el archivo de la
máquina local a la maquina remota. El comando get puede ser usado para transferir un
archivo en reversa. Para transferir múltiples archivos en ambos sentidos, se pueden usar los
comandos mput y mget. También usar help si se ha olvidado un comando.
Si se está usando OS Linux se puede usar el comando sftp en lugar de psftp para
cargar la aplicación. Casi todo se mantiene igual. La aplicación cliente sftp está también
instalada sobre el BBB por default de manera que se pueda revertir el orden de

19
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

comunicación, que es tener el BBB actuando como cliente y otra computadora como el
servidor. Hay algunos consejos para los comandos psftp/sftp que son los siguientes:

 mget –r * realizará recursivamente el comando get de un directorio. Es muy


útil si se desea transferir una carpeta que tiene varias subcarpetas. La opción –r
también puede ser usada en los comandos get, put y mput.
 dir *.txt aplicará un filtro para desplegar solo los archivos “.txt” en el directorio
actual.
 mv puede ser usado para mover un archivo/directorio sobre una máquina remota a
una nueva locación sobre la misma máquina remota.
 reget puede ser usado para reanudar una descarga que fue interrumpida. El
archivo descargado parcialmente tiene que existir sobre la máquina local.
 El comando psftp puede ser emitido en una sola línea o en un script en el prompt
de comandos. Se puede crear un archivo script1.scr que contenga un conjunto
de comandos psftp a ser emitidos. Se puede ejecutar psftp del prompt de
comandos, pasando el password usando –pw y el archivo script usuando –b (o –be
para continuar sobre error, o –bc para desplegar los comandos que se están
ejecutando), tal como sigue:
En el block de notas crea el archivo script1.scr con el contenido mostrado en
la Figura 1.13. El comando more script1.scr se utiliza para ver el contenido del script
sobre el símbolo del sistema de Windows. Básicamente, el script consiste en cambiar el
directorio de la máquina local a “C:\Users\alainmm\Documents\reynaldo” con
el comando lcd, después cambia el directorio de la máquina remota a “\root\nuevo”
con el comando cd ya que el directorio por default es “\root” y finalmente transfiere
todos los archivos que contiene “\root\nuevo” a la ubicación
C:\Users\alainmm\Documents\reynaldo. El script termina con el comando
quit para terminar la aplicación.

Fig. 1.13 Contenido del script utilizando el símbolo del sistema de Windows.

20
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

En la Figura 1.14 se muestra la salida que se despliega en el símbolo del sistema al


ejecutar el script. Para correr el script se debe de dar la ruta donde está instalada la
aplicación psftp (en esta caso C:\Program Files (x86)\PuTTY). A continuación, se ejecuta
la siguiente línea:
psftp root@192.168.7.2 –b En este
C:\Users\alainmm\Documents\script1.scr.
ejemplo se observa como el archivo llamado SONGS.txt fue transferido de la máquina
remota a la máquina local en el directorio antes mencionado.

Fig. 1.14 Despliegue de salida al correr el script.

1.2 EXPLORANDO SISTEMAS LINUX EMBEBIDOS


Este tema expone los conceptos clave, comandos y herramientas requeridas para
manejar efectivamente sistemas Linux embebidos. La primera cosa por decir, es que no hay
tal cosa como ¡Linux embebido! No hay una versión especial del kernel de Linux para
sistemas embebidos; éste es sólo un kernel de Linux de línea especial corriendo sobre un
sistema embebido. Dicho lo anterior, el término “Linux embebido” tiene un uso más común
que el término correcto “Linux sobre un sistema embebido”.
La palabra embebido en el término “Linux embebido” es usada para comunicar la
presencia de un sistema embebido, un concepto que puede ser libremente explicado como
algún tipo de hardware de cómputo con software integrado que fue diseñado para una
aplicación específica. Esto contrasta en tanto con la computadora personal (PC), cual es un
dispositivo de propósito general que es usado para muchas aplicaciones, tal como
buscadores web, procesadores de texto, y consola de juegos. Hay algunas características
generales para sistemas embebidos:

 Ellos tienden a tener aplicaciones específicas y dedicadas.


 La potencia de procesamiento, memoria disponible y capacidad de almacenamiento
están casi siempre limitados.

21
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

 Ellos son generalmente parte de un sistema más grande que puede ser enlazados a
sensores o actuadores.
 Ellos tienen casi siempre un papel para el cual la confiabilidad es crítica (por ejemplo,
controladores en carros, aviones, y equipo médico).
 En muchos casos ellos trabajan en tiempo real, donde sus salidas están
directamente relacionadas a entradas actuales (es decir, sistemas de control).
Los sistemas embebidos están presentes donde sea en la vida cotidiana. Algunos
ejemplos incluyen venta de máquinas, accesorios de cocina, teléfonos y teléfonos
inteligentes, líneas de manufactura y ensamblado, televisores, consolas de videojuegos,
sistemas automotrices (gobierno de potencia, seguridad, manejo del motor, presión de
neumáticos, sensores de reversa), redes, rúters, puntos de acceso inalámbricos, sistemas
de sonido, equipo de monitoreo médico, impresoras, control de acceso de edificios,
parquímetros, medidores de agua/energía inteligentes, relojes, herramientas de
construcción, cámaras digitales, monitores, tabletas, robótica, tarjetas de crédito
inteligentes, sistemas de acceso, y mucho más.
Hay muchos tipos de plataformas embebidas, cada una con sus propias ventajas y
desventajas. Ellas van desde plataformas embebidas de bajo costo, con volumen de precios
de menos de 1 dólar en sus procesadores, tales como, (8/16 bits) Atmel AVR, Microchip PIC,
y TI Stellaris, para plataformas especializadas de alto costo, tal como, TI 32-bit multinúcleo
DSPs que pueden valer hasta 160 dólares. Estas plataformas son típicamente programadas
en C y/o lenguaje ensamblador, requiriendo conocimiento de la arquitectura del sistema en
cuestión antes de desarrollar la aplicación. Linux embebido ofrece una alternativa a estas
plataformas, en el hecho de que no se requiere conocimiento de la arquitectura para
empezar a construir aplicaciones. Sin embargo, si se desea hacer interfaces con módulos
electrónicos o componentes, entonces ese conocimiento será requerido. A continuación,
se mencionan algunos puntos del porque Linux ha tenido un crecimiento.

 Linux es un OS eficiente y escalable, corriendo en dispositivos de bajo costo


orientados al consumidor y en servidores de gran escala caros. Linux ha
evolucionado desde que las computadoras eran menos poderosas, pero ha retenido
mucho de su eficiencia.
 Un gran número de programas de código abierto y herramientas han sido
desarrolladas y que pueden ser utilizadas fácilmente en una aplicación embebida. Si
se necesita un servidor web para una aplicación embebida, se puede instalar lo
mismo que se usaría en un servidor Linux tradicional.
 Hay excelente soporte de código abierto para diferentes periféricos y dispositivos.
 Linux es abierto y no requiere de pago para su uso.
 El kernel y su código de aplicación está corriendo globalmente en muchos
dispositivos, esto hace que los bugs sean menos frecuente y sean detectados
rápidamente.

22
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Una desventaja de Linux embebido es que no es ideal para aplicaciones de tiempo


real debido a que el OS va a la cabeza. Por lo tanto, para aplicaciones de alta precisión y
rápida respuesta, Linux embebido no puede ser una solución perfecta. Sin embargo, aun en
aplicaciones de tiempo real, Linux es usado como la “inteligencia central” e interface de
control para una red de sensores de tiempo real. En adición, hay desarrollos en marcha
sobre OS de tiempo real (RTOS) basados en Linux cuyo propósito es usar Linux en una
manera con derecho preferente (preemptive), interrumpiendo el OS cuando sea requerido
para mantener el proceso en tiempo real.
1.2.1 ARRANQUE DEL BEAGLEBONE BLACK
La primera cosa que se debe de ver cuando se arranca una computadora es la
Interface Firmware Extensible Unificada (UEFI por sus siglas en inglés) que proporciona el
soporte de legado para los servicios BIOS (Basic Input/Output System). La pantalla de
arranque despliega información del sistema e invita a presionar una tecla para alterar esta
información. UEFI prueba los componentes hardware, tal como la memoria, y entonces
carga el sistema operativo, típicamente a partir de una SSD o disco duro. Por lo tanto,
cuando una computadora es encendida la UEFI y el BIOS realizan los siguientes pasos:

 Toma el control del procesador de la computadora.


 Inicializa y prueba los componentes hardware.
 Carga el OS de la SSD/Disco Duro.
La UEFI/BIOS provee una capa de abstracción para el OS para interactuar con la
pantalla y otros periféricos de entrada/salida, tales como el mouse, teclado y dispositivos
de almacenamiento. Sus ajustes son almacenados en memoria flash NAND y memoria de
respaldo de batería. Se puede ver una pequeña pila sobre la tarjeta madre de la
computadora que mantiene el estado de estas memorias y además soporta un sistema de
reloj de tiempo real.
Como la mayoría de los dispositivos Linux embebidos, el BBB no tiene un BIOS o
memoria de respaldo de batería; en lugar de eso, BBB usa una combinación de
arrancadores. Un arrancador es un programa muy pequeño (típicamente menor de 128KB)
que carga el OS; sin embargo, el arrancador es un programa personalizado que es adaptado
para cada plataforma Linux, incluyendo BBB. Hay cuatro conceptos clave para el arrancador.
1. El arrancador Linux principal que es usado sobre el BBB es llamado Das U-Boot
(Universal Bootloader).
2. El código fuente para el U-Boot es modificado usando parches que han sido
escritos especialmente para el BBB.
3. El arrancador para el BBB es compilado a un archivo binario.
4. Un archivo de texto de configuración de arranque uEnv.txt es creado y puede ser
usado para pasar parámetros al kernel de Linux.

23
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Estos pasos crean tres importantes archivos: u-boot.img, MLO y uEnv.txt. Estos
archivos están disponibles sobre la partición VFAT del BBB y pueden verse cuando por
primera vez es conectado el BBB sobre una computadora. Estos tres archivos son
indispensables para arrancar la plataforma y contienen parámetros sobre el BBB. Los
arrancadores del BBB realizan las siguientes funciones críticas:

 Inicializan los controladores (memoria, gráficos, I/O).


 Preparan y asignan memoria del sistema al OS.
 Localizan el OS y proporcionan la facilidad para cargarlo.
 Carga el OS y pasan control a este.
Das U-Boot usa un archivo de configuración de plataforma llamado “árbol de
dispositivo binario” o DTB el cual contiene información específica de la tarjeta que el kernel
requiere para arrancar el BBB. Este archivo contiene toda la información necesaria para
describir el tamaño de memoria, velocidad del reloj, dispositivos sobre la tarjeta, entre
otros. En la Figura 1.15 se muestra una típica secuencia de los pasos de arranque del BBB.

Fig. 1.15 Secuencia completa de arranque sobre el BBB.

1.2.2 ESPACIO DEL KERNEL Y ESPACIO DE USUARIO


El kernel de Linux corre en un área del sistema de memoria llamada “Espacio de
Kernel” y las aplicaciones de usuario regulares corren en un área del sistema de memoria
llamado “Espacio de Usuario”. Hay un límite duro entre estos dos espacios, previniendo
que las aplicaciones de usuario accedan a memoria y recursos que son requeridos por el

24
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

kernel de Linux. Esto ayuda para prevenir al kernel de Linux de chocar con código de usuario
erróneamente escrito y ayuda a proporcionar un grado de seguridad.
El kernel de Linux es “dueño” y tiene acceso completo de la memoria física y recursos
sobre el BBB. Por lo tanto, se tiene que ser cuidadoso de que sólo el más confiable y estable
código sea el que se permita correr sobre el espacio del Kernel. En la Figura 1.16 se muestra
la estructura cuando las aplicaciones de usuario usan la librería GNU C (glibc) para hacer
llamadas a la interfaz de llamada del sistema del kernel. Un módulo de kernel es un archivo
objeto que contiene código que puede ser cargado y desmontado del kernel bajo demanda.
En muchos casos el kernel puede cargar o desmontar módulos mientras éste se está
ejecutando, sin necesidad de reiniciar el BBB. Sin esta capacidad modular, el kernel de Linux
sería muy grande, ya que tendría que soportar cada driver que podría ser necesario sobre
el BBB.

Fig. 1.16 Espacio de Kernel y Espacio de Usuario.

Los servicios kernel están disponibles al usuario de una manera controlada a través
del uso de llamadas al sistema. El kernel también previene que las aplicaciones del espacio
de usuario tengan conflicto unas con otras. Como se ilustró en la Figura 1.15, el archivo U-
Boot pasa control al kernel después de que éste ha sido descomprimido en la memoria. El
kernel entonces monta el sistema de archivo raíz (mmcroot y mmcrootfstype que están
definidos en uEnv.txt). El último paso del kernel en el proceso de arranque es para llamar
init (/sbin/init sobre el BBB), que es el primer proceso del espacio de usuario que
es iniciado.
1.2.3 SYSTEM V INIT (SysVinit)
Tradicionalmente, el proceso padre que maneja todos los sistemas y servicios de
Linux es llamado System V init (systemd bajo Debian). Este proceso es el responsable de
empezar y detener servicios (por ejemplo, servidores web, servidores SSH) sobre el BBB, y

25
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

es muy dependiente del estado actual, o nivel de ejecución, que quizá esta inicializando,
apagando, etc.
El proceso init inicia mediante la lectura del archivo de configuración
/etc/inittab, que define detalles tales como el nivel de ejecución por default (nivel 2
sobre el BBB) y de qué hacer en modo “single-user”. El modo “single-user” es una etapa
durante el proceso de arranque por el cual el acceso exclusivo a todos los recursos es
solicitado por una cuenta “superuser”, para tareas tales como checar la integridad del
sistema de archivo usando el comando fsck. El modo “single-user” evita que otros
usuarios ingresen y usen el sistema de archivo mientras éste está siendo checado.
El nivel de ejecución define el estado del BBB y controla cuales procesos o servicios
son inicializados por el sistema init. Por ejemplo, bajo Debian, cual usa System V init, hay
varios niveles de ejecución, identificados como 0–6 y S (ver Tabla 1.3). Cuando inicia el
proceso init, el nivel de ejecución empieza en N (ninguno). Después, el proceso ingresa
al nivel de ejecución S para inicializar el sistema en modo “single-user” y finalmente, ingresa
a uno de los niveles de ejecución “multi-user” (2–5). Para ver el nivel de ejecución actual
del sistema teclear lo siguiente:
root@beaglebone:~# runlevel
N 5
root@beaglebone:~# who -r
run-level 5 May 15 02:19

En este caso, el BBB está actualmente ejecutando el nivel 5. Se puede cambiar el


nivel de ejecución tecleando init seguido del número de nivel. Por ejemplo,
root@beaglebone:~# init 6

Si se va al directorio /etc (cd /etc) se pueden ver los directorios rc que


relacionan a los diferentes niveles de ejecución:
root@beaglebone:/etc# ls –d rc*
rc.local rc1.d/ rc3.d/ rc5.d/ rcS.d/
rc0.d/ rc2.d/ rc4.d/ rc6.d/ rcn-ee.conf

ls –d lista sólo las entradas del directorio (sin mostrar sus contenidos). El nivel de
ejecución actual es el 5, por lo tanto, se pueden ver que scripts están corriendo en ese nivel:
root@beaglebone:/etc# cd rc5.d
root@beaglebone:/etc/rc5.d# ls –al
...
1rwxrwxrwx 1 root root 17 Feb 18 22:56 S01rsyslog -> ../init.d/rsyslog
1rwxrwxrwx 1 root root 14 Feb 18 22:55 S01rsudo -> ../init.d/sudo
1rwxrwxrwx 1 root root 17 Mar 1 14:21 S02apache2 -> ../init.d/apache2

26
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Tabla 1.3 Niveles de ejecución sobre la distribución de Linux Debian para el BBB.

Nivel Descripción Ejemplo de uso


0 Detener Sistema Detiene los scripts de todos los servicios.
1 Modo Usuario Único Para funciones administrativas tal como checar el sistema de
archivo.
2-5 Modos Multi-usuarios Modo Multi-Usuario regular. Puede ser configurado para tener
diferentes significados mediante la cuenta de administrador.
Todos los modos son los mismos por default en el BBB.
6 Reiniciar el Sistema Detiene los scripts de todos los servicios.
S Iniciar Scripts Modo usuario-único en el arranque. No cambiar estos enlaces.
Sólo para scripts tal como inicialización de teclado que tiene
que correr antes de ingresar a root.

Las entradas en el directorio son enlaces simbólicos al script relacionado en el


directorio /etc/init.d. La primera letra S en el nombre del enlace simbólico indica que
el servicio enlazado esta para ser inicializado. Si la primera letra fuera K indica que el servicio
debe ser detenido. Se pueden llamar los scripts en /etc/init.d manualmente. El
servidor web Apache que está corriendo sobre Debian en el BBB puede ser usado como un
ejemplo. Se puede averiguar el estado de este servicio tecleando lo siguiente:
root@beaglebone:~# service apache2 status
La salida después de ejecutar la línea anterior se muestra en la Figura 1.17. En este
caso, el servidor está corriendo cuatro procesos para manejar simultáneamente llamadas de
múltiples buscadores web al mismo tiempo. Se puede controlar manualmente este servicio
tecleando los comandos mostrados en la Figura 1.18.

Fig. 1.17 Despliegue del estado del servicio Apache usando PUTTY.

Con frecuencia, los comandos de servicio reload y force-reload también


están disponibles en los scripts. Si se teclea more /etc/init.d/apache2, se puede
ver el código fuente del script apache2. Aproximadamente a la mitad del script se puede

27
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

ver el código “case $1 in start…” que define lo que pasa cuando la palabra start
es puesta en la entrada de usuario.

Fig. 1.18 Comandos usados para controlar el servicio Apache.

Cuando el enlace simbólico S es creado en los directorios rc2.d – rc5.d, el


script /etc/init.d/apache2 es llamado, sólo si éste es inicializado manualmente.
Similarmente, cuando el enlace simbólico K es creado en los directorios rc0.d, rc1.d o
rc6.d, una llamada será hecha a la parte de Detener (Stop) del script. Finalmente, se
puede remover el script de la inicialización de arranque mediante:
root@beaglebone:~# update-rc.d apache2 remove
update-rc.d: using dependency based boot sequencing
O, inversamente, agregarlo de acuerdo a los ajustes por default:
root@beaglebone:~# update-rc.d apache2 defaults
update-rc.d: using dependency based boot sequencing
1.2.4 MANEJO DEL SISTEMA LINUX
En esta sección se examina el sistema de archivo Linux más a detalle, sobre la base
de comandos y herramientas para asegurar que se tiene el control administrativo completo
del BBB.
1.2.4.1 El Súper Usuario
Sobre el sistema Linux, la cuenta de administrador del sistema tiene el nivel más alto
de acceso de seguridad para todos los comandos y archivos. Típicamente, esta cuenta es
referida como “root account” o “superuser”. Bajo Debian y Angstrom, esta cuenta tiene el
nombre de ingreso (login) “root”. Por lo tanto, cuando ingresas al BBB usando el nombre
de usuario root, se está ingresando al sistema como súper usuario. La distribución de
Ubuntu fomenta a los usuarios no ingresar como “root”, de hecho, ingresar de ese modo
no está disponible por default, sin embargo, esto se puede habilitar tecleando sudo
passwd root.
Es recomendable cuando se realizan operaciones generales sobre el sistema Linux
tratar evitar ingresar como súper usuario, sin embargo, es importante también recordar
que cuando se usa BBB, no se está corriendo típicamente un servidor con miles de cuentas
28
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

de usuario. En muchas aplicaciones, una cuenta de usuario única, sin password por default,
es suficiente. Sin embargo, cuando se usa una cuenta “no súper-usuario” para el trabajo
desarrollado podría protegerte de ti mismo, por ejemplo, borrar accidentalmente un
archivo del sistema. Bajo muchas distribuciones Linux hay una herramienta especial llamada
sudo (superuser do) que es usada siempre que se desea ejecutar comandos de
administración del sistema. Esta herramienta pedirá el password de administrador y
entonces autorizará realizar operaciones de administrador por un periodo corto de tiempo.
Hay otro comando en Linux que permite correr un shell con un usuario substituto: su.
Tecleando su –(igual como su -root) abre un nuevo shell con acceso súper usuario
completo.
1.2.4.2 Usuarios y Grupos
Linux es un sistema operativo multi-usuario que usa las siguientes tres clases
distintas para manejar los permisos de acceso:

 User: Se pueden crear diferentes cuentas de usuario en el BBB. Esto es muy útil si se
desea limitar acceso a procesos y áreas del sistema de archivo. La cuenta root es
la cuenta súper usuario del BBB y tiene acceso a cada archivo; por ejemplo, esta
cuenta no puede ser segura para correr en un servidor web público si soporta
scripting local.
 Group: Las cuentas de usuario pueden ser marcadas para pertenecer a uno o más
grupos, por lo cual cada grupo tiene diferentes niveles de acceso a diferentes
recursos.
 Others: Todos los usuarios del BBB.
Se pueden crear usuarios en la terminal Linux. La lista completa de grupos está
disponible tecleando more /etc/group.
1.2.5 LABORATORIO 2
El siguiente ejemplo demuestra cómo se puede crear una cuenta de usuario nueva
sobre el BBB y modificar las propiedades de esta cuenta a tus propias necesidades. Los
pasos de este laboratorio consisten en:

 Creación de una nueva cuenta de usuario llamada alainmm en el BBB.


 Adición retroactiva de la cuenta al grupo “nuevo_grupo”.
 El reset del password para la nueva cuenta de usuario.
 Verificar que esa cuenta este trabajando bien.
 Cambiar la posesión de grupo y usuario de un archivo.
 Cambiar un archivo de un grupo a otro en la nueva cuenta alainmm.
Paso 1. Crear la cuenta de usuario alainmm tal como se muestra en la Figura 1.19. Se inicia
tecleando adduser alainmm. A continuación, se pedirá el ingreso de un password

29
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

(perl… en mi caso) y que lo confirmes volviéndolo a escribir. Después, se pedirá información


adicional tal como “Nombre Completo”, “Numero de Cuarto”, etc., sólo teclear ENTER si no
deseas ingresar esta información. Finalmente, confirmas que la información esta correcta
tecleando la letra Y.

Fig. 1.19 Ejemplo de cómo se crea una nueva cuenta de usuario sobre el BBB.

Paso 2. Retroactivamente agregar el usuario a otro grupo como sigue:


root@beaglebone:~# groupadd nuevo_grupo
root@beaglebone:~# adduser alainmm nuevo_grupo
Paso 3. Resetear el password si es requerido como sigue:
root@beaglebone:~# passwd alainmm
Enter new UNIX password:
Retype new UNIX password:
passwd: password update successfully
Paso 4. Se puede probar la cuenta tecleando su alainmm a partir de la cuenta root (Sin
embargo no serás situado en el prompt para ingresar un password). Para probar la cuenta
se puede usar una nueva terminal Linux (usar pwd para imprimir el directorio de trabajo).
En la Figura 1.20 se muestra un ejemplo de este paso y además, se crea un archivo vacío
llamado test.txt mediante el comando touch en la nueva cuenta. Se puede ver como el
archivo ha sido creado en la cuenta de usuario correcta e id de grupo (tecleando more
/etc/group |grep nuevo_grupo). Para borrar una cuenta, teclear userdel –r
alainmm, donde –r borra el directorio home y los archivos de cola.

30
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 1.20 Prueba de la nueva cuenta de usuario.

Paso 5. Este paso demuestra cómo cambiar la posesión de un archivo. Para la finalidad del
ejemplo se trabajará usando la herramienta sudo, el usuario alainmm tiene que estar
presente en el archivo sudoers, cual se logra ejecutando en la cuenta root el comando
visudo. En el archivo sudoers, poner una entrada tal como lo siguiente (ver Figura 1.21):
alainmm ALL=(ALL) ALL

Fig. 1.21 Edición del archivo sudoers para agregar la cuenta alainmm.

En este ejemplo se usa el acceso súper usuario para cambiar el archivo test.txt que
está en el directorio raíz alainmm de la cuenta de usuario alainmm en el grupo
31
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

nuevo_grupo, para tener posesión en la cuenta root del grupo root. Ver Figura 1.22
para seguir los comandos que se utilizan en este paso. Para este ejemplo ingresar primero
a la cuenta alainmm.

Fig. 1.22 Cambio de cuenta y de grupo del archivo test.txt.

En la Figura 1.23 se muestra el uso del comando su para cambiar de la cuenta super
usuario root a la cuenta alainmm. Cuando se cambia a la cuenta alainmm se tienen
permisos restringidos.

Fig. 1.23 Uso del comando su para cambiar de cuenta de administrador.

Paso 6. Se puede cambiar el usuario y la posesión de grupo de un archivo usando el


comando “cambio de posesión” chown. El comando “cambio de grupo” chgrp puede
cambiar el grupo de posesión de un archivo. La Tabla 1.4 lista unos pocos ejemplos de la
estructura para chown y chgrp. En la Figura 1.24 se muestra un ejemplo de cómo se
cambia el archivo “test.txt” del grupo alainmm al grupo nuevo_grupo.

32
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Tabla 1.4 Comandos para trabajar con usuarios, grupos y permisos.

COMANDO DESCRIPCIÓN
chown alainmm a.txt Cambia propietario de archivo.
chown alainmm:users a.txt Cambia propietario de archivo y grupo al mismo tiempo.
chown –Rh alainmm /tmp/test
Recursivamente cambia posesión de /tmp/test.
-h afecta enlaces simbólicos en lugar de archivos de
referencia.
chgrp users a.txt Cambia posesión de grupo del archivo.
chgrp –Rh users /tmp/test Recursivamente cambia posesión de grupo de /tmp/test.
groupdel nuevo_grupo Borra grupo (se hace desde la cuenta superuser root).
chmod 600 a.txt Cambia permisos (ver sección de permisos) para que el usuario
tenga acceso de lectura/escritura del archivo; grupo u otros no
tengan acceso.
chmod ugo+rw a.txt Da acceso a usuarios, grupo y otros al archivo a.txt
chmod a-w a.txt Remueve acceso de escritura para todos los usuarios usando a,
cual describe “todos” (el conjunto de usuarios, grupo y otros).
chmod ugo=rw a.txt Establece los permisos de todos para ser de lectura/escritura.
umask Lista los ajustes por default. Usando S despliega el comando
umask -S umask de una forma más legible.
umask 022 Cambia los permisos por default sobre todos los archivos y
umask u=rwx, g=rx, o=rx directorios creados recientemente. Los dos comandos umask
aquí son equivalentes. Si se establece este valor de máscara y
se crea un archivo o directorio, este será: -rw-r--r-- para
el archivo. Se puede especificar un usuario en umask en el
archivo de la cuenta .login.
chmod u+s myexe Establece un bit especial llamado “setuid bit” (establecer id de
usuario en ejecución) y “setgid bit” (establecer id de grupo en
ejecución), s permite a un programa ser ejecutado como otro
usuario ingresado, pero con los permisos propios del archivo y
grupo. Por ejemplo, se podría usar esto para permitir que un
programa particular pueda ser ejecutado como si la cuenta de
usuario root la ejecutará.
chmod 6750 myexe Establece el “setuid bit” en una manera absoluta. Ambos
ejemplos, dan a myexe los permisos -rwsr-s---, donde
ambos bits son establecidos.
chmod u=rwxs, g=rxs, o=myexe Por razones de seguridad, el “setuid bit” no puede ser aplicado
a script Shell.
stat test.txt Proporciona información del estado del sistema de archivo
muy útil para un archivo o directorio, tal como su dispositivo
físico e información inodo; último acceso; fecha de
modificación y cambio.

1.2.5.1 Comandos Básicos de Linux


Cuando se conecta el BBB con SSH se puede ingresar al sistema con el nombre de
usuario root, el cual no requiere password. De ese modo, el BBB está conectado y la
terminal Linux está lista para recibir comandos. El # en el prompt significa que se ha
ingresado con una cuenta súper usuario.

33
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Figura 1.24 Cambio de grupo de un archivo usando el comando chgrp.

La primera cosa por hacer es determinar que versión de Linux está corriendo sobre
el BBB. Esto se hace de la siguiente manera:
root@beaglebone:~# uname -a
También se puede agregar un password para la cuenta súper usuario tecleando:
root@beaglebone:~# passwd
La terminal pedirá el ingreso del password y una confirmación de éste. En la Tabla
1.5 se listan algunos comandos útiles para empezar a probar el OS.
Tabla 1.5 Comandos de Linux básicos.

COMANDO DESCRIPCIÓN
more /etc/issue Regresa la distribución de Linux que se está usando.
ps –p $$ Regresa el Shell que se está usando actualmente (bash 1).
whoami Regresa que cuenta esta actualmente conectada.
uptime Regresa por cuanto el sistema ha estado corriendo.
top Lista todos los procesos y programas ejecutándose. Presionar Ctrl+C para
salir.
1Bash (Bourne again shell) es un programa informático, cuya función consiste en interpretar órdenes, y un lenguaje de programación de
consola.

Cuando se usan cuentas de Debian o Ubuntu, casi siempre el prefijo sudo está al
inicio de ciertos comandos. Esto es porque sudo es un programa que le permite a los
usuarios correr programas con privilegios de seguridad de súper usuario. Para manipular y
manejar el sistema de archivo de Linux por lo regular se usan los comandos básicos listados
en la Tabla 1.6. Esta tabla cubre lo básico sin embargo hay mucho más. En las siguientes
secciones se irán proporcionando más comandos para el manejo del sistema de archivo. En
la Tabla 1.7 se describen algunos “atajos” que pueden servir cuando se trabaja con Linux.

34
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Tabla 1.6 Comandos básicos para el manejo del sistema de archivo.

NOMBRE COMANDO OPCIONES E INFORMACIÓN EJEMPLOS


Lista de archivos ls -a muestra todo (incluyendo ls -al
archivos ocultos).
-l despliega formato largo.
-R da una lista recursiva.
-r da una lista en reversa.
-t agrupa los últimos modificados.
-S agrupa por tamaño de archivo.
-h da tamaños de archivos.
Directorio actual pwd Imprime el directorio de trabajo. pwd -P
-P imprime la ubicación física.
Cambia directorio cd Cambia directorio. cd /home/root
cd después ENTER o cd ~/ lleva al cd /
directorio home.
cd / lleva a la raíz del sistema de
archivo.
cd .. lleva a un nivel abajo.
Crea un directorio mkdir Crea un directorio mkdir Directorio
Borra un archivo rm Borra un archivo rm bad.txt
o directorio -r borrado recursivo (uso para rm –r Directorio
directorios).
-d remueve directorios vacíos.
Copia un archivo o cp -r copia recursiva cp a.txt b.txt
directorio -u copia sólo si la fuente es más cp –r Dira Dirb
nueva que la de destino o el destino
está perdido.
-v copia verbosa (muestra salida).
Mueve un archivo mv -i avisa antes de sobreescribir mv a.txt b.txt
o directorio -r para directorios. mv –r Dira Dirb
Crea un archivo touch Crea un archivo vacío o actualiza la touch c.txt
vacío fecha de modificación de un
archivo existente.
Ver contenido de more Ve el contenido de un archivo. Usa more a.txt
un archivo la tecla “espacio” para ver la
siguiente página.
Muestra cal Despliega el calendario cal 01 2016
calendario
Borra la terminal clear Borra todo el contenido clear
desplegado sobre la terminal

Tabla 1.7 Algunos atajos para ahorrar tiempo en la terminal de Linux.

ATAJOS DESCRIPCIÓN
Flecha Up Da el último comando que se tecleó y después los comandos previos.
Tecla Tab Auto completa el nombre de un archivo, nombre de un directorio, o el nombre de
comando ejecutable.
Ctrl+A Lleva de regreso al inicio de la línea que se está tecleando.
Crtl+E Lleva al final de la línea que se está tecleando.
Ctrl+U Borra e inicia la línea (Ctrl+E y después Ctrl+U).

35
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Ctrl+L Borra la pantalla.


Ctrl+C Mata cualquier proceso que se está ejecutando.
Ctrl+Z Pone el proceso actual en Background. Tecleando bg deja el proceso corriendo en
background y tecleando fg lleva el proceso a su estado original.

En la Figura 1.25 se muestra un ejemplo del uso de los comandos básicos de Linux.
Físicamente desconectar la alimentación del BBB lleva al kernel a desmontar el eMMC o la
SD Card y puede causar corrupción en el sistema de archivo. El chip de manejo de potencia
del BBB necesita ser informado que será apagado. Para lo anterior, hay importantes puntos
acerca de cómo apagar, reiniciar e iniciar el BBB.

Fig. 1.25 Ejemplo del uso de comandos básicos de Linux.

 Tecleando shutdown –h now apaga la plataforma correctamente. Se puede


retardar por 5 minutos el apagado tecleando shutdown –h +5.
 Tecleando reboot se reseteará y reiniciará la plataforma correctamente.
 Se puede presionar el botón de encendido S3 una vez para apagar la plataforma
correctamente (ver Figura 1.1).
 Mantener el botón de encendido por aproximadamente 8 segundos realiza un
apagado duro. Esto debe ser evitado a menos que el BBB este congelado y no se
pueda apagar por los métodos anteriores.
 Presionando el botón de encendido inicializa la plataforma. Trata de evitar
físicamente desconectar y reconectar el Jack de alimentación o cable USB.
Si se está diseñando un prototipo cerrado y se necesita un botón de apagado
externo, es posible alambrar un botón externo al BBB usando una entrada GPIO y escribir
un Shell script que correrá al inicio para sondear la entrada del GPIO. Si esa entrada se activa
entonces /sbin/shutdown –h now será llamado directamente.

36
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

1.2.5.2 Sistema de Archivo Linux


Linux usa estructuras de datos, llamadas inodos, para representar objetos del
sistema de archivo, tal como archivos y directorios. Cuando un sistema de archivo extendido
Linux (por ejemplo, ext3/ext4) es creado sobre un disco físico, se crea una tabla inodo. Esta
tabla enlaza a una estructura de datos inodo por cada archivo y directorio que hay sobre el
disco físico. La estructura de datos inodo de cada archivo y directorio almacena información
tal como los atributos de permisos; apuntadores a ubicaciones de bloque del disco físico;
estampas de tiempo; y enlaza cuentas. Un ejemplo sobre lo anterior se puede ver tecleando
ls –ail |grep nuevo, donde i causa que ls despliegue el índice inodo. La terminal
en este caso muestra:
root@beaglebone:~# ls –ail |grep nuevo
34800 drwxr-xr-x 2 root root 4096 Apr 23 2014 nuevo
Por lo tanto, 34800 es el índice inodo del directorio /nuevo. Si se ingresa al
directorio /nuevo usando cd, se crea temporalmente un archivo (.) que tiene el mismo
índice inodo del directorio (ver tecleando ls -ail). También se puede ver el índice inodo
del directorio root (..) y del archivo SONGS.txt.
La Figura 1.26 muestra varios conceptos cuando se trabaja con archivos bajo Linux.
La primera letra indica el tipo de archivo. Por ejemplo, si la letra en una d es un directorio,
l un enlace simbólico o – un archivo regular. Hay también otros tipos de archivos oscuros,
c para carácter especial, b para bloque especial, p para FIFO, y s para socket. Los directorios
y archivos regulares no necesitan una profunda explicación, sin embargo, los enlaces
simbólicos necesitan atención especial.

Fig. 1.26 Listado de directorio de Linux y permisos de archivo.

37
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Hay dos tipos de enlaces en Linux, enlace suave y enlace duro. Un enlace suave (o
enlace simbólico) es un archivo que refiere a la ubicación de otro archivo o directorio. Los
enlaces duros, a la inversa, enlazan directamente al índice inodo, pero ellos no pueden ser
enlazados a un directorio. Se puede crear un enlace usando ln /path/to/file.txt
linkname. Se crea un enlace simbólico agregando –s a la llamada. Para mostrar su uso,
el ejemplo mostrado en la Figura 1.27 crea un enlace suave y un enlace duro para el archivo
/test/hola.txt.

Fig. 1.27 Ejemplo de cómo crear enlaces suaves y enlaces duros.

Se puede ver en la figura que hay un número 2 enfrente del archivo hola.txt (después
de los permisos de archivo). Este es el número de enlaces duros que están asociados con el
archivo. Este es un valor contador que fue incrementado por uno cuando el enlace duro,
llamado “hardlink”, fue creado. Si se fuera a borrar el enlace duro (usando rm hardlink)
este contador se decrementa a 1. Para ilustrar la diferencia entre ambos enlaces considera
la Figura 1.28 donde se agrega cualquier texto al archivo “hola.txt”.

Fig. 1.28 Ejemplo de cómo funcionan los enlaces suaves y enlaces duros.

38
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Con el comando echo se agrega el texto “Probando Enlaces” al archivo hola.txt. Se


puede observar que cuando se mueve el archivo hola.txt al subdirectorio, el enlace suave
se rompe, pero el enlace duro aun trabaja perfectamente. Por lo tanto, los enlaces
simbólicos no son actualizados cuando el archivo enlazado es movido, a diferencia de los
enlaces duros que siempre refieren a la fuente, aun si son movidos o removidos. Sólo para
ilustrar el último punto, el archivo hola.txt puede ser removido del directorio usando lo
siguiente:
root@beaglebone:/test# rm subdirectorio/hola.txt
root@beaglebone:/test# more hardlink
Probando Enlaces
Se puede ver que este enlace todavía existe y no será borrado hasta que se borre el
enlace duro llamado “hardlink”, decrementando el contador de enlace a 0. Por lo tanto, si
un archivo o directorio tiene un contador de enlace duro de 0, y este no está siendo usado
por un proceso, este será borrado. En efecto, el nombre de archivo por sí mismo, hola.txt,
es un enlace duro. Para terminar la discusión de la Figura 1.26, el ejemplo en la figura tiene
22 enlaces duros al archivo. Para un directorio esto representa el número de subdirectorios,
el directorio padre (..) y el mismo (.). La entrada está en posesión de root y está en el grupo
root. La siguiente entrada de 4096 es el tamaño requerido para almacenar los metadatos
sobre los archivos contenidos en ese directorio.
Los permisos del sistema de archivo establecen que niveles de acceso se tienen para
un archivo o directorio. El comando cambio de modo chmod permite al usuario cambiar los
permisos de acceso para objetos del sistema de archivo. Se pueden especificar los permisos
de una manera relativa, es decir, chmod a+w test.txt, podría dar acceso de escritura
a todos los usuarios para el archivo test.txt, pero dejar todos los otros permisos iguales. Se
puede también aplicar los permisos de una manera absoluta, es decir, chmod a=r
test.txt, que pone a todos los usuarios con permisos de sólo lectura para el archivo
test.txt. La Tabla 1.4 muestra algunos ejemplos trabajando con usuarios, grupos y permisos.
El siguiente ejemplo mostrado en la Figura 1.29 muestra como modificar los permisos del
sistema de archivo de un archivo usando el comando chmod. El ejemplo consiste en accesar
primero a la cuenta alainmm mediante el comando su, después, se cambia al directorio
raíz para ver con el comando ls –l los permisos del archivo test.txt. El archivo test.txt por
default tiene los permisos -rw-r--r-- lo cual significa que sólo los usuarios tienen
acceso de lectura y escritura, y en grupos y otros sólo acceso a lectura para ese archivo.
Para cambiar los permisos del archivo es necesario usar el comando sudo ya que se está
trabajando desde la cuenta alainmm y no se tienen permisos de administrador. En este
ejemplo se muestra tres formas diferentes de cambiar los permisos de grupo del archivo
test.txt, que por default están en sólo lectura a lectura/escritura.

39
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 1.29 Ejemplo de cómo usar chmod en sus diferentes formas.

Explorar el sistema de archivo puede desanimar a un principiante en Linux. Si se va


al directorio raíz usando el comando cd / sobre el BBB y se teclea ls, se mostrará la
estructura del sistema de archivo, tal como se muestra en la Figura 1.30.

Fig. 1.30 Estructura del directorio raíz del BBB.

Cada uno de estos directorios tiene un papel y si se entiende para que sirve cada
uno de ellos, entonces se puede empezar a conseguir una idea de dónde buscar archivos de
configuración o archivos binarios que se requieran. La Tabla 1.8 brevemente describe el
contenido de cada subdirectorio del sistema de archivo de Linux.
Tabla 1.8 Subdirectorios del directorio raíz de Linux.

DIRECTORIO DESCRIPCIÓN
bin Contiene los ejecutables binarios usados por todos los usuarios y está presente en la
variable de entorno PATH por default. Otro directorio, /usr/bin, contiene ejecutables
que no están enfocados para arrancar o reparar el sistema.
boot Contiene los arboles de dispositivos binarios para el BBB.
dev Contiene los nodos de dispositivo (enlazados al driver de dispositivos).
etc Archivos de configuración para el sistema local.

40
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

home Los directorios home de usuario (/home/root puede ser el home del usuario root).
lib Contiene las librerías del sistema estándar.
lost+found Después de correr fsck (checar sistema de archivo y reparar) los archivos desenlazados
aparecerán aquí. El comando mklost+found recreará el directorio lost+found si
éste es borrado.
media Usado para montar medios removibles, tal como tarjetas micro SD.
mnt Usado para montar sistemas de archivo temporalmente.
opt Un buen lugar para instalar paquetes de software opcional (no sobre el núcleo de Linux).
proc Este es una representación de archivo virtual de procesos ejecutándose sobre el BBB (por
ejemplo, si se va dentro de /proc y se teclea cat iomen se pueden ver las direcciones
mapeadas de memoria.).
root El directorio home de la cuenta root bajo la distribución de Debian. Esto es
/home/root sobre otras distribuciones.
run Proporciona información acerca del sistema ejecutándose desde el último arranque.
sbin Contiene ejecutables para el manejo del sistema de usuario root (súper usuario).
selinux Bajo Debian, relacionado a la seguridad - Sistema de control Linux mejorado.
srv Almacena datos relacionados a ftp, servidores web, rsync, etc.
sys Directorio que contiene un sistema de archivo virtual que describe los sysfs del sistema.
tmp Ubicación de archivos temporales. Ver la nota sobre el bit t.
usr Contiene programas de aplicación para todos los usuarios y muchos subdirectorios tales
como /usr/include (C/C++ archivos de cabecera), /usr/lib (C/C++ archivos de
librerías), /usr/src (C/C++ fuente del kernel de linux), /usr/bin (ejecutables de
usuario), /usr/local (similar a /usr pero para usuarios locales) y /usr/share
(archivos compartidos y medios entre usuarios).
var Contiene archivos de variables tal como logs del sistema.

1.2.5.3 Comandos para el Sistema de Archivo


Hay comandos para trabajar sobre el sistema de archivo, los primeros que se van a
examinar son los comandos df (disk free) y mount. El comando df ofrece una visión
general del sistema de archivo del BBB. Si se agrega la opción –T, también se listan los tipos
de sistema de archivos.
El comando df es muy útil para determinar cuánto espacio en el disco hay; se puede
ver en la Figura 1.31 que el sistema de archivo root tiene usado el 49%, con 1745MB
disponibles para instalaciones adicionales. El sistema de archivo rootfs está listado con
un segundo nombre /dev/disk/by-uuid/…, mostrando que es un sistema de archivo
extendido ext4 que soporta tamaño de discos grandes. También, se listan varios sistemas
de archivos temporales (tmpfs) que actualmente refieren a sistemas de archivos virtuales,
que son mapeados a la memoria DDR3 del BBB. La entrada /dev/mmcblk0p1 tiene una
partición de sistema de archivo VFAT (73MB usados) sobre eMMC del BBB. Este es el
sistema de archivo VFAT que aparece cuando se conecta el BBB en el puerto USB de una
computadora. Se puede ver que este sistema de archivo está montado sobre
/boot/uboot. Se puede usar el comando cd para listar el contenido (cd
/boot/uboot) de este sistema de archivo, el cual fue mostrado en la Figura 1.2.

41
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 1.31 Lista de los Sistemas de archivo sobre el BBB.

El comando de dispositivos de bloque de lista, lsblk, suministra una lista concisa


de los dispositivos de bloque, tal como el eMMC y la SD Card, en una estructura como de
árbol. Se puede ver en la Figura 1.32 que mmcblkl (el eMMC) ha sido particionado en dos
particiones: p1, que esta adjunta a /boot/uboot, y p2, que esta adjunto a la raíz del
sistema de archivo. /mmcblklboot0 y 1 son las particiones de arranque de eMMC que
son requeridas para MLO y U-Boot.

Fig. 1.32 Despliegue del comando de dispositivos de bloque de lista.

El comando mount proporciona con información adicional sobre el sistema de


archivo. Tecleando mount –l da información detallada del sistema de archivo (-l con
etiquetas). La Tabla 1.9 describe algunos comandos del sistema de archivo que se pueden
usar para manejar el sistema de archivo.
Tabla 1.9 Comandos útiles para el sistema de archivo.

COMANDOS DESCRIPCIÓN
du –h /opt Uso del disco, encuentra cuanto espacio un árbol de directorio usa.
du –hs /opt/* Opciones: (-h) forma leíble humana; (-s) resumen; (-c) total. El
du –hc *.jpg
último comando encuentra el tamaño total de los archivos formato
jpg en el directorio actual.

df –h Despliega espacio de disco del sistema (-h) en forma leíble.


lsblk Dispositivos de bloque de lista.
dd if=test.img dd convierte y copia un archivo, donde if es el archivo de entrada y
of=/dev/mmcblkX of es el archivo de salida. Se puede usar este comando bajo Linux para
dd if=/dev/mmcblkX
of=test.img escribir una imagen en la SD Card. Esto es usado es una computadora
corriendo Linux de la siguiente forma:
sudo dd if=./BBB*.img of=/dev/sdx
donde /dev/sdx es la SD Card de lectura/escritura.

42
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

cat /proc/partitions Lista todas las particiones registradas.


mkfs /dev/mmcblkXpX Hace un sistema de archivo Linux. Ver también mkfs.ext4 y
mkfs.vfat.
fdisk –l Notar que fdisk puede ser usado para manejar discos, crear
particiones, borrar particiones, etc. fdisk –l despliega todas las
particiones existentes.
badblocks /dev/mmcblkX Checa por bloques malos sobre la SD Card. Las SD Cards tienen una
circuitería de controlador de nivel débil. Si se tienen errores, es
necesario adquirir una nueva SD Card. No grabar sobre ellas usando
fsck. Correr este comando con permisos root y ten cuidado de
tomar el tiempo necesario para correrlo.
mount /media/store Esto montará una partición si esta esta listada en /etc/fstab.
umount /media/store Desmontará una partición. Se informará si un archivo está abierto
sobre esta partición.

En capítulos posteriores será necesario editar el archivo uEnv.txt que es


necesario para arrancar el BBB. Para editar este archivo se necesita tener acceso a la
partición eMMC del BBB. A continuación, se muestran los pasos para hacer la edición de
este archivo.
Después de arrancar el BBB con la imagen del OS que esta sobre la SD Card
(oprimiendo el botón S3 hasta que los LEDS parpadeen) teclear lo siguiente:
debian@arm:~$ cd /mnt
debian@arm:~$ sudo mkdir vfat
debian@arm:~$ sudo mount /dev/mmcblk1p1 /mnt/vfat
debian@arm:~$ cd /mnt/vfat
debian@arm:~$ ls
debian@arm:~$ sudo nano uEnv.txt
debian@arm:~$ sudo shutdown –h now
Finalmente remover la SD Card y arrancar el BBB normalmente. Otro ejemplo del
uso de los comandos anteriores se muestra a continuación. Este ejemplo consiste en
montar una SD Card como medio de almacenamiento adicional sobre el BBB. En este paso
los siguientes pasos son llevados a cabo:

 Montar una SD Card sobre el BBB como medio de almacenamiento removible


adicional.
 Formatear el sistema de archivo para ser un sistema de archivo ext4 de Linux.
 Montar la SD Card como /media/store.
 Checar cuanto almacenaje está disponible sobre la SD Card.
La SD Card debe colocarse en el BBB después de que éste ha arrancado. Las Figuras
1.33, 1.34, 1.35 y 1.36 muestran los comandos tecleados para llevar a cabo este ejemplo.

43
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 1.33 Uso del comando mount. El dispositivo montado en el slot del BBB está identificado por
BEAGLEBONE (ver la línea /dev/mmcblk1p1/ on /media/BEAGLEBONE…).

Fig. 1.34 Uso del comando mkfs.ext4 para crear un medio de almacenamiento sobre el BBB.

44
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 1.35 Montaje del nuevo medio de almacenamiento. El sistema de archivo montado es de tipo extendido.
Se utiliza –t para indicar el tipo de archivo a montar.

Fig. 1.36 Ejemplo para mostrar el tamaño disponible de almacenamiento. En este ejemplo el espacio
disponible es de 84MB.

El comando find es muy útil para buscar en una estructura de directorio un archivo
particular. Teclear man find para mostrar una lista completa de comandos. Por ejemplo,
usar lo siguiente para encontrar el archivo de cabecera iostream en algún lugar del
sistema de archivo del BBB.
root@beaglebone:~# cd /
root@beaglebone:~# find –name iostream*
./usr/include/c++/4.6/iostream

45
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Usando –iname en lugar de –name ignora letras minúsculas y mayúsculas en la


búsqueda del nombre. Por ejemplo, los siguientes comandos encuentran archivos con la
extensión .gz que fueron modificados en las últimas 24 horas.
root@beaglebone:~# find –ctime 1 –iname *.gz
El comando whereis es diferente en que éste puede ser usado para buscar por un
código fuente binario y paginar manualmente por un programa.
root@beaglebone:~# whereis find
find: /usr/bin/find /usr/bin/X11/find /usr/share/man/man1/find.1.gz

En este caso, el comando binario está en /usr/bin/ (X11 es un enlace simbólico


al directorio actual) y la página del manual está en /usr/share/man/man1
(almacenado en una forma gzip para ahorrar espacio).
El comando more ha sido usado varias veces a lo largo de este tutorial y ya se tiene
cierto conocimiento de su uso. Éste te permite ver un archivo grande o un flujo de salida,
una página a la vez. Por lo tanto, para ver la longitud de un archivo se puede teclear more
filename. Por ejemplo, hay un archivo “log” /var/log/dmesg que contiene todos los
mensajes de salida del kernel. Sin embargo, si se quiere mantener conciso el despliegue,
usar -5 para colocar la longitud de la página a 5 renglones.
root@beaglebone:~# more -5 /var/log/dmesg
Se puede paginar a través del contenido usando la barra de espacio y usar la tecla
“Q” para salir. Hay un comando llamado less que se puede accesar tecleando,
root@beaglebone:~# less /var/log/dmeg
Este comando da una vista interactiva usando el teclado; se pueden usar las teclas
de flecha para moverte hacia arriba y abajo del texto. Hay demasiadas opciones por listar;
sin embargo, por ejemplo, se puede paginar hacia abajo usando la barra de espacio, buscar
por una cadena tecleando / (por ejemplo, teclear /usb para encontrar mensajes
relacionados a dispositivos USB) y entonces presionar la tecla n para ir al siguiente “match”
y la tecla N para ir al anterior “match”.
1.2.5.4 Otros Comandos de Linux
Cuando se está usando la terminal de Linux y se teclean comandos de Linux tal como
date, la salida de estos comandos es enviada a la salida estándar. Como resultado, la salida
es desplegada en la terminal Windows. Es posible redireccionar la salida a un archivo
usando los símbolos de redirección > y >>. El último símbolo se ha usado para agregar texto
a archivos temporales. El símbolo > puede ser usado para enviar la salida a un nuevo
archivo. Por ejemplo,
root@beaglebone:~# cd /tmp

46
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

root@beaglebone:/tmp# date > a.txt


root@beaglebone:/tmp# more a.txt
Sat Jan 16 11:56:59 CST 2016
root@beaglebone:/tmp# date >> a.txt
root@beaglebone:/tmp# more a.txt
Sat Jan 16 11:56:59 CST 2016
Sat Jan 16 11:57:15 CST 2016
El símbolo >> indica que se quiere añadir la salida al archivo. La entrada estándar
usando el símbolo < trabaja por mucho igual de la misma manera. La –e habilita el análisis
de caracteres de escape, tal como el carácter retorno (\n), por ejemplo:
root@beaglebone:/tmp# echo -e “dog\ncat\nfish\nbird” > animals.txt

root@beaglebone:/tmp# sort < animals.txt


bird
cat
dog
fish
Se pueden combinar las operaciones de redirección de entrada y salida. Usando el
mismo archivo animals.txt se pueden realizar operaciones tales como:
root@beaglebone:/tmp# sort < animals.txt > sorted.txt
Para las tuberías (pipes) simplemente poner (|) lo cual permite conectar comandos
de Linux juntos. Tal como se redirecciona la salida a un archivo, se puede redireccionar la
salida de un comando dentro de la entrada de otro comando. Por ejemplo, para listar el
directorio raíz (de cualquier parte del sistema) y enviar (una tubería) la salida dentro del
comando sort, donde éste está programado para mostrar el contenido del directorio en
orden de reversa (-r), usar lo siguiente:
root@beaglebone:/# ls / | sort -r
Se pueden encontrar cuales instalaciones de usuario en el directorio /opt están
ocupando la mayoría del espacio del disco. du proporciona el disco usado. Pasando el
argumento –d1 significa sólo listar los tamaños de un nivel abajo del nivel del directorio
actual y –h significa listar los valores en una forma humanamente leíble. Se puede usar una
tubería para esta salida dentro del comando sort para hacer un ordenamiento numérico
en orden inverso (el más grande en la parte de arriba). Por lo tanto, para este ejemplo
teclear lo siguiente:
root@beaglebone:/# cd /opt

47
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

root@beaglebone:/opt# du –d1 –h | sort -nr


Hay una herramienta más útil llamada tee que permite tanto redireccionar una
salida a un archivo y pasar este en el siguiente comando en la tubería (es decir, almacenar
y ver). Usando los ejemplos anteriores, si se quiere enviar una salida no ordenada de du a
un archivo pero desplegando una salida ordenada, se puede teclear lo siguiente:
root@beaglebone:/opt# du –d1 –h | tee /tmp/unsorted.txt | sort -nr

Se puede usar tee para escribir la salida a varios archivos al mismo tiempo, tal como
se muestra a continuación:
root@beaglebone:/opt# du –d1 –h | tee /tmp/1.txt /tmp/2.txt
Hay comandos de filtro, donde cada uno proporciona una función útil. Por ejemplo:

 sort: Este comando tiene varias opciones, incluyendo (-r) ordena en reversa, (-
f) ignora caso, (-d) usa ordenamiento de diccionario, ignorando puntación, (-n)
ordena numéricamente, (-b) ignora espacios en blanco, (-i) ignora caracteres de
control, (-u) despliega líneas duplicadas sólo una vez, y (-m) une múltiples entradas
en una sola salida.
 wc (contador de palabras): Este comando puede ser usado para calcular el número
de palabras o caracteres en un flujo. Por ejemplo:
root@beaglebone:/tmp# wc < animals.txt
Se puede usar (-l) para contar las líneas, (-w) para contar palabras, (-m) para
contar caracteres y (-c) para contar bytes.

 head: Despliega las primeras líneas de la entrada. Este comando es útil si se tiene
un archivo muy grande o el flujo de información, y si se quiere examinar sólo unas
pocas primeras líneas. Por default éste desplegará las primeras 10 líneas. Se puede
especificar el número de líneas usando la opción –n. Por ejemplo, para conseguir
las primeras cinco líneas de salida del comando dmesg (despliega mensajes o
mensajes de driver) cual despliega el buffer de mensaje del kernel, se puede usar lo
siguiente:
root@beaglebone:/tmp# dmesg | head –n5
 tail: Este comando se usa como head excepto que este despliega las últimas
líneas de un archivo o flujo. Usando este comando en combinación con dmesg
proporciona una salida útil, tal como se muestra a continuación:
root@beaglebone:/tmp# dmesg | tail –n2
 grep: Es un poderoso comando que puede analizar líneas usando texto y
expresiones regulares. Se puede usar este comando para filtrar la salida con las
opciones, (-i) ignorar caso, (-m 5) detener después de cinco “matches”, (-q)
silencioso, saldrá con regreso de estado 0 o si cualquiera de los “matches“ es
encontrado, (-e) especifica un patrón, (-c) imprime un contador de “matches”, (-

48
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

o) imprime sólo el texto igual, y (-l) lista los nombres de archivo del archivo
conteniendo el “match”. Por ejemplo, lo siguiente examina la salida de dmesg para
las primeras tres ocurrencias de la cadena “usb”, usando –i para ignorar el caso:
root@beaglebone:/# dmesg | grep –i –m3 usb
Se pueden combinar tuberías juntas, por ejemplo, para conseguir la misma exacta
salida mediante el uso de head y desplegar sólo las primeras tres líneas de la salida
grep como sigue:
root@beaglebone:/tmp# dmesg |grep –i usb | head –n3
 xargs: Es un comando muy poderoso que habilita la construcción de una lista de
argumentos que se pueden usar para llamar a otro comando o herramienta. En los
siguientes ejemplos, un archivo de texto “args.txt” que contiene tres cadenas es
usado para crear tres nuevos archivos. La salida de cat es hilada a xargs, donde
éste pasa las tres cadenas como argumentos al comando touch, creando tres
nuevos archivos a.txt, b.txt y c.txt:
root@beaglebone:/# echo “a.txt b.txt c.txt” > args.txt
root@beaglebone:/# cat args.txt | xargs touch
root@beaglebone:/# ls
a.txt args.txt b.txt c.txt
El comando echo simplemente repite una cadena, salida de un comando, o un valor
a la salida estándar. A continuación se muestran algunos ejemplos:
root@beaglebone:/# echo ‘hola’
hola
root@beaglebone:/# echo “Hoy es $(date)”
Hoy es Sun Jan 17 11:51:42 CST 2016
root@beaglebone:/# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
En el primer caso, una simple cadena es repetida. En el segundo caso, las “ ” están
presentes cuando un comando se emite dentro de la llamada echo, y en el último caso la
variable de entorno PATH es repetida. El comando echo también habilita para ver estados
de salida de un comando usando $?. Por ejemplo:
root@beaglebone:/# date
Sun Jan 17 11:51:42 CST 2016
root@beaglebone:/# echo $?
0
root@beaglebone:/# ls /madeupdirectory
root@beaglebone:/# echo $?

49
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

ls: cannot access /madeupdirectory: No such file or directory


El estado de salida para date es 0 para una llamada exitosa y 2 para un directorio
que no existe. El comando cat (concatenación) habilita para unir dos archivos juntos en la
línea de comandos. Los siguientes ejemplos usan echo para crear dos archivos a.txt y b.txt;
el comando cat concatena los archivos para crear un nuevo archivo c.txt. Se necesita usar
–e si se quiere habilitar la interpretación de los caracteres de escape en la cadena que está
siendo pasada al comando echo. Por ejemplo, “\n” agrega una nueva línea a la salida.
root@beaglebone:/# cd /tmp
root@beaglebone:/tmp# echo “hello” >> a.txt
root@beaglebone:/tmp# echo –e “to\nthe\nworld” >> b.txt
root@beaglebone:/tmp# cat a.txt b.txt >> c.txt
root@beaglebone:/tmp# more c.txt
hello
to
the
world
El comando diff habilita para fácilmente encontrar las diferencias entre dos
archivos. Esto proporciona una salida muy básica.
root@beaglebone:/# echo –e “dog\nfish\nbird” > a.txt
root@beaglebone:/# echo –e “dog\nshark\nbird” > b.txt
root@beaglebone:/# diff a.txt b.txt
2c2
< fish
---
> shark
El valor 2c2 en la salida indica que la línea 2 en el primer archivo cambio en la línea
2 del segundo archivo, y el cambio es que “fish” cambio a “shark”. El carácter a puede
significar “añadido” y el carácter d podría significar “borrado”. Para una comparación “lado
a lado” se puede usar:
root@beaglebone:/# diff –y –W80 a.txt b.txt
dog dog
fish |shark
bird bird

50
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

donde –y habilita la vista lado a lado y –W80 establece el ancho del despliegue a 80
caracteres.
El comando tar es una utilidad de archivado que habilita para combinar archivos y
directorios en un solo archivo (como un archivo zip descomprimido). Este archivo puede
entonces ser comprimido para ahorrar espacio. Para archivar y comprimir un directorio de
archivos, usar lo siguiente:
root@beaglebone:/# tar cvfz newArchiveName.tar.gz /tmp
donde (c) significa nuevo archivo, (v) significa lista de archivos verboso, (z) significa
comprimir con zip, y (f) significa archivar nombre seguido. También se pueden tener
.tar.gz representado como .tgz. Ver la Tabla 1.10 para más ejemplos.
Tabla 1.10 Ejemplos básicos para el uso del comando tar.

COMANDO DESCRIPCIÓN
tar cvfz name.tar.gz Comprime con formato zip.
tar cvfj name.tar.bz2 Comprime con compresión bzip2 (Tarda más la acción, pero
genera un archivo más pequeño).
tar xvf name.tar.gz Descomprime un archivo gzip (x indica extraer). Este
detectará automáticamente el tipo de compresión.
tar xvf name.tar /dir/filename Descomprime un solo archivo a partir de un archivo.
Trabaja para un solo directorio también. Usar z y j como
se requiera.
tar rvf name.tar filename Agrega otro archivo al archivo.
tar cfz name-$(date +%d%m%y).tar.gz Crea un archivo con la fecha actual. Muy útil para scripts y
/dir/filename
backups. Nota habrá que usar un espacio entre date y
+%d%m%y.

El comando md5sum habilita para checar el código hash, para verificar que los
archivos no hayan sido corrompidos maliciosamente o accidentalmente en tránsito. En el
siguiente ejemplo, la herramienta wavemon es descargada como un paquete .deb, pero
sin instalar. El comando md5sum puede ser usado para generar el md5 checksum.
root@beaglebone:/# apt-get download wavemon
Get:1 Downloading wavemon 0.7.5-3 [52.1 kB]
Fetched 52.1 kB in 0s (66.7 kB/s)
root@beaglebone:/# ls
wavemon_0.7.5-3_armhf.deb
root@beaglebone:/# md5sum wavemon_0.7.5-3_armhf.deb
f70117682d2b148b11514337a622eb4c wavemon_0.7.5-3_armhf.deb
Se puede ahora checar este checksum contra el checksum oficial para asegurarse
que se tiene un archivo válido que no ha sido manipulado. Desafortunadamente, es difícil

51
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

encontrar el checksum de un paquete online. Si este paquete fue instalado previamente el


checksum para wavemon está en /var/lib/dpkg/info/wavemon.md5sums.
1.2.6 VARIABLES DE ENTORNO
Las variables de entorno son valores nombrados que describen la configuración del
ambiente Linux, tal como la ubicación de archivos ejecutables o el editor por default. Para
tener una idea de las variables de entorno que son puestas sobre el BBB, emite una llamada
env, cual proporciona una lista de las variables de entorno de la cuenta. Aquí, env es
llamada sobre la imagen Debian del BBB. En la Figura 1.37 se muestran las variables de
entorno sobre el BBB cuando se teclea el comando env en la terminal.

Figura 1.37 Variables de entorno sobre el BBB.

Se pueden ver y modificar las variables de entorno de acuerdo al siguiente ejemplo,


donde se agrega el directorio /root a la variable de entorno PATH:
root@beaglebone:/# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
root@beaglebone:/# export PATH=$PATH:/root
root@beaglebone:/# echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root

Este cambio se perderá al reiniciar el BBB. Para ajustar permanentemente las


variables de entorno se requieren modificaciones al archivo .profile cuando se usa sh,
ksh, o bash shells, y al archivo .login cuando se usa csh o tcsh shells. Para hacer esto se
necesita realizar la edición de estos archivos en la terminal de Linux.
Para editar un archivo hay una variedad de editores disponibles, pero quizá uno de
los más fáciles de usar y también de los más poderosos para usuarios nuevos es el GNU
nano editor. Se puede empezar el editor tecleando nano seguido por el nombre de un
archivo existente o un nuevo archivo; por ejemplo, tecleando nano hola.txt
desplegará el contenido del archivo. Tecleando nano –c hola.txt desplegará también
los números de línea, que son muy útiles cuando se depurar el código de un programa. Se

52
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

puede mover libremente alrededor del archivo en la ventana usando las teclas de flecha y
editar o escribir texto en la ubicación del cursor. En la parte inferior se pueden ver algunas
teclas para atajos del editor, pero hay muchos más, los cuales se presentan en la Tabla 1.11.
Tabla 1.11 Referencia rápida del editor nano.

TECLAS COMANDO TECLAS COMANDOS


Ctrl+G Ayuda Ctrl+Y Página anterior
Ctrl+C Cancelar Ctrl+_ Ctrl+/ Ir al número de línea
Ctrl+X Salir Alt+/ Ir al final del archivo
Ctrl+L Permite el ajuste de línea larga Ctrl+6 Empezar a marcar texto
Ctrl+O Guardar Ctrl+K o Alt+6 Cortar el texto marcado
Flechas Moverse alrededor del archivo Ctrl+U Pegar texto
Ctrl+A Ir al empiezo de la línea Ctrl+R Insertar contenido de otro
archivo.
Ctrl+E Ir al final de la línea Ctrl+W Buscar por una cadena
Ctrl+Space Palabra siguiente Alt+W Encontrar siguiente
Alt+Space Palabra anterior Ctrl+D Borrar carácter bajo cursor
Ctrl+V Página siguiente Ctrl+K Borrar línea entera

1.2.7 MANEJO DE PAQUETES


Un manejador de paquete es un conjunto de herramientas de software que
automatizan el proceso de instalar, configurar, actualizar y remover paquetes de software
del sistema operativo Linux. Diferentes distribuciones de Linux usan diferentes
manejadores de paquetes: Angstrom usa OPKG, Ubuntu y Debian usan APT sobre DPKG y
Arch Linux usa Pacman. Cada uno tiene su propia sintaxis de uso, pero sus operaciones son
similares. Por ejemplo la primera columna de la Tabla 1.12 lista los comandos para instalar
un paquete usando diferentes manejadores. La tabla también lista otros comandos de
manejo de paquetes que pueden ser usados. Por ejemplo, wavemon es una herramienta
útil para configurar una conexión WIFI. Si se ejecuta el comando wavemon se verá que el
paquete no está instalado.
Para el caso de usar Debian se usa el manejador de paquetes específico para este
OS para instalar paquetes, una vez que se determina cual paquete será instalado, ejemplo:
root@beaglebone:/# apt-cache search wavemon
wavemon – Wireless Device Monitoring Application
root@beaglebone:/# apt-get install wavemon
Reading package list...Done...
Setting up wavemon (0.7.5-3)...
...

53
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Tabla 1.12 Comandos de manejo de paquetes comunes usando nano como ejemplo.

COMANDO ANGSTROM DEBIAN/UBUNTU


Instalar un paquete opkg install nano sudo apt-get install nano

Actualizar el índice del opkg update sudo apt-get update


paquete
Actualizar los paquetes sobre opkg upgrade sudo apt-get upgrade
el sistema.
¿Está nano instalado? opkg list-installed |grep nano dpkg-query –l |grep nano

Es un paquete conteniendo la opkg list|grep nano apt-cache search nano


cadena nano disponible
Conseguir más información opkg info nano apt-cache show nano
apt-cache policy nano
sobre un paquete
Conseguir ayuda opkg apt-get help

Bajar un paquete del opkg download nano sudo apt-get download nano
directorio actual
Remover un paquete opkg remove nano sudo apt-get remove nano

Borrar un paquete antiguo opkg-clean script sudo apt-get clean

1.2.8 PROCESOS DE LINUX


Un proceso es una instancia de un programa que se está corriendo en el OS. Es
necesario ser capaz de manejar los procesos que se están corriendo sobre el BBB,
entendiendo los procesos de primer plano y segundo plano, y matar un proceso que llega a
ser bloqueado.
El comando ps lista los procesos que están corriendo actualmente sobre el BBB. En
la Figura 1.38 se muestran dos procesos corriendo al teclear el comando ps, el proceso
bash Shell con ID (PID) de proceso de 1210 y el comando por sí mismo ps, que está
corriendo con el PID 4212. El PID de ps es diferente cada vez que se corre este comando.

Fig. 1.38 Procesos corriendo sobre el BBB.

Para ver cada proceso que está corriendo sobre el sistema, usar ps ax. En el
siguiente ejemplo (ver Figura 1.39), se usa un comando de filtro para buscar por la cadena
“apache” para descubrir información sobre el proceso del servidor apache que se está
corriendo sobre el BBB. Interesantemente, apache2 aparece cuatro veces, significando
que hay cuatro diferentes procesos corriendo por el servidor web, permitiendo con esto
manejar múltiples conexiones simultaneas.
Linux es un OS multitarea que permite correr procesos en segundo plano mientras
se usa un programa que se está ejecutando en primer plano. Este concepto es similar a la

54
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

conducta de un sistema por ventanas como Windows. Por ejemplo, el reloj del sistema
continuara actualizando el tiempo mientras se está usando un buscador web.

Fig. 1.39 Información sobre el proceso del servidor apache.

Lo mismo se cumple para aplicaciones que corren en una terminal. Para demostrar
esto, considera el pequeño segmento de código C que despliega “Hola Mundo” cada cinco
segundos en una terminal Linux (ver Figura 1.40). Se puede crear el archivo usando el
comando nano hola.c.

Fig. 1.40 Uso del comando nano para escribir un programa en lenguaje C.

Después de guardar el archivo hola.c, éste puede ser compilado tecleando el


comando gcc, tal como se muestra en la Figura 1.41 (-o especifica el nombre de archivo
ejecutable).

Fig. 1.41 Ejemplo de cómo compilar un código escrito en lenguaje C.

55
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Si todo va bien, ahora se tendrá el archivo fuente y el programa ejecutable llamado


hola (notar que la bandera x esta puesta). El archivo ejecutable puede ser corrido
tecleando ./hola, tal como se muestra en la Figura 1.42.

Fig. 1.42 Ejecución de hola el cual muestra cada 5 segundos la cadena “Hola Mundo”.

El programa continuará mostrando “Hola Mundo” cada 5 segundos. Esta aplicación


puede ser detenida usando Ctrl+C. Sin embargo, si se quiere correr esta aplicación en
segundo plano, hay dos maneras para hacerlo.
La primera es que en lugar de usar Ctrl+C para matar el proceso, usar Ctrl+Z, y
entonces en el prompt usar el comando bg. Cuando se teclea Ctrl+Z, el ^Z (detener)
aparece en la salida. Cuando el comando bg es ingresado, el programa es puesto en
segundo plano y continua ejecutándose. De hecho, se puede seguir utilizando la terminal
pero ésta será interrumpida cada 5 segundos ya que aparecerá “Hola Mundo”. El proceso
se puede llevar de regreso a primer plano usando el comando fg. La aplicación puede
entonces ser detenida tecleando Ctrl+C.
La segunda forma para poner esta aplicación en segundo plano es ejecutar la
aplicación con un símbolo & después del nombre de la aplicación. En este caso se asignará
un PID a la aplicación. Para parar el proceso se puede usar ps para encontrar el PID
(root@beaglebone:/# ps aux|grep hola) de esta aplicación. Este proceso puede
ser detenido usando el comando kill (root@beaglebone:/# kill 1245). Se puede
asegurar que el proceso está muerto tecleando nuevamente ps. Si un proceso no muere,
se puede usar el argumento -9, cual asegura la muerte del proceso (kill -9 1245).
Un comando aparte, pkill, matará un proceso basado en el nombre, en este caso,
se puede matar el proceso como sigue:
root@beaglebone:/# pkill hola

Un comando adicional es watch, cual ejecuta un comando en un intervalo regular


de tiempo y muestra el resultado a pantalla completa en la terminal. Si se quiere especificar
el intervalo de tiempo entre cada ejecución se usa –n seguido por el número de segundos.

56
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

1.2.9 AJUSTE DEL INTERNET SOBRE USB


Una pregunta como ¿Qué fecha es? causa más dificultad de lo que se puedan
imaginar. Si se teclea el comando date en el prompt, probablemente se despliegue lo
siguiente como salida:
root@beaglebone:/# date
Thu May 15 06:55:54 UTC 2014

cual esta muchos meses fuera de fecha, en este caso el BBB está conectado a la
computadora usando una conexión Internet sobre USB. Sin embargo, es probable que la
fecha y el tiempo sean correctos si se tiene una conexión vía Ethernet regular.
Si la fecha y el tiempo están equivocados, es porque el equipo BBB no colocó un reloj
en tu plataforma. A diferencia de una computadora, no hay una batería de respaldo en el
BBB que asegure que los ajustes del BIOS sean retenidos, de hecho, tampoco hay BIOS. Para
establecer la fecha y el tiempo se puede usar el NTP (Network Time Protocol). El NTP es un
protocolo de red que sirve para sincronizar relojes entre computadoras. Si el BBB tiene la
fecha y el tiempo correcto es porque la está obteniendo a partir de la red.
Una manera de establecer la fecha y el tiempo es encontrar en el servidor la NTP
más cercana mediante www.pool.ntp.org e ingresar los siguientes comandos:
root@beaglebone:/etc/network# date
Thu May 15 07:28:21 UTC 2014
root@beaglebone:/etc/network# /usr/sbin/ntpdate –b –s –u ie.pool.ntp.org
root@beaglebone:/etc/network# date
Sun Jan 17 18:52:14 UTC 2016

La fecha es ahora correcta, pero esto sólo dura hasta el reinicio. Si este comando
falla (se recibe el mensaje “Error resolving…”), entonces se debe hacer lo siguiente:
Si se está usando Internet sobre USB, entonces la llamada a ntpdate probablemente falle,
ya que se necesita directamente la IP de tráfico del BBB a través de la computadora. Primero
se tiene que establecer una conexión de red compartida como fue explicado en la sección
1.1.3.1. Después, teclear lo siguiente en la terminal (el comando ping se usa para probar
la conexión y la latencia entre dos conexiones de red),
root@beaglebone:~# ping 8.8.8.8
connect: Network is unreachable
root@beaglebone:~# /sbin/route add default gw 192.168.7.1
root@beaglebone:~# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_req=2 ttl=51 time=13.0 ms...

57
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Este cambio significa que todo el tráfico está siendo ruteado a través de la computadora
hacia el internet. Si este paso falla se debe checar los ajustes de internet sobre USB de la
sección 1.1.3.1 (quizá habilitando y deshabilitando el uso compartido). Ahora se debe ser
capaz de resolver nombres de dominio bajo Debian, por ejemplo:
root@beaglebone:~# ping www.google.com
PING www.google.com (74.125.138.106) 56(84) bytes of data.
64 bytes from www.google.com (74.125.138.106): icmp_req=2 ttl=51 time=13.0ms
...(Ctrl+C para salir)

Todos los pasos anteriores son perdidos en el siguiente reinicio del BBB. Se puede usar el
editor nano para editar el archivo .profile (es decir, nano ~/.profile) y agregar
las siguientes dos líneas al final del archivo:
/sbin/route add default gw 192.168.7.1
/usr/sbin/ntpdate –b –s –u ie.pool.ntp.org
Esta edición alentará el proceso de ingreso al BBB. Después de que se establezca el tiempo
y la fecha se puede ajustar la zona horaria. Usa el comando siguiente el cual proporciona
una interface de usuario basada en texto que permite elegir tu ubicación:
root@beaglebone:~# dpkg-reconfigure tzdata
root@beaglebone:~# date
Sun Jan 17 19:10:56 CST 2016

1.2.10 LABORATORIO 3
En esta sección se examinará como cambiar la conducta de los LEDS de usuario del
BBB, los cuatro LEDS colocados en la esquina de la plataforma. Cada LED proporciona
información sobre el estado del BBB.

 USR0 Destella en una secuencia como de ritmo cardiaco, indicando que el BBB está
funcionando bien.
 USR1 Destella durante actividad en la SD Card.
 USR2 Destella dependiendo de nivel de actividad del CPU.
 USR3 Destella durante actividad en eMMC.
Se puede cambiar la conducta de estos LEDS a tus propias necesidades, pero se
perderá temporalmente la información de actividad del BBB.
Sysfs es un sistema de archivo virtual que está disponible bajo Kernels de Linux
recientes. Este archivo proporciona acceso a dispositivos y drivers, ya que de otra manera
sólo pueden ser accesibles dentro de un espacio de kernel restringido. Usando una conexión
SSH cliente, buscar el directorio /sys/class/leds. La salida es como sigue:
root@beaglebone:~# cd /sys/class/leds

58
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

root@beaglebone:/sys/class/leds# ls
beaglebone:green:usr0 beaglebone:green:usr2
beaglebone:green:usr1 beaglebone:green:usr3

NOTA: La ubicación del directorio sysfs puede variar de acuerdo a las versiones del kernel
de Linux.
Ahora se puede observar cuatro LEDS “verdes” mapeados a usr0, usr1, usr2 y
usr3. Se puede cambiar al directorio para alterar las propiedades de uno de estos LEDS,
por ejemplo, elegir el LED usr3:
root@beaglebone:/sys/class/leds# cd beaglebone\:green\:usr3
root@beaglebone:/sys/class/leds/beaglebone:green:usr3# ls
brightness device max_brightness power subsystem trigger uevent

En esta parte hay diferentes archivos de entrada que dan información adicional y
acceso a ajustes. Se puede determinar el estado actual de un LED tecleando:
root@beaglebone:/sys/class/leds/beaglebone:green:usr3# more trigger
none nand-disk mmc0 [mmc1] timer oneshot hearbeat backlight gpio cpu0 default-on
transient

donde se puede ver que el LED USR3 está configurado para mostrar actividad sobre el
dispositivo emmc1. Se puede apagar el “trigger” de este LED tecleando:
root@beaglebone:/sys/class/leds/beaglebone:green:usr3# echo none > trigger
root@beaglebone:/sys/class/leds/beaglebone:green:usr3# more trigger
none nand-disk mmc0 mmc1 timer oneshot hearbeat backlight gpio cpu0 default-on
transient

se observará que el LED para de destellar completamente y los corchetes desaparecen de


mmc1 si se teclea el comando more trigger. Se puede encender y apagar
completamente el LED tecleando:
root@beaglebone:/sys/class/leds/beaglebone:green:usr3# echo 1 > brightness
root@beaglebone:/sys/class/leds/beaglebone:green:usr3# echo 0 > brightness

Se puede poner al LED destellar en un intervalo de tiempo que se elija. Para hacer
destellar el LED se necesita poner el “trigger” en modo “timer” tecleando echo timer >
trigger. Se verá destellar el LED en un intervalo de un segundo. Si se teclea:
root@beaglebone:/sys/class/leds/beaglebone:green:usr3# more trigger
none nand-disk mmc0 mmc1 [timer] oneshot hearbeat backlight gpio cpu0 default-on
transient

ahora estará seleccionada la opción “timer”. Notar que ahora hay dos nuevas entradas de
archivo, “delay_on” y “delay_off”. Para verlas teclea:
root@beaglebone:/sys/class/leds/beaglebone:green:usr3# ls

59
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

brightness delay_on device max_brightness power delay_off subsystem trigger


uevent

El “timer” de destello del LED hace uso de estas nuevas entradas de archivos de
tiempo. Se puede encontrar más información sobre estos valores usando el comando de
concatenación cat, por ejemplo:
root@beaglebone:/sys/class/leds/beaglebone:green:usr3# cat delay_on 500

que reporta el retardo de tiempo en milisegundos. Generar una señal que dure 100ms
apagado y 800ms encendido. Tecleando echo mmc1 > trigger se regresa el LED a su
estado por default.

60
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

UNIDAD 2

SISTEMAS EMBEBIDOS Y MANEJO DE


PERIFÉRICOS

61
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

2.1 INTRODUCCIÓN
En este capítulo se describen varias opciones de programación para el BBB,
incluyendo lenguajes basados en scripts y compilados. Se usa el destello de un LED para
todos los ejemplos, de forma que se pueda investigar la estructura y sintaxis de cada
lenguaje de programación abarcado. El capítulo también está enfocado en los lenguajes de
programación de C/C++, describiendo los principios de estos lenguajes y por qué la
programación orientada a objetos es apropiada y necesaria para el desarrollo de
aplicaciones de sistemas embebidos escalables. Además, este capítulo detalla cómo se
puede tener acceso directamente al kernel de Linux usando la librería GNU C y como se
puede usar el IDE ECLIPSE para hacer compilación cruzada entre una computadora y el BBB.
Por otro lado, este capítulo integra Linux, programación y electrónica para construir
circuitos y escribir programas que se interconecten con las entradas y salidas del BBB. Este
capítulo explica ejemplos prácticos de cómo usar las entradas/salidas de propósito general
(GPIO) para generar una señal binaria que conmute un LED, o para leer una entrada binaria
a partir de un push botón. También son incluidos los pasos para leer una entrada analógica
y enviarla a una salida modulada por ancho de pulso (PWM). Una interface con GPIOs es un
tópico razonablemente complejo debido a los recientes cambios incorporados al kernel de
Linux. Sin embargo, el BBB tiene características de manejo de capas y el código que está
disponible en este capítulo se puede usar para hacer las interfaces razonablemente
sencillas.
Finalmente, en este capítulo se describe el bus de comunicación a detalle,
explicando y comparando los diferentes tipos de buses que están disponibles sobre el BBB.
Se describe la configuración de éstos para su uso, y como se pueden comunicar con y
controlar dispositivos I2C, SPI, UART y CAN usando Linux y programación en C/C++. Se
proporcionan ejemplos básicos para usar acelerómetros de bajo costo, dispositivos seriales,
entre otros.
2.1.1 AJUSTANDO LA FRECUENCIA DEL CPU DEL BBB
La plataforma BBB tiene varios “gobernadores” que pueden ser usados para perfilar
la razón de uso de desempeño/potencia. Por ejemplo, si se estuviera construyendo una
aplicación con el BBB que se alimenta con baterías que tiene requerimientos de
procesamiento bajos, se puede reducir la frecuencia del reloj para conservar la energía. Se
puede encontrar información sobre el estado actual del BBB tecleando lo que se muestra
en la Figura 2.1.
En la figura anterior se puede observar que hay varios “gobernadores” disponibles,
con los nombres de perfil, “conservativo”, “sobre demanda”, “espacio de usuario”, “ahorro
de energía” y “desempeño”. Para habilitar cada uno de estos “gobernadores” se debe
teclear lo que se muestra en la Figura 2.2.

62
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 2.1 Uso del comando cpufreq-info para ver estado actual del BBB y su frecuencia de trabajo.

Fig. 2.2 Ejemplo de cómo ajustar la frecuencia de reloj del BBB

63
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Los comandos mostrados en la figura anterior deben ejecutarse con privilegios


root. Si estas herramientas no están instaladas sobre el BBB, se puede instalar el paquete
cpufrequtils. El “gobernador” por default es “sobre demanda”, cual dinámicamente
conmuta las frecuencias del CPU si el BBB alcanza 95% de la carga del CPU.

2.2 LENGUAJES BASADOS EN SCRIPTS


Un lenguaje basado en scripts es un lenguaje de programación de computadora que
es usado para especificar archivos script, cuales son interpretados directamente por un
entorno en tiempo de ejecución para realizar tareas. Hay muchos lenguajes basados en
scripts que están disponibles, tales como Bash, Perl, y Python, y estos pueden ser usados
para automatizar la ejecución de tareas sobre el BBB, tales como la administración del
sistema, interacción y la interconexión con componentes electrónicos.
El decidir cuál lenguaje basado en scripts es el que se debe usar en el BBB no es fácil,
ya que cada uno cuenta con muchas opciones que lo fortalecen, sin embargo, se puede
elegir el lenguaje en base a las características que más se ajusten a la tarea que se esté
programando. Por ejemplo:

 Bash: Es una gran elección para pequeños scripts que no requieren estructuras de
programación avanzadas. Los scripts basados en Bash son usados extensamente en
este curso para pequeñas y bien definidas tareas. Se pueden usar los comandos de
Linux discutidos en el capítulo anterior en los scripts basados en Bash.
 Perl: Es una gran elección para scripts que analizan documentos de texto o flujos de
procesos de datos. Este lenguaje es de escritura sencilla y soporta el paradigma de
la programación orientada a objetos.
 Python: Es genial para scripts que necesitan una estructura más compleja y
probablemente que necesitan ser modificados en el futuro. Python soporta
programación basada en objetos y tecleado dinámico.
Estos tres lenguajes basados en scripts están disponibles pre-configurados sobre la
imagen de Debian estándar del BBB. Esto puede ser muy útil para tener conocimiento de
todos estos lenguajes, de forma que se puedan encontrar herramientas o librerías para
hacer los proyectos muy sencillos. Esta sección proporciona un breve repaso de cada uno
de estos lenguajes, incluyendo un segmento conciso de código que realiza la misma función
en cada lenguaje.
En el capítulo anterior fue descrito como cambiar el estado de los LEDS sobre la
plataforma usando los comandos de Shell de Linux. En esta sección se examina cómo es
posible hacer la misma actividad en forma de programación estructurada.

64
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

2.2.1 BASH
Los scripts basados en Bash son una gran elección para scripts pequeños que no
requieren estructuras de programación avanzadas. El primer programa cubre comandos de
consola de Linux tales como echo y more para crear un script conciso que habilita la
elección de argumentos en la línea de comandos, por ejemplo, si se desea encender el LED
USR3, apagarlo, o ponerlo a destellar. En la Figura 2.3 se muestra el código que será usado
para cambiar el estado del LED usr3. Para ingresar el código se puede usar el editor nano
y después, se necesita cambiar las propiedades del archivo para que tenga la bandera de
archivo ejecutable por medio de chmod ugo+x bashLED.
Primero, todos estos scripts de comandos empiezan con “#!” seguido por el nombre
y la ubicación del interpretador a ser utilizado, en este caso #!/bin/bash. El archivo es
solo un archivo de texto regular, pero el “#!” es un código mágico para informar al OS que
el archivo es un ejecutable. Después, el script define la trayectoria del LED para el cual se
desea cambiar el estado usando la variable USR3_PATH. Esto permite que sea fácilmente
cambiable si se desea usar un diferente LED de usuario o trayectoria.

Fig. 2.3 Script basado en Bash usado para cambiar el estado del LED usr3.

65
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

El script contiene una función llamada removeTrigger, principalmente para


demostrar como las funciones están estructuradas dentro del script Bash. Esta función es
llamada después en el script. Notar que cada if se termina con un fi. El carácter de nueva
línea \n se debe usar con el argumento -e.
La primera declaración if confirma que el número de argumentos pasados al script
($#) no sea igual a 1. Recordar que la manera correcta de llamar este script es de la forma
./bashLED command. Por lo tanto, command será el primer argumento de usuario
pasado ($1) y habrá un argumento en total. Si no hay argumentos, entonces un mensaje
será desplegado y el script terminará regresando el código 2. Este valor es consistente con
los comandos del sistema Linux, donde un valor de salida de 2 indica uso incorrecto. Un uso
correcto es indicado por un valor de 0, cualquier otro valor generalmente indica la falla de
un script.
Si el argumento que fue pasado es on entonces el código despliega un mensaje;
llama la función removeTrigger; y escribe la cadena “1” al archivo “brightness” en
el directorio /sys del LED3. Las funciones restantes modifican los valores del LED usr3 de
la misma manera como se describió en el capítulo anterior. Para probar el script se puede
teclear lo que se muestra en la Figura 2.4.

Fig. 2.4 Prueba del script basado en Bash.

2.2.2 PERL
Perl es un lenguaje basado en scripts con características que proporcionan acceso a
una amplia librería de módulos reusables y portabilidad para otros OS. Perl es mejor
conocido por su procesamiento de texto y por sus módulos de expresiones regulares. A
finales de los 90s este lenguaje fue muy popular debido a que se escribían scripts para
generar dinámicamente páginas web en servidores. Después, fue superado por tecnologías

66
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

tales como servelets de Java, páginas Server de Java (JSP por siglas en inglés), y PHP. El
lenguaje ha evolucionado desde su nacimiento en 1980 y ahora incluye soporte para la
programación orientada a objetos. Perl 5 está instalado por default sobre la imagen de Linux
de Debian del BBB. La Figura 2.5 muestra el código en Perl, el cual tiene la misma estructura
del script basado en Bash, así, no es necesario discutirlo en detalle.
Sólo hay unos pocos puntos a notar en el código. Los signos “<” o “>” sobre el
nombre del archivo indican si el archivo está siendo abierto con acceso a lectura o escritura,
respectivamente. Los argumentos son pasados como $ARGV[0…n] y el número de
argumentos está disponible como el valor $#ARGV. Un archivo abierto, debe seguir de un
“<” o “>”, y terminar cerrando el archivo para poder escribir los valores en el directorio
/sys. Los argumentos que son pasados a DATA son recibidos como los valores $_, cual no
es la sintaxis de programación más bella, pero esta trabaja perfectamente bien. Para
ejecutar el código, simplemente se teclea ./perlLED command, donde command es
“on”, “off”, “flash” o “status”. Por último, el #! identifica al interpretador de Perl. No olvidar
que antes de ejecutar el script el archivo perlLED debe tener la bandera de archivo
ejecutable. Para probar el script se puede teclear lo que se muestra en la Figura 2.4 pero
cambiando el nombre del archivo a perlLED.

67
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 2.5 Script basado en Perl usado para cambiar el estado del LED usr3.

2.2.3 PYTHON
Python es un lenguaje orientado a objetos con características de tecleado fuerte y
dinámico que fue diseñado para ser fácilmente aprendido y entendido. Por dinámico se
entiende que no se tiene que asociar un tipo (es decir, entero, carácter, cadena) con una
variable, en su lugar, el valor de la variable “recuerda” su propio tipo. Por lo tanto, si se
fuera a crear la variable x=5, la variable x podría comportarse como un entero, pero si
subsecuentemente se asigna a esta variable la cadena x=”string”, entonces ésta se
comporta como una cadena. Lenguajes estáticos tal como C/C++ o Java no permiten la
redefinición de una variable de esta manera. Por fuerte se entiende que la conversión de
una variable de un tipo a otro requiere una conversión explicita. Python está instalado por
default sobre la imagen de Linux del BBB. El código para ejemplo anterior de cambiar el
estado del LED usr3 pero ahora usando Python es mostrado en la Figura 2.6.
El formato de este código es importante, de hecho, Python impone la disposición
del código haciendo sangrías de una forma estructural. Por ejemplo, después de la línea
“if len(sys.argv)!=2:” las siguientes nuevas líneas son sangradas. Si no se desplaza
una de estas líneas, por ejemplo, la línea “sys.exit(2)”, entonces esta línea no sería
parte de la declaración condicional if y el código podría salir siempre en esta parte del
programa. Para ejecutar el código nuevamente se puede hacer referencia a la Figura 2.4
pero cambiando el nombre del archivo por pythonLED. No olvidar poner la bandera de
archivo ejecutable.

68
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 2.6 Script basado en Python usado para cambiar el estado del LED usr3.

2.3 LENGUAJES COMPILADOS


La distribución de Linux del BBB viene completa con un conjunto de tecnologías que
se pueden usar rápidamente para empezar con el desarrollo de software y hardware en el
BBB. Estas tecnologías son llamadas Node.js, Cloud9 y BoneScript. Node.js es un lenguaje
de programación, Cloud9 es un entorno de desarrollo de software en el cual se puede
escribir código Node.js y BoneScript es una librería de código para Node.js que permite
interactuar con el hardware del BBB.
2.3.1 JAVASCRIPT Y NODE.js
Node.js es una plataforma para construir aplicaciones de red que usan el mismo
motor de JavaScript como el buscador web de Google Chrome. JavaScript es un lenguaje de
programación que es por lo general usado para crear interfaces interactivas dentro de
páginas web. Node.js es JavaScript del lado del servidor. Su entorno de tiempo de ejecución

69
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

y las librerías habilitan al usuario para correr aplicaciones basadas en JavaScript, sin un
buscador, directamente en una interface Shell de Linux.
Node.js usa un manejador de eventos, modelo no bloqueante de entrada/salida. La
programación de manejador de eventos es trivial en la programación de interfaces de
usuario. Esto esencialmente significa que el flujo de los programas es manejado por
acciones del usuario o mensajes que son transferidos de otros hilos o procesos. Es
interesante el hecho de que este lenguaje usa entradas/salidas no bloqueantes, lo cual es
conveniente para la interconexión de pines de entrada/salida del BBB, seguramente
compartiendo recursos con otras aplicaciones. Como todos los nuevos lenguajes se debe
iniciar con un ejemplo sencillo. En la Figura 2.7 se muestra un código que envía la cadena
“SISTEMAS OPERATIVOS EMBEBIDOS” a la terminal de Linux. Utilizar el editor nano para
ingresar el código y guardar el archivo con nombre javascriptLED.js.

Fig. 2.7 Código de ejemplo para empezar a utilizar JavaScript.

Para ejecutar el código se debe teclear node javascriptLED.js en el


directorio que contenga el archivo javascript. La llamada al comando node trabaja porque
el entorno de tiempo de ejecución de Node.js está preinstalado sobre la imagen Linux del
BBB. Para seguir con el ejemplo de LED considere el código mostrado en la Figura 2.8 el cual
realiza la misma tarea de cambiar el estado del LED usr3.
El código ha sido estructurado en la misma manera que los ejemplos previos y no
hay demasiadas diferencias sintácticas. Sin embargo, hay una diferencia de peso entre
Node.js y otros lenguajes: Las funciones son llamadas asíncronamente. Hasta este punto,
todos los lenguajes discutidos siguen un modo de ejecución secuencial. Por lo tanto, cuando
una función es llamada, el contador de programa (también conocido como apuntador de
instrucción) ingresa a esa función y no regresa hasta que la función sea completada.
Considera, por ejemplo, un código como este:

functionA();
functionB();

La función functionA() es llamada primero y functionB() no será llamada


hasta que functionA() sea completada. Este no es el caso en Node.js; functionA()
es llamada primero y después Node.js continua ejecutando el código subsecuente,
incluyendo el ingreso a functionB(), mientras el código en functionA() esta aun
siendo ejecutado. Esto representa una dificultad seria en el ejemplo en curso, en particular
con el segmento de código del caso “flash” (ver Figura 2.9). La primera llamada a
70
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

writeLED() configura el sistema de archivo sysfs para ahora contener las nuevas
entradas de archivo delay_on y delay_off. Sin embargo, debido a la naturaleza
asíncrona de las llamadas a funciones, la primera llamada a writeLED() no ha terminado
de configurar el sistema de archivo antes de que la segunda llamada a writeLED() sea
realizada. Esto significa que las entradas del sistema de archivo delay_on y delay_off
no serán encontradas y el código escrito en la función fallará. Para probar lo anterior,
cambia el código de la línea “fs.writeFileSync(…)” por “fs.writeFile(…)”.

Fig. 2.8 Script basado en Python usado para cambiar el estado del LED usr3.

71
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 2.9 Segmento de código que involucra tres llamadas a funciones.

Para combatir este tema, se puede sincronizar (previene que los hilos sean
interrumpidos) el bloque de código donde se hacen las tres llamadas a la función
writeLED(), de forma que se asegure que las funciones sean llamadas secuencialmente.
Alternativamente, como se mostró en el ejemplo de este código, se puede usar una versión
especial de la función writeFile() de Node.js llamada writeFileSync() para
asegurar que la primera llamada a función modifique los bloques del sistema de archivo y
las otras llamadas a writeFileSync()no interfieran con la secuencia del código.
Node.js permite llamadas asíncronas porque ellas ayudan para asegurar que el
código “viva”. Por ejemplo, si se realiza una consulta en una base de datos, el código será
capaz de hacer algo útil mientras espera el resultado. Cuando el resultado esté disponible
una función “callback” será ejecutada para procesar los datos recibidos. Esta estructura
asíncrona es perfecta para aplicaciones basadas en internet, donde se requiere postear y
solicitar a partir de sitios web y servidores web, y no es claro cuando una respuesta será
recibida (sino es que todas). Node.js tiene un lazo de eventos que maneja todas las llamadas
asíncronas, creando hilos para cada llamada como requiera y asegura que las funciones
“callback” sean ejecutadas cuando una llamada asíncrona complete su tarea asignada.
2.3.2 JAVA
En lenguajes compilados tradicionales, el código fuente es trasladado directamente
a código máquina para una plataforma en particular usando un conjunto de herramientas,
las cuales se llaman compiladores. La traslación sucede cuando el código está siendo
desarrollado; una vez compilado, el código puede ser ejecutado sin necesidad de
herramientas adicionales.
Java es un lenguaje híbrido: se escribe código Java en un archivo fuente, por
ejemplo, javaLED.java, cual es un archivo de texto regular. El compilador de Java
(javac) compila y traslada este código fuente en instrucciones código máquina para una
máquina virtual Java (VM). Código regular compilado no es portable entre arquitecturas
hardware, pero los archivos “bytecode” (código máquina) pueden ser ejecutados en
cualquier plataforma que tenga una implementación de una VM de Java. Originalmente, la
VM de Java interpretaba los archivos bytecode en tiempo de ejecución, sin embargo, más
recientemente, traslaciones dinámicas son empleadas por la VM para convertir los archivos
bytecode en instrucciones de máquina nativas en tiempo de ejecución.
La ventaja clave de este ciclo de vida es que el archivo bytecode compilado es
portable entre plataformas, y éste está compilado para generar código de instrucción de

72
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

máquina genérica, la traslación dinámica a “código máquina real” es muy eficiente. La


desventaja de esta estructura cuando se compara con lenguajes compilados es que las VM
implican una sobrecarga a la ejecución del ejecutable final.
Actualmente, no hay una versión del Kit de desarrollo de Java (JDK por sus siglas en
inglés) para Linux embebido, cual evita que se compile código directamente sobre el BBB.
Además, el entorno de ejecución de Java (JRE por sus siglas en inglés), cual proporciona la
máquina virtual Java, no está instalada en el BBB por default.
Para instalar el JRE sobre el BBB se debe ir primero a la página de Oracle y bajar el
archivo ejre-7u45-fcs-b15-linux-arm-vfp-sflt-client_headless-26_sep_2013.gz
que se encuentra dentro de Downloads - Java for Developers - Java
Embedded – Java SE Embedded – Downloads – Oracle Java SE
Embedded Downloads Archive - Oracle Java SE Embedded version 7
Update 45.
Una vez descargado el archivo, correr el programa “psftp”, el cual servirá para
transferir el archivo recién descargado hacia el BBB. Inicie una nueva sesión y ejecute los
comandos mostrados en la Figura 2.10 (Las rutas mostradas en la Figura 2.10 deben darse
de acuerdo a la dirección de alojamiento del archivo en su propia computadora).

Fig. 2.10 Transferencia del archivo JRE hacia el BBB.

Una vez transferido el archivo, correr el programa PUTTY y entrar de manera remota
al BBB utilizando una comunicación SSH. Una vez iniciada la sesión ejecutar los comandos
mostrados en la Figura 2.11. Básicamente, la Figura 2.11 muestra como descomprimir el
archivo transferido en el directorio creado /usr/java.
Para poder ejecutar una aplicación Java se tiene que modificar el archivo de
configuración .profile usando el editor nano y agregar las siguientes modificaciones a
las variables de entorno:
export PATH=$PATH:/usr/java/ejre1.7.0_45/bin/
export JAVA_HOME=/usr/java/ejre1.7.0_45/
73
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 2.11 Comandos utilizados para alojar en el BBB el paquete que contiene el entorno de ejecución de Java.

Una vez hecho lo anterior, al iniciar una nueva sesión SSH ejecutar el comando java
–version para mostrar la versión del JRE instalado en el BBB. Para editar código Java
utilizar el programa gratuito “Eclipse for Java”. Se debe empezar por crear un nuevo
proyecto dando el nombre y colocando en “Use an execution environment JRE” la opción
“JavaSE-1.7”, tal como se muestran en la Figura 2.12.
Una vez creado el proyecto, dar clic con el botón derecho sobre la carpeta “src” para
crear una nueva clase (New - Class). Dar un nombre a la clase y habilitar la opción “public
static void main(String[] args)”, tal como se muestra en la Figura 2.13.
En este punto, se puede teclear código sobre el nuevo archivo creado. En la Figura
2.14 se muestra el código en Java el cual realiza la misma tarea de cambiar el estado del
LED usr3. Para compilar y correr el código sobre Eclipse dar clic en el botón “RUN”.
Para poder ejecutar este nuevo código sobre el BBB hay que instalar un nuevo
software sobre el entorno Eclipse. Para lo anterior, ir a “Help – Install New Software” y
buscar por “Kepler – http://...”. Esto cargará una lista de software disponible; dentro de
esta lista buscar por “General Purpose Tools” y después instalar “Remote System Explorer
End-User Runtime”. En las nuevas versiones de Eclipse hay una versión más nueva de este
software que ya viene instalado. Para mostrar lo anterior, ir a “Windows – Show View –
Others – Remote System” y dentro de la carpeta elegir “Remote System”. En este punto, se
agregará un nuevo árbol de directorios llamado “local” sobre la plataforma Eclipse.

74
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 2.12 Ventana principal que muestra la configuración inicial para crear un proyecto de Java.

Fig. 2.13 Ventana principal que muestra la configuración para crear una clase en Java.

75
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 2.14 Programa basado en Java usado para cambiar el estado del LED usr3.

Sobre “Local” dar clic con el botón derecho y elegir la opción “New – Connection –
Linux”. El paso anterior abrirá una nueva ventana preguntando por un “Host name” y un
nombre de conexión, en este caso poner en el “Host name” la IP 192.168.7.2 del BBB y
elegir un nombre para la conexión cualquiera, tal como se muestra en la en la Figura 2.15.

Fig. 2.15 Ventana de configuración para una nueva conexión remota con Linux.

76
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Sobre la misma ventana dar clic en “Siguiente” y habilitar en el recuadro de


configuración la casilla de “ssh.files”. A continuación, dar clic en “Siguiente” y nuevamente
sobre el recuadro de configuración habilitar la opción “processes.shell.linux”. De nuevo, dar
clic en “Siguiente” y en el recuadro de configuración señalar la casilla “ssh.shells”. Por
último, dar clic en “Siguiente” y asegurar que en la nueva ventana que aparece esté
habilitada la opción “ssh.terminals”; terminar dando clic en el botón “Finish”.
Para establecer la comunicación con el BBB, sobre el árbol de directorios recién
creado en “Remote Systems” ir a “Sftp Files” y dar doble clic sobre “My Home”. Esto abrirá
una ventana como la que se muestra en la Figura 2.16; en el campo “User ID” teclear “root”
y oprimir “OK”. Un mensaje de advertencia saltará a la vista diciendo que la autenticidad
del Host no pudo ser establecida, sin embargo, dar clic en “Yes”; otros mensajes de
advertencia aparecerán, pero simplemente dar clic en “Yes” a todo. En todo este proceso
es importante mantener la comunicación de la computadora con el BBB mediante el
programa PUTTY y PSFTP. En este punto, debe ser capaz de ver sobre el entorno de Eclipse
en el directorio “My Home” los archivos y directorios que se encuentran en el BBB.

Fig. 2.16 Ventana para especificar el username y el password del OS corriendo sobre el BBB.

Para establecer la comunicación remota entre el BBB y el programa Eclipse ir a “Ssh


Terminals”, dar clic con el botón derecho y seleccionar “Launch Terminal”. Ahora, se tiene
acceso a la plataforma BBB.
Para transferir el código Java que controla el estado del LED usr3 al BBB, ir al
directorio local que esta sobre “Remote Systems” y buscar en la carpeta de trabajo la clase
javaLED.class. A continuación, copiar este archivo y pegarlo sobre el directorio “My
Home”. En este punto, debe de aparecer el archivo javaLED.class sobre el directorio
“/home” del BBB. Para comprobar lo anterior, teclear el comando ls sobre la terminal de
Eclipse. Para ejecutar el código Java sobre el BBB se debe teclear sobre la terminal de Eclipse
lo siguiente:
root@beaglebone:~# java javaLED command
donde command es “on”, “off”, “flash” o “status”.

77
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

2.3.3 C/C++
C++ fue desarrollado por Bjarne Stroustrup en los Laboratorios Bell durante 1983 –
1985. C++ está basado en el lenguaje C que fue desarrollado en AT&T para sistemas UNIX a
inicios de los 70s por Dennis Ritchie. Además de agregar un marco orientado a objetos, C++
también mejora el lenguaje C agregando características tal como mejor comprobación de
tipos. C++ gano rápidamente un amplio uso, cual fue debido a su similitud con la sintaxis del
lenguaje de programación C, y por el hecho de que éste permitió usar código C cuando sea
posible. C++ no es un lenguaje orientado a objetos puro sino que es híbrido, teniendo la
estructura organizacional de los lenguajes orientados a objetos pero reteniendo las
eficiencias de C, tal como, el tipo de variables y los apuntadores.
A diferencia de Java, C++ no es propio de una sola compañía. En 1998 el comité ISO
adoptó una especificación de lenguaje uniforme con el objetivo de remover inconsistencias
entre los varios compiladores de C++. Esta estandarización continua hasta hoy con C++11 y
C++14 aprobado por la ISO en 2011 y 2014 respectivamente.
En este curso se asume que lector ha cubierto suficiente el lenguaje de
programación C. Ahora es tiempo de ver cómo escribir una aplicación en C que cambie el
estado del LED usr3. Para escribir código C/C++ se puede usar el programa “Eclipse for
C/C++” tal como se hizo anteriormente para el lenguaje Java. Este programa es gratuito y
puede descargarse directamente de la página de Eclipse. Adicional a este programa, será
necesario descargar el compilador “gcc” el cual también es gratuito. Antes de configurar el
entorno del programa Eclipse, se debe de instalar el compilador (gcc-4.8.2-64.exe) en la ruta
“C:\MinGW”. Para configurar el entorno de Eclipse, ejecute el programa y vaya a la pestaña
“Windows - Preferences” y en la ventana que aparece buscar por “General - Workspace”.
En la sección “Text File Encoding” seleccionar “Other – UTF-8”; en la sección “New text file
line delimiter” habilitar “Other - Unix”. Sobre la misma ventana de configuración ir al
recuadro de la izquierda y buscar por el campo “C/C++ - Editor - Folding”; habilite las
opciones “Enable folding of preprocessor…” y “Enable folding of control…”; además,
deshabilite la opción “Header comments”. Ahora, sobre el recuadro de la izquierda buscar
por “C/C++ - New C/C++ Project Wizard”; en la sección “Tool Chains” escoger “MinGW-GCC”
y presionar el botón “Apply”. Por último, sobre el recuadro de la izquierda buscar por el
campo “General – Editors – Text Editors” y habilitar la opción “Show whitespace characters”
presionar el botón “Apply” y salir de la ventana de configuración.
Una vez configurado el entorno Eclipse se debe crear un nuevo proyecto. Ir a “File –
New – C Project”; en la ventana que aparece dar un nombre “C_LED” al proyecto y escoger
la opción “Hello World ANSI C Project”; observar que el compilador “MinGw GCC” esta
seleccionado por default. Terminar dando clic en “Finish”, esto creará automáticamente un
árbol de directorios donde uno de ellos contiene el archivo “C_LED.c”. Modificar este
archivo para que aparezca el código en C de la Figura 2.17, el cual tiene la misma estructura
de los otros ejemplos antes vistos.

78
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 2.17 Programa basado en C usado para cambiar el estado del LED usr3.

Una vez escrito el código, ir la pestaña “Project” y seleccionar “Build All”, esto
compilará el código y mostrará los posibles errores en el código si los hay. Para ejecutar el
código C sobre el BBB, es necesario crear una conexión remota tal como se hizo para
ejecutar el código en Java (ver sección JAVA). Para establecer la comunicación remota entre
el BBB y el programa Eclipse ir a “Ssh Shells”, dar clic con el botón derecho y seleccionar
“Launch Terminal”. Ahora, se tiene acceso a la plataforma BBB.
Para transferir el código C que controla el estado del LED usr3 al BBB, ir al
directorio local que esta sobre “Remote Systems” y buscar en la carpeta de trabajo el
archivo C_LED.c. A continuación, copiar este archivo y pegarlo sobre el directorio “My
Home”. En este punto, debe de aparecer el archivo C_LED.c sobre el directorio “/home”
del BBB. Para comprobar lo anterior, teclear el comando ls sobre la terminal de Eclipse.
Para poder ejecutar el código C primero es necesario compilar el archivo sobre el BBB, esto
se hace tecleando sobre la terminal de Eclipse lo siguiente:
root@beaglebone:~# gcc C_LED.c –o C_LED

79
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

La línea anterior creará el archivo C_LED.exe el cual es un archivo ejecutable. Para


correr este ejecutable teclear sobre la terminal lo siguiente:
root@beaglebone:~# ./C_LED command
donde command es “on”, “off”, “flash” o “status”.
Como se discutió anteriormente, el lenguaje C++ fue construido sobre el lenguaje C,
agregándole soporte para clases orientadas a objetos; sin embargo, unas pocas diferencias
son inmediatamente aparentes cuando se empieza a trabajar con la programación general
de C++. Inicialmente, el cambio más grande que se nota es el uso de flujos de entrada y
salida y el uso general de cadenas. Para mostrar estas diferencias, ir al entorno de Eclipse
para crear un nuevo proyecto en “File – New – C++ Project”. Teclear “CPP_LED” para
nombrar el proyecto y elegir la opción “Hello World C++ Project”. Sobre el archivo
CPP_LED.cpp teclear el código en C++ para el ejemplo del LED que es mostrado en la
Figura 2.18.

Fig. 2.18 Programa basado en C++ usado para cambiar el estado del LED usr3.

80
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

La mayoría del código en C++ es muy similar al de C, sin embargo, es digno de hacer
referencia al segmento de la función writeLED(), donde se realiza la apertura del archivo
usando la clase de flujo de archivo fstream. El operador de flujo de salida (<<) en este
caso envía la cadena al flujo. El método c_str() regresa una cadena de C++ como una
cadena de C.
Para transferir el código C++ que controla el estado del LED usr3 al BBB, ir al
directorio local que esta sobre “Remote Systems” y buscar en la carpeta de trabajo el
archivo CPP_LED.cpp. A continuación, copiar este archivo y pegarlo sobre el directorio
“My Home”. En este punto, debe de aparecer el archivo CPP_LED.cpp sobre el directorio
“/home” del BBB. Para poder ejecutar el código C++ primero es necesario compilar el
archivo sobre el BBB, esto se hace manteniendo la conexión remota entre Eclipse y el BBB
y tecleando sobre la terminal de Eclipse lo siguiente:
root@beaglebone:~# g++ CPP_LED.cpp –o CPP_LED
La línea anterior creará el archivo CPP_LED.exe el cual es un archivo ejecutable.
Para correr este ejecutable teclear sobre la terminal lo siguiente:
root@beaglebone:~# ./CPP_LED command
donde command es “on”, “off”, “flash” o “status”.
Los conceptos de programación orientada a objetos ahora pueden ser aplicados al
ejemplo del LED, mediante la restructuración de la funcionalidad del código C++ dentro de
una clase llamada LED que contiene estados y métodos. Una diferencia de los códigos
anteriores con el código mostrado en la Figura 2.19 es que se puede controlar los cuatro
LEDS de usuario usando el mismo código orientado a objetos. Por lo tanto, usando la clase
LED, cuatro diferentes instancias de objetos LED pueden ser creados, cada una controlando
uno de los cuatro LEDs físicos sobre el BBB.
Este código está estructurado como una sola clase LED con estados privados para
path y number, y métodos de implementación privados para writeLED() y
removeTrigger(). Estos estados y métodos no son accesibles fuera de la clase. Los
métodos de interface públicos son turnOn(), turnOff(), flash() y
OutputState(). Hay dos métodos públicos más que son:

 El primero es un constructor que habilita la inicialización del estado del objeto. Este
es llamado por LED led(0) para crear el objeto led de la clase LED con número
0. Esto es muy similar a la manera en que se asigna un valor inicial a un entero, es
decir, int x = 5. Un constructor tiene que tener el mismo nombre exacto como
el nombre de la clase y este no puede regresar nada.
 El último es un destructor (~LED()). Al igual que un constructor, este debe de tener
el mismo nombre exacto como el nombre de la clase y es prefijado por el carácter

81
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

tilde (~). Este método es llamado automáticamente cuando el objeto está siendo
destruido.

Fig. 2.19 Programa en C++ usado para cambiar el estado del LED usr3 utilizando clases.

82
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

La palabra clave virtual tiene un uso nuevo y se puede pensar de esta palabra
como “permiso primordial para tomar lugar cuando un objeto esta dinámicamente
limitado”. Esta siempre debe estar allí (excepto para el constructor), a menos que se
conozca que allí no habrá definitivamente clases hijas. Remover la palabra clave virtual
resultará en un ligero mejoramiento en el desempeño del código.
La sintaxis void LED::turnOn(){…} es simplemente usada para establecer
que el método turnOn() está asociado con la clase LED. Con esto es posible tener muchas
clases en un único archivo .cpp y también es posible para que dos clases tengan un método
turnOn(). Por lo tanto, la asociación explicita permite informar al compilador la relación
correcta. La ventaja de esta versión de código orientado a objetos es que ahora se tiene una
estructura que puede ser construida cuando se desee proporcionar funcionalidad adicional
para interactuar con el sistema de LEDs.

2.4 GLIB Y SYSCALL


La librería GNU C de Linux (glibc), proporciona un conjunto extensivo de funciones
para llamadas al sistema. Esta librería incluye la funcionalidad para manejar archivos,
señales, matemáticas, procesos, usuarios y mucho más. Hay muchas funciones glibc, pero
una función en particular merece la atención, esta es la función syscall. Esta función
genera una llamada de sistema general usando el argumento que se pasa a la función. El
primer argumento es un número de llamada de sistema, el cual está definido en
/sys/syscall.h. Se puede abrir este archivo en la ruta /usr/include/arm-
linux-gnueabihf/sys/syscall y buscar por los números a pasar en la función.
Este tema se retomará más adelante.

2.5 COMPILACIÓN CRUZADA Y EL IDE ECLIPSE


En este punto, todo el código fue construido y ejecutado sobre el BBB. Sin embargo,
para proyectos grandes esto puede ser impráctico, ya que se puede necesitar manejar
muchos archivos fuente dentro de un solo proyecto. Además, los tiempos de compilación
pueden ser lentos en el BBB para construir grandes proyectos. Este capítulo primero
describe cómo se puede usar una computadora personal para desarrollar aplicaciones que
pueden ser desplegadas directamente en el BBB. Se introduce el entorno de desarrollo
integrado Eclipse, que permite capacidades de desarrollo avanzadas, tal como depuración
remota.
2.5.1 INSTALACIÓN DE LAS HERRAMIENTAS
Esta sección describe como establecer un entorno de compilación cruzada
completamente caracterizado para construir código para el BBB usando una computadora
personal.

83
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Un compilador típico que es ejecutado sobre una computadora construirá código


máquina ejecutable únicamente para esa plataforma. Sin embargo, es posible crear código
ARM ejecutable directamente en una computadora para la plataforma BBB, para esto, se
requiere un compilador cruzado, aun pensando que la computadora tiene una arquitectura
hardware diferente.
Se usa generalmente Linux sobre una computadora para esta tarea. Si se está
usando un entorno Windows/Mac, se puede usar una configuración VMware para crear una
máquina virtual que aloje un OS Linux. Para aplicaciones Linux que usan compilación
cruzada, el primer paso es instalar una “cadena de herramientas Linux”. Una “cadena de
herramientas” es un conjunto de herramientas de desarrollo de software y librerías que
están encadenadas juntas para habilitar construir código ejecutable en un sistema
operativo en un tipo de máquina, tal como Linux de 64 bits sobre una maquina Intel x86, y
ejecutar dicho código en un diferente sistema operativo y/o diferente arquitectura, tal
como Linux de 32 bits sobre un dispositivo ARM.
Para este tutorial se usa una imagen del OS Debian jessie 8.2.0-amd64 corriendo en
una máquina virtual usando la herramienta VMware. Para instalar la cadena de
herramientas sigue los siguientes pasos:

 Iniciar una nueva sesión corriendo Debian sobre la máquina virtual.


 Abrir la terminal de Linux.
 Agregar al archivo sudoers la cuenta de usuario con la que se inicia sesión en
Debian. Para esto, se debe tener permisos de súper-usuario; teclear su - e ingresar
password. A continuación, teclear visudo y agregar la línea cuenta
ALL=(ALL:ALL) ALL debajo de la línea %sudo (cuenta refiere al nombre de
la cuenta de usuario). Guardar los cambios y salir.
 Ir al directorio /etc/apt/sources.list.d/ y crear el archivo
crosstools.list:
alain@debian:~$ cd /etc/apt/sources.list.d
alain@debian:/etc/apt/sources.list.d$ sudo nano crosstools.list
[sudo] password for alain:

 Agregar al archivo la entrada deb http://emdebian.org/tools/debian


jessie main.
 Instalar el paquete curl tecleando:
alain@debian:/etc/apt/sources.list.d$ sudo apt-get install curl
 Instalar el paquete build-essential tecleando:
alain@debian:/etc/apt/sources.list.d$ sudo apt-get install build-essential
 Descargar la cadena de herramientas tecleando lo siguiente:
alain@debian:/etc/apt/sources.list.d$ curl http://emdebian.org/tools/debian
/emdebian-toolchain-archive.key | sudo apt-key add -
 Cambiar al directorio raíz tecleando cd ~/.
 Agregar el tipo de arquitectura a usar, es este caso teclear:
alain@debian:~$ sudo dpkg --add-architecture armhf

84
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

 Actualizar el paquete mediante:


alain@debian:~$ sudo apt-get update
 Instalar el paquete crossbuild-essential-armhf tecleando:
alain@debian:~$ sudo apt-get install crossbuild-essential-armhf
 En este punto se puede construir una aplicación de prueba para checar que todo
esté trabajando antes de empezar a configurar Eclipse. Se debe escribir un pequeño
programa en C++, construirlo en la computadora y desplegarlo en el BBB. Por
ejemplo, ingresa el siguiente código en la computadora:
alain@debian:~$ nano testARM.cpp
#include<iostream>
using namespace std;
int main(){
cout << “Probando código ARM” << endl;
return 0;
}
 Compilar el código y ejecutarlo tecleando:
alain@debian:~$ arm-linux-gnueabihf-g++ testARM.cpp –o testARM
alain@debian:~$ ./testARM
bash: ./testARM ...
 Transferir el archivo ejecutable binario al BBB mediante:
alain@debian:~$ sftp root@192.168.7.2
alain@debian:~$ put testARM
alain@debian:~$ exit
 Abrir una conexión SSH para el BBB para confirmar que el ejecutable binario trabaja
correctamente:
alain@debian:~$ ssh root@192.168.7.2
root@beaglebone:~$ ./testARM
Probando código ARM
root@beaglebone:~$ exit
 Instalar el paquete de librerías libicu-dev:armhf, tecleando:
alain@debian:~$ sudo apt-get install libicu-dev:armhf
 Para emular la arquitectura armhf se debe instalar un paquete llamado QEMU que
permite emular el microprocesador ARM sobre una máquina x86. Para instalar
QEMU teclear:
alain@debian:~$ sudo apt-get install qemu-user-static
 Ahora se puede ejecutar el código del archivo testARM mediante:
alain@debian:~$ ./testARM
 Instalar chromium para descargar el IDE Eclipse tecleando:
alain@debian:~$ sudo apt-get install chromium
alain@debian:~$ chromium &
 Seleccionar en la página de Eclipse “Eclipse IDE for C/C++ Developers” y el OS “Linux
64 Bit”.
 Descomprimir el archivo descargado de la carpeta /Descargas tecleando:
alain@debian:~$ cd /Descargas
alain@debian:~/Descargas$ tar –xvf eclipse-cpp...
 Finalmente, mover la carpeta eclipse a:
alain@debian:~/Descargas$ mv eclipse ~/

85
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

2.5.2 IDE ECLIPSE


Eclipse es un entorno de desarrollo integrado que habilita para manejar código y
herramientas de compilación cruzada integrada, depuradores y otras conexiones para crear
una plataforma de desarrollo sofisticada. Eclipse puede ser extendido para proporcionar un
soporte de depurado remoto completo para aplicaciones que están físicamente
ejecutándose en el BBB. Esta es una poderosa característica que habilita depurar
aplicaciones software que están interactuando con el hardware real del proyecto, pero
observando los valores depurados dentro del entorno de eclipse.
Eclipse está escrito en Java y fue inicialmente enfocado al desarrollo de software
Java. Sin embargo, Eclipse tiene un excelente soporte para desarrollo de C/C++ usando una
extensión de herramientas de desarrollo.
Después de descargar Eclipse y moverlo de ubicación, el siguiente paso es ejecutarlo
directamente en background usando:
alain@debian:~$ cd eclipse
alain@debian:~/eclipse$ ./eclipse &

Para configurar el IDE Eclipse es necesario crear un nuevo proyecto. Ir a “File – New
– C++ Project”. En la ventana que aparece (ver Figura 2.20) se tien..e que dar un nombre al
proyecto y seleccionar la opción “Hello World C++ Project”; verificar que la opción “Cross
GCC” este seleccionada. A continuación, dar clic en siguiente y en la ventana que aparece
dar un nombre para el autor del código. Una vez más, dar clic en siguiente y verificar en la
nueva ventana que las opciones “Debug” y “Release” estén seleccionadas.

Fig. 2.20 Ventana que muestra la configuración para crear un proyecto de código C++ con herramienta de
compilación cruzada.

86
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Después de dar clic en siguiente una nueva ventana aparecerá en la cual se debe de
especificar el prefijo del compilador cruzado y la ruta de donde se encuentra. Referir a la
Figura 2.21 para establecer estas dos opciones. Finalizar la configuración del proyecto
dando clic en “Finish”.

Fig. 2.21 Configurando el nombre y la ruta del compilador a usar en un proyecto con herramienta de
compilador cruzado.

Una vez terminada la configuración del proyecto una ventana como la que aparece
en la Figura 2.22 se mostrará.

Fig. 2.22 Entorno de desarrollo de código en el IDE Eclipse.

87
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Para confirmar que todo vaya bien, dar clic en el botón “Run”, el cual compilará el
proyecto y desplegará en la consola el mensaje “Hello World”. Es importante notar que del
lado izquierdo sobre el explorador de proyecto aparecerán nuevos directorios. Sobre el
directorio “Binaries” se alojará el ejecutable binario que podrá correrse sobre el BBB.
El siguiente paso es establecer una conexión remota entre el IDE Eclipse y el BBB.
Para esto, seguir los pasos antes mencionados en la Sección 3.2 para “Remote System”. En
este punto, se debe tener una ventana como la que aparece en la Figura 2.23.

Fig. 2.23 Conexión remota entre el IDE Eclipse y el BBB.

Una vez que el BBB está conectado, ir a la ventana del explorador de proyecto, dar
clic derecho sobre el ejecutable “testARM” y seleccionar copiar. Después, ir al directorio
sobre “Remote System” y pegar el archivo en el directorio “My Home”. El ejecutable
“testARM” debe mostrarse tal como aparece en la Figura 2.23. Este archivo está ahora sobre
el BBB y puede ser ejecutado desde la terminal “Remote Shell” una vez que se hayan
cambiado los permisos con el comando chmod para hacerlo un archivo ejecutable.
Una manera de automatizar el proceso anterior de copiar el archivo “testARM” de
la computadora y pegarlo en el BBB es mediante el uso del comando scp (secure copy
command). Se puede configurar la computadora de manera que no se requiera un password
para ssh al BBB usando los siguientes pasos (cuando se requiera añadir un campo dejar el
espacio en blanco):
alain@debian:~/eclipse$ ssh-keygen
alain@debian:~/eclipse$ ssh-copy-id root@192.168.7.2

88
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

alain@debian:~/eclipse$ ssh-add
alain@debian:~/eclipse$ ssh root@192.168.7.2

Ahora se debe ser capaz de hacer la conexión ssh al BBB sin requerir un password.
Para configurar el IDE Eclipse para desplegar el ejecutable automáticamente en el BBB se
introduce el comando scp testARM root@192.168.7.2:/home/alain/ en la
ruta “Project – Properties – C/C++ Build – Settings – Build Steps – Post-build-steps”. Para
verificar que el ejecutable haya sido colocado bien en la ruta, teclear sobre la terminal lo
siguiente:
root@beaglebone:~# cd /home/alainmm
root@beaglebone:/home/alainmm# ls
testARM
root@beaglebone:/home/alainmm# /.testARM
“¡¡¡Hello World!!!”

La depuración remota es el último paso para desarrollar una configuración de


plataforma de desarrollo cruzado. Como se está pensando en un futuro interactuar con los
módulos hardware que son físicamente conectados al BBB, podría ser ideal poder depurar
el código en vivo sobre el BBB. La depuración remota con Eclipse habilita controlar los pasos
de ejecución, ver mensajes de salida y valores de memoria dentro del entorno de Eclipse.
Siguiendo con el mismo proyecto, sobre el BBB se necesita instalar el servidor para
depuración llamado gdbserver, que habilita al IDE Eclipse conectarse al depurador. Esta
herramienta está instalada por default en la imagen Debian del BBB, pero se puede instalar
o actualizar usando el siguiente comando:
root@beaglebone:~# apt-get install gdbserver

El servidor gdbserver se ejecuta sobre el BBB cuando este es llamado por el IDE
Eclipse sobre la computadora usando RSE (Remote System Explore). Sobre la computadora
corriendo Linux, ahora se necesita instalar el depurador de multi-arquitectura GNU, para
esto teclear:
alain@debian:~$ sudo apt-get install gdb-multiarch

Después, sobre la misma computadora crear un archivo llamado .gdbinit en la


carpeta del proyecto usando el editor nano. Anadir al archivo la línea set
architecture arm.Por ejemplo:
alain@debian:~$ cd workspace/testARM
alain@debian:~/workspace/testARM$ nano .gdbinit
alain@debian:~/workspace/testARM$ ls -al
alain@debian:~/workspace/testARM$ more .gdbinit

set architecture arm

89
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

El entorno de Eclipse necesita ser configurado para usar el depurador multi-


arquitectura. Ir a “Run – Debug Configuration”, y borrar la configuración del depurador por
default que está sobre “C/C++ Application” dando clic con el botón derecho y seleccionado
la opción “Delete”. Ahora, seleccionar C/C++ Remote Application y con el botón derecho
seleccionar “new”, lo cual creará una nueva configuración. Del lado derecho, en la pestaña
“Main” y sobre el campo “Connection”, cambiar la opción “local” por la conexión remota
“BeagleBone”. Sobre la misma pestaña en el campo “Remote Absolute File Path for C/C++
Application” escribir la ruta donde se desea que se guarden los archivos de la depuración,
en este caso la ruta será /home/alainmm/. La Figura 2.24 muestra un ejemplo del paso
anterior.

Fig. 2.24 Ajustes de la ventana de configuración “Main” para la depuración cruzada.

Ahora, sobre la pestaña “Debugger” y en la opción “Debugger Options - Main”, ir al


campo “GDB Debugger” y actualizar la ruta colocando /usr/bin/gdb-multiarch.
Después, sobre el campo “GDB Command File” buscar por la ruta del archivo .gdbinit
presionando el botón “Browse”. En la Figura 2.25 se muestra un ejemplo de estos pasos. Es
importante mencionar que para buscar el archivo .gdbinit es necesario habilitar la
opción “Mostrar archivos ocultos” dando clic en el botón derecho sobre la nueva ventana
que aparece.

Fig. 2.25 Ajustes de la ventana de configuración “Debugger” para la depuración cruzada.

90
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Finalmente, sobre la misma pestaña “Debugger” y en la opción “Debugger Options


– Gdberver Settings”, actualizar los campos “Gdbserver path” y “Port number” escribiendo
/usr/bin/gdbserver y 12345, respectivamente. Para mostrar que todo vaya bien,
dar clic en el botón “Debug” (Un mensaje de advertencia puede aparecer, simplemente dar
clic en “yes”). En este punto, el IDE Eclipse debe estar en el modo Debug apuntando a la
primera línea del código. La Figura 2.26 muestra una típica ventana de depurado.

Fig. 2.26 Ventana de depuración del entorno IDE Eclipse.

2.6 ENTRADAS/SALIDAS DE PROPÓSITO GENERAL


Es posible interconectar circuitos electrónicos y módulos al BBB en varias diferentes
maneras. Por ejemplo:

 Uso de los GPIOs sobre los headers del BBB. Estos proporcionan gran versatilidad
en términos de los tipos de circuitos que se pueden conectar al BBB.
 Uso de los buses sobre los headers del BBB. La conexión de Bus habilita la
comunicación con módulos complejos tal como sensores.
 Conexión de módulos USB. Si los drivers de Linux están disponibles, muchos
diferentes tipos de dispositivos electrónicos pueden ser conectados al BBB como
teclados y adaptadores Wi-Fi.
 Comunicación a través de Ethernet/WiFi/Bluetooth con módulos electrónicos. Es
posible construir una red de sensores que se comuniquen con el BBB a través de
conexiones de red.

91
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

2.6.1 HEADERS SOBRE EL BEAGLEBONE BLACK


El siguiente paso trabajando con el BBB es conectar a éste circuitería usando los
GPIOs y las entradas analógicas que están disponibles en los headers de expansión P8 y P9.
La Figura 2.27 proporciona una primera vista de la funcionalidad de las entradas y salidas
sobre los headers P8 y P9 del BBB. Muchos de estos pines están multiplexados, significando
que ellos tienen muchas más funciones de las que están desplegadas en la figura. El nombre
listado típicamente describe la operación por default del pin.

Fig. 2.27 Headers P8 y P9 sobre el BBB con nombres de pines indicando su funcionalidad por default.

NOTA: Ser especialmente cuidadoso cuando se trabaje con los headers P8 y P9. Las
conexiones incorrectas pueden destruir tu plataforma. Favor de probar todos los circuitos
para asegurar que sus voltajes y niveles de corriente estén dentro del rango antes de
conectarlos a los headers.
2.6.2 SALIDA DIGITAL GPIO
El ejemplo de configuración para una salida digital usa un GPIO conectado a un
arreglo LED-Resistencia. La resistencia es de un valor de 1.5KΩ y está conectada en serie
con el LED. Se usa el header P9, donde el pin 1 (GND) es usado para proporcionar la tierra
al circuito y el pin 23 (GPIO49) para alimentar el LED con un voltaje positivo. Los GPIOs del
BBB toleran 3.3V con un manejo de corriente de 4-6mA. Cuando se usa un arreglo
Transistor-LED-Resistencia se puede usar el pin 7 (SYS_5V) para alimentar el colector del
transistor soportando corrientes de hasta 250mA. Otra alternativa es usar el pin 5 (VDD_5V)
que puede suministrar hasta 1A, pero solo si se está utilizando una fuente de alimentación
en el Jack de 5 DC.
Una vez que el circuito es construido y conectado al BBB, se puede arrancar la
plataforma y controlar el LED usando la terminal de Linux. Por el momento, se tendrán que

92
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

realizar las operaciones como súper-usuario. Más adelante se discutirá una solución para
remover esta restricción.
Como se mencionó anteriormente, se usa el pin 23 que corresponde al GPIO49, pero
que lleva por nombre GPIO1_17. Esto significa que es el GPIO 17 de 32 (0 – 31) sobre un
segundo chip de cuatro (0 – 3). Como hay 32 GPIOs en cada chip, el número interno
correspondiendo al pin GPIO1_17 es calculado como sigue: (1 x 32)+17=49. El rango total
será de 0 (GPIO0_0) a 127 (GPIO3_31), pero como anteriormente se mencionó, no todos
los GPIOs del AM335x están disponibles en los headers. Para habilitar el GPIO49 se usan los
comandos mostrados en la Figura 2.28 sobre una terminal Linux.

Fig. 2.28 Ejemplo sobre como habilitar un GPIO en el BBB.

Ahora se puede ver un nuevo directorio gpio49 que puede ser usado para cambiar
las propiedades del GPIO como se muestra en la Figura 2.29.

Fig. 2.29 Cambio de la propiedad “dirección” para configurar el GPIO como salida digital.

El GPIO es ahora configurado como salida y su valor de salida puede ser cambiado,
resultando que el LED se encienda o se apague según sea el caso (ver Figura 2.30).
Para remover un GPIO se usa unexport tal como se muestra en la Figura 2.31.

93
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 2.30 Cambio de la propiedad “valor” para cambiar el estado de una salida digital.

Fig. 2.31 Ejemplo sobre como remover un GPIO.

2.6.3 ENTRADA DIGITAL GPIO


La siguiente aplicación es usar un GPIO como una entrada digital para leer el estado
de un push botón. Esta aplicación es primero realizada usando la terminal de Linux y
después usando código C/C++. El circuito está basado en un push botón normalmente
abierto que es conectado en los pines 3 (VDD_3V3) y 27 (GPIO3_19) sobre el header P9.
Seguramente se estará pensando por la necesidad de usar una resistencia “pull-up” o “pull-
down” en un circuito que está basado en interruptores. En este ejemplo, no es accidental
que se use el pin 27 ya que éste utiliza una resistencia “pull-down” interna por default para
resolver este tópico. En la Figura 2.32 se muestran los pasos de configuración del pin 27
para que funcione como una entrada digital.
En este ejemplo, el pin 27 está configurado por default como entrada y el valor es 1
cuando el botón está presionado y 0 cuando es liberado. Cada vez que se pregunta por el
valor de la entrada con el comando more se está consultando el estado del botón para
checar su valor.

94
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 2.32 Pasos de configuración para usar un GPIO como entrada digital.

Es interesante cuando no se conecta nada al pin 12 del header P9 cual corresponde


al GPIO60 y se ingresa la misma secuencia de comandos. Con nada conectado a esta
entrada, se registra un valor de 1. Esto es porque esta entrada es conectada vía una
resistencia pull-up interna a la línea de 3.3V. Este tema debe ser claro para que se entienda
la configuración de los GPIOs y se usen apropiadamente.
2.6.4 AJUSTES DE CONFIGURACIÓN DE LOS GPIOS
Así como se configuran los pines para tener ya sea una configuración de resistencia
interna pull-up o pull-down, hay también 7 diferentes modos para cada pin. Este es llamado
el modo multiplexor (mmode) para cada pin y éste es establecido usando un número binario
de tres dígitos, tal como se describe en el primer renglón de la Tabla 2.1. Esta tabla se basa
en la información proporcionada en el documento AM335x TRM. Usando estos ajustes de
bit, se puede construir un valor de 7 bits que puede ser usado para configurar la conducta
exacta de un GPIO dentro de Linux usando “capas de árbol de dispositivo”.
Tabla 2.1 Ajustes de configuración para GPIOs.

BIT Campo AM335x Descripción


0,1,2 mmode El modo multiplexado. Usando los tres bits menos significativos se
puede seleccionar un modo entre 0 y 7. Esto habilita a cada pin tener
hasta 8 diferentes modos.
3 puden Habilita resistencia interna pull-up/pull-down. Habilita=0, Deshabilita=1
4 putypesel Selecciona resistencia interna pull-up o pull-down. Pull-down = 0,
Pull-up = 1.
5 rxactive Entrada activa. Recibidor deshabilitado=0, entrada habilitada=1. Si este
bit es colocado en alto, el pin será una entrada, por otro lado, éste será
una salida.
6 slewctrl Control de la velocidad de subida. Rápida=0, Lenta=1. La velocidad de
subida proporciona control sobre el tiempo de subida/bajada de una
salida. Se puede poner este bit en lenta si se usan interconexiones tales
como I2C.

95
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

El modo mmode es discutido en breve, pero cuando se trabaja con GPIOs el mmode
será 7, por lo tanto, los valores hexadecimales más comunes para configurar los GPIOs son
los siguientes:

 0x27 (00100111) Rápida, Entrada, Pull-Down, Habilitado, y Modo 7.


 0x37 (00110111) Rápida, Entrada, Pull-Up, Habilitado, y Modo 7.
 0x07 (00000111) Rápida, Salida, Pull-Down, Habilitado, y Modo 7.
 0x17 (00010111) Rápida, Salida, Pull-Up, Habilitado, y Modo 7.
Estos valores de configuración son muy útiles, ya que ellos establecen los pines en
el modo de operación exacta que se requiera. Las Figuras 2.33 y 2.34 proporcionan la
mayoría de la información importante que se requiere cuando se va hacer una
interconexión con el BBB.

Fig. 2.33 Descripción de los pines sobre el header P8 del BBB.

Las figuras ilustran las opciones mmode que están disponibles en cada uno de los
pines de los headers P8 y P9 del BBB. Una gran cantidad de información está presente en
estas dos figuras, a continuación, se notan algunos puntos que son particularmente
importantes:

96
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 2.34 Descripción de los pines sobre el header P9 del BBB.

 Cualquier pin que es resaltado en la columna $PINS está realmente asignado y no


debe ser usado a menos que se deshabilite la funcionalidad a la cual está asignada.
Ver la columna sobre notas para más detalles.
 Modo 7 es el mmode GPIO.
 Como se mencionó, el número del GPIO es calculado tomando el número del chip
del GPIO, multiplicarlo por 32 y sumarle el offset. Por ejemplo, GPIO1_12 = (1 x 32)
+ 12 = GPIO44.
 Muy importante, el número $PINS no es el número del GPIO. Este número $PINS en
la figura es una referencia en software para cada uno de los pines y estos valores
son proporcionados en la segunda columna de la figura.
 Los elementos resaltados en las columnas Mode6 y Mode5 relacionan a la
funcionalidad PRU (Unidades de Tiempo Real Programables).
Para probar alguna de la información que se muestra en las figuras anteriores, se
puede hacer referencia a la Figura 2.35 y teclear en una terminal Linux lo que se muestra.
El número del pin es el valor de $PINS del pin en cuestión. Por lo tanto, se puede ver
que el pin 12 del header P8 (el valor de $PINS = 12) está en modo 0x27, que es una entrada
en modo 7 (GPIO1_12) con resistencia pull-down habilitada. Hay más información
disponible en este directorio sobre cuales pines están asignados. Por ejemplo, usar lo
mostrado en la Figura 2.36 para checar los pines asignados. Se puede ver que los pines del

97
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

0 al 7 están asignados al eMMC, mientras que los pines del 8 al 12 están sin asignar a un
específico periférico, por lo tanto, es un GPIO.

Fig. 2.35 Acceso a la información de configuración de pines.

Fig. 2.36 Asignación de los pines.

2.6.5 CONTROL DE GPIOS CON C/C++


Una clase en C/C++ ha sido escrita para mostrar la funcionalidad de los GPIOs del
BBB de una forma más fácil de usar. Para probar esta clase se siguen utilizando las
conexiones mencionadas en las Secciones 2.6.2 y 2.6.3 sobre el BBB, es decir, el push botón
conectado a los pines 3 (VDD_3V3) y 27 (GPIO115), y el arreglo resistencia-LED a los pines
1 (DGND) y 23 (GPIO49). La clase contiene todos los métodos necesarios para configurar un
GPIO como entrada/salida, leer/escribir un valor digital al GPIO, para establecer el flanco
de subida/bajada y para establecer si la salida es activa en bajo/alto. El código está separado
en un archivo de cabecera (.h) y en un archivo de implementación (.cpp). En la Figura 2.37
se muestra el código en C/C++ del archivo de cabecera que contiene la clase GPIO. Observar
cómo todo el código está escrito dentro de la declaración “namesapace beaglebone”. Lo
anterior, con la finalidad de llevar todo lo de este archivo de cabecera al programa principal.

98
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

En la Figura 2.38 se muestra el código en C/C++ de la aplicación. Esta aplicación está


dividida en tres partes; la primera parte consiste en hacer destellar el LED diez veces, una
vez cada segundo; la segunda parte consiste en poner el programa en espera hasta que no
sea oprimido el push botón, una vez oprimido el LED enciende por 5 segundos; la tercera
parte del programa consiste nuevamente en destellar el LED, pero con la diferencia de que
se usa un método que contiene una forma más rápida de escribir hacia el GPIO permitiendo
destellar el LED un millón de veces alrededor de una frecuencia de 125KHz.
Desafortunadamente, la aplicación tiene un uso del CPU del 98% cuando se genera
la salida cuadrada (destello del LED), lo cual no es práctico sobre un OS Linux que es
multiusuario y multiproceso, haciéndolo ciertamente no muy eficiente. Los PWM pueden
servir para conmutar un GPIO usando una señal periódica regular, a una frecuencia fija, con
carga de CPU despreciable. Para conmutaciones rápidas de GPIOs usando señales no
periódicas los PRU-ICSS probablemente sean requeridos.
2.6.6 ARBOL DE DISPOSITIVO DE LINUX
En la primera introducción al proceso de arranque del OS Linux en el Capítulo 1, se
explicó de manera clara que Linux corre sobre un dispositivo embebido y no tiene un BIOS.
Durante el proceso de arranque y configuración del dispositivo, el OS utiliza archivos que se
encuentran en una SD Card o en el eMMC que describen el hardware de la plataforma. Cada
tipo de dispositivo embebido Linux tiene su propio conjunto único de archivos para describir
el hardware de la plataforma.
Cuando el BeagleBone estuvo ejecutando kernels de Linux más viejos, las
modificaciones específicas requeridas para estos kernels eran aplicadas directamente al
código fuente Linux usando un archivo llamado board-amm335xevm.c. Los kernels de
Linux más viejos (antes de la versión 3.7) también proporcionaban un archivo OMAP MUX
fácil de usar para manejar la configuración de pines del BeagleBone. La popularidad de los
procesadores basados en ARM permitió una proliferación de kernels Linux personalizados.
Como resultado, una cantidad de código estuvo siendo agregado directamente a la línea
principal de Linux para describir todas y cada una de las características, para todos y cada
uno de los dispositivos ARM siendo manufacturados. Por lo tanto, para evitar el uso
excesivo de código, las nuevas plataformas ARM con los más recientes kernels Linux usan
un árbol de dispositivo aplanado (FDT por sus siglas en inglés).
El FDT es simplemente una estructura de datos que describe el hardware de la
plataforma. Los archivos FDT describen el CPU, memoria, los LEDs de usuario, el bus I2C,
entre otros. Estos archivos son usados como parte del proceso de arranque. Para modificar
el hardware que está habilitado en el BBB, se podrían modificar estos archivos, compilarlos
usando un compilador y finalmente, desplegarlos sobre el directorio de arranque. Después
de reiniciar el BBB las nuevas configuraciones estarían listas para usar, sin embargo, todo
este proceso podría resultar pesado.

99
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

100
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 2.37 Código en C/C++ para la clase GPIO.

101
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 2.38 Aplicación para mostrar el uso de los GPIOS como entrada y salida.

Desafortunadamente, los FDT no son convenientes para una configuración en


tiempo de ejecución (es decir, después de arrancar la plataforma) de entradas y salidas, que
en ausencia de una alternativa es extremadamente problemático agregar capas
dinámicamente o incrustaciones virtuales al BBB. Afortunadamente, Pantelis Antoniou
desarrolló una solución para este problema usando incrustaciones de árboles de dispositivo
(DTO por sus siglas en inglés) y un manejador de capas.
La mejor manera de explicar un DTO es haciendo referencia a la Figura 2.39 la cual
describe el código de una reasignación de pines del header P9. En la Figura 2.27 se puede
observar que los pines 11 y 13 están asignados al receptor y transmisor del UART4,
respectivamente. Para este ejemplo, se asume que se ha decidido reasignar estos pines a
GPIO0_30 y GPIO0_31, que son modo 7 en ambos casos.

Fig. 2.39 Ejemplo de un DTO para configurar GPIOs dinámicamente.

102
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Los DTOs tienen una extensión de archivo “.dts”. Después de editar el DTO, sobre el
BBB, se debe compilar el archivo “.dts” en un objeto gota de árbol de dispositivo (.dtbo)
usando un compilador (dtc) con la siguiente sintaxis:
$ dtc –O dtb –o EBB-GPIO-Example-00A0.dtbo –b 0 -@ EBB-GPIO-Example.dts

Para desplegar la incrustación, copiar el archivo binario de salida (.dtbo) al directorio


/lib/firmware sobre el BBB.
$ cp EBB-GPIO-Example-00A0.dtbo /lib/firmware

Como se discutió en el Capítulo 1, las capas son plataformas de expansión que


pueden unirse al BBB. Cada capa tiene asociado un archivo “.dtbo”. Idealmente cuando se
conecta una capa al BBB, el respectivo archivo “.dtbo” debe ser cargado para configurar los
pines de los headers P8 y P9 que se interconectan con la capa. El manejador de capa está
diseñado para permitir a las capas ser cargadas dinámicamente en tiempo de ejecución, sin
el requerimiento de recompilar el kernel de Linux. El manejador de capa está implementado
enteramente en el kernel de Linux, pero este carga archivos “.dtbo” a partir del directorio
/lib/firmware en tiempo de ejecución.
El primer paso que se debe de realizar para usar el manejador de capas es instalar
dos variables de entorno (checar las rutas sobre tu BBB).
$ export SLOTS=/sys/devices/bone_capemgr.9/slots
$ export PINS=/sys/kernel/debug/pinctrl/44e10800.pinmux/pins
Debido a que es probable instalar las capas muy a menudo, se deben agregar estas
dos líneas en el archivo .profile, en el directorio home del BBB. Usando la llamada a
nano ~/.profile, se pueden agregar las dos líneas anteriores. Después, se debe usar
el comando source para establecer estas variables de estado. Estas variables serán
automáticamente establecidas en el proceso de arranque del BBB. Se pueden checar los
slots del manejador de capas para ver cuales capas están cargadas y cuales pines están
asignados, tal como se muestra en la Figura 2.40.

Fig. 2.40 Edición del archivo ~/.profile y establecimiento de las variables de estado.

103
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Los slots del 0 al 3 están reservados para capas físicamente conectadas, mientras
que las incrustaciones de árboles de dispositivo (capas virtuales) reciben ubicaciones de
slots más altas. Para transferir las variables de entorno SLOTS y PINS se tiene que iniciar
sesión como súper usuario y teclear visudo. Bajo la línea que contiene env_reset
colocar lo siguiente:
Defaults env_reset
Defaults env_keep += “SLOTS”
Defaults env_keep += “PINS”
Guardar los cambios para ver que las variables han sido transferidas a la sesión súper
usuario y después cargar la nueva incrustación tecleando lo mostrado en la Figura 2.41.

Fig. 2.41 Ejemplo de cómo cargar una incrustación en el BBB.

La incrustación ha sido cargada en el slot número 7. Para probar que la capa está
trabajando correctamente se puede teclear el comando cat $PINS. Los pines están
configurados exactamente como se solicitó en el archivo de la incrustación de árbol de
dispositivo con el pin 11 (GPIO28) colocado en modo 7 y el pin 13 (GPIO29) en modo 37.
Para remover una incrustación de un slot se debe pasar el signo menos (-), seguido
por el número del slot, al manejador de capa (ver Figura 2.42).
Este procedimiento trabaja para la mayoría de los slots, pero en el momento de
escribirlo, este procedimiento puede bloquear la terminal de Linux para ciertas capas,
requiriendo un reinicio del BBB. Las incrustaciones del HDMI y del eMMC ocupan muchos
de los pines de los headers P8 y P9, y estas incrustaciones tienen que ser removidas para
accesar a los pines alternativos. Deshabilitar la capa del HDMI o del eMMC no es sencillo,
se tiene que modificar el archivo uEnv.txt usando la aplicación Notepad++ sobre
Windows o directamente sobre el BBB (referir al Capítulo 1 para modificar este archivo).

104
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 2.42 Ejemplo sobre como remover una incrustación.

Sobre el archivo, quitar el comentario que está debajo de la línea que dice “Disable
HDMI”, tal como se muestra a continuación:
##Disable HDMI
optargs=capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN
pero teniendo cuidado de no hacerlo sobre la línea similar que dice “Disable HDMI/eMMC”.
Una vez hecho este cambio, se debe reiniciar el BBB. Para determinar si la capa fue
removida correctamente, teclear el comando cat $SLOTS sobre la terminal Linux, y
buscar en los slots desplegados por la letra L. La letra L significa que la capa está habilitada,
si esta letra está ausente entonces la capa está deshabilitada.
Si se necesita deshabilitar el eMMC para usar los pines del header que ocupa este
módulo, se debe tener cuidado de que el BBB tenga que ser arrancado a partir de la SD
Card. Si se introduce un error en el archivo uEnv.txt, entonces el BBB no podrá arrancar.
Si se desea cargar una incrustación cada vez que la plataforma arranca, se debe
modificar el archivo uEnv.txt agregando una nueva línea con lo siguiente:
##Disable HDMI
#optargs=capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN
optargs=capemgr.enable_partno=BB-SPIDEV0

Después de reiniciar el BBB, se mostrará una nueva capa en uno de los slots libres.

2.7 ENTRADAS/SALIDAS ANALÓGICAS


En esta sección se describe cómo se puede interconectar un circuito analógico al
BBB y cómo se puede leer el valor que éste proporciona mediante el uso del sistema de
archivo sysfs de Linux. Además, se explora la funcionalidad de los pines PWM del BBB
para ser utilizadas como salidas analógicas.

105
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

2.7.1 ENTRADAS ANALÓGICAS


El AM335x tiene un registro de aproximaciones sucesivas (SAR por sus siglas en
inglés) de 12 bits que es capaz de muestrear 200000 muestras por segundo. La entrada para
el SAR es internamente seleccionada usando un interruptor analógico y el BBB hace siete
de estos interruptores analógicos disponibles en el header P9 como entradas analógicas.
Entre otras cosas, las entradas analógicas pueden ser configuradas para ser usadas como
un controlador de pantalla táctil resistiva de 4, 5 o 8 alambres. En esta sección, las entradas
del ADC (convertidor analógico-digital) son usadas como entradas simples de un solo
alambre. Por default, estas entradas no están habilitadas en el BBB, por lo tanto, el primer
paso es habilitarlas. Las entradas analógicas pueden ser habilitadas con el uso del
manejador de capas para cargar un DTO (ver Figura 2.43).

Fig. 2.43 Pasos para habilitar la incrustación del ADC en el BBB.

Una vez adjuntada la incrustación BB-ADC al slot, se mostrará una nueva entrada en
el directorio /devices, en el cual se encontrarán los archivos de entrada que permiten
leer directamente los valores puros del ADC (ver Figura 2.44).

Fig. 2.44 Archivos habilitados debido a la incrustación BB-ADC.

106
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Si se lee la entrada analógica AIN0, usando cat in_voltage0_raw, cuando


nada está conectado, el resultado será un valor entero entre 0 y 4095. A continuación se
muestra un ejemplo simple en código C++ que lee un valor del ADC. Este programa está
estructurado para que se lea un solo valor de cualquiera de los pines AIN, pasando el
número del pin (0-6) a la función readAnalog().
Este código trabaja perfectamente para leer un sensor ocasionalmente, pero no es
muy bueno para leer un sensor muchas veces por segundo.
#include<iostream>
#include<fstream>
#include<string>
#include<sstream>
using namespace std;
#define PATH “/sys/bus/iio/devices/iio:device0/in_voltage”
int readAnalog(int number){
stringstream ss;
ss << PATH << number << “_raw”;
fstream fs;
fs.open(ss.str().c_str(),fstream::in);
fs >> number;
fs.close();
return number;
}
int main(int argc, char* argv[]){
cout << “ADQUIRIENDO VALOR” << endl;
int value = readAnalog(0);
cout << “EL VALOR ES: ” << value << endl;
return 0;
}

2.7.2 SALIDAS ANALÓGICAS


La siguiente funcionalidad a ser examinada es el uso de las salidas PWM del BBB para
proporcionar una conversión digital-analógica de baja frecuencia, o para la generación de
señales de control para motores y ciertos tipos de servos. Hay ocho salidas PWM, tres
módulos eHRPWM (dos salidas cada uno) y dos módulos eCAP. Estas salidas son descritas
en las Figuras 2.33 y 2.34 donde se puede ver que las seis salidas eHRPWM están disponibles
en dos pines separados (es decir, la salida 2B está disponible en los pines P8_13 y P8_46).

107
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Al igual que el ADC, los pines PWM son habilitados usando incrustaciones, cuales están
disponibles en el directorio /lib/firmware.
Para habilitar P9_22 como una salida PWM, se tienen que pasar dos incrustaciones
al manejador de capas (ver Figura 2.45). La capa HDMI está bloqueando varias de las salidas
PWM, por lo tanto, es necesario deshabilitar esta capa si se quieren usar más salidas PWM.
Para accesar a las propiedades de una salida PWM se tiene que cambiar de directorio tal
como se muestra en la Figura 2.46.

Fig. 2.45 Pasos para habilitar las incrustaciones del módulo PWM.

Fig. 2.46 Directorio donde se encuentran las propiedades de las salidas PWM.

Para configurar una señal PWM, el periodo es aplicado en nanosegundos. Por lo


tanto, para una salida PWM que tiene un periodo de 10µs y 50% de ciclo de servicio se tiene
que establecer lo mostrado en la Figura 2.47.

Fig. 2.47 Configuración del periodo y ciclo de servicio de una señal PWM.

108
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

EJERCICIO: Crear una clase en C++ que configure una salida PWM.

2.8 TEMAS AVANZADOS SOBRE GPIOS


Un problema serio con la aplicación de la entrada digital GPIO descrita en este
capítulo es que ésta requiere que el archivo sysfs sea repetidamente sondeado para
determinar si un cambio en el estado del GPIO ha ocurrido. Esta tarea es intensiva de
procesador o propensa a larga latencia si la frecuencia de los chequeos es reducida. Esta
sección explica como este problema puede ser direccionado usando dos diferentes técnicas.
2.8.1 LINUX epoll
Al inicio de este capítulo se presentó un código que puede ser usado para detectar
el estado de un botón checando el estado del archivo value. Esta es una operación
intensiva de procesador y no es realmente práctica. Si se observa el contenido del directorio
/sys/class/gpio se notará un archivo de entrada llamado edge que hasta ahora no
ha tenido relevancia. Se puede usar una llamada de función de sistema epoll() a partir
del archivo de cabecera sys/poll.h, donde uno de sus argumentos especifica un
apuntador a un arreglo de estructuras, cada una identificando un archivo de entrada a ser
monitoreado y el tipo de evento a ser monitoreado (por ejemplo, EPOLLIN para leer
operaciones, EPOLLET flanco de disparo y EPOLLPRI para datos urgentes). Otro de los
argumentos especifica cuantos elementos están en el arreglo del argumento anterior. El
último argumento identifica un tiempo muerto en milisegundos. Si este valor es -1 entonces
el kernel esperará por siempre por la actividad especificada en el arreglo. Este código ha
sido agregado en ejemplo de la Figura 2.48. En la figura se muestra la función
waitForEdge2() la cual espera a que cualquiera de dos eventos ocurra. Los eventos
sirven para determinar en cuál de los dos GPIO que fueron programados como entradas
hubo el cambio de estado.
Para probar este código se debe conectar dos push botón al BBB, el primero a los
pines P9_3 (VDD_3V3) y P9_27 (GPIO_115) y el segundo a los pines P9_2 (DGND) y P9_12
(GPIO_60). Notar como la clase GPIO se sigue utilizando para configurar los GPIOs como
entradas. En la Figura 2.49 se muestra una salida típica de la ejecución del código anterior.
Cuando el push botón que está conectado al GPIO_60 es presionado, la salida mostrará
“Ocurrió el evento 2”, en caso contrario, si el push botón que está conectado al GPIO_115
es presionado, la salida mostrará “Ocurrió el evento 1”. Por último, si ambos push botón
son presionados la salida mostrará las dos leyendas anteriores.

109
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 2.48 Uso de la función epoll() para detectar cambios de estado en GPIOs programados como entradas.

Fig. 2.49 Salida que muestra cuál de los eventos ha ocurrido.

2.9 BUSES DE INTERFACES


Esta sección examina comunicaciones más complejas que pueden ser realizadas
usando interfaces de bus que están disponibles en el BBB. El bus de comunicación es un
mecanismo que habilita datos para ser transferidos entre componentes de alto nivel de una

110
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

plataforma embebida usando protocolos de comunicaciones estandarizadas. Los buses de


sistemas embebidos más comúnmente usados están disponibles en el BBB y ellos son temas
de esta sección, el Inter-Integrated Circuit (I2C) y el Serial Peripheral Interface (SPI). En
adición, el Universal Asynchronous Receiver/Transmitter (UART) y el Controller Area
Network (CAN) serán discutidos. Estos son dispositivos hardware de computadora que
pueden ser configurados y usados para enviar y recibir datos seriales. Cuando se combinan
con manejadores de interfaces apropiados, UART y CAN pueden implementar protocolos
de comunicaciones seriales estándar.
Entender la conducta y uso de los protocolos de comunicaciones de los buses y de
los dispositivos, habilita la posibilidad de construir sistemas electrónicos avanzados basados
en BBB. Hay un gran número de sensores complejos, actuadores, dispositivos de entrada,
expansiones I/O y otros microcontroladores que conforman a estos protocolos de
comunicaciones y el BBB es capaz de comunicarse con todos ellos.
2.9.1 I2C
Inter-Integrated Circuit (I2C) es un bus de 2 alambres sencillo que fue diseñado por
Philips en 1980 para interconectar microprocesadores o microcontroladores a dispositivos
periféricos de baja velocidad. Un dispositivo maestro, tal como el BBB, controla el bus, y
muchos dispositivos esclavos direccionables pueden ser adjuntados a los mismos dos
alambres. Este bus se ha mantenido popular sobre los años, principalmente debido a su
relativa simplicidad y amplitud de adopción. Este bus es actualmente usado en
smartphones, la mayoría de los microcontroladores, y en aplicaciones de manejo de
entornos en servidores de cultivos de gran escala. A continuación, se dan algunas
características generales del bus I2C:

 Sólo dos líneas de señal son requeridas para la comunicación, la línea Serial Data
(SDA) para la transmisión de datos bidireccional, y la línea Serial Clock (SCL), cual es
usada para sincronizar la transferencia de datos. Debido a que el bus usa esta señal
de reloj sincronizadora, la transferencia de datos es dicha a ser síncrona. La
transmisión es dicha a ser bidireccional porque el mismo alambre SDA puede ser
usado para enviar y recibir datos.
 Cada dispositivo sobre el bus puede actuar como un maestro o un esclavo. El
dispositivo maestro es el que inicia la comunicación y el dispositivo esclavo es el que
responde. Los dispositivos diseñados esclavos no pueden iniciar la comunicación con
el dispositivo maestro.
 Cada dispositivo esclavo conectado al bus es pre-asignado a una única dirección,
cual es de la forma de 7-bits o 10 bits.
 Este bus tiene facilidades verdaderas de multi-maestro, incluyendo detección de
colisión y arbitraje si dos o más dispositivos maestros se activan a la vez.

111
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

La Figura 2.50 ilustra la interconexión de múltiples dispositivos esclavos al bus I2C.


Todas las conexiones de salida a las líneas SDA y SCL están en configuración de drenaje
abierto, por lo cual todos los dispositivos comparten una conexión a tierra común. Esto
significa que los dispositivos de diferentes familias lógicas pueden ser entremezclados en el
bus, y que un gran número de dispositivos puedan ser agregados a un único bus. En teoría,
hasta 128 dispositivos pueden ser conectados a un único bus, pero haciendo eso podría
incrementar fuertemente la capacitancia de las líneas de interconexión. El bus está
diseñado para trabajar sobre distancias cortas. Líneas de buses largas son propensas a
interferencia eléctrica y efectos de capacitancia.
La capacitancia de la línea de transmisión tiene un amplio impacto sobre la tasa de
transmisión de datos. Una capacitancia elevada implica tasas de velocidad de transmisión
de datos más bajas. El bus del BBB soporta frecuencias de hasta 400KHz. El bus I2C requiere
resistencias pull-up (Rp) en ambas líneas SDA y SCL, como se ilustra en la Figura 2.50. Estas
son llamadas resistencias de terminación y ellas usualmente tienen un valor de entre 1kΩ y
10kΩ. Su papel es halar las líneas SDA y SCL hasta VDD cuando ningún dispositivo I2C las está
halando hacia GND. Esta configuración pull-up habilita múltiples dispositivos maestros para
tomar control del bus y para que los dispositivos esclavos extiendan la señal de reloj. La
extensión de reloj puede ser usada por el dispositivo esclavo para bajar la transferencia de
datos hasta que éste termine el procesamiento y esté listo para transmitir. Estas resistencias
están por lo general presentes en la plataforma que está asociada con el dispositivo I2C. Esta
puede ser una característica útil, pero puede causar dificultad si se desea usar varias
plataformas sobre el mismo bus.

Fig. 2.50 Configuración de interconexión del bus I2C.

112
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Los resistores en serie (Rs) mostrados en la Figura 2.50 usualmente tienen valores
bajos (250Ω), y pueden ayudar a proteger contra condiciones de sobre corriente.
NOTA: El bus I2C del BBB tolera 3.3V; consecuentemente se necesita circuitería de traslación
de nivel lógico si se desea conectar dispositivos I2C que se alimentan con 5V.
Los buses I2C0 y I2C2 están presentes por default en la imagen de Debian del BBB y
quizá erróneamente, ellos están mapeados a los nombres de dispositivo Linux i2c-0 y
i2c-1, respectivamente. Se puede habilitar el segundo bus I2C público (ver Tabla 2.2),
i2c-2 (I2C1) usando el siguiente comando:
root@beaglebone:/dev# echo BB-I2C1 > $SLOTS
Linux proporciona un conjunto de herramientas llamadas i2c-tools, para
interconectar a buses de dispositivos I2C. Estas incluyen una herramienta de prueba de bus,
un vaciador de chip, y ayudadores de acceso a nivel registro. Estas herramientas están
realmente instaladas sobre el BBB, pero pueden ser actualizadas o instaladas usando:
root@beaglebone:/dev# apt-get install i2c-tools
Tabla 2.2 Buses I2C sobre el BBB.

H/W BUS S/W DEVICE SDA PIN SCL PIN DESCRIPCIÓN


I2C0 /dev/i2c-0 N/A N/A Bus interno para
control de HDMI
I2C1 /dev/i2c-2 P9_18 P9_17 Bus I2C general,
deshabilitado por
default
I2C2 /dev/i2c-1 P9_20 P9_19 Bus I2C general,
habilitado por
default

El primer paso es detectar que dispositivo está presente en el bus. Cuando el


segundo bus I2C público es habilitado, y la línea de reloj (SCL) o línea de datos (SDA) no están
conectadas a ningún dispositivo, el comando i2cdetect desplegará la siguiente salida
(ver Figura 2.51):

Fig. 2.51 Despliegue de dispositivos presentes en el bus I2C.

El bus /dev/i2c-1 puede ser probado para dispositivos conectados a este bus de
la siguiente manera (ver Figura 2.52):

113
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 2.52 Dispositivos conectados al bus i2c-1.

donde las direcciones 0x03 a 0x77 son desplegadas por default. Usando –a desplegará el
rango completo 0x00 a 0x7F. Cuando -- es desplegado, la dirección fue probada pero
ningún dispositivo respondió. Cuando UU es desplegado, la prueba es saltada, ya que la
dirección está realmente en uso por un driver. Se puede identificar el driver usando lo
siguiente:
root@beaglebone:/sys/bus/i2c/devices/1-0054# cat modalias
Cuando un dispositivo I2C está físicamente conectado al bus I2C (en este ejemplo
I2C2), y si el dispositivo está funcionando y está correctamente alambrado, aparecerá su
dirección predefinida, en este caso 0x48 (ver Figura 2.52).
El comando i2cdump puede ser usado para leer in los valores de los registros del
dispositivo conectado a un bus I2C y desplegarlos en forma de bloque hexadecimal. No se
debe de usar este comando sin consultar la hoja de datos del dispositivo esclavo. Un
ejemplo del uso de este comando se muestra a continuación:
root@beaglebone:~# i2cdump –y 1 0x48
Para escribir un solo byte a un registro del dispositivo, el patrón de acceso maestro/esclavo
en el primer renglón es usado como sigue:
1. El maestro envía un bit de empiezo (es decir, pone SDA en bajo, mientras SCL está
en alto).
2. Mientras la señal de reloj conmuta, los siete bits de la dirección del esclavo son
transmitidos, un bit a la vez.
3. Un bit de lectura (1) o un bit de escritura (0) es enviado, dependiendo de si el
maestro quiere leer o escribir el registro del esclavo.
4. El esclavo responde con un bit de reconocimiento (ACK=0).
5. En modo escritura, el maestro envía un byte de datos, un bit a la vez, después de lo
cual el esclavo envía de regreso un bit ACK. Para escribir a un registro, la dirección
del registro es enviada, seguida por el valor del dato a ser escrito.
6. Finalmente, para concluir la comunicación, el maestro envía

114
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

El comando i2cget puede ser usado para leer el valor de un registro para probar
el dispositivo, o como una entrada para scripts Shell de Linux. Por ejemplo, para leer el
DEVID del dispositivo interconectado (usando el ADXL345), se usa lo siguiente:
root@beaglebone:~# i2cget –y 1 0x53 0x00
El comando i2cset puede ser usado para configurar un registro. Este es requerido
por ejemplo, para llevar el ADXL345 fuera del modo de ahorro de energía, mediante la
escritura de 0x08 en el registro POWER_CTL, cual está en la dirección 0x2D.
root@beaglebone:~# i2cset –y 1 0x53 0x2D 0x08
El primer ejemplo de programación en C/C++, simplemente lee un solo byte a partir
del dispositivo esclavo (ver Figura 2.53).

Fig. 2.53 Código para leer un byte del dispositivo I2C esclavo.

2.9.2 SPI
El bus de Interface de Periférico Serial (SPI) es un enlace de datos seriales síncrono
rápido, completamente duplo que habilita a dispositivos tales como el BBB para comunicar
con otros dispositivos sobre distancias cortas. Por lo tanto, al igual que I2C, el bus SPI es
síncrono, pero a diferencia del bus I2C, el SPI es completamente duplo. Esto significa que
puede transmitir y recibir datos al mismo tiempo, mediante el uso de líneas separadas para
enviar datos y recibir datos.
La comunicación SPI toma lugar entre un solo dispositivo maestro y uno o más
dispositivos esclavos. La Figura 2.54 ilustra un ejemplo de un único esclavo, donde cuatro

115
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

líneas de señal son conectadas entre el dispositivo maestro y esclavo. Para comunicar con
el dispositivo esclavo, los siguientes pasos toman lugar:
1. El maestro SPI define la frecuencia de reloj en la cual sincronizar los canales de
comunicación de datos.
2. El maestro SPI jala la línea Chip Select (CS) a bajo, activando el dispositivo cliente,
éste por lo tanto es dicho a ser activo en bajo. Esta línea es también conocida como
Slave Select (SS).
3. Después de un retardo corto, el maestro SPI genera ciclos de reloj enviando datos
de salida sobre la línea Master Out – Slave In (MOSI) y recibiendo datos sobre la línea
Master In - Slave Out (MISO). El dispositivo esclavo SPI lee datos a partir de la línea
MOSI y transmite datos sobre la línea MISO. Un bit es enviado y un bit es recibido
sobre cada ciclo de reloj. Los datos son usualmente enviados en trozos de un byte.
4. Cuando el proceso se completa, el SPI maestro para enviando una señal de reloj y
después jala la línea CS a alto, desactivando el dispositivo esclavo.

Fig. 2.54 Uso del bus SPI maestro para conectar a un dispositivo esclavo.

A diferencia del bus I2C, el bus SPI no requiere resistencias de pull-up sobre las líneas
de comunicación, así las conexiones son muy sencillas. Una comparación resumida de I2C
versus SPI es proporcionada en la Tabla 2.3.
Tabla 2.3 Comparación de I2C versus SPI sobre el BBB.

I2C SPI
Conectividad Dos alambres, cual hasta 128 Típicamente cuatro alambres y requiere
dispositivos direccionables pueden lógica adicional para más de un
ser conectados. dispositivo esclavo.
Tasa de Datos El modo rápido de I2C es 400KHz. Usa Más rápido desempeño, típicamente
media comunicación dúplex. sobre los 10MHz. Completamente dúplex.
Hardware Requiere resistores pull-up. No requiere resistores pull-up.
Soporte BBB Soportado completamente con dos Soportado completamente con dos
buses externos (más uno interno). buses. Sólo un pin de selección de esclavo
sobre cada bus.
Características Puede tener múltiples maestros. Los Simple y rápido, pero sólo un único
esclavos tienen direcciones, dispositivo maestro, no direccionable y no
reconocimiento de transferencia y control de esclavo of flujo de datos.
puede controlar el flujo de datos.
Aplicación Acceso de dispositivos intermitente, Para dispositivos que proporcionan flujos
es decir, reloj de tiempo real, de datos, es decir, sensores.
EEPROMS.

116
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

El bus SPI opera usando uno de cuatro diferentes modos, cual es elegido de acuerdo
a la especificación definida en la hoja de datos del dispositivo SPI esclavo. La información es
sincronizada usando una señal de reloj y uno de los modos de comunicación SPI descritos
en la Tabla 2.4 es puesto para describir cómo se realizará la sincronización. La polaridad del
reloj define si el reloj está en bajo o alto cuando éste está sin utilizar (es decir, cuando CS
está en alto). La fase de reloj define si la información sobre las líneas MOSI y MISO es
capturada sobre el flanco de subida o flanco de bajada de la señal de reloj. Cuando la
polaridad del reloj es 1, la señal de reloj es equivalente a una versión invertida de la misma
señal de reloj con una polaridad de 0. Por lo tanto, un flanco de subida sobre una forma de
polaridad de señal de reloj es el equivalente a un flanco de bajada sobre la otra. Se necesita
examinar la hoja de datos para el dispositivo esclavo para determinar el modo SPI.
Tabla 2.4
MODO POLARIDAD DE RELOJ FASE DE RELOJ
0 0 (Bajo en modo inactivo) 0 (Dato capturado en el flanco de
subida de la señal de reloj)
1 0 (Bajo en modo inactivo) 1 (Dato capturado en el flanco de
bajada de la señal de reloj)
2 1 (Alto en modo inactivo) 0 (Dato capturado en el flanco de
bajada de la señal de reloj)
3 1 (Alto en modo inactivo) 1 (Dato capturado en el flanco de
subida de la señal de reloj)

El protocolo SPI no define una tasa de datos máxima, flujo de control, o


reconocimiento de comunicación. Por lo tanto, las implementaciones varían a partir de
dispositivo a dispositivo, así que es muy importante estudiar la hoja de datos de cada tipo
de dispositivo SPI esclavo. Hay algunas variantes de SPI de tres alambres que usan una sola
línea bidireccional MISO/MOSI en lugar de dos líneas individuales. Por ejemplo, el sensor
ADXL345 soporta I2C y ambas comunicaciones SPI de cuatro y tres alambres.
El header P9 en la Figura 2.27 especifica que los buses SPI0 y SPI1 son accesibles a
partir de este header. SPI1 conflictúa con los pines mcasp0 de manera que se tiene que
deshabilitar el HDMI para poder usarlo. Como se muestra en la Figura 2.54, los pines para
SPI0 son los siguientes:

 Chip Select: P9_17 spi0_cs0 (Modo 0) $PINS 87 Offset 0x15C.


 MOSI: P9_18 spi0_d1 (Modo 0) $PINS 86 Offset 0x158.
 MISO: P9_21 spi0_d0 (Modo 0) $PINS 85 Offset 0x154.
 Clock: P9_22 spi0_sclk (Modo 0) $PINS 84 Offset 0x150.
Los buses SPI0 y SPI1 están deshabilitados por default, por lo tanto, para habilitarlos
se usa una incrustación de árbol de dispositivo. El archivo BB-SPIDEV0-00A0.dts define

117
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

como esta incrustación está configurada, con resistores internos pull-up habilitados y
entradas/salidas definidas como se muestra en el código del archivo.
Para habilitar los buses SPI, la incrustación de requisito tiene que ser cargada,
usando la misma sintaxis discutida en la sección 2.6.6 (ver Figura 2.55). Si la incrustación
está cargada correctamente en un slot, entonces habrá ahora dos nuevos dispositivos en el
directorio /dev (spidev1.0 y spidev1.1), donde spidev1.0 significa chip select 0
sobre bus 1.
Para probar el bus SPI se puede usar el programa mostrado en la Figura 2.56.
Conecta spi0_d1 (P9_18) a la terminal SIMO del dispositivo esclavo, spi0_d0 (P9_21) a
la terminal SOMI del dispositivo esclavo y finalmente, spi0_sclk (P9_22) a la terminal
CLK del dispositivo esclavo. Si el bus es de 4 alambres conecte spi0_cs0 (P9_17) para
habilitar el dispositivo esclavo en la línea CS.

Fig. 2.55 Instalando incrustación para manejo del bus SPI0.

118
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 2.56 Código en C/C++ para probar el bus SPI.

La función main() establece los parámetros SPI de control. Estos son solicitudes
ioctl() que permiten sobrescribir la configuración actual del dispositivo para
parámetros tales como los siguientes, donde xx es ambos RD (leer) y RW (escribir):

 SPI_IOC_xx_MODE: Modo de transferencia SPI (0 – 3).


 SPI_IOC_xx_BITS_PER_WORD: Número de bits en cada palabra.
 SPI_IOC_xx_LSB_FIRST: 0 es MSB primero, 1 es LSB primero.
 SPI_IOC_xx_MAX_SPEED_HZ: Tasa de transferencia máxima en Hz.
La implementación de Linux actual proporciona únicamente transferencia síncrona. El
segundo bus SPI, puede ser habilitado, pero solo si la interface HDMI es deshabilitada. La
incrustación HDMI puede ser deshabilitada usando los pasos descritos en la sección 2.6.6.
Cuando la segunda incrustación SPI es cargada, la variable de entorno $SLOTS debe de
mostrar el slot que ha sido asignado a la está incrustación. Una vez cargado, el bus SPI tiene
la siguiente configuración:

 Chip Select: P9_28 spi1_cs0 (Mode 3) $PINS 103 Offset 0x19C.


 MOSI: P9_30 spi1_d1 (Mode 3) $PINS 102 Offset 0x198.
 MISO: P9_29 spi1_d0 (Mode 3) $PINS 101 Offset 0x194.
 Clock: P9_31 spi1_sclk (Mode 3) $PINS 100 Offset 0x190.

119
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Dependiendo del número de incrustaciones SPI que se tienen cargadas, el


dispositivo SPI aparecerá ya sea como spidev1.0 y spidev1.1 o spidev2.0 y
spidev2.1.
2.9.3 UART
Un transmisor/receptor asíncrono universal (UART por sus siglas en inglés) es un
dispositivo periférico de procesador usado para transferencia serial de datos, un bit a la vez,
entre dos dispositivos electrónicos. UARTs fueron originalmente IC autónomos, pero ahora
por lo general están integrados con el microprocesador/microcontrolador huésped. Un
UART no es, estrictamente hablando, un bus, pero su capacidad para implementar
comunicaciones de datos seriales solapa con capacidades similares de los buses I2C y SPI.
Un UART es descrito como asíncrono debido a que el transmisor no tiene que enviar una
señal de reloj al receptor para sincronizar la transmisión, en lugar de eso una estructura de
comunicación es agregada que usa bits de inicio y parada para sincronizar la transmisión de
datos. Debido a que no es requerido un reloj, la información es típicamente enviada usando
solo dos líneas de señal. Tal como una línea de teléfono regular, la conexión de datos de
transmisión (TXD) es conectada a la conexión de datos del receptor (RXD).
Tradicionalmente, UARTs han sido usados con convertidores de nivel/manejadores de
línea para implementar interfaces tal como RS-232 o RS-485, pero para comunicaciones a
cortas distancias, es posible usar el nivel lógico original para las salidas y entradas UART
para habilitar dos UARTs para comunicarse el uno con el otro. Nota que esto es
perfectamente posible pero no es un uso estandarizado para UARTs.
El número de símbolos por segundo es conocido como la tasa de baudios o razón de
modulación. Con ciertos esquemas de codificación un símbolo podría ser usado para
representar dos bits (es decir, cuatro estados, por ejemplo, usando tecleado de corrimiento
de fase de cuadratura). Después, la tasa podría ser dos veces la tasa de baudios. Sin
embargo, para una simple conexión UART bi-nivel, la tasa de baudios es la misma que la
tasa de bits.
El transmisor y el receptor están de acuerdo sobre la tasa de bits antes de empezar la
comunicación. La tasa de bytes es en tanto más baja que 1/8 de la tasa de bits, ya que hay
bits a la cabeza asociados con la transmisión serial de datos. La transmisión empieza cuando
el transmisor envía un bit de inicio (nivel lógico bajo). Sobre el receptor, el flanco de bajada
del bit de inicio es detectado y entonces después de 1.5 periodos de bits, el primer valor de
bit es muestreado. Cada bit subsecuente es muestreado después 1.0 periodos de bits, hasta
que el número de bits bajo acuerdo es transferido (típicamente siete u ocho). El bit de
paridad es opcional (pensando en que ambos dispositivos tienen que ser configurados para
usarlo o no). Si este bit se va a usar, éste puede identificar si un error de transmisión ha
ocurrido. Este bit podría ser alto o bajo, dependiendo de si se emplea una paridad impar o
par. Finalmente, un bit de parada es enviado (opcional dos bits de parada), cual siempre es

120
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

un valor lógico alto. El ejemplo de esta sección usa una forma 8N1, que significa que ocho
bits son enviados en cada marco, con ningún bit de paridad y un bit de parada.
NOTA: Es importante que no se conecte un dispositivo UART de 5V a la entrada RXD UART
del BBB ya que se llegaría a dañar el BBB.
El BBB tiene cuatro UARTs que son accesibles vía sus conectores P8 y P9 sobre los
pines listados en la Tabla 2.5.
Tabla 2.5 Pines UART en los conectores del BBB (entre paréntesis se muestra el modo mux).

UART1 UART2 UART3 UART4 UART5


TXD P9_24(0) P9_21(1) No expuesto P9_13(6) P8_37(4)
RXD P9_26(0) P9_22(1) No expuesto P9_11(6) P8_38(4)

Para el siguiente ejemplo, el UAR4 del BBB es usado. Como se detalló en la Tabla 2.5,
los pines para el UART4 son los siguientes:

 P9_13 UART4_TXD: Salida que transmite datos al receptor.


 P9_11 UART4_RXD: Entrada que recibe datos del transmisor.
La primera prueba es conectar estos dos pines juntos, de modo que el UART del BBB
este literalmente “hablando a él mismo”. Una vez que el alambrado este completo, la
incrustación UART4 debe ser cargada para habilitar el UART, ya que de otro modo no habrá
presencia accesible de las terminales de dispositivo (ver Figura 2.57).

Fig. 2.57 Ejemplo de cómo cargar la incrustación del UART4.

Cuando la incrustación este cargada, el contenido del directorio /dev ahora incluye
una nueva entrada para ttyO4 (letra O, no cero). Este es el “teletipo” (terminal) de
dispositivo, cual es una interface software que habilita el envío y recepción de datos sobre
el UART.
Para probar el dispositivo, se puede usar el comando agetty (alternativo getty)
o el emulador terminal minicom, cuales habilitan el envío y recepción de datos sobre el

121
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

dispositivo ttyO4. El programa minicom habilita para dinámicamente cambiar la


configuración serial mientras se está ejecutando (es decir, número de bits en un frame,
número de bits de parada, paridad, etc.) mediante el tecleado de CTRL+A seguido por Z.
Para instalar y ejecutar minicom seguir los siguientes comandos:
root@beaglebone:~# apt-get install minicom
root@beaglebone:~# minicom –b 9200 –o –D /dev/ttyO4
En este punto se debe teclear Crtl+A seguido por la tecla Z y después presionar E
para activar función “Eco local”. Ahora cuando se presiona una tecla, se debe ver que el
carácter tecleado aparece dos veces. Cualquier tecla que se presione es transmitida de la
salida TXD y también es reflejada en consola. Cuando un carácter es recibido en la entrada
RXD, éste es desplegado en la consola. Por lo tanto, si se ve que los caracteres aparecen dos
veces para las teclas que se están presionando, entonces la prueba UART está trabajando
correctamente. Se puede verificar lo anterior brevemente desconectando el lazo de
conexión TXD-RXD, después de lo cual la tecla presionada sólo aparecerá una vez.
El siguiente paso es escribir un código en C/C++ en el BBB que pueda comunicar con
un dispositivo UART. El programa en C/C++ mostrado en la Figura 2.58 envía una cadena al
dispositivo UART y lee el eco recibido. Este programa usa la librería de Linux “termios.h”,
cual proporciona una interface terminal general que puede controlar puertos de
comunicación asíncrona.
Este código usa la estructura “termios”, para configurar las banderas que definen el
tipo de comunicación que debe tomar lugar. La estructura “termios” tiene los siguientes
miembros:

 tcflag_t c_iflag: Configura los modos de entrada.


 tcflag_t c_oflag: Configura los modos de salida.
 cflag_t c_cflag: Configura los modos de control.
 tcflag_t c_lflag: Configura los modos locales.
 cc_t c_cc[NCCS]: Para caracteres especiales.
Una completa descripción de la funcionalidad “termios” y configuración de banderas
está disponible tecleando man termios en la consola del BBB.
2.9.4 CAN

122
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 2.58 Código en C para el uso de la comunicación UART.

2.10 APLICACIONES
En esta sección se aprenderá a cómo construir interfaces usando GPIOs y Buses
seriales. En particular, se puede combinar hardware y software para proporcionar al BBB la
habilidad para interactuar con su ambiente físico en las siguientes tres maneras: Primero,
controlando actuadores tal como motores, el BBB puede afectar su ambiente, cual es muy
importante para aplicaciones tales como robótica y automatización del hogar. Segundo, el
BBB conseguirá información sobre su ambiente físico comunicándose con sensores.
Tercero, mediante la interconexión a módulos de despliegue, el BBB podrá presentar
información.
2.10.1 APLICACIÓN SPI
La primera aplicación es para probar el bus SPI como se ilustra en la Figura 2.59. Esta
usa un CI 74HC595, cual es un registro de corrimiento con salidas aseguradas que ser
alimentado con niveles lógicos de 3.3V. El 74HC595 puede ser usado a frecuencias de
20MHz o más grandes, dependiendo del voltaje de alimentación VCC. El circuito en la Figura
2.59 usa una barra de ocho LEDs y una red de resistores para minimizar el número de
conexiones.

123
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 2.59 Ejemplo SPI con el CI 74HC595.

El 74HC595 es conectado al BBB usando tres de las cuatro líneas SPI, ya que una
respuesta MISO del 74HC595 no es requerida (se podría conectar la línea MISO a QH, para
una comunicación bidireccional). Las conexiones son las siguientes:

 P9_22 SPI0_SCLK es conectado a la entrada de reloj serial (pin 11) del 74HC595. Esta
línea es usada para sincronizar la transferencia de datos SPI en la línea MOSI.
 P9_18 SPI0_D1 es la línea MOSI y es usada para transferir la información del BBB a
la entrada serial del 74HC595 (pin14). Este enviará un byte (ocho bits) en un tiempo,
cual es la capacidad completa del 74HC595.
 P9_17 SPI0_CS0 es la línea de selección de esclavo. Esta línea es importante, ya que
es usada para mantener la información a la salida del 74HC595 mediante su
transición de estado de bajo a alto. Esta línea es conectada a la entrada de reloj de
registro (pin 12) del 74HC595.
Los LEDs sobre la barra encenderán de acuerdo a los bytes que son transferidos. Este
circuito es útil para controlar 8 salidas usando solo una línea de datos seriales, pero puede
ser extendida su capacidad encadenando más 74HC595. Es particularmente útil para
manejar arreglos de display de 7 segmentos como se verá más adelante.
Una de las ventajas del bus SPI es que este puede ser compartido con múltiples
dispositivos esclavos, asegurando que solo uno de los dispositivos esclavos este activo
cuando la comunicación toma lugar. En la mayoría de los microcontroladores, los pines
GPIO pueden ser usados como pines de selección de esclavo, y una estructura similar puede
ser desarrollada en el BBB. Si se desea tener control para la selección de esclavo se puede
usar el circuito de la Figura 2.60. Esta configuración usa compuertas OR y un inversor para
asegurar que solo una entrada CS sea puesta en bajo a la vez. En la Figura 2.60(a), el
dispositivo esclavo ADXL345 está activo cuando CS = 0 y GPIO = 0, y en la Figura 2.60(b), el
segundo dispositivo esclavo está activo cuando CS = 0 y GPIO=1.

124
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 2.60 Control de más de un dispositivo SPI esclavo con el BBB usando GPIOs.

Dependiendo del dispositivo esclavo siendo usado, la salida GPIO combinada con un
solo inversor puede ser suficiente, ya que se podría permanentemente jalar la línea CS a
bajo sobre el dispositivo esclavo, ignorando la salida CS del maestro. Sin embargo, esto
podría no trabajar para el 74HC595, ya que la línea CS del BBB es usada para asegurar los
datos a la salida de LEDs.
Para más de dos dispositivos esclavos, un decodificador 3 – 8 líneas, tal como el
74HC138 podría ser una buena solución. Este tiene salidas invertidas, cual significa que solo
una de sus ocho salidas está en bajo en un punto en el tiempo. Este dispositivo podría ser
controlado con tres de los GPIOs del BBB y éste podría habilitar uno de ocho dispositivos
esclavos.
El BBB puede ser unido a monitores de computadora y televisiones digitales usando
el conector de salida HDMI. En adición, también capas de pantallas touch LCD pueden ser
unidas a los conectores P8 y P9 como se mencionó en el Capítulo 1. Las desventajas de tales
dispositivos son que ellos no pueden ser prácticos o ellos pueden ser demasiado caros para
ciertas aplicaciones. Cuando una cantidad pequeña de información necesita ser
retrasmitida al usuario, un simple LED puede ser usado. Para mostrar información más
compleja, se suelen usar displays de siete segmentos y módulos LCD de bajo costo.
Los displays de 7 segmentos típicamente consisten de ocho LEDs que pueden ser
usados para desplegar números decimales y hexadecimales con un punto decimal. Ellos
están disponibles para un rango de tamaños y colores, como un ejemplo típico vea la Figura
2.61 donde se observa el etiquetado de sus terminales.

Fig. 2.61 Etiquetado de terminales para displays de 7 – segmentos.

125
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Los displays de siete segmentos son descritos a ser ya sea de cátodo común o de
ánodo común. Esto significa que los cátodos o ánodos del arreglo de LEDs que componen
el display son conectados juntos como se muestra en la Figura 2.61. No se debe limitar la
corriente a través del display colocando un solo resistor en la conexión ánodo/cátodo
común ya que la corriente será compartida entre los segmentos que están encendidos. Esto
resulta en una iluminación desigual, la intensidad de la cual depende el número de
segmentos que son polarizados. Por lo tanto, ocho resistencias limitadoras de corriente son
requeridas para cada display de siete segmentos.
Es posible manejar estos displays usando ocho GPIOs por módulo de siete
segmentos, pero es también posible usar registros de corrimiento y la interface SPI, cual
proporciona las siguientes ventajas:

 Sólo tres pines SPI son requeridos, sin importar cuantos módulos display de siete
segmentos son usados. Usando GPIOs podría requerir más de ocho salidas por cada
módulo display de siete segmentos.
 Los displays de siete segmentos están disponibles en un vasto rango de tamaños y
colores.
 No hay requerimiento para agregar FET o BJT para manejar segmentos individuales.
La Figura 2.62 ilustra una configuración de alambrado que puede ser usada para
conectar un arreglo de displays de siete segmentos de cátodo común al BBB usando su
interface SPI (en esta configuración los IC 74HC595 están en cadena, es decir, la salida de
una etapa está conectada a la entrada de la otra). Si hay tres displays de 7 segmentos en
esta configuración, entonces es necesario correr 24 bits (3 x 8 bits) a la salida SPI0_D1 del
BBB antes de asegurar el 74HC595 usando la línea SPI0_CS0 del BBB.

Fig. 2.62 Interface SPI para arreglos de displays de siete segmentos de cátodo común usando registros de
corrimiento seriales de 8 bits.

126
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Módulos LCD de carácter son displays de matriz de puntos que caracteriza tablas de
fuentes pre-programadas de manera que ellas puedan ser usadas para desplegar mensajes
de texto simples sin la necesidad de software de despliegue complejo. Ellos están
disponibles en un rango de renglones y columnas de carácter (comúnmente 2x8, 2x16, 2x20
y 4x20) y usualmente contiene un LED de luz de fondo, cual está disponible en varios
colores.
Para entender el uso de un módulo LCD, se debe estudiar su hoja de datos, Mientras
la mayoría de los módulos LCD tienen interfaces comunes (casi siempre usando el
controlador HD44780), los módulos de Newhaven tienen mejores hojas de datos.
Hay módulos LCD disponibles con interfaces integradas I2C y SPI, pero la mayoría de
los módulos están disponibles con una interface paralela de 8 o 4 bits. Agregando un
74HC595 al circuito es posible desarrollar una interface SPI personalizada, cual proporciona
una flexibilidad mayor en la elección de módulos. Un módulo LCD genérica puede ser unido
al BBB usando el circuito mostrado en la Figura 2.63.

Fig. 2.63 Interface SPI para módulos LCD usando registro de corrimiento.

Se puede interconectar módulos LCD usando ya sea el modo de 8 o 4 bits, pero no


hay diferencia en la funcionalidad disponible en cualquiera de los modos. La interface de
cuatro bits requiere pocas conexiones de interface, pero cada valor de 8 bits tiene que ser
escrito en dos pasos, los cuatro bits más bajos seguidos por los cuatro bits más altos.
Para escribir al módulo LCD dos líneas son requeridas, la línea RS y la línea E. El
circuito en la Figura 2.63 está diseñado para usar una interface de 4 bits, ya que este
requiere sólo 6 líneas, en lugar de las 10 líneas que se podrían requerir con una interface de

127
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

8 bits. Esto significa que un solo registro 74HC595 puede ser usado para interconectar al
módulo cuando este está en modo de 4 bits. La desventaja es que el software es ligeramente
más complejo para escribir, ya que cada byte tiene que ser escrito en dos nibbles. La
interface de 4 bits usa las entradas DB4-DB7, mientras que la interface de 8 bits requiere el
uso de DB0-DB7.
Es posible leer valores de datos de la LCD, pero esto no es requerido en esta
aplicación, por lo tanto, la señal R/W es puesta a tierra para poner la LCD en modo de
escritura. La alimentación es aplicada usando VCC (5V) y VSS (GND). VEE establece el nivel
de contraste de la LCD y tiene que estar en un nivel bajo entre VCC y VSS. Un potenciómetro
de 10KΩ puede ser usado para proporcionar control preciso sobre el contraste de la LCD.
Los códigos de dirección de carácter de la LCD son mostrados sobre el módulo en la
Figura 2.63. Usando comandos, valores de datos pueden ser enviados a estas direcciones.
Por ejemplo, para desplegar la letra A en la esquina izquierda de arriba, el siguiente
procedimiento puede ser usado con una interface de 4 bits:

 Borrar la LCD enviando el valor 00000001 a D4-D7. Este valor debe ser enviado en
dos partes; el nibble más bajo (0001), seguido del nibble más alto (0000). La línea E
se pone en alto luego en bajo después de cada nibble es enviado. Un retardo de
1.55ms es requerido. El módulo espera un comando a ser enviado cuando la línea
RS está en bajo. Después de enviar este comando, el cursor es puesto en la esquina
izquierda superior.
 Escribir el dato 01000001 = 6510 = “A” con el nibble más bajo enviado primero,
seguido por el nibble más alto. La línea E es puesta en alto seguido de bajo después
de que cada nibble es enviado. El módulo espera datos a ser enviados cuando la
línea RS es puesta en alto.
2.10.2 ACTUADORES
Los motores eléctricos pueden ser controlados con el BBB para hacer que
dispositivos físicos se muevan u operen. Ellos convierten la energía eléctrica en energía
mecánica que puede ser usada por dispositivos para actuar sobre su entorno. Un dispositivo
que convierte energía en movimiento es generalmente referido como un actuador.
Interconectar el BBB a actuadores proporciona una miríada de posibilidades de
aplicaciones, incluyendo control robótico, automatización del hogar, control de cámaras,
vehículos aéreos, control de impresoras 3-D, entre otros.
Los motores eléctricos típicamente proporcionan movimiento rotatorio alrededor
de un eje fijo, que puede ser usado para manejar ruedas, bombas, bandas, válvulas
eléctricas, carriles, torretas, brazos robóticos y mucho más. En contraste a esto, actuadores
lineales crean movimiento en una línea recta, que puede ser muy útil para control de
posición en máquinas de control numérico por computadora e impresoras 3-D. En algunos
casos ellos convierten movimiento rotatorio en movimiento lineal usando un eje de tornillo
128
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

que traslada una tuerca roscada a lo largo de su longitud conforme está rota. En otros casos,
un solenoide mueve un tornillo linealmente a través de los efectos magnéticos de una
corriente eléctrica.
Tres principales tipos de motores son comúnmente usados con el BBB;
servomotores, motores de DC y motores a paso. A continuación se estudia cada uno de
ellos.
Los motores de CD son usados en muchas aplicaciones, a partir de juguetes a
avanzados robots. Ellos son motores ideales para usar cuando una rotación continua es
requerida, tal como en las ruedas de un vehículo eléctrico. Típicamente, ellos tienen solo
dos terminales a las cuales un voltaje es aplicado. La velocidad de rotación y la dirección de
rotación pueden ser controladas variando este voltaje. La tendencia de una fuerza para
rotar un objeto sobre su eje es llamada torque, y para un motor de CD, el torque es
generalmente proporcional a la corriente aplicada.
Los motores de CD, por lo general requieren más corriente de la que el BBB puede
suministrar; por lo tanto, puede estar tentado a manejarlos a partir del BBB simplemente
usando un transistor BJT o FET. Desafortunadamente, esto no trabajará bien, debido a un
fenómeno conocido como recontra golpe inductivo, que resulta en un pico de voltaje
grande que es causado por la inercia del flujo de corriente a través de un inductor
(devanados del motor) que es repente despolarizado. Aun para fuentes de alimentación de
motores modestos, este voltaje grande puede exceder 1kV por un periodo de tiempo corto.
La Figura 2.64 ilustra una solución simple a este problema poniendo un diodo de giro libre
a través de las terminales del motor de CD.

Fig. 2.64 Control de un motor de CD unidireccional.

El diodo de giro libre es polarizado en reversa durante la operación regular del


motor, y por lo tanto no tendrá impacto. Sin embargo, el diodo es polarizado directamente
por un pico de voltaje de contra golpe. Por lo tanto, el pico de voltaje está limitado a la
fuente de voltaje del motor más la caída del diodo. Un resistor o diodo zener puede ser
puesto en serie con el diodo de giro libre para mejorar el nivel de protección. Una

129
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

alternativa a esta configuración es poner un diodo zener a través de las terminales colector-
emisor. La desventaja de esta alternativa es la tierra de la fuente tiene que hundir un gran
pico de corriente, que podría conducir a un tipo de ruido.
El enfoque previo proporciona control unidireccional de un motor de CD. Para
control bidireccional, una configuración de circuito llamado puente H puede ser usado
como el que se muestra en la Figura 2.65. Notar que este circuito tiene diodos para proteger
los cuatro transistores. Para manejar el motor en sentido hacia adelante (asumiendo
sentido horario), Q1 y Q4 deben de ser activados. Esto causa un flujo de corriente a partir
de la terminal positiva a la negativa del motor de CD. Cuando el par opuesto de transistores
son activados, la corriente fluye de la terminal negativa a la terminal positiva del motor y
esto ocasiona un sentido anti horario. El motor no rotará si dos transistores opuestos son
apagados.

Fig. 2.65 Puente H para control del manejo bidireccional de motores de CD.

Cuatro de los pines PWM del BBB pueden ser conectados al circuito puente H, pero
con el cuidado particular de que los dos transistores del lado A o del lado B no sean
activados al mismo tiempo, ya que esto generaría una corriente excesiva que podría dañar
al motor y a la plataforma. Por lo anterior se recomienda usar CI tales como el SN754410
que son fáciles y seguros de usar.
A diferencia de los motores de CD, cuales rotan continuamente cuando un voltaje
de CD es aplicado, los motores paso a paso normalmente rotan en pasos de ángulo fijo
discretos. Por ejemplo, el motor paso a paso que es usado en este ejemplo rota con 200
pasos por revolución, por lo tanto tiene un ángulo de paso de 1.8°. En un motor paso a paso
cada vez que un pulso es aplicado a su entrada, la velocidad de rotación es proporcional a
la razón en la cual los pulsos son aplicados.
Los motores paso a paso pueden ser posicionados muy precisamente, ya que ellos
típicamente tienen un error de posicionamiento de menos del 5% de un paso. El error no
se acumula sobre múltiples pasos, ya que los motores paso a paso pueden ser controlados
en una forma de lazo abierto, sin necesidad de un lazo de retroalimentación. A diferencia

130
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

de los servomotores, pero al igual que los motores de CD, la posición absoluta del tornillo o
eje no es conocida sin la adición de dispositivos como encoders rotatorios, cuales por lo
general incluyen una referencia de posición absoluta que puede ser ubicada realizando una
simple rotación del tornillo.
Los motores paso a paso como se ilustra en la Figura 2.66, tienen magnetos
permanentes dentados que están fijos a un tornillo rotatorio, llamado el rotor. El rotor está
rodeado por bobinas (agrupadas en fases) que están fijas al cuerpo estacionario del motor
(el estator). Los devanados son electromagnetos, que cuando se energizan, atraen los
dientes del tornillo dentado en dirección horario o anti horario, dependiendo del orden en
el cual los devanados fueron activados, tal como se ilustra en la Figura 2.66.

Fig. 2.66 Estructura externa e interna de un motor paso a paso; señales de manejo de paso completo.

131
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

 Paso completo: Dos fases siempre activas (máximo torque).


 Medio Paso: Dobla la resolución de paso. Alterna entre dos fases activas y una sola
fase activa (torque alrededor de ¾ máximo).
 Micro paso: Usa formas de onda senoidales para las corrientes de fase para el paso
del motor en lugar de corrientes de encendido/apagado, así permitiendo
resoluciones de paso más altas ( el torque es reducido significativamente).
Los servomotores consisten de un motor de CD que es unido a un potenciómetro y
un circuito de control. La posición del motor puede ser controlada enviando una señal PWM
al controlador. El HS-422 es un servomotor de bajo costo, de buena calidad, y ampliamente
disponible que puede ser alimentado usando una fuente de 5V. Este puede rotar en un
rango de ±90°, pero el sensor no se comporta de manera lineal fuera del rango de ±45°. De
acuerdo a su hoja de datos el HS-422 espera un pulso cada 20ms que tiene una duración de
1100µs (para poner el eje en la posición central). La posición central puede ser puesta
pasando un pulso de 1500µs de duración.
El servomotor tiene tres alambres: negro (café), rojo y amarillo. El alambre negro es
conectado a la tierra GND del BBB (P9_01); el alambre rojo es conectado al pin SYS_5V
(P9_07); y el alambre amarillo es conectado vía una resistencia limitadora de corriente de
1kΩ a la salida PWM (P9_22). La Figura 2.67 muestra un ejemplo de un servomotor físico.

Fig. 2.67 Vista física de un servomotor.

2.10.3 SENSORES ANALÓGICOS


Un transductor es un dispositivo que convierte variaciones en una forma de energía
en variaciones proporcionales en otra forma de energía. Por ejemplo, un micrófono es un
transductor acústico que convierte variaciones de ondas de sonido en variaciones
proporcionales de una señal eléctrica. De hecho, los actuadores son también transductores,
ya que ellos convierten energía eléctrica en energía mecánica.
Los transductores que convierten la información sobre un ambiente físico en señales
eléctricas (voltajes o corrientes) son llamados sensores. Los sensores pueden contener
circuitería adicional para acondicionar las señales eléctricas y su combinación por lo general
es llamada instrumento. Los términos sensor, transductor e instrumento son de hecho por

132
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

lo general usados intercambiablemente. La interconexión de sensores habilita la


construcción de un rango versátil de proyectos usando el BBB.
Una aplicación simple para medir el nivel de luz se describe a continuación. Para
elegir el valor del resistor 𝑅 que lleva el LDR (resistor dependiente de luz) en un circuito
divisor de voltaje, una buena regla es usar la ecuación (2.1), donde 𝑅𝑚𝑖𝑛 es la resistencia
medida del LDR cuando este está cubierto y 𝑅𝑚𝑎𝑥 es la resistencia medida del LDR cuando
una fuente de luz está cerca de su superficie.

𝑅 = √𝑅𝑚𝑖𝑛 × 𝑅𝑚𝑎𝑥 (2.1)


Otra aplicación es usar sensores de medición de distancia infrarrojos o de
ultrasonido que son útiles para navegación robótica (detección de objetos y seguidor de
línea) e interruptores de proximidad. Estos sensores también pueden ser unidos a
servomotores y usarlos para calcular el rango de mapas (es decir el frente de una plataforma
móvil). Ellos trabajan muy bien en ambientes interiores, pero tienen un uso limitado en
exteriores o a la luz del sol.
El sensor Sharp GP2D12 es buen ejemplo porque cuatro problemas necesitan ser
resueltos antes de poder usarlo.

 La respuesta del sensor es altamente no lineal, así que dos diferentes distancias
pueden dar la misma salida. Se necesita encontrar una manera para desambiguar la
salida del sensor. Por ejemplo, si la salida del sensor es 1.5V, podría significar que el
objeto detectado esta ya sea a 5cm o 17 cm del sensor. Una solución común a este
problema es montar el sensor de manera que sea físicamente imposible para un
objeto estar más cerca que 10cm del sensor.
 El valor de voltaje (0V a 2.6V) excede el rango del ADC. Por lo tanto, se debe usar un
circuito de acondicionamiento de señal para resolver este problema.
 La señal de salida esta propensa a ruido de alta frecuencia. Un filtro RC pasa bajas
puede ser diseñado para resolver este problema.
 Aun para las distancias asumidas más grandes de 10cm, la relación entre la distancia
y el voltaje de salida es aun no lineal. Un proceso de ajuste de curvas puede ser
empleado para resolver este problema si una relación lineal es requerida.

2.10.4 TECLADO MATRICIAL Y LCD


La siguiente aplicación maneja un teclado matricial para mandar códigos al BBB para
que ejecute alguna acción. El teclado matricial utilizado es de 4x3, 4 renglones por 3
columnas, conteniendo los símbolos, 1, 2, 3, 4, 5, 6, 7, 8, 9, *, 0 y # (ver Figura 2.68). Este
arreglo matricial requiere 7 líneas del BBB para operarlo apropiadamente, es decir, tres
GPIOs programados como entradas y cuatro GPIOS como salidas digitales. Sin embargo,
usando circuitería adicional el número de GPIOs puede ser reducido.

133
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

La aplicación maneja hilos (threads) para mostrar las capacidades de éstos en el BBB.
POSIX threads es un conjunto de funciones, tipos y constantes de C que proporcionan todo
lo que se necesita para implementar hilos en las aplicaciones de C/C++ sobre el BBB. Agregar
hilos al código permite que parte del código sea ejecutado aparentemente en paralelo,
donde cada hilo recibe una rebanada de tiempo del procesador. Para usar hilos en una
aplicación, se necesita incluir el archivo de cabecera “pthread.h” y usar la bandera –
pthread cuando se compila y enlaza en código usando gcc/g++.

Fig. 2.68 Teclado matricial de 4x3.

En la Figura 2.69 se muestra el código de la aplicación la cual usa un hilo para crear
un evento que se ejecuta en paralelo con el ciclo principal. La aplicación usa un registro de
corrimiento 74HC194 para generar el código de barrido en los 4 renglones del teclado
matricial (P1, P2, P3 y P4). De ese modo, se necesita una función que esté generando una
señal de reloj continuamente sobre el registro de corrimiento, mientras en el ciclo principal
se espera a que ocurra un evento en cualquiera de las 3 columnas del teclado matricial. La
función del hilo threadFunction() es precisamente generar la señal de reloj para el
registro de corrimiento y llevar la cuenta de los pulsos generados para tener una referencia
del código que es barrido en el teclado matricial, es decir, hay un contador que se reinicia
después de cuatro pulsos. La Tabla 2.6 resume la función del hilo threadFunction().
Tabla 2.6 Resumen de la función del hilo sobre la aplicación.

Código Pulso Contador


1110 1 0
1101 2 1
1011 3 2
0111 4 3
1110 5 0
1101 6 1
… … …

134
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

135
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 2.69 Código para el manejo de un teclado matricial usando hilos.

136
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

El código mostrado en la Figura 2.69 usa la cabecera “epoll/sys.h” para crear la


función waitForEdge3() que sirve para sondear 3 entradas del BBB mediante la
llamada a la función epoll_wait(). La función principal main() empieza configurando
dos GPIOs como salida, donde GPIO15 (P9_24) sirve para habilitar la carga paralela del
código 1011 en el registro de corrimiento poniendo la entrada S0 en 1 lógico (La línea S1
sobre el registro de corrimiento debe estar puesta en 1 lógico) y dando un pulso de reloj.
Por otro lado, el GPIO14 (P9_26) se usa para generar la señal de reloj que alimenta la
entrada CP del registro de corrimiento. Después, sobre la misma función principal se
configuran tres GPIOs como entrada, donde el GPIO66 (P8_7) sirve para sondear la línea P7
del teclado matricial, GPIO67 (P8_8) sondea la línea P6 y GPIO68 (P8_10) sondea la línea
P5. En la Figura 2.70 se muestra el diagrama de conexiones de la aplicación.
La función principal continúa con la creación del hilo para que se esté ejecutado la
función threadFunction() concurrentemente con el ciclo principal. En el ciclo
principal se usa un objeto de flujo de datos para formar un código de dos símbolos. Esto
quiere decir que en el ciclo se espera a que sean apretadas dos teclas para formar el código.
Si una tecla es presionada hay un tiempo de 5 segundos de espera para que la segunda tecla
sea presionada, si esto no ocurre, entonces no se forma ningún código y el programa vuelve
al estado de espera de que sea presionada la primera tecla. Para salir de la aplicación se
debe teclear dos veces la tecla “*” para formar el código “**”.

Fig. 2.70 Diagrama de conexiones para la aplicación del teclado matricial.

En la Figura 2.71 se muestra otra aplicación la cual usa un registro de corrimiento


74HC595 para hacer el barrido de renglones de un teclado matricial y para hacer la
comunicación con una LCD MCC164B1-2 usando una configuración de 4 líneas.

137
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 2.71 Hardware para usar un teclado matricial y una LCD simultáneamente con el BBB.

138
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

UNIDAD 3

SERVICIOS DE RED EMBEBIDOS

139
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

3.1 INTRODUCCIÓN
En el capítulo anterior se describió un marco que puede ser usado para habilitar al
BBB tomar control de un microcontrolador y emitir comandos a éste usando una
comunicación serial UART. También en el capítulo anterior, se describió como el BBB por el
mismo es muy útil para accionamiento, sensado y aplicaciones de despliegue de
información. El BBB puede ser configurado para ser un dispositivo servidor serial,
habilitándolo para ejecutar comandos que son enviados a partir de otro dispositivo
maestro, tal como una computadora de escritorio, una máquina servidor, u otro BBB. Por
ejemplo, el BBB podría ser usado como el procesador central de un robot controlado
remotamente que recibe comandos sobre un enlace serial alámbrico o una conexión
Bluetooth inalámbrica.
En este capítulo se describe un marco similar que se puede desarrollar usando
sockets de Internet ya sea con línea fija o Ethernet inalámbrico. Sin embargo, dependiendo
de la aplicación, Ethernet o Wi-Fi puede no ser una opción viable debido a los
requerimientos de infraestructura y/o limitaciones de energía. Por lo tanto, el control
remoto usando conexiones seriales alámbricas o inalámbricas se discute primero en este
capítulo.
Antes de que el servidor serial sea establecido en el BBB, es necesario discutir el
administrador del sistema daemon, systemd, cual es usado para iniciar o detener servicios
bajo Linux. Los daemons son procesos de segundo plano (usualmente terminan con la letra
d), y entender el systemd es particularmente importante si se va a reconfigurar las
interfaces seriales actuales o diseñar una aplicación que se desea que inicie
automáticamente cuando el BBB arranca.

3.2 MANEJO DE SERVICIOS


Systemd fue desarrollado para reemplazar el sistema init discutido en el
Capítulo 1. Éste es un desarrollo de Linux controversial, pero es probable que sobre el
tiempo, init sea completamente reemplazado por systemd en el BBB. Systemd es el
primer proceso daemon para ejecutar en el BBB, y éste es el último proceso para terminar
cuando el BBB es apagado. Su principal papel es manejar muchos de los servicios que están
disponibles en el BBB. Éste proporciona tiempos de arranque más rápidos, ya que está
diseñado para ejecutar menos scripts y además, ejecutarlos en paralelo. Sin embargo, éste
no presenta el mismo tipo de soporte para los scripts que está disponible con init.
Tecleando systemctl proporciona una lista completa de los servicios que están
corriendo en el BBB (ver Figura 3.1 y usar la barra de espacio para paginar o la tecla Q para
salir). Por ejemplo, usar el comando mostrado en la Figura 3.2 para encontrar los servicios
de terminal que están corriendo en el BBB.

140
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 3.1 Servicios ejecutándose en el BBB.

Fig. 3.2 Servicios Terminal ejecutándose en el BBB.

El segundo servicio en la lista es el servicio llamado gadget serial. Éste es la


conexión Serial sobre USB del BBB, que fue discutida en el Capítulo 1. Se puede conseguir
el estado de este servicio tecleando el comando mostrado en la Figura 3.3.

Fig. 3.3 Estado del servicio serial-getty@ttyGS0.service.

El gadget serial agetty, por lo general sólo llamado getty (“get teletype”),
es un programa de Linux que maneja conexiones de terminal. El servicio systemd corre
como un proceso, visible usando lo mostrado en la Figura 3.4.

Fig. 3.4 Visualizando el proceso agetty.

141
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Usando cualquier método se puede ver que el servicio está corriendo. Varios
comandos pueden ser ejecutados en tales servicios, por ejemplo:

 systemctl start [name]: Inicia un servicio.


 systemctl stop [name]: Detiene un servicio que está corriendo.
 systemctl restart [name]: Restablece un servicio corriendo.
 systemctl enable [name]: Habilita un servicio para iniciar sobre el arranque.
 systemctl disable [name]: Deshabilita un servicio de inicio del arranque.
Un método para control remoto del BBB es reemplazar un servicio serial por un
servicio de aplicación personalizado. Para reemplazar el servicio gadget serial por un
servicio de control personalizado, éste tiene que estar primero apagado y deshabilitado de
inicio del arranque (ver Figura 3.5).

Fig. 3.5 Paso para detener el servicio serial-getty@ttyGS0.service.

Después de este paso, no debería de haber un proceso ttyGS0 corriendo, pero el


dispositivo está aún presente. Systemctl debe también indicar que éste está inactivo.
Este proceso también debe ser deshabilitado de inicio del arranque (ver Figura 3.6).

Fig. 3.6 Paso para deshabilitar el servicio serial-getty@ttyGS0.service de inicio del arranque.

Un servicio personalizado ahora puede ser desplegado que ligue a /dev/ttyGS0.


3.2.1 CONEXIÓN SERIAL DEL BBB A COMPUTADORA PERSONAL
Un servidor serial hecho a la medida es presentado en la Figura 3.7 que puede ser
usado para controlar remotamente el BBB. Para este ejemplo hay varios comandos auto
explicativos: “LED on”, “LED off” y “quit”. Estos comandos podrían ser enlazados a los
ejemplos de actuadores y sensores vistos en el capítulo anterior. Esencialmente, esto

142
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

habilita a crear una conexión terminal serial personalizada, donde tales comandos sean la
única interacción permitida con el BBB. El mismo ejemplo de código puede ser modificado
ligeramente para ser usado en una máquina de escritorio para formar el cliente de la
conexión.

Fig. 3.7 Código en C/C++ para usar el BBB como servidor serial.

143
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Para probar la aplicación se debe empezar la sesión terminal serial en PUTTY antes
de que se ejecute el programa mostrado en la Figura 3.7 (en una sesión regular SSH) para
ver la salida completa. La salida aparece simultáneamente en la terminal de escritorio
PUTTY (115200 baudios) y la sesión SSH Linux que le sigue, tal como es mostrado en la Figura
3.8. Habilitar “Implicit LF in every CR” en los ajustes de PUTTY para conseguir la misma
salida. Este código puede ser ejecutado de la siguiente manera:
root@beaglebone: ./BBBSERIALSERVER /dev/ttyGS0

Fig.3.8 Control remoto del BBB usando terminal de escritorio PUTTY.

3.2.2 INICIANDO UN SERVICIO PERSONALIZADO SOBRE EL ARRANQUE


El servicio en la última sección parará cuando el BBB sea restablecido (o el comando
quit sea enviado). Para establecer un servicio para iniciar automáticamente sobre el
arranque, se debe primero poner el servicio ejecutable en un directorio general. Esto
ayudará a prevenirlo de ser accidentalmente borrado del directorio “home” de cuentas de
usuario.
root@beaglebone:# cp /home/alainmm/BBBSERIALSERVER /usr/bin
Los archivos de configuración de servicios del BBB (archivos .service) son
almacenados en el directorio /lib/systemd/system. Por ejemplo:
root@beaglebone:# cd /lib/systemd/system
root@beaglebone:/lib/systemd/system# ls | less
bluetooth.service
bonescript-autorun.service
...
Los archivos .service por ellos mismos describen el orden en el cual cada servicio
debe ser inicializado. Por ejemplo, un nuevo servicio puede ser creado para que empiece el
BBBSERIALSERVER cuando el BBB arranque, tal como se muestra en la Figura 3.9.

144
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 3.9 Nuevo servicio para iniciar el BBBSERIALSERVER en el arranque del BBB.

El ajuste multi-user.target relaciona al “run-level 3” de init que fue


discutido en el Capítulo 1. El servicio puede ser habilitado usando una llamada a
systemctl, tal como sigue:
root@beaglebone:# mv /usr/bin/bbb-serial-server.service /lib/systemd/system
root@beaglebone:# systemctl enable bbb-serial-server.service
root@beaglebone:# systemctl start bbb-serial-server.service
root@beaglebone:# systemctl status bbb-serial-server.service

El servidor serial ahora está corriendo en el BBB, cual puede ser accedido como antes
usando una conexión al COM sobre la máquina de escritorio. El comando “quit” está
pobremente diseñado, ya que este termina el servicio, este comando debe ser
probablemente removido si se usa este código como una plantilla. Para habilitar
nuevamente el servicio serial-getty@ttyGS0.service se deben seguir los siguientes pasos:
root@beaglebone:# systemctl stop bbb-serial-server.service
root@beaglebone:# systemctl disable bbb-serial-server.service
root@beaglebone:# cd /etc/systemd/system
root@beaglebone:/etc/systemd/system # nano serial-getty@tyyGS0.service
#AGREGAR LAS SIGUIENTES DOS LINEAS AL FINAL DEL ARCHIVO
[Install]
WantedBy=multi-user.target
root@beaglebone:/etc/systemd/system # cd
root@beaglebone:# systemctl enable serial-getty@tyyGS0.service
root@beaglebone:# systemctl restart serial-getty@tyyGS0.service

3.2.3 CONEXIÓN BLUETOOTH


Bluetooth es un sistema de comunicación inalámbrico popular que fue creado por
Ericsson y es ahora manejado por el Grupo de Interés Especial Bluetooth (SIG por sus siglas

145
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

en inglés). Bluetooth fue diseñado como un estándar abierto para habilitar a muchos tipos
de dispositivos diferentes para comunicarse inalámbricamente sobre distancias cortas. Éste
es por lo general usado para la transferencia digital de datos para auriculares de audio,
teclados, ratones de computadora, dispositivos médicos y muchas otras aplicaciones. El BBB
no tiene sobre la plataforma soporte para Bluetooth, pero el soporte puede ser agregado
usando un adaptador Bluetooth USB de bajo costo.
La elección del adaptador Bluetooth es muy importante, pues no todos los
adaptadores tienen soporte de drivers para Linux. Idealmente, se debería determinar por
adelantado a la compra del adaptador si hay soporte de Linux y si éste trabajará con el BBB.
Desafortunadamente, eso no es siempre posible, además, ya que el soporte de driver de
dispositivo de Linux es usualmente dependiente del chip, puede haber el caso que dos
dispositivos con el mismo número de modelo y aparentemente la misma funcionalidad,
tengan diferentes chips, dejando uno soportado por Linux y el otro no. El adaptador
Bluetooth usado en esta sección es el Kinivo BTD-400 Bluetooth 4.0 USB Adapter (también
se puede usar el TRUST BLUETOOTH 2.0 USB ADAPTER 10M BT-2250P). Este dispositivo esta
comúnmente disponible y la versión actual usa un chip de Broadcom que tiene buen
soporte de Linux.
El primer paso es instalar los paquetes que son requeridos para la conectividad
Bluetooth en el BBB. Checar que haya suficiente espacio libre en el BBB, ya que la instalación
requiere sobre 200MB de almacenaje.
root@beaglebone:# apt-get update
root@beaglebone:# apt-get install bluetooth bluez-utils

Después de la instalación, el BBB debe ser apagado y el adaptador insertado en el


socket USB del BBB. Una vez que la plataforma sea arrancada, se puede listar los módulos
USB que están actualmente conectados al BBB usando el comando lsusb, donde el listado
Broadcom Corp. Indica que el dispositivo ha sido detectado.
root@beaglebone:# lsusb
Bus 001 Device 002: ID 0a5c:2101 Broadcom Corp. BCM2045 Bluetooth

Un módulo de kernel cargable de Linux (LKM por sus siglas en inglés), es un


mecanismo para agregar código al kernel de Linux en tiempo de ejecución. Ellos son ideales
para drivers de dispositivos, habilitando el kernel para comunicar con el hardware sin que
éste tenga que conocer como el hardware trabaja. La alternativa a LKM podría ser construir
el código para todos y cada uno de los drivers en el kernel de Linux, cual podría conducir a
un tamaño de kernel impráctico y recompilaciones del kernel constantes. Los LKMs son
cargables en tiempo de ejecución, pero ellos no existen en el espacio de usuario, ellos son
esencialmente parte del kernel. Cuando el adaptador Bluetooth es insertado en el BBB, se
puede usar el comando lsmod para encontrar cuales módulos están actualmente cargados
(ver Figura 3.10).

146
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 3.10 Módulos cargados en el BBB.

El comando modprobe habilita para agregar o remover un LKM a o del kernel de


Linux en tiempo de ejecución. Sin embargo, si todo ha trabajado correctamente, el módulo
debería haberse cargado automáticamente. Se puede checar dmesg para ver los errores
que se pudieron haber alcanzado cuando el BBB fue arrancado. Usando cat
/proc/modules proporciona información similar sobre los módulos que están cargados.
El comando hcitool es usado para configurar conexiones Bluetooth y si el
argumento dev es pasado, éste proporciona información sobre el dispositivo Bluetooth
local (ver Figura 3.11).

Fig. 3.11 Información del dispositivo Bluetooth local.

Los números que aparecen en la Figura 3.11 es la dirección de dispositivo hardware


del adaptador que fue conectado al BBB y es diferente para otros adaptadores. Usando este
comando se puede escanear por dispositivos, conexiones de despliegue, mostrar niveles de
energía y realizar muchas más funciones, checar man hcitool para más detalles. En este
punto, se debe ser capaz de escanear por dispositivos Bluetooth en la vecindad. Asegurar
que los dispositivos estén descubribles, que ellos puedan ser encontrados cuando un
escaneo toma lugar (ver Figura 3.12).

Fig. 3.12 Escaneo de dispositivos Bluetooth usando el comando hcitool scan.

Esto significa que el adaptador en el BBB ha descubierto mi computadora personal


ALAINMANZO (el comando hcitool scan puede activar dispositivos Bluetooth en cuartos

147
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

cercanos que usan controles remotos Bluetooth). El BBB puede interrogar los servicios
disponibles usando el comando sdptool browse (ver Figura 3.13).

Fig. 3.13 Servicios disponibles en el dispositivo Bluetooth de la computadora personal.

La salida es seguida por una larga lista de servicios disponibles, tales como una
fuente de audio, un disipador de audio, un servidor ftp, servicios de impresora, y así
sucesivamente, cada uno teniendo sus propios números de canal únicos.
Si el BBB está para actuar como un servidor inalámbrico, es vital que el BBB este
descubrible por las máquinas cliente. El comando hciconfig puede configurar el
dispositivo Bluetooth (hci0) para habilitar escaneos de página y de interrogación, tal como
sigue:
root@beaglebone:# hciconfig hci0 piscan

Para parear el adaptador Bluetooth sobre el BBB con la PC, es necesario teclear lo
siguiente:
root@beaglebone:# bluez-simple-agent hci0 DC:85:DE:E4:AC:AC

donde DC:85:DE:E4:AC:AC es la dirección asignada a la PC. A continuación, un código


de seguridad será pedido, en este caso el código ingresado fue 0000. Después, la PC
anunciará que un dispositivo intenta conectarse y permitirá el ingreso del mismo código de
seguridad (0000). Al finalizar la instalación el dispositivo Bluetooth estará pareado con la PC
personal (ver Figura 3.14).

Fig. 3.14 Pasos para parear un adaptador Bluetooth con una PC.

148
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Un perfil de puerto serial (SPP) es requerido sobre el BBB para definir como los
puertos seriales virtuales son conectados vía conexiones Bluetooth. El comando sdptool
puede ser usado para configurar un perfil para un puerto serial sobre el canal 22 y encontrar
detalles sobre los servicios disponibles usando:
root@beaglebone:# sdptool add --channel=22 SP
root@beaglebone:# sdptool browse local

En este punto, la computadora de escritorio puede ser usada para escanear por
dispositivos. El BBB debe ser detectado como beaglebone-0. El OS Windows instala
varios drivers del dispositivo junto con sus servicios Bluetooth. Estos servicios Bluetooth son
anunciados por default en el BBB, pero ellos no están necesariamente disponibles. Sin
embargo, para permitir la comunicación entre el BBB y una PC, una conexión serial necesita
ser establecida para el canal 22. Cuando sdptool es usado, un puerto serial debe aparecer
en la lista de servicios disponibles en la computadora de escritorio (ver Figura 3.15).

Fig. 3.15 Servicios disponibles en el adaptador Bluetooth.

El BBB necesita correr un servicio que puede escuchar por conexiones entrantes
sobre el canal 22. La configuración rfcomm puede ser usada para escuchar por conexiones
sobre un canal especifico Bluetooth in una sesión SSH. Una terminal serial puede ser abierta
de la PC al BBB usando PUTTY, abriendo una conexión al puerto COM asociado. En este caso
el puerto es el COM8 y la tasa de baudios es 115200 (ver Figura 3.16). Cuando una conexión
es formada al BBB, la ventana SSH despliega lo mostrado en la Figura 3.17. No parar este
servicio. Mientras el servicio este escuchando, abre una segunda terminal SSH al BBB. En la
segunda terminal SSH se puede usar cat y echo al dispositivo asociado con la conexión
serial Bluetooth rfcomm0 (ver Figura 3.18).

149
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 3.16 Comando para poner escuchar al BBB por el canal 22 y configuración para abrir una terminal serial
en el puerto COM8 usando PUTTY.

Fig. 3.17 Conexión serial lograda satisfactoriamente entre el BBB y la PC.

En este punto es claro que el dispositivo está trabajando correctamente, y se puede


conectar una terminal minicom a la aplicación PUTTY tal como sigue (ver también Figura
3.19):
root@beaglebone:/dev# minicom –b 115200 –o –D /dev/rfcomm0

150
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 3.18 Comunicación entre el BBB y la PC usando una conexión serial Bluetooth.

Fig. 3.19 Comunicación entre el BBB y la PC usando minicom.

3.3 INTERNET DE LAS COSAS


En este capítulo se introduce el concepto de Internet de las Cosas (IoT por sus siglas
en inglés). Dos sensores serán introducidos también en esta sección, un sensor de
temperatura y un sensor de baja energía Bluetooth. Usando el BBB, estos sensores son las
“cosas” de ejemplos que serán conectadas al internet. Varias arquitecturas diferentes de
comunicaciones IoT serán descritas. La primera arquitectura configura el BBB para ser un

151
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

servidor web que usa scripts del lado del servidor para desplegar la información del sensor.
Después, un código de C/C++ personalizado es descrito que puede empujar la información
del sensor a Internet y en plataforma como un servicio (PaaS) de oferta, tal como
ThingSpeak y Xively. Finalmente, un par cliente/servidor para Protocolo de Control de
Transmisión (TCP por sus siglas en inglés) de alta velocidad es descrito. La última parte del
Capítulo introduce algunas técnicas para manejar sensores BBB distribuidos y tópicos sobre
redes físicas, incluyendo la conectividad del BBB al Internet usando Wi-Fi; ajustar el BBB
para tener una IP estática, y usar energía sobre Internet (PoE) con el BBB.
Los términos “Internet de las cosas” (IoT) y “Sistemas ciber-Físicos” (CPS), son
ampliamente usados para describir la extensión de la web y el Internet dentro de un campo
físico, mediante la conexión de dispositivos embebidos distribuidos. Actualmente, el
Internet es un internet de la gente, el concepto IoT visiona que si los sensores y actuadores
físicos pueden ser enlazados al Internet, entonces un rango nuevo completo de aplicaciones
y servicios son posibles. Por ejemplo, si los sensores en un ambiente doméstico se pudieran
comunicar uno con otro y con el Internet, entonces ellos podrían ser “inteligentes” sobre
como ellos funcionan; un sistema de calefacción doméstico que puede recuperar el
pronóstico del clima puede ser más eficiente y podría proporcionar un ambiente más
confortable. Dentro de las casas inteligentes, los dispositivos IoT deben ser capaz de
automatizar tareas laboriosas; manejar seguridad; y mejorar la eficiencia de energía,
accesibilidad, y conveniencia. Sin embargo, el IoT también tiene amplia aplicación para
muchas industrias a gran escala, tal como manejo de energía, cuidado de la salud,
transporte y logística.
Cuando el mundo físico puede ser actuado mediante dispositivos que son
adjuntados a Internet, tal como los actuadores, entonces los dispositivos son por lo general
llamados CPS. Los términos IoT y CPS son por lo general usados intercambiablemente, con
ciertas industrias tales como manufactura inteligente favoreciendo el término CPS. Sin
embargo, no es irrazonable para considerar a CPS para ser un bloque de construcción
constituyente que cuando se combina con sensores web y con un marco de comunicaciones
a gran escala forme el IoT.
Cada una de las arquitecturas de comunicación que serán descritas tienen una
estructura diferente, y cada una puede ser aplicada a diferentes aplicaciones de
comunicación:

 El servidor web BBB: Un BBB que es conectado a un sensor y corre un servidor web
puede ser usado para presentar información a la web cuando ésta es solicitada para
hacerlo como un navegador web. Las comunicaciones toman lugar usando el
Protocolo de Transferencia de Hipertexto (HTTP).
 El cliente web BBB: Un BBB puede iniciar contacto con un servidor web usando
solicitudes HTTP para enviar y recibir datos. Un programa en C/C++ es escrito que

152
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

usa TCP y sockets TCP para construir un navegador web básico, que puede
comunicarse sobre HTTP, o si es necesario, seguramente por HTTPS.
 El cliente/servidor TCP BBB: Un cliente y servidor en C++ personalizado es
presentado que puede intercomunicarse a altas velocidades con un protocolo de
comunicaciones predefinidas por el usuario.
 El sensor web BBB usando un PaaS. Un código es escrito para habilitar al BBB para
usar HTTP y APIs personalizadas para enviar datos a, y recibir datos de, servicios web
tal como ThingSpeak y Xively. Este código habilita para construir grandes redes de
sensores que puedan intercomunicar y almacenar datos sobre servidores remotos.
Además, estos servicios web pueden ser usados para visualizar la información que
es almacenada.
Antes de examinar estas arquitecturas de comunicación, es necesario introducir los
dos sensores (cosas) que se conectaran a Internet. El sensor de temperatura LM35 de Texas
Instruments y el sensor de etiqueta de Texas Instruments. El sensor de etiqueta demuestra
la capacidad del protocolo Bluetooth 4.0 de baja energía que es ideal para conectar “cosas”
al BBB.
Para conectar el sensor de temperatura LM35 al BBB haga referencia a la Figura 3.20.
Por otro lado, el código para leer la información del sensor y presentar la temperatura en
grados Celsius se muestra a continuación:
#include<iostream>
#include<fstream>
#include<string>
#include<sstream>
#include<stdlib.h>
using namespace std;
#define LDR_PATH "/sys/bus/iio/devices/iio:device0/in_voltage"
int readAnalog(int number){
stringstream ss;
ss << LDR_PATH << number << "_raw";
fstream fs;
fs.open(ss.str().c_str(), fstream::in);
fs >> number;
fs.close();
return number;
}

float getTemperature(int adc_value){


float cur_voltage = adc_value * (1.80f/4096.0f);
float degreesC = (cur_voltage)/0.01f;
return degreesC;
}

int main(int argc, char* argv[]){


int ain = 0;
cout << "Adquiriendo la temperatura a partir del LM35" << endl;
if (argc>1) ain = atoi(argv[1]);
int value = readAnalog(ain);
cout << "El valor del ADC es: " << value << endl;
float temperature = getTemperature(value);
cout << "La temperatura es: " << temperature << " grados Celsius." << endl;
return 0;
}

153
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 3.20 Conexión del sensor de temperatura LM35 al BBB.

Para configurar y construir el código del ejemplo, se siguen los siguientes pasos:
root@beaglebone:# echo BB-ADC > $SLOTS
root@beaglebone:# g++ LM35.cpp –o LM35
La temperatura puede ser calculada usando AIN0 pasando el argumento 0 al
programa, ver Figura 3.21.

Fig. 3.21 Despliegue obtenido de salida al ejecutar el código para el sensor de temperatura.

Bluetooth de baja energía es una tecnología para aplicaciones de redes de área


personal inalámbricas, tal como automatización de casas, cuidado de la salud, y
entretenimiento en el hogar. Bluetooth inteligente está enfocado en aplicaciones de baja
energía mientras aún se mantiene el mismo rango de comunicaciones como un Bluetooth
regular. El sensor de etiqueta tiene un consumo de corriente de polarización de 8µA,
habilitándolo potencialmente a operar sobre una pequeña batería por muchos meses. El
sensor de etiqueta es un kit de desarrollo inteligente Bluetooth que está dirigido en
particular a aplicaciones de teléfonos celulares inteligentes. Sin embargo, puede también
ser usado por el BBB como un nodo de sensores que puede colectar datos de su entorno.
Para usar el sensor de etiqueta, primero se debe instalar el paquete Bluetooth.
root@beaglebone:# apt-get install Bluetooth hcitool

154
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Este paquete contiene las herramientas que fueron discutidas al inicio de este
capítulo, tal como la herramienta de interface del controlador huésped (hcitool) que es
usada para configurar las conexiones Bluetooth. El ejecutable hcitool también tiene
comandos de dispositivos de baja energía, tal como escaneo (lescan), agregar lista blanca
(lewladd), crear conexión (lecc), desconectar (ledc), y actualizar conexión (lecup).
Para comunicarse con el sensor de etiqueta, presiona el botón sobre el lado del
módulo, escanea por su ID Bluetooth, y conéctalo según la Figura 3.22.
FIGURA 3.22
3.3.1 EL BEAGLEBONE BLACK COMO UN SERVIDOR WEB
Una ventaja significante de un dispositivo Linux embebido sobre los demás sistemas
embebidos tradicionales es la vasta cantidad de software abierto que está disponible. En
esta sección, un servidor web es instalado y configurado sobre el BBB. Este es un proceso
sencillo comparado con los pasos involucrados en una plataforma embebida sin Linux típica.
De hecho, uno de los retos más difíciles es elegir cual servidor web Linux se usará. Hay
servidores disponibles tal como lighttpd, Boa, Monkey y Nginx, pero Apache es un buen
servidor web para usar de comienzo, de hecho Apache está actualmente instalado en la
imagen de Debian del BBB. Una vez que sea familiar Apache, se pueden entonces investigar
soluciones para servidores web que están diseñadas específicamente para dispositivos
Linux embebidos.
Correr un servidor web sobre el BBB proporciona un número de posibilidades,
incluyendo las siguientes:

 Presentar contenido web general al mundo.


 Integrar sensores y desplegar sus valores al mundo.
 Integrar sensores y usar esto para intercomunicar entre dispositivos.
 Proporcionar interfaces basadas en web a herramientas que están corriendo sobre
el BBB.
El servidor Apache está actualmente en la distribución Debian del BBB. Se pueden
usar los siguientes comandos para actualizar o instalar esta aplicación:
root@beaglebone:# dpkg --get-selections | grep apache
root@beaglebone:# apt-get update
root@beaglebone:# apt-get install apache2
Sobre la imagen de Debian del BBB el servidor web Apache está corriendo en el
puerto número 8080 por default. Un número de puerto es un identificador que puede ser
combinado con una dirección IP para proporcionar un punto final para una sesión de
comunicaciones. Este es usado efectivamente para identificar el servicio software que es
requerido por un cliente. Por ejemplo, se puede encontrar la lista de servicios que están
155
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

escuchando los puertos sobre el BBB mediante el uso de comandos de estadística de red
(ver Figura 3.22).

Fig. 3.22 Lista de servicios que escuchan a los puertos del BBB.

Por lo tanto, cuando una solicitud de red es recibida por el puerto 8080 esta es
direccionada a la aplicación del servidor web de Apache2. El número de puerto usual para
tráfico web inseguro es 80, este es asumido cuando se ingresa una URL en el buscador web.
Se puede ver en la lista anterior que el puerto 80 está actualmente direccionado a
systemd, cual en turno usa bonescript.service para proporcionar la página web
Bone101.
Apache puede ser configurado usando los archivos en /etc/apache2/, ver
Figura 3.23.

Fig. 3.23 Archivos para configurar el servidor web apache2.

Donde los archivos de configuración del núcleo son como los siguientes:

 apache2.conf es el archivo de configuración principal para el servidor.


 ports.conf es para configurar números de puerto de servidor virtual (colocado
en el puerto 8080 por default en la imagen Debian del BBB).
 El directorio sites-available contiene los archivos de configuración para
muchos sitios virtuales, y el directorio sites-enabled debe contener un link
simbólico para un archivo de configuración en el directorio sites-available,
para activar un sitio. Los comandos a2ensite y a2dissite deben ser usados
para habilitar y deshabilitar sitios. Hay un ejemplo de archivo de configuración

156
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

presente, en el cual se debe establecer la dirección de e-mail ServerAdmin y el


documento root (el default es /var/www).
En adición a los archivos de configuración, la funcionalidad de Apache puede ser más
extendida (es decir, proporcionar soporte Python) con el uso de módulos. Se pueden
identificar los módulos actuales que han sido compilados dentro de Apache usando lo
mostrado en la Figura 3.24.

Fig. 3.24 Módulos instalados en el servidor apache.

Para crear una página web simple para el servidor web del BBB se puede usar el
editor nano y alguna sintaxis HTML básica tal como se muestra en la Figura 3.25.

Fig. 3.25 Código HTML para crear una página web sencilla.

Ahora cuando se conecta al servidor web sobre el BBB usando un buscador web, se
verá la salida desplegada de la Figura 3.26.

Fig. 3.26 Primera página web sobre el BBB.

157
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Las páginas web son ideales para la presentación de contenido web estático y
mediante el uso de un editor como KompoZer, CoffeeCup, o Notepad++ se puede
rápidamente construir contenido HTML para un servidor web personal. Se puede entonces
usar la funcionalidad del puerto de reenvío del rúter del hogar y un servicio DNS dinámico,
para compartir el contenido wed estático de la página con el mundo.
Contenido web dinámico más avanzado puede también ser desarrollado para el BBB
que interconecta al entorno físico para tales tareas como leer datos de un sensor o controlar
motores. Un método relativamente sencillo para hacer esto es usar scripts de Interface de
puerta común (CGI por sus siglas en inglés). El archivo de configuración en (enlazado a) el
directorio sites-enabled especifica una ubicación de directorio en la cual los scripts
pueden ser puestos, de manera que ellos puedan ser ejecutados vía una solicitud de
navegador web. La ubicación por default, está en el directorio /usr/lib/cgi-bin/,
donde un solo script puede ser creado como sigue:
root@beaglebone:/usr/lib/cgi-bin# nano test.cgi
#!/bin/bash
echo "Content-type: text/html"
echo ""
echo '<html>'
echo '<head>'
echo '<meta http-equiv="Content-Type" content="text/html";
charset=UTF-8">'
echo '<title>Hola BeagleBone</title></head>'
echo '<body><h1>Hola BeagleBone</h1><para>'
hostname
echo ' ha estado hasta '
uptime
echo '</para></html>'

El script tiene entonces que hacerse ejecutable y puede ser probado como sigue:
root@beaglebone:/usr/lib/cgi-bin# chmod a+x test.cgi
root@beaglebone:/usr/lib/cgi-bin# ./test.cgi
El script es muy verboso, pero se puede ver que es muy fácil la llamada a comandos
del sistema (es decir, hostname y uptime) directamente adentro de éste. Cuando el
script es probado en la ventana terminal, su salida despliega el código fuente HTML. Sin
embargo, cuando su salida es vista usando un navegador web (ver Figura 3.27), el código
HTML es renderizado correctamente.
Así como se llaman comandos del sistema Linux, se pueden también ejecutar
programas que han sido escritos en C/C++. Para demostrar esta capacidad, el programa
LM35.cpp usado anteriormente puede ser modificado de manera que éste solo
despliegue la temperatura en grados Celsius cuando sea ejecutado. Este nuevo ejecutable

158
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

binario, llamado LM35raw (ver Figura 3.28) puede ser copiado al directorio
/usr/local/bin de manera que esté “permanentemente” instalado en el BBB.

Fig. 3.27 Renderización del código puesto en el script test.cgi.

Fig. 3.28 Código modificado para sensor de Temperatura.

root@beaglebone:# cp LM35raw /usr/local/bin


El script CGI puede ser modificado para desplegar el valor de temperatura
directamente a partir del sensor como sigue:
root@beaglebone:/usr/lib/cgi-bin# nano temperatura.cgi

159
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

#!/bin/bash
echo "Content-type: text/html"
echo ""
echo '<html>'
echo '<head>'
echo '<meta http-equiv="Content-Type" content="text/html";
charset=UTF-8">'
echo '<title>Hola BeagleBone</title></head>'
echo '<body><h1>Hola BeagleBone</h1><para>'
echo 'La temperatura es: '
/usr/local/bin/LM35raw
echo 'Grados Celsius '
echo '</para></html>'

Esto resulta en la salida desplegada en la Figura 3.29. Este código podría ser
fácilmente adaptado para desplegar datos a partir del sensor de etiqueta. Si se
experimentan dificultades con los scripts, los archivos log de Apache son almacenados en
/var/log/apache2/, cuáles pueden ser vistos con acceso de súper usuario.

Fig. 3.29 Página web del sensor de temperatura.

NOTA: Los scripts CGI pueden ser estructurados para aceptar datos a partir de la web
mediante el uso de campos de forma. Para hacer esto, se tiene que filtrar la entrada para
evitar daño potencial en la escritura de sitio cruzado. En particular, se debe filtrar los
caracteres <>&*?./ de la entrada de campo de forma.
Interacciones más complejas usando CGI pueden hacerse, por ejemplo el uso de
formas web para pasar datos entre el navegador web y la aplicación que se está ejecutando
en el BBB. En esta discusión se empieza por explicar cómo se pueden usar programas en
C/C++ en lugar de scripts CGI para desplegar una página web. Después, se investiga el uso
de la librería Cgicc GNU para interacciones más estructuradas y complejas.
En este ejemplo el servidor Apache es usado para servir las aplicaciones CGI, así que
tener instalado Apache es el único prerrequisito software requerido. Apache corre en el
puerto 8080 del BBB por default cuando se usan imágenes Debian.

160
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Se podría argumentar que esto es un “enfoque anticuado” para resolver el problema


de tener un servidor web sobre un sistema embebido interactuando con un navegador web
cliente, ya que hay poderosas alternativas tales como servelets Java, node.js, PHP, etc., para
hacer esto. Sin embargo, este enfoque:

 Tiene un bajo costo operativo sobre el BBB, ya que el código es compilado y no


interpretado.
 Permite el acceso a llamadas del sistema.
 Se puede interconectar fácilmente con el hardware usando librerías.
La desventaja de esto es que no es realmente conveniente para programadores
novatos, la sintaxis del formato de salida puede ser verbosa y el manejo de sesión es
compleja. Aun con eso, es digno de señalar que algunas aplicaciones web de gran escala
como Google y Amazon incluyen el uso de C++ sobre sus servicios.
Un CGI es un enfoque sencillo para construir aplicaciones web dinámicas.
Efectivamente, esto permite a un servidor web compartir más que solo archivos HTML y/o
imágenes estáticas. Esto se hace permitiendo que scripts/programas en ciertas ubicaciones
en el sistema de archivos (/usr/bin/cgi-bin) sean ejecutados por el servidor web y
para la salida de los scripts/programas a ser pasada por medio del servidor web al
navegador web del usuario que hace la solicitud. CGI permite al navegador web del usuario
pasar información al script/programa usando solicitudes HTTP POST o GET. Casi todos los
lenguajes de programación pueden ser usados para construir aplicaciones CGI, ya que su
único papel en la transacción es analizar la entrada que es enviada a ellos mediante el
servidor y construir la respuesta de salida HTML conveniente.
En el BBB, el directorio /cgi-bin requiere permisos de acceso root. Hay un
número de diferentes maneras de resolver este problema, pero esto se deja para otro
momento. Si se está planeando hacer público visible el BBB sobre Internet y ponerlo a
controlar un sistema de automatización para el hogar, entonces se debe de estudiar el
tópico de seguridad de servidores.
Para crear una aplicación CGI con C++ se puede hacer sobre el directorio
/usr/lib/cgi-bin/ del BBB. Este directorio requiere permisos de súper usuario para
agregar un script/programa. Se puede usar el editor nano para crear el programa en C++
que se muestra en la Figura 3.30.
Este ejemplo usa la estructura sysinfo para obtener el tiempo de actividad y
disponibilidad de memoria para la plataforma BBB. Este también usa variables de entorno
para determinar la dirección IP del navegador cliente que hace la solicitud para ejecutar el
programa CGI. Las siguientes variables de entorno que están disponibles se presentan en la
Tabla 3.1.

161
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Tabla 3.1 Variables de entorno CGI.

Variables de Entorno
SERVER_SOFTWARE SERVER_NAME GATEWAY_INTERFACE SERVER_PROTOCOL
SERVER_PORT REQUEST_METHOD PATH_INFO PATH_TRANSLATED
SCRIPT_NAME QUERY_STRING REMOTE_HOST REMOTE_ADDR
AUTH_TYPE REMOTE_USER REMOTE_IDENT CONTENT_TYPE
CONTENT_LENGTH HTTP_ACCEPT HTTP_USER_AGENT REDIRECT_REQUEST
REDIRECT_URL REDIRECT_STATUS HTTP_REFERER HTTP_COOKIE

Fig. 3.30 Código utilizado para aplicación CGI.

Para construir el script se debe ejecutar el comando siguiente:


root@beaglebone:/usr/lib/cgi-bin# g++ hello.cpp –o hello.cgi
En este punto el programa CGI puede ser llamado remotamente a partir del
navegador web de la PC usando la siguiente URL (ver Figura 3.31):
http://192.168.7.2:8080/cgi-bin/hello.cgi

Fig. 3.31 Despliegue de una aplicación CGI con C++.

162
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Desafortunadamente, el enfoque que es descrito arriba es solo realmente


conveniente para programas que hacen información disponible al Internet. Por default
C/C++ no tienen las librerías construidas que se requieren para fácilmente y efectivamente
construir aplicaciones CGI interactivas. Para esto se necesita la librería de clases de C++
Cgicc.
Cgicc GNU es una librería para construir aplicaciones CGI. Ésta es poderosa y
simplifica grandemente el proceso de construcción de aplicaciones CGI comunes. Estas
aplicaciones permiten interactuar con el BBB sobre Internet usando una interface
simplificada dentro de un servidor web. La primera tarea es descargar, compilar e instalar
la librería Cgicc GNU en el BBB. En primer lugar se descarga el código fuente de la librería
Cgicc. Se puede encontrar la última versión en ftp://ftp.gnu.org/gnu/cgicc/.
Para esta discusión se utiliza la versión 3.2.16, la cual es la más aconsejable para instalar en
el BBB. En las Figuras 3.32 y 3.33 se muestran los pasos para descargar la librería Cgicc GNU
y la configuración del directorio final que son necesarios en el proceso de instalación.

Fig. 3.32 Proceso de descarga de la librería Cgicc GNU.

Después del proceso mostrado en la Figura 3.33 se necesita hacer el proyecto en


base a teclear make en el directorio de descarga. make es un proceso para construir la
librería y dura alrededor de 5 minutos.
root@beaglebone:~/cgicc/cgicc-3.2.16# make
El paso final es instalar la librería compilada para todos los usuarios en el BBB. Se
debe asegurar que se ejecute make install con permisos de súper usuario, de otro
modo se instalarán los archivos de la librería en el lugar incorrecto.

163
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 3.33 Proceso para configurar como all user el directorio de instalación final.

root@beaglebone:~/cgicc/cgicc-3.2.16# make install


root@beaglebone:~/cgicc/cgicc-3.2.16# cd /usr/lib
root@beaglebone:~/cgicc/cgicc-3.2.16/usr/lib# ls libgci*
La aplicación de prueba es un controlador de LED que es muy similar al ejemplo
mostrado en el Capítulo 2. Los LEDs sobre la plataforma pueden ser controlados usando la
clase LED de C++ que se presenta en la Figura 3.34.

164
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 3.34 Clase LED en C++ usada en la aplicación CGI.

La Figura 3.35 muestra el código en C++ para crear la aplicación CGI. Esta aplicación
usa la librería Cgicc para mostrar un simple ejemplo de Solicitud-Respuesta. Un GET es
usado para solicitar información a partir de los recursos del servidor, mientras un POST es
usado para enviar información para ser procesada por los recursos del servidor. La
estructura general de una solicitud GET es usar un par name/value para identificar la
funcionalidad que se podría querer para la acción. Por ejemplo, una solicitud GET
generalizada podría ser descrita como:
http://192.168.7.2:8080/cgi-bin/mygetapp?name1=value1&name2=value2

Esto invoca la aplicación mygetapp en el BBB y pasa las dos variables, name1 y
name2, que tienen los valores value1 y value2, respectivamente. La Figura 3.36 ilustra
la aplicación que resulta a partir del código de la Figura 3.35. Se puede ver en la barra de
direcciones que la URL tiene la forma 192.168.7.2:8080/cgi-
bin/LED.cgi?command=flash. La solicitud URL consiste de un nombre “command”
que tiene el valor “flash”. Cambiando este valor se puede controlar el estado del LED USR3.
El código tiene algunas características interesantes. El form_iterator it es
usado para determinar el valor asociado con el nombre “command” del par name/value.
Un chequeo es realizado para probar que el elemento no falte o sea nulo. Si esto ocurre
entonces un mensaje es presentado al usuario. Por otro parte, un objeto de cadena cmd es
creado en lugar de **it para ordenar la sintaxis; esto no es estrictamente necesario pero
hace el código más legible. El cmd es después comparado con las cuatro posibles opciones
y el estado correcto del LED será disparado.

165
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 3.35 Código en C++ para controlar el estado del LED usando CGI.

Fig. 3.36 Despliegue de la aplicación CGI.

El programa puede ser compilado usando la llamada:


root@beaglebone:# g++ LED.cpp –o LED.cgi -lcgicc

donde el archivo LED.cpp es pasado al compilador, junto con la bandera –l para enlazar
con la librería cgicc. Para desplegar el resultado binario se usa lo siguiente:
root@beaglebone:# cp LED.cgi /usr/lib/cgi-bin
root@beaglebone:# chmod +s /usr/lib/cgi-bin/LED.cgi

166
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

El comando chmod +s establece el bit setuid; ahora el archivo binario


LED.cgi será ejecutado con permisos root por medio de Apache. Esto es necesario
porque el código LED requiere acceso root para modificar el estado de los LEDs de la
plataforma.
El segundo ejemplo que usa la librería Cgicc es un ejemplo HTTP POST. El ejemplo
POST permite interactuar con una forma que contiene “checkboxes”, “componentes radio”,
“botones”, “campos de texto”, etc. El código fuente completo es presentado en la Figura
3.37. Es importante notar que este es el único código fuente requerido. La aplicación genera
la forma HTML, cual se llama ella misma una y otra vez. Al igual que la aplicación GET, el
LED3 cambia de estado como se esperaría al seleccionar una acción.

Fig. 3.37 Código de ejemplo de una aplicación HTTP POST.

167
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

La operación de este ejemplo se muestra en la Figura 3.38. Se puede ver que esta
aplicación cambia su salida para desplegar el estado del LED3. Esto es únicamente posible
en este ejemplo porque la forma HTML “almacena” el estado de la “aplicación”. En cada
ocasión que se da clic en el botón “Execute Command”, la aplicación se ejecuta de nuevo y
corre hasta el final, de esa manera perdiendo el estado. El estado esperado es únicamente
retenido por la forma HTML.

Fig. 3.38 Aplicación CGI POST basada en C++.

Este programa tiene algunas características interesantes, en particular, éste usa


funciones tales como HTTPHTMLHeader(), html(), body(), etc. para generar el
contenido HTML para la salida. Esto es mucho menos verboso y menos propenso a errores.
Hay muchas funciones que pueden ser usadas en el código. El código del ejemplo también
muestra como interactuar con “radio buttons” (comandos), “checkboxes” (estados) y
“textos” (entradas) dentro de formas HTML.
Los script CGI trabajan muy bien cuando son scripts cortos, ellos son ligeros y fácil
de editar. Sin embargo, así como concierne la seguridad (es decir, ataques vía
manipulaciones URL), ellos tampoco escalan muy bien (es decir, para interconectar con
bases de datos). Una alternativa es usar lenguaje en script del lado del servidor PHP. PHP
es un lenguaje basado en script abierto razonablemente ligero con una sintaxis parecida a
C que puede ser escrito directamente dentro de páginas HTML. Este puede ser instalado
dentro de apache como sigue:
root@beaglebone:# apt-get install apache2 apache2-utils
root@beaglebone:# apt-get install php5 curl php5-curl php5-json
root@beaglebone:# service apache2 restart

Un programa PHP se muestra en la Figura 3.39 y se ubica en el directorio


/var/www. Tal como los scripts CGI, éste interconecta al LM35 mediante la ejecución del
programa LM35raw, resultando en la salida mostrada en la Figura 3.40.

168
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 3.39 Código en PHP para ejecutarse en la página HTML.

Fig. 3.40 Despliegue de la aplicación de temperatura basada en PHP.

NOTA: En adición, es posible instalar una base de datos tal como MySQL sobre el BBB,
formando un servidor LAMP (Linux, Apache, MySQL y PHP). Esto permitirá la instalación
adicional de sistemas de manejo de contenido tal como WordPress o Drupal, para crear
contenido web avanzado que puede incluir interacción con hardware.
El servidor web Bone101 proporciona información muy importante sobre cómo
lograr empezar con el BBB; sin embargo, éste ocupa por default el puerto web (puerto 80).
Si se desea reemplazar Bone101 por un servidor web personalizado, se puede apagar el
servicio bonescript y configurar el servidor personalizado para usar el puerto 80. Para
apagar el servicio bonescript se pueden usar los siguientes pasos:
root@beaglebone:# systemctl list-units –t service | grep bonescript

para confirmar que bonescript.service está corriendo. Para parar el servicio se


necesita detener primero bonescript.socket y después el servicio, tal como sigue:
root@beaglebone:# systemctl stop bonescript.socket
root@beaglebone:# systemctl stop bonescript.service
root@beaglebone:# systemctl disable bonescript.socket

169
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

root@beaglebone:# systemctl disable bonescript.service

Ahora se puede configurar el servidor Apache2 para usar el puerto 80 modificando


el archivo ports.conf para escuchar el puerto 80 como sigue:
root@beaglebone:# cd /etc/apache2
root@beaglebone:/etc/apache2# nano ports.conf
root@beaglebone:/etc/apache2# more ports.conf | grep 80
NameVirtualHost *:80
Listen 80

Después modifica el archivo (o enlaza el archivo a) en el directorio /sites-


enabled de manera que el puerto VirtualHost sea puesto en 80, y reestablece el
servidor Apache como sigue:
root@beaglebone:/etc/apache2# cd /sites-enabled/
root@beaglebone:/etc/apache2/sites-enabled/# nano 000-default
root@beaglebone:/etc/apache2/sites-enabled/# more 000-default | grep 80
<VirtualHost *:80>
root@beaglebone:/etc/apache2# systemctl restart apache2.service

3.3.2 CLIENTE WEB CON C++


Instalar un servidor web en el BBB le proporciona una manera simple e intuitiva para
presentar información a una aplicación de navegador web cliente. Es importante entender
que la distinción entre un cliente y un servidor es no hacer nada con la capacidad hardware
de los dispositivos interconectados. Más bien, esto se relaciona con el papel de cada
dispositivo en un particular punto en el tiempo. Por ejemplo, cuando se recupera una página
web a partir del BBB usando su servidor web Apache, el navegador web de una
computadora de escritorio es un cliente del servidor web del BBB.
Cuando el BBB actúa como un servidor, éste espera pasivamente por una conexión
a partir de la máquina cliente, pero hay muchos casos cuando el BBB quizá necesite
activamente contactar un servidor sobre otra máquina. En tales casos, el BBB tiene que
actuar como un cliente de ese servidor. En este punto se han usado muchas aplicaciones de
red cliente en el BBB, tales como ping, wget, ssh, sftp y así sucesivamente, y estas
aplicaciones pueden ser usadas dentro de scripts Shell. Sin embargo, podría ser también útil
si se pudiera generar solicitudes cliente dentro de código C/C++ y para esto se pueden usar
sockets de redes.
Un socket es un punto de red que es definido usando una dirección IP y un número
de puerto. Una dirección IP (versión 4) es simplemente un número de 32-bits, que está
representado por cuatro valores de 8-bits (por ejemplo, 192.168.7.2), y un número de
puerto es un entero sin signo de 16-bits (0-65,535) que puede ser usado para habilitar

170
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

múltiples comunicaciones simultaneas a una única dirección IP. Puertos por debajo de 1024
son generalmente restringidos a acceso root para prevenir a los usuarios de secuestros de
servicios de núcleo (por ejemplo, 80 para HTTP, 20/21 para FTP, 22 para SSH y 443 para
HTTPS).
La descripción de un socket también tiene que definir el tipo de socket, indicando si
es un socket de flujo o un socket de datagrama. Los sockets de flujo usan el protocolo de
control de transmisión (TCP), que proporciona una transferencia confiable de datos donde
el tiempo de transmisión no es un factor crítico. Su confiabilidad significa que éste es usado
para servicios tales como HTTP, e-mail (SMTP), y FTP, donde los datos tienen que ser
confiables y correctamente transferidos. El segundo tipo de socket es un socket de
datagrama que usa el protocolo de datagrama de usuario (UDP), cual es menos confiable
pero mucho más rápido que TCP, ya que no hay error de chequeo para paquetes. Las
aplicaciones de tiempo crítico tales como voz sobre IP (VoIP) usan UDP, ya que los errores
en los datos serán presentados en la salida como ruido, pero la conversación no será
pausada a la espera de los datos perdidos hasta estar presentes.
Cuando la comunicación es establecida entre dos sockets de red, a esto se le conoce
como conexión. Los datos pueden entonces ser enviados y recibidos sobre esta conexión
usando funciones de escritura y lectura. Es importante notar que una conexión podría
también ser creada entre dos procesos (programas) que están corriendo sobre una sola
máquina y por lo tanto se usa para comunicación inter-proceso.
El soporte completo de C/C++ para comunicación de sockets puede ser agregado al
programa incluyendo el archivo de cabecera sys/socket.h. En adición, el archivo de
cabecera sys/types.h contiene los tipos de datos que son usados en las llamadas al
sistema y el archivo de cabecera netint/in.h contiene las estructuras necesarias para
trabajar con direcciones de dominio de Internet.
El código fuente mostrado en la Figura 3.41 es una aplicación de navegador web
básica que puede ser usado para conectar un servidor web HTTP, recuperar una página web
y desplegarla en una forma HTML pura, como un navegador web regular, pero sin el
renderizado bonito. El código realiza los siguientes pasos:

 El nombre del servidor es pasado al programa como un argumento de cadena. El


programa convierte esta cadena en una dirección IP (almacenada en la estructura
hostent) usando la función gethostbyname().
 El cliente crea un socket TCP usando la llamada a sistema socket().
 La estructura hostent y un número de puerto (80) son usados para crear una
estructura sockaddr_in que especifica la dirección de punto final a la cual se
conecta el socket. Esta estructura también establece la familia de direcciones para
ser basadas en IP (AF_INET) y el orden byte de la red.

171
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

 El socket TCP está conectado al servidor usando la llamada de sistema connect(),


el canal de comunicaciones está ahora abierto.
 Una solicitud HTTP es enviada al servidor usando la llamada a sistema write() y
una respuesta de longitud fija es leída a partir del servidor usando la llamada a
sistema read(). La respuesta HTML es desplegada.
 El cliente se desconecta y el socket es cerrado usando la función close().

Fig. 3.41 Código en C de una aplicación de navegador web básica.

Este código puede ser construido y ejecutado como sigue. En este ejemplo, la página
web sencilla del servidor web Apache local del BBB es solicitada, mediante el uso de
localhost, cual esencialmente significa “este dispositivo”, y usa la interface de
red virtual de lazo de regreso, cual tiene la dirección IP 127.0.0.1:

172
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

root@beaglebone:# g++ WEBCLIENT.cpp –o WEBCLIENT


root@beaglebone:# ./WEBCLIENT localhost

El ejemplo trabaja correctamente, regresando el archivo index.html a partir de


/var/www (ver Figura 3.42). Este programa también se puede conectar a otros servicios
web (por ejemplo, ./WEBCLIENT www.google.com).

Fig. 3.42 Despliegue de salida de la aplicación WEBCLIENT.

Una de las limitaciones de la aplicación socket TCP anterior es que todas las
comunicaciones son enviadas “en la transparencia” a través de redes IP. Esto no puede ser
de preocupación para redes domésticas, pero si el cliente y el servidor están en diferentes
redes físicas, entonces la información que es transferida puede ser fácilmente vista en redes
intermediarias. Algunas veces es necesario comunicarse seguramente entre un cliente y un
servidor, por ejemplo, si se está enviando un nombre de usuario y un password en un
servicio online. En adición, un cuidado particular debe ser tomado en aplicaciones donde el
BBB puede actuar motores o relés, un malicioso ataque podría causar destrucción física.
Una manera para implementar comunicaciones seguras es usar la herramienta OpenSSL.
OpenSSL es una herramienta que implementa Capas de Sockets Seguras (SSL por sus
siglas en inglés) y protocolos de Seguridad de Capas de Transporte (TLS por sus siglas en
inglés) y una librería de criptografía. Esta librería puede ser instalada usando lo siguiente:
root@beaglebone:# apt-get install openssl

OpenSSL es una herramienta compleja y exhaustiva que puede ser usada para
encriptar todo tipo de comunicaciones. Esta sección presenta una aplicación de ejemplo
para ilustrar su uso. Para este ejemplo, el código cliente web C/C++ es modificado para

173
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

soportar comunicaciones SSL como se muestra en la Figura 3.43. El código involucrado en


este ejemplo es el mismo de la Figura 3.41, excepto por lo siguiente:

 La conexión socket TCP está formada al puerto seguro HTTP (HTTPS), cual es el
puerto 443 por default.
 La librería SSL es inicializada usando la función SSL_Library_init().
 Un objeto de contexto SSL es usado para establecer la conexión TLS/SSL. La
seguridad y opciones de certificado pueden ser establecidas en este objeto.
 La conexión de red es asignada a un objeto SSL y un saludo es realizado usando la
función SSL_connect().
 Las funciones SSL_read() y SSL_write() son usadas.
 La función SSL_free() es usada para apagar la conexión TLS/SSL, liberando el
socket y los objetos de contexto SSL.
El código puede ser compilado y probado usando los siguientes comandos:

root@beaglebone:# gcc WEBBROWSERSSL.c –o WEBBROWSERSSL –lcrypto -lssl


root@beaglebone:# ./WEBBROWSERSSL www.google.com

La aplicación puede comunicarse exitosamente con el puerto SSL (443) sobre


servidores web seguros (por ejemplo, www.google.com). El código actual no verifica la
autenticidad del propietario del servidor, pero hace comunicaciones encriptadas.

3.3.3 EL BEAGLEBONE COMO UN SENSOR WEB


Anteriormente en este capítulo un servidor web fue configurado de manera que éste
pueda presentar la información de sensado de temperatura en Internet. Este mecanismo
es muy útil, ya que proporciona una instantánea en tiempo de las salidas del sensor. Para
proporcionar la tendencia de los datos, podría ser posible almacenar los datos en archivos
planos o instalar una base de datos ligera en el BBB. Herramientas de graficación tales como
phpChart y pChart podrían ser usadas para presentar los datos visualmente.
Una manera alternativa para realizar la colección y visualización de la información
del sensor web es conectar el BBB a servicios de agregación de información online, cuales
habilitan poner la información del sensor en la nube, directamente a partir del BBB. En esta
sección, dos de tales servicios online son utilizados directamente desde dentro de
programas de C/C++ que se están ejecutando sobre el BBB. Esto habilita el desarrollo muy
ligero de operaciones que pueden aprovechar servicios de Internet para intercomunicar
entre BBBs sobre diferentes redes. Esto también habilita la colección de datos del sensor a
partir de muchos “sensores web” BBB al mismo tiempo sobre diferentes redes físicas.
ThingSpeak es una aplicación de IoT de fuente abierta y API que puede ser usada
para almacenar datos a partir de sensores web (cosas). Usando HTTP, los sensores pueden
empujar datos numéricos o alfanuméricos al servidor, donde pueden ser procesados y
visualizados. La aplicación ThingSpeak puede ser instalada sobre un servidor que está
corriendo la aplicación web Ruby on Rails y una base de datos SQL.

174
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 3.43 Aplicación cliente web que usa la herramienta SSL.

En este ejemplo, el BBB empuja la información del sensor de temperatura a un


servicio libre de alojamiento en www.thingspeak.com, donde los datos pueden también ser
visualizados. Una vez que se configura una cuenta, se puede entonces crear un nuevo canal,
que proporciona las API de escritura y lectura claves para el canal. Estas son usadas en el
código C++ de ejemplo de la Figura 3.44.

175
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 3.44 Uso de las API de ThingSpeak.

Una clase programada en C++ llamada SocketClient está disponible para este
ejemplo (ver Figura 3.45). Esta clase simplemente envuelve el código en C que fue usado
para aplicación cliente web de C/C++ mostrado en la Figura 3.41.
El código de ejemplo de la Figura 3.44 usa la clase SocketClient. El ejemplo lee
el sensor de temperatura y empuja la medición al servidor ThingSpeak usando una solicitud
POST HTTP. Para enviar datos al servidor en intervalos de tiempo regular, se pueden agregar
hilos POSIX y llamadas a funciones sleep() en el código mostrado en la Figura 3.44. Sin
embargo, una alternativa más fácil es usar el planificador de trabajo basado en tiempo cron
de Linux.

176
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 3.45 Clase SocketClient utilizada para la aplicación sensor web.

177
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

El daemon cron de Linux (nombrado después Chronos) es una utilidad sumamente


configurable para planificar tareas para ser realizadas en tiempos y fechas específicas. Es
típicamente usado para tareas de administración del sistema, tales como respaldo de datos,
archivos temporales borrados, rotar archivos log, actualizar repositorios de paquetes, etc.
Cuando se conectan sensores o actuadores al BBB, cron puede también ser muy útil
para aplicaciones tales como registrar datos de estos sensores en intervalos fijos sobre
largos periodos de tiempo. En el BBB, se puede usar un planificador para tareas tales como
recolectar datos del sensor, manejar el reloj de un motor a pasos, fotografía de tiempo
transcurrido, establecer alarmas de seguridad y así sucesivamente.
Cron despierta una vez cada minuto y checa sus archivos de configuración, llamados
crontabs, para ver si algunos comandos son planificados para ser ejecutados. Esto puede
ser usado para planificar tareas para correr con una frecuencia máxima una vez por minuto
hasta una frecuencia mínima una vez por año. Los archivos de configuración para cron
pueden ser encontrados en el directorio /etc.
root@beaglebone:# cd /etc/cron<Tab><Tab>

El archivo crontab contiene instrucciones del planificador para el daemon de cron,


de acuerdo a los campos crontab que son listados en la Tabla 3.2. Cada línea del archivo
crontab específica el tiempo en el cual el campo de comando se debe ejecutar. Un valor
comodín (*) está disponible, por ejemplo, si éste es puesto en el campo hora, entonces el
comando se debe ejecutar en todos y cada una de las horas del día.
Tabla 3.2 Campos de crontab.

CAMPO RANGO DESCRIPCIÓN


m 0-59 El campo minuto
h 0-23 El campo hora
dom 1-31 El campo de día del mes
mon 1-12 (o nombre) Mes del año (primeras tres letras pueden ser usadas)
dow 0-7 (o nombre) 0 o 7 es domingo (primeras tres letras pueden ser usadas)
user Puede especificar el usuario que ejecuta el comando
command El comando a ser ejecutado en un punto en el tiempo

Los rangos son permitidos (por ejemplo, 1 – 5 para lunes a viernes) y son listas de
tiempo (es decir, 1, 3, 5). En adición, las cadenas pueden ser usadas en lugar de los primeros
cinco campos: @reboot, @yearly, @annually, @monthly, @weekly, @daily, @midnight y
@hourly. El archivo crontab personalizado mostrado en la Figura 3.46 proporciona
algunos ejemplo. Hay comentarios en el archivo para explicar la funcionalidad de las
entradas.
Los ejemplos son agregados al archivo crontab para enviar mensajes y para borrar
el directorio /tmp. Se puede especificar que un comando debe ser ejecutado cada 10
minutos usando */10 en el campo minutos.

178
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 3.46 Ejemplo de la configuración de un archivo crontab.

También se puede tener notificado otras entradas en el archivo crontab que


refieren a un comando anacron. Anacron es una utilidad cron especializada para
dispositivos, tales como computadoras Laptop que no se espera que estén prendidas 24/7.
Si un cron regular fuera configurado para respaldar archivos cada semana pero si sucedió
que el BBB fue apagado en ese preciso momento, entonces el respaldo podría nunca
haberse realizado. Sin embargo, con anacron el respaldo será realizado cuando el BBB
arranque la próxima vez. Se puede instalar anacron usando lo siguiente:
root@beaglebone:# apt-get install anacron

Ahora habrá un nuevo archivo /etc/anacrontab que realiza el mismo papel que
hace crontab para cron. El archivo de configuración para anacron puede ser
encontrado en /etc/init/anacron.conf.
Un problema con tener cron y anacron instalados sobre un mismo sistema, es que
es posible para cron correr un trabajo que anacron tiene realmente corriendo o viceversa.
Esta es la razón de las entradas crontab al final de la lista de la Figura 3.46. Estas entradas
aseguran que run-parts sea ejecutado sólo si anacron no está instalado en el BBB.
Esto es probado por la llamada test –x /usr/sbin/anacron, cual regresa 0 si el
comando anacron está presente, y 1 si no lo está. Llamando a echo $? Despliega el
valor de salida.
Una alternativa para agregar una entrada directamente al archivo crontab es
agregar un script a uno de los directorios: cron.daily, cron.hourly,
cron.monthly o cron.weekly en el directorio /etc. Cualquier script en estos
directorios es ejecutado por cron. Por ejemplo, se puede crear un script en el directorio
cron.hourly para actualizar la temperatura en ThingSpeak como se muestra en la Figura
3.47.
Una alternativa a lo anterior es ejecutar directamente el archivo binario dentro de
una cuenta de usuario usando user crontab, cual se describe a continuación. Cada
cuanta de usuario tiene su propio crontab. Estos archivos son puestos en el directorio

179
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

/var/spool/cron/crontabs, pero ellos no deben ser editados en esta ubicación. Lo


siguiente crea un crontab para el usuario alainmm:
alainmm@beaglebone:~$ crontab -e

Se puede editar el archivo crontab de usuario para subir la temperatura a


ThingSpeak cada 30 minutos agregando la siguiente línea:
*/30 * * * * ~/home/alainmm/SocketClient > /dev/null 2>&1

Fig. 3.47 Pasos de compilación y creación del script para ejecutar la aplicación SocketClient cada hora.

El final de este comando redirecciona la salida estándar a /dev/null. La


llamada 2>&1 redirecciona el error estándar a la salida estándar, y por lo tanto también a
/dev/null. Si esto no estuviera presente, entonces por default la salida del comando
SocketClient podría ser enviada por correo al administrador de sistema (si el correo es
configurado en el BBB). Se puede respaldar el archivo crontab como sigue:
alainmm@beaglebone:~$ crontab –l > crontab-backup

Para reintegrar este archivo de respaldo con crontab se debe usar lo siguiente:
alainmm@beaglebone:~$ crontab crontab-backup

La cuenta de administrador puede controlar cuales usuarios tienen acceso a cron


mediante la puesta ya sea de cron.allow o un archivo cron.deny en el directorio
/etc. Bajo Debian todos los usuarios pueden tener sus propios crontab por default. Usar
lo siguiente para remover esta capacidad:
alainmm@beaglebone:~$ more cron.deny
alainmm
alainmm@beaglebone:~$ crontab -e

Para usar esta configuración cron con el programa SocketClient, se debe de


asegurar que la capa del ADC esté cargada en el sistema en el arranque, de otra manera, el
programa fallará después de reiniciar.
En la Figura 3.48 se muestra la ventana de inicio para crear una cuenta en
ThingSpeak. Una vez configurada la cuenta se debe iniciar sesión y crear un nuevo canal

180
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

llenando los campos mostrados en la Figura 3.49. Para poder enviar datos del BBB a la nube
es necesario escribir el “write API key” en el código de la Figura 3.44. Esta clave está
disponible en la pestaña “API KEYs” de la página principal del canal (ver Figura 3.50).

Fig. 3.48 Ventana principal para crear una cuenta en ThingSpeak.

Fig. 3.49 Ventana donde se configura un canal para recolectar datos.

181
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 3.50 Ventana donde se muestra el API key para la aplicación.

Xively proporciona una muy poderosa PaaS de IoT que habilita la interconexión de
dispositivos IoT. La PaaS de Xively puede ser usada para construir aplicaciones similares a la
aplicación de sensado de temperatura de ThingSpeak. Sin embargo, Xively también
proporciona funcionalidad avanzada que puede ser usada para construir soluciones de nivel
empresa, tales como las siguientes:

 Servicios de Directorio: Habilita a aplicaciones para buscar un directorio de objetos


y permisos asociados con dispositivos.
 Servicios de Datos: Para archivar datos de series de tiempo y recuperarlos.
 Servicios de Negocios: Para proveer, activar y manejar dispositivos.
NOTA: Xively es un servicio de computación en la nube que proporciona librerías de
software, almacenamiento de datos y hardware que es necesario para sus clientes para
construir ofertas de escala comercial.
Dispositivos tales como el BBB, ofrecen servicios de datos y aplicaciones que se
pueden interconectar a estos servicios usando la API de Xively, cual soporta manejo de
mensajes en tiempo real y ruteado. Tal como una PaaS es muy útil si se tiene muchos nodos
de sensores BBB que se tienen que intercomunicar. También se puede almacenar vastas
cantidades de datos de series de tiempo. Mientras la arquitectura es más compleja que
ThingSpeak, la PaaS de Xively proporciona escalabilidad y una librería de C para
interconectar a sus servicios.
Se puede crear una cuenta en www.xively.com mediante el ingreso a una cuenta
de desarrollador libre. Después bajo la etiqueta “Develop” se puede seleccionar “+Add”
para agregar un dispositivo. Antes de proporcionar una breve descripción, se observará una
página que se puede usar para crear un canal con la opción “+Add Channel”. En el siguiente

182
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

ejemplo, el dispositivo es llamado “Beaglebone Temperatura” y el canal es llamado


“Temperatura” (ver Figura 3.51). Los valores auto generados device key y feed ID
son muy importantes para los siguientes ejemplos, cuales utilizan la librearía C de Xively.

Fig. 3.51 Ventana típica de una interface Xively.

Xively ha desarrollado una librería en C llamada libxively, cual proporciona una


interface para aplicaciones Xively de manera que ellas se puedan ejecutar sobre una
plataforma embebida como el BBB. La librería está estructurada por tres capas:

 Una capa de comunicación para abrir comunicaciones de sockets y enviar datos.


 Una capa de transporte que codifica/decodifica solicitudes HTTP/WebSockets.
 Una capa de datos que codifica/decodifica formatos de datos Xively.
La librería puede ser descargada y construida en el BBB usando los pasos (usar un
directorio temporal) de la Figura 3.52, donde la bandera --recursive instruye un git
para buscar cualquier sub-módulo requerido. Cuando la librería es construida, los siguientes
ejemplos binarios aparecen (ver Figura 3.53). Estas aplicaciones pueden ser usadas en el
BBB como la base de scripts que interactúan con el dispositivo Xively. Por ejemplo, en la
Figura 3.54 se muestra el uso de feed_update para empujar un valor de dato fijo a Xively.

183
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 3.52 Pasos para construir la librería C de Xively sobre el BBB.

Fig. 3.53 Ejemplos de archivos binarios para usar de base en scripts.

Fig. 3.54 Uso de feed_update para empujar un dato de valor fijo a Xively.

184
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

El precedente valor fijo 26 empujado al canal Temperatura, puede ser recuperado a


partir del mismo canal usando lo mostrado en la Figura 3.55.

Fig. 3.55 Uso de feed_get_all para leer los datos de valor fijo en el canal Temperatura de Xively.

Escribir scripts es útil, pero para aplicaciones más dinámicas la librería C de Xively
puede ser usada directamente dentro de programas de C/C++. La versión actual de
libxively junto con sus archivos asociados de cabecera están presentes en el sub-
directorio libxively/ del directorio /temp/libxively/scr.
El primer ejemplo, en la Figura 3.56, lee el valor del sensor de temperatura LM35 y
envía este dato al canal “Temperatura” de Xively. El código puede ser construido y
ejecutado usando la siguiente llamada:
alainmm@beaglebone:~$ gcc –Wall –std=c99 xivelysensor.c libxively.a –o
xivelysensor –Ilibxively/
alainmm@beaglebone:~$ ./xivelysensor

Para ejecutar la primera línea anterior es necesario tener el sub-directorio


/libxively y el archivo objeto libxively.a que se encuentra en
/temp/libxively/obj en el mismo directorio donde se encuentra el código principal
xivelysensor.c.

185
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig.3.56 Código en C que usa la librería de Xively para empujar un dato a la nube.

Este programa envía el valor de temperatura 176.132812 al canal “Temperatura”.


Un cron de trabajo puede ser usado para repetidamente llamar a este programa, cual
resulta en un despliegue visual similar al de la Figura 3.57.
Un segundo programa llamado readxively.c es escrito para recuperar el valor
del canal “Temperatura” actual directamente del PaaS de Xively (ver Figura 3.58). La
funcionalidad de lectura y escritura pueden ser utilizadas para habilitar a muchos BBB
intercomunicarse.

186
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 3.57 Ventana para el despliegue de las mediciones de temperatura en Xively.

Fig. 3.58 Código en C para recuperar el valor actual en la PaaS de Xively.

187
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Este código puede ser construido de la misma manera y puede ser ejecutado usando
./readxively. Este programa envía y recibe datos de punto flotante. Se puede cambiar
el código para enviar datos usando las funciones xi_set_value_i32() y
xi_set_value_str(), enteros y cadena de datos, respectivamente, pueden ser
escritos para el servicio. También este código puede ser usado para recibir datos usando
i32_value o str_value, para enteros y cadenas de datos, respectivamente.
3.3.4 EL CLIENTE/SERVIDOR EN C++
La aplicación cliente de C/C++ descrita anteriormente en este capítulo usa HTTP y
HTTPS para conectar a un servidor web y recuperar una página web. En esta sección un
servidor TCP es descrito, en el cual un cliente TCP pueda se conectar con la finalidad de
intercambiar información, cual no tiene que estar en forma HTTP. La misma clase
SocketClient que fue usada anteriormente, es reusada en esta sección y una nueva
clase llamada SocketServer es descrita. Los pasos que toman lugar durante una
comunicación cliente/servidor se describen a continuación:

 En el paso 1, un servidor TCP que está corriendo sobre el BBB en la dirección IP


192.168.7.2; empieza escuchando a un puerto TCP de usuario definido (54321). Este
escuchará a este puerto por siempre, esperando el contacto de un cliente.
 En el paso 2, una aplicación cliente TCP es ejecutada. La aplicación cliente tiene que
conocer la dirección IP y número de puerto del servidor al cual se conectará. La
aplicación cliente abre un socket cliente usando la ubicación de puerto Linux
disponible siguiente. El servidor, cual puede estar corriendo sobre un diferente BBB,
acepta una solicitud de conexión del cliente. Éste entonces recupera una referencia
para la dirección IP cliente y el número de puerto. Una dirección es formada y el
cliente escribe un mensaje a esta conexión, cual es “Hola a partir del cliente”.
 En el paso 3, el servidor lee un mensaje a partir de la conexión y envía de regreso un
nuevo mensaje al cliente, cual es “El servidor dice gracias”. El cliente lee el mensaje
de respuesta y lo despliega en la terminal. Entonces el cliente y servidor ambos
cierran los sockets de red. Los programas corren asíncronamente, en este caso
corriendo hasta terminar.
El ejemplo completo es proporcionado en las Figuras 3.59 y 3.60. El programa
cliente.cpp en la Figura 3.59 usa la clase SocketClient vista anteriormente. La
clase SocketServer en la Figura 3.61 es nueva y se comporta de una manera muy
diferente que la clase SocketClient. Un objeto de esta clase es creado pasando el
número de puerto al constructor, cuando el método listen() es llamado. El contador de
programa no regresa a partir de este método hasta que una conexión haya sido aceptada
por el servidor.

188
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 3.59 Código para la aplicación Cliente.

Fig. 3.60 Código para la aplicación Servidor.

El programa server.cpp en la Figura 3.60 crea un objeto de la clase


SocketServer y espera una conexión cliente. El código para este ejemplo puede ser
construido usando lo siguiente:
root@beaglebone:# g++ cliente.cpp -o cliente
root@beaglebone:# g++ server.cpp -o server

El servidor ahora puede ser ejecutado usando ./server. El servidor esperará en


este punto hasta que una solicitud cliente haya sido recibida. Para ejecutar la aplicación
cliente, una sesión de terminal separada en el mismo BBB, otro BBB o una PC con Linux
puede ser usada. La aplicación cliente puede ser ejecutada pasando la dirección IP del
servidor (ver Figura 3.62). El número de puerto (54321) está definido dentro del código del
programa cliente. Cuando el cliente se conecta al servidor, ambos el cliente y el servidor se
ejecutan simultáneamente, resultando la salida mostrada en la Figura 3.62.

189
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 3.61 Código en C para la clase SocketServer.

190
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 3.62 Salida del cliente y servidor cuando establecen comunicación entre ellos.

Este código más adelante será modificado y mejorado agregándole soporte de hilos
y habilitándolo para intercomunicarlo con una mejor estructura que una simple cadena. Sin
embargo, debe ser claro que este código habilita la interconexión entre cliente/servidor
Linux que están ubicados donde sea en el mundo. El par cliente/servidor se comunica
enviando y recibiendo bytes, por lo tanto, la comunicación puede tomar lugar en una muy
alta tasa de transferencia de datos y está únicamente limitada por la infraestructura de la
red física.
3.3.5 BEAGLEBONE Y Wi-Fi
Puede ser necesario en ciertas aplicaciones de IoT que el BBB esté conectado
inalámbricamente a Internet. En esta sección se describe cómo se pueden usar los
adaptadores Wi-Fi USB en el BBB. El BBB puede comunicarse inalámbricamente con otros
dispositivos usando varios diferentes estándares, cada uno de los cuales tiene sus propias
ventajas y desventajas, como se resume en la Tabla 3.3.
Tabla 3.3 Comparación entre diferentes estándares inalámbricos.

BLUETOOTH ZIGBEE WIFI CUSTOM


Estándar IEEE 802.15.1 IEEE 802.15.4 IEEE 802.11 2.4Ghz Custom
Rango 10m a 100m ~100m 10m a 100m 10 a 100m
Potencia Baja Muy Baja Alta Muy baja
Tasa de Datos 2.1Mb/s 250Kb/s 10 a 300Mb/s 250Kb/s
Topología Estrella Malla/Estrella Estrella Estrella
Organización Bluetooth SIG Zigbee Alliance Wi-Fi Alliance Ninguno

191
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Varios adaptadores Wi-Fi populares han sido probados en el BBB. Después de que
un adaptador USB es insertado y el BBB es arrancado, se puede confirmar que el adaptador
de red ha sido detectado usando el comando lsusb, cual debe resultar en una salida de la
forma ilustrada en la Figura 3.63. El adaptador debe ser detectado por el BBB y su chipset
identificado.

Fig. 3.63 Dispositivo WIFI detectado versión 2 (8179).

Para instalar el dispositivo Wi-Fi (Nano USB Adapter TL-WN725N en este caso) en el
BBB, se deben teclear los siguientes comandos en una terminal SSH (revise que el adaptador
Wi-Fi esté desconectado).
root@beaglebone:# apt-get update

root@beaglebone:# apt-get install linux-headers-$(uname -r)

root@beaglebone:# apt-get update

root@beaglebone:# install build-essential

root@beaglebone:# apt-get install git

root@beaglebone:# git clone https://github.com/lwfinger/rtl8188eu

root@beaglebone:# cd rtl8188eu

root@beaglebone:/rtl8188eu# make all

root@beaglebone:/rtl8188eu# make install

root@beaglebone:/rtl8188eu# insmod 8188eu.ko

NOTA: Muchos adaptadores Wi-Fi tienen problemas debido a la insuficiencia de corriente


de la fuente de alimentación. Se recomienda usar un PSU de 2A a 5v conectado al Jack del
BBB.
Si todo va bien, el adaptador debe aparecer como wlan0 en una llamada al
comando ifconfig (ver Figura 3.64). El adaptador puede ahora ser configurado en el
archivo de configuración /etc/network/interfaces usando el editor nano (quitar el
comentario # en la línea iface wlan0 inet dhcp). Si la conexión de red esta
encriptada, entonces esta configuración no es suficiente, pero ésta permitirá determinar la
configuración de red (Usar Ctrl-C para parar el intento de conexión en el comando
siguiente).

192
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 3.64 Modulo Wi-Fi detectado como wlan0.

root@beaglebone:/etc/network# ifup wlan0

Se puede escanear los puntos de acceso de redes inalámbricas usando el comando


mostrado en la Figura 3.65.

Fig. 3.65 Puntos de acceso de redes inalámbricas.

193
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

El siguiente paso es generar una WPA passphrase usando el nombre del punto
de acceso inalámbrico (SSID) y el password de red, tal como se muestra a continuación:
root@beaglebone:# wpa_passphrase Nombre_de_red Password > /etc/wpa.conf

El archivo de configuración wpa.conf se puede enlazar al archivo de configuración


/etc/network/interfaces incluyendo la entrada wpa-conf /etc/wpa.conf
(ver Figura 3.66).

Fig. 3.66 Agregando enlace al archivo de configuración de wlan0.

Si se están probando múltiples adaptadores Wi-Fi, entonces todos ellos pueden ser
direccionados en el mismo archivo wpa.conf. La interface de adaptador de red puede
ser reinicializada, el archivo de configuración checado, y así activar el adaptador de red
inalámbrico (wlan0) usando el comando ifup, tal como sigue:
root@beaglebone:# /etc/init.d/networking restart

root@beaglebone:# ifconfig –a

root@beaglebone:# ifup wlan0

El adaptador inalámbrico ahora debe haber sido ubicado en una dirección IP vía el
punto de acceso inalámbrico (ver Figura 3.67). Si se quita el comentario en la línea auto
wlan0 en el archivo /etc/network/interfaces, entonces la interface inalámbrica
empezará en el arranque automáticamente. No se debe hacer este cambio hasta que el
adaptador este completamente trabajando.

194
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 3.67 Asignación de dirección IP al adaptador inalámbrico wlan0.

Se puede desconectar el adaptador usando el comando ifdown wlan0. Para


conseguir más información sobre la configuración del adaptador se puede usar iwconfig.
Por último, se puede usar el comando siguiente para presentar un despliegue de la fuerza
e la señal de red, cual se actualiza cada segundo.
root@beaglebone:# watch –n 1 cat /proc/net/wireless

NOTA: Una vez configurada la red inalámbrica, ahora se pueden borrar las dos últimas líneas
agregadas al archivo .profile (ver Capítulo 1).
3.3.6 DIRECCIÓN IP ESTÁTICA
El BBB está configurado por default para usar el protocolo de configuración huésped
dinámico (DHCP por sus siglas en inglés) para la ubicación de su dirección IP alámbrica e
inalámbrica. Los rúters de red típicamente corren un servidor DHCP que ubica una baraja
de direcciones a los dispositivos unidos a la red. Mientras DHCP trabaja muy bien para la
mayoría de los dispositivos sobre una red local, esto puedo causar dificultades si se desea
hacer visible al BBB fuera del firewall doméstico a través de un reenvío de puerto. Esto es
porque los dispositivos DHCP pueden recibir una dirección IP diferente cada vez que ellos
arrancan (dependiendo del tiempo transcurrido del rúter). El reenvío de puerto significa
que un puerto particular sobre el BBB (por ejemplo, 80) puede ser mapeado a un puerto
que es visible fuera del firewall, de esa manera haciendo un servicio sobre el BBB visible al

195
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

mundo. Muchos rúters/firewall requieren que el BBB tenga una dirección IP estática para
establecer un reenvío de puerto a éste.
Para dar una dirección IP estática al adaptador alámbrico, se puede alterar el archivo
de configuración /etc/network/interfaces para manualmente especificar la
dirección (por ejemplo, 192.168.1.80), la máscara de red, y el gateway de red, con el
siguiente formato:
root@beaglebone:/etc/network# more interfaces

# The primary network interface

auto eth0

iface eth0 inet static

address 192.168.1.80

netmask 255.255.255.0

Gateway 192.168.1.1

El BBB tendrá una dirección IP estática después de un reinicio. El mismo


procedimiento aplica a otro adaptador, tal como el adaptador inalámbrico wlan0. No
establecer una dirección IP que este dentro de la baraja del DHCP o asignado a otro
dispositivo, o esto resultará en un conflicto de IP en la red.

3.4 INTERFACES DE USUARIO CON EL BEAGLEBONE


En esta sección son introducidas las interfaces de usuario (IU) y el desarrollo de la
aplicación sobre el BBB. Una IU permite una profunda interacción con una aplicación, cosa
que no es posible con una interface de línea de comandos. En particular, la adición de
elementos de despliegue gráficos puede resultar en aplicaciones de fácil uso. También se
introduce un marco de aplicación software para desarrollo de IU conocido como Qt. El
entorno Qt será el foco de la discusión más adelante, debido a sus librerías exhaustivas de
código. Un ejemplo de aplicación IU es desarrollado para el BBB que usa el sensor de
temperatura LM35 sobre Internet.
3.4.1 CÓMPUTO DE RED VIRTUAL
Cómputo de Red Virtual (VNC por sus siglas en inglés) habilita aplicaciones de
escritorio sobre una computadora (el servidor) para estar compartiendo y remotamente
estar controlando otra computadora (el cliente). Las pulsaciones en el teclado y las
interacciones con el mouse sobre el VNC cliente son transmitidas al VNC servidor sobre la
red. El VNC servidor determina el impacto de estas interacciones y entonces actualiza el
buffer de marco remoto (RAM que contiene los datos de imagen del Bitmap) en el VNC de
la máquina cliente. VNC usa un protocolo de buffer de marca remoto, cual es similar al
protocolo de escritorio remoto (RDP) que está estrechamente acoplado al OS Windows.

196
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

El BBB no requiere un despliegue físico para actuar como un VNC servidor, lo que
significa que los pines de los conectores P8 /P9 que son asignados a la salida HDMI pueden
ser reasignados a otra tarea. Importantemente, con VNC las aplicaciones Linux son
ejecutadas sobre el BBB usando su procesador, pero el despliegue del buffer de marco se
está actualizando sobre la máquina remota.
Muchas aplicaciones VNC cliente están disponibles, pero VNC Viewer es descrito a
continuación porque está disponible para plataformas Windows y Linux. Este programa
puede ser descargado e instalado libremente a partir de la página www.realvcn.com. Una
vez que es ejecutado, una pantalla de ingreso aparece que solicita la dirección del servidor
VNC. Sin embargo, para esta configuración se tiene que asegurar que el BBB este corriendo
un servidor VNC antes de ingresar. La distribución Debian del BBB tiene instalado el
tightvncserver por default. La primera vez que se ejecuta el servidor aparecerá la
línea donde se define el password para el acceso remoto.
root@beaglebone:# tightvncserver

You will require a password to access your desktops.

Password:

New ‘X’ desktop is bleaglebone:1...

Una vez que el servidor está corriendo, se puede checar la descripción del proceso
para determinar el número de puerto (en este caso es el puerto 5901, ver Figura 3.68).

Fig. 3.68 Identificación del número de puerto 5901 del servidor VNC.

La sesión VNC Viewer puede ahora ser inicializada en la máquina de escritorio


usando la dirección del servidor y su número de puerto (es decir, 192.168.7.2:5901).
El escritorio del BBB estará contenido dentro de un marco de ventana (ver Figura 3.71).
3.4.2 INTRODUCCIÓN A Qt EN EL BEAGLEBONE
Qt es un poderoso marco de desarrollo de plataforma cruzada que usa C++ estándar.
Qt proporciona librerías de código C++ para desarrollo de aplicaciones GUI (Interfaces de
Usuario Gráficas) y para acceso a base de datos, manejo de hilos, redes, y mucho más.
Importante, el código desarrollado bajo este marco puede ser ejecutado bajo Windows,
Mac OS, Android, Linux y en plataformas embebidas, tal como el BBB. Qt puede ser usado

197
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

bajo términos de fuente abierta o comercial y está soportado por herramientas de


desarrollo disponibles libremente, tal como qmake y Qt Creator. La capacidad y flexibilidad
de este marco lo hacen un candidato ideal para aplicaciones GUI que están corriendo
directamente sobre el BBB, o en dispositivos que controlan el BBB.
En esta sección Qt se describe a detalle, pero es útil iniciar con un ejemplo sencillo
que puede ser compilado y ejecutado en el BBB ya sea directamente o usando VNC. El
primer paso es instalar las herramientas de desarrollo Qt en el BBB. El último comando en
el código siguiente instala un juego completo de herramientas. El comando de en medio
identifica los componentes del juego.
root@beaglebone:# apt-get update

root@beaglebone:# apt-cache search qt4

root@beaglebone:# apt-get install qt4-dev-tools

El programa de la Figura 3.69 es una aplicación Qt muy concisa que puede ser usada
como una prueba. Este código usa un objeto de la clase QLabel, cual es una subclase de
la clase QWidget, para desplegar un mensaje en la aplicación. Un widget es un elemento
IU primario que es usado para crear GUIs con Qt. La clase QWidget padre proporciona el
código requerido para renderizar (dibujar) el objeto subclase sobre la pantalla de
despliegue.

Fig. 3.69 Ejemplo de un código simple para usar la aplicación Qt.

El archivo simpleQT.cpp es el único archivo requerido en un directorio antes de


que los siguientes pasos tomen lugar. El generador makefile de plataforma cruzada qmake
puede ser usado para crear un proyecto por default (ver Figura 3.70). El archivo de proyecto
.pro describe la configuración del proyecto y, si es requerido, éste puede ser editado
manualmente para agregar dependencias adicionales. El generador makefile qmake puede
ser ejecutado otra vez, pero ahora sin el argumento –project (ver Figura 3.70).

198
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 3.70 Uso de qmake para generar el archivo de proyecto y el makefile.

El paso anterior genera el archivo makefile en el directorio actual y permite al


ejecutable ser construido usando una llamada make, cual usa g++ para construir la
aplicación final.
root@beaglebone:~/nuevo_directorio/QT# make

El ejecutable está ahora presente en el directorio y puede ser ejecutado, cual resulta
en un despliegue visual como se muestra en la Figura 3.71.

Fig. 3.71 Despliegue de la IU usando VNC.

Claramente hay pasos adicionales involucrados en el uso de qmake para construir


una aplicación Qt, pero éstos son necesarios para tomar ventaja de la naturaleza de
plataforma cruzada de Qt. Por ejemplo, se pueden realizar pasos similares en una máquina
de escritorio para construir la misma aplicación, sin importar su OS.
Qt es un marco de desarrollo de plataforma cruzada completa que está escrita en
C/C++. Esta es usada para programar IU, pero también proporciona soporte para bases de
datos, hilos, temporizadores, redes, multimedia, XML, procesamiento y mucho más.

199
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Qt extiende C++ agregando macros e introspección, código que examina el tipo y


propiedades de un objeto en tiempo de ejecución, cual no está disponible nativamente en
C++. Es importante notar que todo el código está aún solo en C++.
Qt está construido en módulos, cada uno de los cuales puede ser agregado a un
proyecto incluyendo los archivos de cabecera en el programa C++ e identificando que el
módulo es usado en el archivo .pro. Por ejemplo, para incluir las clases en el módulo
QtNetwork, se puede agregar #include<QtNetwork> al código de programa y enlazar
contra el módulo agregando QT += network al archivo .pro de qmake. Una lista de
módulos importantes se proporciona en la Tabla 3.4.
Tabla 3.4 Resumen de módulos importantes de Qt.

NOMBRE DESCRIPCIÓN
QtCore Contiene el núcleo de clases no GUI, tal como QString, QChar, QDate, QTimer y
QVector. Está incluido por default en proyectos QT, ya que todos los otros módulos
QT recaen sobre este módulo.
QtGui Módulo núcleo que agrega soporte GUI al módulo QtCore, con clases tales como
QDialog, QWidget, QToolbar, QLabel, QTextEdit y QFont. Este módulo
está incluido por default; si la aplicación no tiene GUI, entonces se puede agregar Qt
-= gui al archivo .pro.
QtMultimedia Contiene clases para funcionalidad multimedia de bajo nivel, tales como
QVideoFrame, QAudioInput y QAudioOutput. Para usar este módulo, agregar
#include<QtMultimedia> al archivo fuente y QT += multimedia al archivo
.pro.
QtNetwork Contiene clases para comunicación de red sobre TCP y UDP, incluyendo
comunicaciones SSL, con clases tales como QTcpSocket, QFtp, QLocalServer,
QSslSocket, y QUdpSocket. Tal como se mencionó arriba, se usa
#include<QtNetwork> y QT += network.
QtOpenGL La librería de Gráficos Abierta (OpenGL) es una interface de programación de
aplicación de plataforma cruzada (API) para gráficos de computadora 3D, cual es
ampliamente usada en visualización industrial y aplicaciones de juegos de
computadora. Este módulo hace sencillo contener OpenGL en las aplicaciones con
clases tales como QGLBuffer, QGLWidget, QGLContext, y QGLShader.
Nuevamente, usar #include<QtOpenGL> y QT += opengl. El AM335x
capacidad de aceleración de hardware OpenGL, pero este es actualmente difícil de
utilizar.
QtScript Habilita para hacer aplicaciones Qt en guiones. Los scripts son usados en aplicaciones
tales como Microsoft Excel y Adobe Photoshop para habilitar a los usuarios a
automatizar tareas repetitivas. QtScript incluye un motor de Javascript, cual se
puede usar dentro del núcleo de aplicación para funcionalidad entrelazada en scripts.
También se puede usar para exponer la funcionalidad interna de la aplicación a
usuarios, habilitándolos para agregar nuevas funcionalidades sin la necesidad de una
compilación C++. Usar #include<QtScript> y QT += script.
QtSql Contiene clases para interconectar a bases de datos usando el lenguaje de
programación SQL, tales como QSqlDriver, QSqlQuery y QSqlResult. Usar
#include<QtSql> y QT += sql.
QtSvg Contiene clases para crear y desplegar archivos de gráficos de vector escalar (SVG),
tales como QSvgWidget, QSvgGenerator y QSvgRenderer. Usar
#include<QtSvg> y QT += svg.

200
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

QTest Contiene clases para las pruebas unitarias de aplicaciones Qt usando la herramienta
QTestLib, tales como QSignalSpy y QTestEventList. Usar
#include<QtTest> y QT += testlib.
QtWebKit Proporciona un motor de navegador web y clases para renderizar e interconectar con
contenido web, tal como QWebView, QWebPage y QWebHistory. Usar
#include<QtWebKit> y QT += webkit.
QtXml El lenguaje de margen extensible (XML) es un formato de documento legible
humanamente que puede ser usado para transportar y almacenar datos. El módulo
QtXml proporciona un flujo de lectura y escritura para datos XML, con clases tales
como QXmlReader, QDomDocument y QXmlAttributes. Usar
#include<QtXml> y QT += xml.

La clase QObject es la clase base de casi todas las clases Qt y todos los
reproductores. Esto significa que la mayoría de las clases Qt comparten funcionalidad
común para manejo de memoria, propiedades y programación de manejo de eventos.
Qt implementa introspección almacenando información sobre cada clase que es
derivada del QObject usando un objeto QMetaObject dentro de su sistema de objeto
meta. Cuando se construyen proyectos usando Qt se verá que nuevos archivos .cpp
aparecen en el directorio; éstos son creados mediante el compilador de objetos meta. El
compilador de C++ compilará estos archivos en un archivo objetivo C/C++ regular, cual es
enlazado para crear una aplicación ejecutable.
Qt tiene un modelo de programación de eventos que habilita a los eventos y cambios
de estado a ser interconectados con reacciones usando mecanismos llamados señales y
espacios. Por ejemplo, un reproductor de botón QT puede ser configurado de manera que
cuando éste sea accionado, genere una señal, cual ha sido conectada a un espacio. El
espacio, cual es algo como una llamada a función, realiza una tarea definida por el usuario
cuando éste reciba la señal. Las señales y los espacios pueden ser aplicados a objetos no
GUI; éstos pueden ser usados para intercomunicación entre cualquier objeto que está en
cualquier camino derivado a partir de la clase QOject. Las señales y los espacios
proporcionan un poderoso mecanismo que es posiblemente la característica más única del
marco Qt.
Una aplicación Qt basada en el sensor de temperatura se desarrolla más adelante
que hace extensivo el uso de señales y espacios. Por ejemplo, la aplicación actualiza el
despliegue de temperatura cada 5 segundos leyendo el valor del ADC. En este ejemplo, la
clase QTimer tiene una señal llamada timeout() que es emitida siempre que un objeto
llamado timer “termine el tiempo” (después de cada 5 segundos). Esta señal es conectada
al espacio on_updateTemperature() sobre un objeto de la clase QMainWindow
llamada mainWindow. La conexión es hecha mediante una llamada de la forma:
QObject::connect (source,SIGNAL(signature),destination,SLOT(signature));

donde source y destination son objetos de clases que son derivadas de la clase
QObject. La signature es el nombre de función y tipos de argumentos.
201
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

El sitio web qt-project.org proporciona una excelente descripción detallada


de la conducta de las señales y los espacios, pero aquí se dan algunos puntos resumidos
adicionales para señales, espacios y conexiones para poder iniciar:

 Las señales pueden ser conectadas a cualquier número de espacios.


 Las señales están definidas en la sección de señales en el código (bajo una etiqueta
signals: cual está usualmente en el archivo de cabecera de la clase).
 Los métodos de señal tienen que regresar void y no pueden tener ninguna
implementación.
 Una señal puede ser emitida explícitamente usando la palabra clave emit.
 Los espacios pueden ser conectados a cualquier número de señales.
 Los espacios están definidos en la sección espacios del código (bajo una etiqueta
slots: que puede ser pública, privada o protegida).
 Los espacios son métodos regulares con una implementación completa.
 Las conexiones pueden ser explícitamente formadas o automáticamente creadas
cuando se usa herramientas de diseño gráfico Qt.
El marco Qt también tiene asociado herramientas de desarrollo. Así como la
herramienta qmake, hay un IDE caracterizado completamente llamado Qt Creator, cual es
similar en naturaleza a Eclipse, excepto que éste es especialmente adaptado para desarrollo
Qt. El IDE está disponible para Linux, Windows y Mac OS X, y su herramienta de diseñador
Qt puede ser ejecutada directamente en el BBB. Qt Creator puede ser usado para construir
aplicaciones nativas, o puede ser usado para aplicaciones de compilación cruzada para el
BBB, instalando una cadena de herramientas de plataforma cruzada.
Una de las características claves que proporciona Qt Creator es su Editor de Diseño
Visual, que habilita interactivamente arrastrar y soltar widgets sobre diseños de ventana,
llamadas formas. La interface dispone las propiedades de los widgets para ser configurados
fácilmente, y proporciona una manera sencilla de habilitar señales y asociamiento de
espacios contra los componentes IU. Por ejemplo, para escribir código que se ejecuta
cuando un botón es apretado, simplemente de debe dar clic con el botón derecho del
mouse y elegir “Go to slot”, cual proporciona un diálogo con una lista de señales. Una vez
que una señal es elegida, el IDE automáticamente habilitará la señal, proporcionará una
plantilla de código de espacio, y asociará la señal con el espacio. Las propiedades IU de las
formas son almacenadas en un archivo XML y asociadas con el proyecto.
En esta sección, el IDE Qt Creator es usado para construir una aplicación para el
sensor de temperatura. Esta aplicación se ejecuta directamente en el BBB, sin importar la
arquitectura IU usada. Esta aplicación demuestra algunas de las capacidades de Qt en el
BBB, mientras se está siendo consiente del volumen de código a ser estudiado. Este ejemplo
de aplicación soporta las siguientes características:

202
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

 Un hilo temporizador toma una lectura cada cinco segundos a partir del ADC del BBB
usando un sensor de temperatura LM35.
 Un despliegue de temperatura de punto flotante estilo LCD es usado.
 Un despliegue de la mínima y máxima temperatura es proporcionada.
 Un deslizador es usado para elegir una temperatura en la cual se active una alarma.
Una alerta dispara el despliegue de un cuadro de diálogo.
 Un mecanismo es proporcionado para convertir el despliegue de temperatura en
una escala de Celsius a una escala en Fahrenheit usando un elemento radio widget.
 Un despliegue de estado es usado en cada botón de la ventana.
Para instalar el Qt en una máquina Linux, primero se debe de descargar el instalador
online que es proporcionado directamente en la página www.qt.io (ver Figura 3.72).

Fig. 3.72 Página de descarga del IDE Qt.

Para correr la instalación habrá una sesión de consola y teclee lo siguiente:


alain@debian:~$ chmod +x qt-unified-linux-x64-online.run

alain@debian:~$ ./qt-unified-linux-x64-online.run

El código fuente completo para esta aplicación está disponible en las Figuras 3.73,
3.74 y 3.75. En la Figura 3.73 se muestra el código que proporciona la función principal
main() para la aplicación en la cual una instancia de las clases QApplication y
MainWindow son creadas. La clase QApplication maneja el control de flujo de la
aplicación GUI (el lazo principal). La clase MainWindow es definida en el código de las
Figuras 3.74 y 3.75.

203
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 3.73 Función principal de la aplicación.

Fig. 3.74 Archivo de cabecera de la clase MainWindow.

La clase MainWindow es un hijo de la clase QMainWindow (cual es un hijo de


QWidget y últimamente de QObject). Esto significa que cualquiera de los métodos que
están disponibles en las clases padre está también disponible en la clase MainWindow.

204
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

205
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 3.75 Métodos (slots o espacios) de la clase MainWindow.

Fig. 3.76 Componentes de la IU.

La Figura 3.76 muestra la relación de los componentes utilizados en la IU. El


componente timer no es un componente GUI pero este hace generar una señal
timeout(), cual es conectada al espacio on_update_Temperature(). La naturaleza
exacta del código en las Figuras 3.74 y 3.75 se entiende mejor editándolo y observando el
impacto que éste tiene. No se requiere el sensor de temperatura para ejecutar el código,
pero la temperatura desplegada mantendrá un valor fijo en su ausencia.
La aplicación GUI del sensor de temperatura puede ser editada usando Qt
Designer directamente en el BBB (usando VNC o una pantalla HDMI). Qt Designer
está disponible directamente en la barra de BBB bajo Programming -> Qt Designer
o tecleando designer en el prompt de Shell.

206
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Si se piensa que usando Qt Designer y qmake en el BBB es demasiado lento y oneroso,


se puede desarrollar y depurar la aplicación sobre una computadora de escritorio y después
transferir los archivos al BBB. Por ejemplo, para este proyecto se deben copiar los siguientes
archivos al BBB a partir de la máquina de escritorio usando sftp, scp o rsync (ver Figura
3.77).

Fig. 3.77 Generación del archivo ejecutable en el BBB.

En la Figura 3.78 se muestra la aplicación del sensor de temperatura corriendo sobre el BBB
usando VNC.

Fig. 3.78 Aplicación GUI ejecutándose en el BBB.

207
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

3.4.3 DESARROLLO DE UNA APLICACIÓN IU REMOTA


En la Sección 3.3.4 una aplicación Cliente/Servidor fue introducida que puede ser
usada para intercomunicación directa entre dos procesos que están corriendo en dos
diferentes máquinas usando sockets TCP. Las máquinas podrían estar situadas sobre la
misma red física/inalámbrica, o podrían estar en diferentes continentes. La comunicación
socket requiere de programadores para marcar sus propios protocolos de comunicaciones,
que resulta en una programación más avanzada, pero también conduce a una comunicación
muy eficiente, cual está realmente limitada por la velocidad de la red.
Como una primera aplicación, la funcionalidad de la aplicación GUI del sensor de
temperatura Qt y la aplicación C++ Cliente/Servidor son combinadas. Esto habilita la
creación de una aplicación de temperatura GUI Cliente que puede intercomunicarse con un
servicio de temperatura, cual está corriendo en el BBB. El código del servidor del servicio de
Temperatura es mejorado con respecto al presentado en la Sección 3.3.4, haciéndolo multi-
hilo. Este cambio habilita a muchas aplicaciones cliente unirse al servidor al mismo tiempo.
El código fuente completo de la aplicación cliente se muestra en las Figuras 3.79 a la
3.82 y el código fuente del servidor está disponible en las Figuras 4.x a la 4.x.
La aplicación GUI del sensor de temperatura ha sido modificada de manera que
ahora tiene “Internet Habilitado”. Este cambio significa que la aplicación no se tiene que
ejecutar en el BBB, en su lugar, la aplicación GUI puede correr sobre una máquina de
escritorio y comunicarse con el BBB usando sockets TCP. Para lograr este resultado los
siguientes cambios fueron hechos al código de la aplicación GUI:

 Una nueva ventana de diálogo fue agregada a la aplicación para que pueda ser usada
para ingresar la dirección IP del servidor, el número de puerto del servicio y la
frecuencia de refresco de las lecturas (ver Figura 3.83).
 En lugar de leer a partir del ADC del BBB, la aplicación GUI tiene que abrir un socket
TCP y comunicarse a la aplicación servidor del BBB. La aplicación Cliente envía la
cadena “Leer Temperatura” al servidor. El servidor está programado para responder
con el valor de temperatura, cual la obtiene a partir del sensor LM35 que está
conectado al ADC.
 Un menú es habilitado en la aplicación que puede ser usado para abrir la ventana
de ajustes del servidor o cerrar la aplicación.
El primer cambio involucra la adición de una nueva clase al proyecto anterior
(File->New File or Project->Files and Classes->Qt->Qt Designer
Form Class, después se elige Dialog without Buttons), como se muestra en la
Figura 3.84, cual está asociada con un diálogo (y su archivo XML
serversettingdialo.ui). El papel de esta clase es actuar como envoltura para los
valores que son ingresados en la ventana de diálogo.

208
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 3.79 Archivo cabecera de la clase MainWindow.

Fig. 3.80 Archivo cabecera de la clase serversettingdialog.

209
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

210
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 3.81 Métodos de la clase MainWindow.

El segundo cambio involucra la adición del código del socket al método


leer_temperatura(), como se muestra en la Figura 3.81. Este código usa el módulo
QtNetwork cual requiere que se agregue la siguiente línea al archivo de proyecto
qt1.pro para que el proyecto enlace a ese módulo.
QT += core gui network
La clase QTcpSocket es usada para crear una conexión cliente al servidor de
temperatura TCP del BBB. Sockets TCP regulares son usados sobre el BBB, cual no causan
ninguna dificultad en la transacción de cadenas de datos. Importante, se podría
equivalentemente usar código de sockets Java. Ser cuidadosos de asegurar que el orden de
los bytes sea preservado.

211
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 3.82 Métodos de la clase serversettingdialog.

Fig. 3.83 Ventana de Diálogo para los ajustes del servidor.

El tercer cambio es el implementado por el método createActions() en la


Figura 3.81, cual crea el menú GUI cuando éste es llamado por la clase constructor. Este
método agrega dos acciones al menú: el elemento de salida “Exit” que termina la aplicación
y el elemento “Ajustes” que dispara la ejecución del espacio on_openSettings(), cual
abre la ventana de diálogo de ajustes del servidor.

212
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

Fig. 3.84 Archivos generados por las clases MainWindow y serversettingdialo.

El BBB no tiene que actualizar la GUI del lado del cliente en esta arquitectura, en su
lugar, éste maneja conexiones socket TCP, cadenas de procesos y valores de lectura a partir
del ADC. Tales operaciones tienen un gasto muy bajo sobre el BBB, y por lo tanto éste es
capaz de simultáneamente manejar muchas solicitudes cliente.

213
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.

BIBLIOGRAFÍA

1. Derek Molloy, Exploring BeagleBone; Tools and techniques for building with embedded
linux, Wiley, 2015.

2. Yifeng Zhu, Embedded Systems with ARM Cortex-M3 Microcontrollers in Assembly


Language and C, E-Man Press LLC, 2014.

3. Samuel Greengard, The Internet of Things, The MIT Press, 2015.

4. Philip Koopman, Better Embedded System Software, Drumnadrochit Education, 2010.

5. Christopher Hallinan, Embedded Linux Primer: A Practical Real-World Approach, Prentice


Hall, 2010.

6. Karim Yaghmour, Jon Masters, Gilad Ben-Yossef and Philippe Gerum, Building
Embedded Linux Systems, O'Reilly Media, 2008.

7. Katalin Popovici, Frédéric Rousseau, Ahmed Jerraya, and Marilyn Wolf, Embedded
Software Design and Programming of Multiprocessor System-on-Chip: Simulink and System
C Case Studies, Springer, 2010.

8. Marisa Lee, Raspberry Pi 2: Beginner's Step-by-Step Guide to Using Your Raspberry Pi


2, 2015.

9. Yankee Bush Software LLC, How to Build Your Own Real-Time Operating System:
Advanced Embedded Kernel Programming in C & Assembly, 2014.

10. Jim Cooling, Real-time Operating Systems, Lindentree Associates, 2013.

11. Simon Monk, Programming the BeagleBone Black: Getting Started with JavaScript and
Bone Script, Mc. Graw Hill, 2014.

214

Vous aimerez peut-être aussi