Embox RTOS auf Raspberry Pi

BildHallo!

Wir werden oft gefragt, ob Embox Raspberry Pi unterstützt. Ja, gibt es. Beschreibung, wie man jetzt hier läuft . In diesem Artikel möchte ich etwas mehr darüber sprechen.

Wir hatten das Raspberry Pi Model B Rev. 2.0 Board schon lange gekauft (dies ist das erste Rpi 1) und sogar die ersten Schritte bei der Portierung unternommen: UART, Interrupt-Controller, Timer und sogar Framebuffer wurden in irgendeiner Form implementiert. Aber die Daten darüber, wie man es startet, gingen verloren, so dass ich mich daran erinnern / es wieder verstehen musste.

Erstens starteten sie auf dem QEMU-Emulator. Normale QEMU unterstützt Raspi2-Maschinen, jedoch keine Raspi. Bei einem Portierungsprozess wurde jedoch nur die Raspi-Unterstützung hinzugefügt. Wir haben die Version immer noch in unserem Repository, obwohl wir Commits entwerfen mussten, um sie für die moderne Umgebung zu kompilieren, aber am Ende haben wir eine Version des QEMU-Emulators, der rpi1-Unterstützung bietet - die "-M raspi" -Maschine (Sie können sehen, wie sie in unserem Wiki ausgeführt wird) Infolgedessen wurde Embox dort gestartet und zeichnete einen Farbverlauf im Videospeicher.

Es gab eine Frage zum Anfangen mit Eisen. Das Booten war zunächst nicht klar, daher haben wir uns entschlossen, das Standard-Raspbian zu testen. 2020-02-13-raspbian-buster-lite.img wird von der offiziellen Website heruntergeladen. Alle Downloads erfolgen von einer microSD-Karte, daher bereiten wir sie vor - kopieren Sie das resultierende Bild
dd bs=4M if=2020-02-13-raspbian-buster-lite.img of=/dev/sdb conv=fsync
Dabei ist "/ dev / sdb" die SD-Karte.

Wenn Sie sich jetzt lsblk ansehen, wird es so etwas geben:


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

Lassen Sie uns sdb1 mounten und sehen, was dort liegt:


$ 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

Wie Sie sehen können, gibt es für alle Gelegenheiten eine ganze Reihe von * .dtb - für verschiedene Versionen von Raspberry. Wir sehen auch den Bootloader - bootcode.bin und kernel.img ist Linux.

Wir haben den Monitor über HDMI an die Platine angeschlossen, hochgefahren, Raspbian gesehen, alles ist in Ordnung. Als nächstes müssen wir unsere Binärdatei mit Embox in kernel.img kopieren, damit der Bootloader sie lädt.
Embox erstellen:


make confload-arm/rpi1-model-b
make

Kopieren Sie die resultierende Binärdatei:


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

Wir legen die SD-Karte wieder in das RPI ein und schalten den Strom ein - auf dem Monitor erschien das Quadrat, das von der Embox gezeichnet werden sollte, nicht. Versuchen wir, eine Verbindung über die serielle Schnittstelle herzustellen und unsere Binärdatei zu debuggen. Verwenden Sie dazu den RDC1-USB-UART-Adapter. Wir verbinden es wie folgt mit der Platine:


RDC1      Rapi

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

Hier können Sie die Pinbelegung auf dem Bild sehen, damit sie vergeben wird. Nun stellt sich heraus, dass der USB-Adapter über den USB-Hub des PCs mit Strom versorgt wird und der Rpi wiederum über den USB-Adapter mit Strom versorgt wird.



Anschalten. Verbindung über Minicom herstellen:


sudo minicom -d /dev/ttyUSB0

Es ist keine Schlussfolgerung sichtbar. Es muss ein Problem mit dem Treiber für die serielle Schnittstelle vorliegen. Wir versuchen, die Registerinitialisierung zu deaktivieren und verwenden die vom Bootloader konfigurierten Elemente. Füllen Sie ein neues Image auf der SD-Karte aus - die Ausgabe wurde angezeigt. Alles ist klar, es bedeutet, dass es richtig angeschlossen wurde, aber der Treiber für die serielle Schnittstelle ist nicht richtig programmierbar. Ich werde nicht darüber sprechen, wie wir den seriellen PL011-Port-Treiber repariert haben, aber ich werde einige Punkte erwähnen, die bei der Entwicklung für diese Plattform nützlich sein können. Erstens werden die Basisadressen auf Rpi irgendwie verwirrend berechnet. Sie können nicht sofort in der Dokumentation gefunden werden. Eine gute Möglichkeit, die Basisadresse der Register zu überprüfen, besteht darin, sie unter Linux anzusehen:


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

Wir sehen, dass die Adresse 0x20201000 ist.

Der zweite Punkt ist, dass Linux für Rpi modifiziert ist, das zusammengestellt und in kernel.img kopiert werden kann - www.raspberrypi.org/documentation/linux/kernel/building.md

Im Fall der seriellen Schnittstelle hat es wirklich geholfen, die Eingangsfrequenz zu verstehen UARTCLK, erforderlich für die Programmierung der Baudrate - fügen Sie einfach printk () an der richtigen Stelle in drivers / tty / serial / amba-pl011.c ein.

Infolgedessen konnten wir ohne wesentliche Änderungen das gleiche Image wie für QEMU auf Eisen erstellen.

Das ist wahrscheinlich alles, da es keinen Sinn macht, die Treiberquellen zu zerlegen, da Sie sie einfach in unserem Repository studieren können. Im Allgemeinen scheint es unter Raspberry nur sehr wenige Ports anderer Nicht-Linux-Betriebssysteme zu geben. Zum Beispiel habe ich weder FreeRTOS gefunden (es stellte sich heraus, dass sich eine Art Repository auf GitHub befindet, aber nicht in offiziellen Releases), noch für NuttX oder ähnliches. Ja, und Diskussionen in den Foren deuten darauf hin, dass RTOS dort angeblich nicht benötigt wird, und nehmen Sie es besser, Arduino zu spielen - www.raspberrypi.org/forums/viewtopic.php?t=201540 Das Osdev-

Beispiel erwies sich als nicht funktionsfähig. Wenn also jemand etwas möchte - dann mach es auf blankem Metall, dann sieh dir bessere Beispiele von uns an :)

Die volle Unterstützung für das neue Rpi 2/3/4 ist noch in unseren Plänen. Eine gewisse Unterstützung wird jedoch höchstwahrscheinlich im Rahmen von GSoC 2020 geleistet, einer der beliebtesten Ideen unter Studenten. Für GSoC haben wir die Rpi1-Unterstützung in Embox wiederhergestellt. Wenn jemand darüber nachdenkt, warum er Rpi RTOS benötigt, schreiben Sie in die Kommentare, wir werden uns freuen :)

Wenn Sie die Quellen von RaPi oder nur Embox studieren, beantworten wir gerne die Fragen:
Newsletter: embox-ru@googlegroups.com
Telegramm-Chat: t.me/embox_chat

All Articles