Embox RTOS en Raspberry Pi

imagen¡Hola!

A menudo se nos pregunta si Embox es compatible con Raspberry Pi. Sí hay. Descripción de cómo ejecutar ahora aquí . En este artículo quiero hablar un poco más sobre esto.

Habíamos comprado la placa Raspberry Pi Model B rev 2.0 durante mucho tiempo (este es el primer Rpi 1) e incluso dimos los primeros pasos en la transferencia: el UART, el controlador de interrupción, el temporizador e incluso el framebuffer se implementaron de alguna forma. Pero los datos sobre cómo comenzar se perdieron, así que tuve que recordarlo / entenderlo nuevamente.

En primer lugar, se lanzaron en el emulador QEMU. QEMU regular tiene soporte de máquina raspi2, pero no raspi. Pero cuando hubo un proceso de portabilidad, solo se agregó soporte raspi. Todavía tenemos la versión en nuestro repositorio, aunque tuvimos que redactar confirmaciones para compilarla en el entorno moderno, pero al final obtuvimos una versión del emulador QEMU que tiene soporte para rpi1: la máquina "-M raspi" (puedes ver cómo ejecutarla en nuestra wiki)) Como resultado, Embox se lanzó allí y dibujó un gradiente en la memoria de video.

Había una pregunta sobre comenzar con hierro. Al principio no estaba claro cómo arrancar, así que decidimos probar el Raspbian estándar. 2020-02-13-raspbian-buster-lite.img se descarga del sitio oficial . Todas las descargas se realizan desde una tarjeta microSD, así que la preparamos: copie la imagen resultante
dd bs=4M if=2020-02-13-raspbian-buster-lite.img of=/dev/sdb conv=fsync
donde "/ dev / sdb" es la tarjeta SD.

Si nos fijamos en lsblk ahora, habrá algo como esto:


sdb      8:16   1  14,6G  0 disk 
├─sdb1   8:17   1   256M  0 part 
└─sdb2   8:18   1  14,3G  0 part

Montemos sdb1 y veamos qué hay ahí:


$ sudo mount /dev/sdb1 /mnt
$ ls /mnt/
bcm2708-rpi-b.dtb       bcm2710-rpi-3-b.dtb       COPYING.linux  fixup_db.dat      start_db.elf
bcm2708-rpi-b-plus.dtb  bcm2710-rpi-3-b-plus.dtb  fixup4cd.dat   fixup_x.dat       start.elf
bcm2708-rpi-cm.dtb      bcm2710-rpi-cm3.dtb       fixup4.dat     issue.txt         start_x.elf
bcm2708-rpi-zero.dtb    bcm2711-rpi-4-b.dtb       fixup4db.dat   kernel.img
bcm2708-rpi-zero-w.dtb  bootcode.bin              fixup4x.dat    LICENCE.broadcom
bcm2709-rpi-2-b.dtb     cmdline.txt               fixup_cd.dat   overlays
bcm2710-rpi-2-b.dtb     config.txt                fixup.dat      start_cd.elf

Como puede ver, hay un conjunto completo de * .dtb para todas las ocasiones, para diferentes versiones de Raspberry. También vemos el gestor de arranque: bootcode.bin, y kernel.img es Linux.

Conectamos el monitor a través de HDMI a la placa, arrancamos, vimos a Raspbian, todo está bien. Luego, necesitamos copiar nuestro binario con Embox a kernel.img para que el gestor de arranque lo cargue.
Construir Embox:


make confload-arm/rpi1-model-b
make

Copie el binario resultante:


cp build/base/bin/embox.bin /mnt/kernel.img

Volvemos a insertar la tarjeta SD en el Rpi y activamos la alimentación: en el monitor, el recuadro que debería haber sido dibujado por el Embox no apareció. Bueno, intentemos conectarnos a través del puerto serie y depurar nuestro binario. Para hacer esto, use el adaptador RDC1-USB-UART. Lo conectamos a la placa de la siguiente manera:


RDC1      Rapi

GND <---> GND
5V  <---> 5V
RX  <---> TXD0/GPIO14
TX  <---> RXD0/GPIO15

Aquí puedes ver el pinout en la imagen para que sea perdonado. Ahora resulta que la alimentación del adaptador USB proviene del concentrador USB de la PC, y la alimentación del Rpi, a su vez, se suministra desde el adaptador USB.



Encender. Conéctese a través de minicom:


sudo minicom -d /dev/ttyUSB0

Ninguna conclusión es visible. Debe haber algún tipo de problema con el controlador del puerto serie. Intentamos deshabilitar la inicialización del registro, y utilizamos lo que fue configurado por el gestor de arranque, rellenamos una nueva imagen en la tarjeta SD: apareció la salida. Todo está claro, significa que se conectó correctamente, pero el controlador del puerto serie no es programable correctamente. No hablaré sobre cómo reparamos el controlador del puerto serie PL011, pero señalaré un par de puntos que pueden ser útiles al desarrollar para esta plataforma. En primer lugar, las direcciones base en Rpi se calculan de alguna manera confusas, no se pueden encontrar inmediatamente en la documentación, por lo que una buena manera de verificar la dirección base de los registros es mirarlos en Linux:


pi@raspberrypi:~$ ls /sys/bus/amba/devices/20201000.serial

Vemos que la dirección es 0x20201000.

El segundo punto es que hay Linux modificado para Rpi, que se puede ensamblar y copiar en kernel.img - www.raspberrypi.org/documentation/linux/kernel/building.md

En el caso del puerto serie, realmente ayudó a comprender la frecuencia de entrada UARTCLK, necesario para programar la velocidad en baudios: simplemente inserte printk () en el lugar correcto en drivers / tty / serial / amba-pl011.c.

Como resultado, sin cambios significativos, logramos lanzar la misma imagen que para QEMU en hierro.

Probablemente eso sea todo, ya que no tiene sentido desarmar las fuentes del controlador, ya que puede estudiarlas en nuestro repositorio. En general, parece que bajo Raspberry hay muy pocos puertos de otros sistemas operativos que no sean Linux. Por ejemplo, no encontré FreeRTOS (resultó que algún tipo de repositorio está en GitHub, pero no en lanzamientos oficiales), ni para NuttX, ni nada de eso. Sí, y las discusiones en los foros sugieren que supuestamente no se necesita RTOS allí y que es mejor jugar a Arduino - www.raspberrypi.org/forums/viewtopic.php?t=201540 El

ejemplo de Osdev resultó inoperativo, así que si alguien quiere algo- luego hacerlo en metal desnudo, luego ver mejores ejemplos de nosotros :)

El soporte completo para el nuevo Rpi 2/3/4 todavía está en nuestros planes. Pero lo más probable es que se brinde apoyo como parte de GSoC 2020, una de las ideas más populares entre los estudiantes. En realidad, para GSoC, restauramos el soporte de Rpi1 en Embox. Si alguien piensa por qué necesita Rpi RTOS, escriba en los comentarios, estaremos encantados :)

Además, si estudia las fuentes de RaPi o simplemente Embox, estaremos encantados de responder las preguntas:
Boletín: embox-ru@googlegroups.com
Telegram chat: t.me/embox_chat

All Articles