Raspberry Pi® a fondo para desarrolladores. Derek Molloy

Читать онлайн.
Название Raspberry Pi® a fondo para desarrolladores
Автор произведения Derek Molloy
Жанр Математика
Серия
Издательство Математика
Год выпуска 0
isbn 9788426727800



Скачать книгу

por todo el mundo que los errores son extremadamente infrecuentes y además se detectan y corrigen rápidamente.

      Una desventaja de Linux empotrado es su falta de idoneidad para las aplicaciones en tiempo real debido a la sobrecarga, fundamentalmente de tiempo en este caso, del propio SO. Así pues, para aplicaciones de gran precisión y mínima latencia, como el procesamiento de señales analógicas, Linux empotrado podría no ser la solución perfecta. Sin embargo, incluso en aplicaciones de tiempo real, se emplea a menudo como cerebro e interfaz de control dentro de un conjunto interconectado de sensores (véase el capítulo 12). Además, el desarrollo de las capacidades de Linux RTOS (Real Time Operating Systems, sistemas operativos de tiempo real) continúa avanzando y progresa en su objetivo de agilizar las interrupciones del SO para su uso en tiempo real.

      Linux se publica bajo licencia GNU GPL (General Public License, licencia pública general), que garantiza a los usuarios el derecho de uso y modificación del código fuente sin límites. Así pues, la palabra free hace aquí más referencia al concepto de "libre" que al de "gratuito" (ambos son significados del término en inglés). De hecho, algunas de las distribuciones de Linux más caras son precisamente las destinadas a las arquitecturas empotradas. Podrá encontrar una guía rápida para familiarizarse con la licencia GPLv3 en la web www.gnu.org, que relaciona nuestros derechos como usuarios (Smith, 2013):

      Derecho a utilizar el software para cualquier propósito.

      Derecho a modificar el software para que se ajuste a sus necesidades.

      Derecho a compartir el software con amigos y vecinos.

      Y derecho a compartir todos aquellos cambios que introduzca en él.

      Aun si estamos utilizando una distribución descargada de forma gratuita, puede que nos cueste un esfuerzo significativo modificar las librerías y los controladores de dispositivo para adaptar los componentes y módulos particulares que deseemos utilizar en el desarrollo de los productos.

      Lo primero que deberíamos ver cuando arrancamos un ordenador es la UEFI (Unified Extensible Firmware Interface, interfaz de firmware ampliable unificada), que brinda compatibilidad con las rutinas de servicio de la antigua BIOS (Basic Input/Output System, sitema básico de entrada/salida). La pantalla de inicio muestra información del sistema y nos invita a pulsar una tecla para modificar estos ajustes. La UEFI comprueba los componentes del hardware, como la memoria, y, luego, carga el SO, generalmente desde una unidad de disco duro SSD (Solid State Disk, disco de estado sólido). Así pues, cuando encendemos un ordenador, la UEFI, o la BIOS, ejecutan las tareas siguientes:

      1. Toma el control del procesador del equipo.

      2. Inicializa y comprueba los componentes hardware.

      3. Carga el SO desde la unidad SSD o disco duro convencional.

      La UEFI/BIOS ofrece una capa de abstracción que permite al SO interaccionar con la pantalla y otros periféricos de entrada/salida del sistema, como ratón, teclado y almacenamiento externo. Sus ajustes se guardan en una memoria flash NAND alimentada por una pila de botón (que se puede ver en las placas madre de los ordenadores) que alimenta también el reloj del sistema.

      Como la mayoría de los dispositivos Linux empotrados, el RPi carece de BIOS y de batería de alimentación, al menos de forma predeterminada (veremos cómo se añade un reloj en tiempo real al RPi en el capítulo 9). En lugar de eso, utiliza una combinación de gestores de arranque (bootloaders). Generalmente, los gestores de arranque son pequeños programas que realizan la función crítica de vincular el hardware concreto de cada placa con Linux:

      ❏Inicializan los controladores (memoria, gráficos, E/S).

      ❏Preparan y asignan la memoria del sistema para el SO.

      ❏Localizan el SO y preparan su carga.

      ❏Cargan el SO y le pasan el control.

      El gestor de arranque de Linux empotrado es un programa personalizado para cada tipo de placa, incluido el RPi. Existen gestores de arranque de código abierto para Linux, tales como Das U-Boot (el cargador universal de referencia), que se puede personalizar, siempre que se cuente con un conocimiento detallado del hardware de la plataforma de Linux empotrado, mediante parches de software específicos de cada plataforma (diríjase a tiny.cc/erpi301). El RPi utiliza un enfoque distinto: utiliza unos gestores de arranque muy eficientes pero de código cerrado, desarrollados específicamente para el RPi por Broadcom. Tanto el gestor de arranque como los archivos de configuración se encuentran en el directorio /boot de la imagen en el RPi:

      pi@erpi /boot $ ls -l *.bin start.elf *.txt *.img fixup.dat

      -rwxr-xr-x 1 root root 17900 Jun 16 01:57 bootcode.bin

      -rwxr-xr-x 1 root root 120 May 6 23:23 cmdline.txt

      -rwxr-xr-x 1 root root 1581 May 30 14:49 config.txt

      -rwxr-xr-x 1 root root 6174 Jun 16 01:57 fixup.dat

      -rwxr-xr-x 1 root root 137 May 7 00:31 issue.txt

      -rwxr-xr-x 1 root root 3943888 Jun 16 01:57 kernel7.img

      -rwxr-xr-x 1 root root 3987132 Jun 16 01:57 kernel.img

      -rwxr-xr-x 1 root root 2684312 Jun 16 01:57 start.elf

      La figura 3-1 ilustra el proceso de arranque en el RPi, donde cada etapa del mismo se carga e invoca por la precedente. Los archivos bootcode.bin y tart.elf son gestores de arranque de código cerrado que están en código binario y se ejecutan en la GPU del RPi, y no en la propia CPU. El archivo de licencia que podemos encontrar en github.com/raspberrypi/firmware/tree/master/boot indica que se autoriza la redistribución "en código binario, sin modificaciones" y que "solo se puede utilizar con propósitos de desarrollo y ejecución en un dispositivo Raspberry Pi". Podemos encontrar una imagen comprimida del núcleo en /boot/kernel.img. Por descontado, es código abierto.

      La salida que sigue es una secuencia de arranque típica, capturada con el cable serie USB a TTL de 3,3 V que vimos en el capítulo 1. El cable estaba fijo a los pines 6 (GND), 8 (UART_TXD) y 10 (UART_RXD) de la cabecera del RPi, y los datos se capturaron a 115.200 baudios. A diferencia de los gestores U-boot, que se ejecutan en la CPU, los gestores tempranos del RPi no ofrecen salida por consola, aunque sí hacen parpadear los LED de la placa con patrones específicos si surgen problemas. Lo que sigue es un extracto de la salida por consola durante el arranque del RPi 3. Muestra una importante información del sistema, como el mapeo de la memoria:

      Figura 3-1: La secuencia de arranque completa en el RPi.

      Uncompressing Linux... done, booting the kernel.

      [ 0.000000] Booting Linux on physical CPU 0x0

      ...

      [ 0.000000] Linux version 4.1.18-v7+ (dc4@dc4-XPS13-9333) (gcc version

      4.9.3 (crosstool-NG crosstool-ng-1.22.0-88-g8460611) ) #846 SMP Thu Feb

      25 14:22:53 GMT 2016

      [ 0.000000] CPU: ARMv7 Processor [410fd034] revision 4 (ARMv7) ...

      [ 0.000000] Machine model: Raspberry Pi 3 Model B Rev 1.2

      [ 0.000000] cma: Reserved 8 MiB at 0x36400000 ...

      [ 0.000000] Kernel command line: 8250.nr_uarts=1 dma.dmachans=0x7f35

      bcm2708_fb.fbwidth=656 bcm2708_fb.fbheight=416 bcm2709.boardrev=0xa02082

      bcm2709.serial=0xbbffd b2c smsc95xx.macaddr=B8:27:EB:FF:DB:2C

      bcm2708_fb.fbswap=1 bcm2709.uart_clock=48000000