El uso de sistemas embebidos se ha popularizado y beneficiado por las nuevas tecnologías, ya que ahora permiten implementar sistemas que no solo controlen de un modo básico y simple un dispositivo, sino que pueden formar parte de un ecosistema que incluya conectividad a Internet y por lo tanto monitoreo y control remoto. Adicionalmente, tendencias como el radio definido por software (SDR) han integrado a sus desarrollos la implementación en sistemas embebidos lo que permite el desarrollo de un sistema de comunicación completo en un ambiente embebido, disminuyendo costos y proporcionando portatibilidad.

Instalación.

A diferencia de los sistemas operativos convencionales, el instalar un sistema embebido puede verse limitado por la arquitectura de hardware del sistema embebido, por lo que su instalación puede llegar a ocupar varias horas o incluso interrumpirse por la falta de recursos. Una alternativa es la compilación cruzada, donde en una computadora con mejores prestaciones que el hardware de un sistema embebido compila todo el software necesario para el desarrollo del sistema operativo embebido, pero con las librerías que le corresponden al sistema embebido, esto es, se realizará la compilación de una arquitectura de un sistema embebido en una arquitectura de hardware diferente.

Existen varios proyectos para el desarrollo de sistemas embebidos, tales como openembbeded o yocto project. GNU Radio por su parte, proporciona un procedimiento para generar un sistema operativo embebido con GNU Radiointegrado al momento de realizar la compilación cruzada.

Para el correcto funcionamientod de OpenEmbedded, se requiere de los siguientes prerequisitos.

$ sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib build-essential chrpath socat libsdl1.2-dev xterm

Una vez cumplidos los prerequisitos se procede a la descarga del proyecto repo.

$ curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > repo
$ chmod a+x repo
$ sudo mv repo /usr/local/bin/

Se crea el directorio de trabajo del proyecto.

$ mkdir oe-repo
$ cd oe-repo

Se indica que el sistema embebido incluye GNU Radio.

$ repo init -u git://github.com/balister/oe-gnuradio-manifest.git -b fido

Se actualiza el proyecto e indica el modelo de la plataforma a utilizar.

$ repo sync
$ TEMPLATECONF=`pwd`/meta-sdr/conf source ./oe-core/oe-init-build-env ./build ./bitbake

Al momento de ejecutar el proyecto puede generar diversos tipos de errores, tal como este, donde no se indicó la plataforma

You had no conf/local.conf file. This configuration file has therefore been
created for you with some default values. You may wish to edit it to use a
different MACHINE (target hardware) or enable parallel build options to take
advantage of multiple cores for example. See the file for more information as
common configuration options are commented.

You had no conf/bblayers.conf file. The configuration file has been created for
you with some default values. To add additional metadata layers into your
configuration please add entries to this file.

The Yocto Project has extensive documentation about OE including a reference
manual which can be found at:
    http://yoctoproject.org/documentation

For more information about OpenEmbedded see their website:
    http://www.openembedded.org/


### Shell environment set up for builds. ###

You can now run 'bitbake <target>'

Se indica la plataforma de hardware del sistema embebido, en este caso es una tarjeta Zedboard y con el comando bitbake se inicia la creación del sistema embebido, debido a la descarga de software esta operación llega a consumir hasta 50 GB de disco duro, igualmente puede tardar mucho tiempo por la velocidad del enlace de Internet.

$ export MACHINE="zedboard-zynq7"
$ bitbake gnuradio-dev-image

En caso de que falte algún paquete, el proyecto indicará la falta del mismo.

NOTE: Your conf/bblayers.conf has been automatically updated.
ERROR:  OE-core's config sanity checker detected a potential misconfiguration.
    Either fix the cause of this error or at your own risk disable the checker (see sanity.conf).
    Following is the list of potential problems / advisories:

    Please install the following missing utilities: chrpath

Este problema se soluciona a través de apt-get.

$ sudo apt-get install chrpath

Otro de los errores que se pueden presentar es la falta de recetas al momento de generar el sistema embebido.

