Académique Documents
Professionnel Documents
Culture Documents
INSTITUTO TECNOLÓGICO DE
MORELIA
ASIGNATURA
SISTEMAS OPERATIVOS EMBEBIDOS
Realizado por:
Dr. Alain Manzo Martínez
1
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
TEMAS
2
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
BIBLIOGRAFÍA
3
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
UNIDAD 1
4
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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.
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
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.
8
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
9
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
10
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
11
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
12
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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.
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:
15
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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:
17
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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:
Fig. 1.13 Contenido del script utilizando el símbolo del sistema de Windows.
20
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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.
22
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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:
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.
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
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.
Fig. 1.17 Despliegue del estado del servicio Apache usando PUTTY.
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.
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:
29
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
Fig. 1.19 Ejemplo de cómo se crea una nueva cuenta de usuario sobre el BBB.
30
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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.
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.
32
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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.
33
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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.
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.
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.
36
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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.
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.
39
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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.
41
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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.
42
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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.
46
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
47
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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.
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.
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root
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.
53
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
Tabla 1.12 Comandos de manejo de paquetes comunes usando nano como ejemplo.
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
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.
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.
55
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
Fig. 1.42 Ejecución de hola el cual muestra cada 5 segundos la cadena “Hola Mundo”.
56
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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 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.
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
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.
63
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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.
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.
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.
functionA();
functionB();
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.
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.
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.
Fig. 2.16 Ventana para especificar el username y el password del OS corriendo sobre el BBB.
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.
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.
83
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
84
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
85
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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á.
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.
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!!!”
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
89
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
90
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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.
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.
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.
94
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
Fig. 2.32 Pasos de configuración para usar un GPIO como entrada digital.
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:
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.
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.
98
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
99
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
100
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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.
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
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.
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.
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.
105
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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).
106
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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.
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.
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.
110
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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.
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.
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.
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)
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.
118
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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):
119
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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).
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:
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.
122
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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.
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.
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.
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.
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.
132
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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.
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++.
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.
134
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
135
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
136
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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
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.
140
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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.
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:
Fig. 3.6 Paso para deshabilitar el servicio serial-getty@ttyGS0.service de inicio del arranque.
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
144
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
Fig. 3.9 Nuevo servicio para iniciar el BBBSERIALSERVER en el arranque del BBB.
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
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
146
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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).
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
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).
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.
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.
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;
}
153
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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.
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:
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.
Donde los archivos de configuración del núcleo son como los siguientes:
156
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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.
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.
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.
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.
161
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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
162
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
163
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
Fig. 3.33 Proceso para configurar como all user el directorio de instalación final.
164
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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.
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.
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.
168
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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
169
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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:
171
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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.
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.
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:
174
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
175
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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.
177
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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.
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.
Fig. 3.47 Pasos de compilación y creación del script para ejecutar la aplicación SocketClient cada hora.
Para reintegrar este archivo de respaldo con crontab se debe usar lo siguiente:
alainmm@beaglebone:~$ crontab crontab-backup
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).
181
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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:
182
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
183
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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.
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
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.
186
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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:
188
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
189
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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.
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.
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:# cd rtl8188eu
192
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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
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
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.
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
auto eth0
address 192.168.1.80
netmask 255.255.255.0
Gateway 192.168.1.1
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
Password:
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.
197
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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.
198
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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.
199
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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.
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).
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.
204
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
205
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
206
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
En la Figura 3.78 se muestra la aplicación del sensor de temperatura corriendo sobre el BBB
usando VNC.
207
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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.
209
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
210
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
211
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
212
ITM SISTEMAS OPERATIVOS EMBEBIDOS DR. ALAIN MANZO M.
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.
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.
9. Yankee Bush Software LLC, How to Build Your Own Real-Time Operating System:
Advanced Embedded Kernel Programming in C & Assembly, 2014.
11. Simon Monk, Programming the BeagleBone Black: Getting Started with JavaScript and
Bone Script, Mc. Graw Hill, 2014.
214