Parsing recipes: 100% |#######################################| Time: 00:00:30
Parsing of 1939 .bb files complete (0 cached, 1939 parsed). 2455 targets, 247 skipped, 0 masked, 0 errors.
ERROR: No recipes available for:
  /home/cidte/oe-repo/oe-core/../meta-fsl-arm/openembedded-layer/recipes-support/opencv/opencv_3.0.bbappend
  /home/cidte/oe-repo/oe-core/../meta-fsl-arm-extra/recipes-kernel/linux/linux-timesys_3.0.15.bbappend

Summary: There was 1 ERROR message shown, returning a non-zero exit code.

En caso de que alguna receta no este disponible para su descarga será necesario eliminarla de la lista de recetas.

$ gedit conf/bblayers.conf

Dentro del archivo de configuración se busca los paquetes no disponibles y se borran.

/home/cidte/oe-repo/oe-core/../meta-fsl-arm \
/home/cidte/oe-repo/oe-core/../meta-fsl-arm-extra \

Una vez hecha la modificación, se ejecuta nuevamente el comando bitbake

$ bitbake gnuradio-dev-image

Parsing recipes: 100% |#######################################| Time: 00:00:14
Parsing of 1871 .bb files complete (0 cached, 1871 parsed). 2377 targets, 194 skipped, 0 masked, 0 errors.
WARNING: No bb files matched BBFILE_PATTERN_ettus-e100 '^/home/cidte/oe-repo/oe-core/../meta-ettus/e100-bsp/'
NOTE: Resolving any missing task queue dependencies
NOTE: multiple providers are available for jpeg (jpeg, libjpeg-turbo)
NOTE: consider defining a PREFERRED_PROVIDER entry to match jpeg
NOTE: multiple providers are available for jpeg-native (jpeg-native, libjpeg-turbo-native)
NOTE: consider defining a PREFERRED_PROVIDER entry to match jpeg-native

Build Configuration:
BB_VERSION        = "1.26.0"
BUILD_SYS         = "x86_64-linux"
NATIVELSBSTRING   = "elementary-OS-0.3.1"
TARGET_SYS        = "arm-oe-linux-gnueabi"
MACHINE           = "zedboard-zynq7"
DISTRO            = "nodistro"
DISTRO_VERSION    = "nodistro.0"
TUNE_FEATURES     = "arm armv7a vfp neon callconvention-hard"
TARGET_FPU        = "vfp-neon"
meta              = "(nobranch):f0873b83d693af4a103999160d67fcf25c7eedc1"
e100-bsp          
e300-bsp          
common            = "(nobranch):eed1cc7bd61aaefc711237f5952faa23f859454d"
meta-xilinx       = "(nobranch):13779b9254bab450875a60ed8f21edd0e8876a71"
meta-oe           
meta-networking   
meta-filesystems  
meta-python       = "(nobranch):df2f700d66bace65f5d802225232d01cf511fe81"
meta-sdr          = "(nobranch):033049a3fa7c97dbe57eaaa54b84b05cbdd6484f"
meta-ti           = "(nobranch):2210ae2cdacc22105b76c5fa45957ebec104f1c6"

NOTE: Preparing RunQueue
NOTE: Executing SetScene Tasks
NOTE: Executing RunQueue Tasks

Copia a memoria SD.

Una vez terminado el proceso de compilación cruzada, el proyecto entrega una serie de archivos que son el sistema operativo embebido en la siguiente ubicación.

$ cd /<ruta-instalación-repo>/oe-repo/build/tmp-glibc/deploy/images

Estos archivos deben ser copiados a una memoria SD, para ello es necesario que la memoria tenga dos particiones: una llamada BOOT, fat32, de 40 MB y que sea bootable y la segunda llamada rootfs, ext4 y de tamaño del resto de la memoria. Los archivos que se requieren en la memoria SD en la partición de BOOT son:

$ cp boot.bin /<ruta-a-memoria-SD>/BOOT
$ cp u-boot.elf /<ruta-a-memoria-SD>/BOOT
$ cp u-boot-dtb.img /<ruta-a-memoria-SD>/BOOT
$ cp uEnv.txt /<ruta-a-memoria-SD>/BOOT
$ cp uImage /<ruta-a-memoria-SD>/BOOT
$ cp zedboard-zynq7.dtb /<ruta-a-memoria-SD>/BOOT

Los archivos para la partición de rootfs estan en un comprimido, no es necesario que el archivo comprimido sea copiado a la memoria, por lo que se puede extraer directamente

$ sudo tar -C /<ruta-a-memoria-SD>/rootfs/ -xzpf gnuradio-dev-image-zedboard-zynq7.tar.gz
$ sudo tar -C /<ruta-a-memoria-SD>/rootfs/ -xzpf modules-zedboard-zynq7.tgz

Cabe mencionar que puede ser posible que el sistema no arranque debido a problemas con el archivo boot.bin, para solucionar el problema sólo hay que sustituirlo por uno que funcione correctamente o en su defecto crear uno utilizando las herramientas de ISE y SDK.

Con respecto a los archivos utilizados en rootfs, no existe ningún problema si son sustituidos utilizando archivos de BOOT de otra versión, ya que los archivos de rootfs representan el sistema operativo y los archivos de BOOT la plataforma de hardware.

SDK.

Adicionalmente, el proyecto permite obtener el SDK del sistema embebido.

$ export MACHINE="zedboard-zynq7"
$ bitbake -c populate_sdk gnuradio-dev-image

$ ls tmp-glibc/deploy/sdk/
$ sudo sh tmp-glibc/deploy/sdk/oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.sh
$ . /usr/local/oecore-x86_64/environment-setup-armv7ahf-vfp-neon-oe-linux-gnueabi

Comunicación con tarjeta Zedboard a través de puerto serial.

El puerto UART de la tarjeta Zedboard es un puerto USB que se comunica de modo serial con la computadora, al momento de encender la tarjeta y estando conectada con la computadora por el puerto USB, se teclea el siguiente comando para buscar el puerto serial.

$ dmesg | grep tty

Existen diversas maneras de llamar al puerto serial, entre ellas:

/dev/ttyS0 (puerto serial)
/dev/ttyUSB0 (serial sobre USB)
/dev/ttyACM0 (serial sobre USB)

Una vez indentificado, se procede a comunicar con la tarjeta, en linux se puede utilizar el paquete screen para realizar la comunicación serial.

$ sudo apt-get install screen

Ya instalado el paquete, se procede a realizar el enlace a través del puerto serial.

$ screen /dev/ttyACM0 115200

Finalmente, se procede a encender la tarjeta Zedboard, en caso de que no arranque, desde el puerto serial se ejecuta:

> env default -a
> env save
> reset

Para entrar a esta consola se tiene que evitar el autoboot de la tarjeta.

Acceso SSH con X11Forwarding.

Para habilitar la conexión SSH con X11Forwarding, desde el puerto serial hay que modificar el archivo:

# vi /etc/ssh/sshd_config

Descomentar X11Forwarding no y poner X11Forwarding yes. En caso de no conocer como funciona el editor vi se puede buscar los comandos básicos en Internet.

Reiniciar el servicio con el comando

# /etc/init.d/sshd restart

De este modo, queda habilitado X11Forwarding en los enlaces SSH, sin embargo es necesario indicar -X en la configuración de la conexión.

Fijar contraseña al usuario root.

La contraseña de root se fija desde la terminal con el siguiente comando

# passwd

Apagado remoto de la tarjeta Zedboard.

Para apagar remotamente la tarjeta Zedboard sin dañar el sistema embebido es necesario teclear en la terminal de enlace remoto el comando.

# shutdown -h now

Conclusión.

El desarrollo de un sistema embebido a través de compilación cruzada puede resultar bastante complejo, pero la ventaja principal es que solo se requiere realizar una vez y los archivos generados pueden ser distribuidos libremente para la tarjeta para la cual fue diseñada. Así también, debido a que el proyecto de GNU Radio se basa en yocto y openembedded, es viable agregar otros proyectos a través de bblayers.

@viktor_ivan