Erstellen einer Bare-Metal-Anwendung auf Intel Cyclone V für absolute Anfänger

Das Einrichten von Linux auf dem Entwicklungsboard wie SocKit mit einem Doppelkern-ARM Cortex A9 ist kein Hexenwerk. Ein Hersteller der Karte unterstützt das gebrauchsfertige Image, das für die Installation auf einer SD-Karte oder einem anderen Medium geeignet ist. Aber was ist, wenn Sie sich danach sehnen, Bare Metal zu berühren und sich einer halsbrecherischen Geschwindigkeit von Code nähern, die nicht durch einen Betriebssystemkern eingeschränkt wird? Nun, es ist möglich, aber nicht so einfach und offensichtlich. In diesem kurzen Aufsatz werde ich Ihnen Schritt für Schritt erklären, wie Sie Ihre erste Bare-Metal-Anwendung auf Cyclone V SoC erstellen und ausführen, die den ARM Cortex A9-Kern des HPS-Subsystems des SoC verwendet.

Sie benötigen das Entwicklungsboard mit Intel (Altera) Cyclone V SoC. Ich habe SoCKit Board verwendet:



Ich habe alle in diesem Artikel beschriebenen Dinge in Debian Jessie getan. Sie können ein anderes Linux-System oder Windows mit entsprechenden Änderungen verwenden.

Und Sie benötigen DS-5 IDE. Und mit der kostenlosen Edition können Sie leider keinen Bare-Metal-Code kompilieren. Sie benötigen die Vollversion.

1. Vorbereitung

Obwohl Sie über die Vollversion von DS-5 verfügen, müssen Sie die kostenlose DS-5 Altera Edition installieren. Beide Versionen müssen im Sudo- Modus in verschiedenen Verzeichnissen installiert werden, z. B.: / Home / user / intelFPGA für DS-5 Altera Edition und / home / user / DS-5 für die Vollversion von DS-5. Sie sollten die Pfade während des Installationsvorgangs manuell eingeben.

2. IDE läuft

2.1. Führen Sie zunächst das Skript /home/user/intelFPGA/16.1/embedded/embedded_command_shell.sh aus , ändern Sie dann ein Verzeichnis in / home / user / DS-5 / bin und führen Sie IDE aus:

$ ./eclipse & 


Das Skript legt Umgebungsvariablen fest. Um die Variablen beim Systemstart festzulegen, sollten Sie der Datei /home/user/.profile die folgende Zeile hinzufügen :

 QUARTUS_ROOTDIR=/home/user/intelFPGA/16.1/qprogrammer export PATH=$PATH:/usr/local/gcc-arm-none-eabi-5_4-2016q3/bin/:/home/user/intelFPGA/16.1/embedded/host_tools/mentor/gnu/arm/baremetal/bin/ 


Fügen Sie bei Bedarf eine ähnliche Zeile für otterpflichtige Variablen hinzu, z. B. QSYS_ROOTDIR.

Außerdem müssen Sie Quartus Prime installieren und ausführen. Angenommen , das Installationsverzeichnis von Quartus lautet /home/user/intelFPGA/16.1/quartus/ .

Führen Sie Quartus Prime unter /home/user/intelFPGA/16.1/quartus/bin/quartus und das JTAG-Programmierprogramm unter /home/user/intelFPGA/16.1/qprogrammer/bin/quartus_pgmw aus .

3. SoCkit anschließen

3.1. Schließen Sie die SoCkit-Karte an einen Computer an. Schließen Sie Micro-USB-Kabel an die Anschlüsse der Karte mit den Namen "USB Blaster (JTAG)" und "USB to UART" an.

3.2. Schalten Sie die Karte ein und geben Sie ein:

 $ ls /dev/bus/usb/001 001 002 003 


Die letzte Nummer (003) ist eine JTAG-Schnittstelle. Legen Sie die Berechtigungen zum Schreiben fest:

  $ sudo chmod 666 /dev/bus/usb/001/003 


Sie müssen es jedes Mal tun, wenn Sie das Board einschalten.

3.3. Einstellungen des TTY-Terminals

Sie können diesen Befehl verwenden:
 screen /dev/ttyUSB0 115200 


4. Aufbau des Preloaders (u-boot-spl)

4.1. Laden Sie die Datei sockit_ghrd_16.0.tar.gz herunter und entpacken Sie sie. Entpacken Sie es beispielsweise in / home / user / ghrd-16 / sockit_ghrd .

4.2. Führen Sie Quartus Prime aus und öffnen Sie die Datei /home/user/ghrd-16/sockit_ghrd/soc_system.qpf.

4.3. Führen Sie Qsys (Tools / Qsys) aus. Öffnen Sie die Datei /home/user/ghrd-16/sockit_ghrd/soc_system.qsys. Generieren / generieren Sie HDL und beenden Sie Qsys.

4.4. Führen Sie Assembler in Quartus Prime aus.

4.5. Führen Sie den bsp-editor aus: /home/user/intelFPGA/16.1/embedded/host_tools/altera/preloadergen/bsp-editor . Erstellen Sie ein neues Projekt: Datei / Neues HPS BSP. In das Feld " Preloader-Einstellungsverzeichnis " schreiben Sie " / home / user / ghrd-16 / sockit_ghrd / hps_isw_handoff / soc_system_hps_0 ".

4.6. Richten Sie den Preloader ein. Gehen Sie zur Registerkarte Erweitert. Schalten Sie Watchdog_enable aus . Wenn Sie Debug-Meldungen über JTAG anzeigen möchten, können Sie Semihosting aktivieren . Danach drücken Sie Generieren und beenden.

4.7. Es ist möglich, die Startmeldung zu ändern. Ändern Sie beispielsweise in der Datei software / spl_bsp / uboot-socfpga / board / altera / socfpga / socfpga_cyclone5.c die Zeichenfolge " BOARD: Altera SOCFPGA Cyclone V Board " auf einer anderen:
 /* * Print Board information */ int checkboard(void) { #ifdef CONFIG_SOCFPGA_VIRTUAL_TARGET puts("BOARD : Altera VTDEV5XS1 Virtual Board\n"); #else //puts("BOARD : Altera SOCFPGA Cyclone V Board\n"); puts("ARM preloader build by 32-bit.me\n"); #endif return 0; } 


4.8. Die Umgebungsvariable SOCEDS_DEST_ROOT muss auf /home/user/intelFPGA/16.1/embedded gesetzt sein :
 export SOCEDS_DEST_ROOT=/home/user/intelFPGA/16.1/embedded 

Gehen Sie nun zum Verzeichnis
 /home/user/ghrd-16/sockit_ghrd/software/spl_bsp 
und machen . Make kann mit dem Fehler "make: mkpimage: Befehl nicht gefunden" fehlschlagen, sollte jedoch die Datei u-boot-spl im Pfad / home / user / ghrd-16 / sockit_ghrd / software / spl_bsp / uboot-socfpga / spl erstellen / u-boot-spl .

4.9. Testen des Preloaders

4.9.1. Sie benötigen kein FPGA-Image (mit der Erweiterung ".sof"), um den Preloader auszuführen. Führen Sie DS-5 aus und öffnen Sie "Run / Debug-Konfigurationen".

4.9.2. Im Feld Verbindung sollte die Option CV SoCKit 1-1 eingestellt sein . Wenn dies nicht der Fall ist, klicken Sie auf "Durchsuchen" und stellen Sie diese Option ein. Wenn ein Fehler auftritt, führen Sie 3.1-3.2 aus.

4.9.3. Legen Sie die Datei u-boot-spl auf der Registerkarte "Dateien" im Feld "Anwendung auf Host zum Herunterladen" fest: / home / user / ghrd-16 / sockit_ghrd / software / spl_bsp / uboot-socfpga / spl / u-boot-spl . Setzen Sie das Flag "Symbole laden". Lassen Sie das Feld "Dateien" leer.

4.9.4. Schalten Sie ein Debugging-Skript aus, das auf der Registerkarte Debugging gestartet wird.

4.9.5. Führen Sie das Terminal-Dienstprogramm (z. B. Bildschirm ) aus und klicken Sie auf die Schaltfläche "Debuggen". Der Preloader wird in den Speicher geladen und ein Debugger kann gestartet werden. Drücken Sie die "Weiter" -Taste (oder F8) und sehen Sie die Meldung:

 U-Boot SPL 2013.01.01 (Jun 24 2017 - 19:49:33) ARM preloader build by 32-bit.me CLOCK: EOSC1 clock 25000 KHz CLOCK: EOSC2 clock 25000 KHz CLOCK: F2S_SDR_REF clock 0 KHz CLOCK: F2S_PER_REF clock 0 KHz CLOCK: MPU clock 925 MHz CLOCK: DDR clock 400 MHz CLOCK: UART clock 100000 KHz CLOCK: MMC clock 50000 KHz CLOCK: QSPI clock 370000 KHz RESET: COLD SDRAM: Initializing MMR registers SDRAM: Calibrating PHY SEQ.C: Preparing to start memory calibration SEQ.C: CALIBRATION PASSED SDRAM: 1024 MiB ALTERA DWMMC: 0 Card did not respond to voltage select! spl: mmc init failed: err - -17 ### ERROR ### Please RESET the board ### 


Dies bedeutet, dass der Preloader erfolgreich gestartet wurde.

4.9.6. Drücken Sie nach dem Debuggen der Sitzung die Tasten "Vom Ziel trennen" und "Verbindung entfernen".

5. Schreiben Sie eine Hello World für den Bare-Metal-Modus.

5.1. Laden Sie das Projekt ArrowSocKit_BareMetal_GNU.zip herunter. Stellen Sie Umgebungsvariablen wie in 2.1 ein. Führen Sie DS-5 aus, importieren Sie das Projekt aus dem Archiv ( Datei / Importieren / Vorhandenes Projekt in den Arbeitsbereich , Archivdatei auswählen ). Das entpackte Projekt wird im Verzeichnis / home / user / DS-5-Workspace / BareMetalBoot-GNU angezeigt.

5.2. Sie können versuchen, das Projekt mit make zu erstellen, es kann jedoch noch nicht erstellt werden. Gehen Sie wie folgt vor, um das Projekt zu erstellen.

5.3. Kopieren Sie das Verzeichnis /home/user/intelFPGA/16.1/embedded/ip/altera/hps/altera_hps/hwlib nach / home / user / DS-5-Workspace / . Hier sind die Ordner src und include , und in jedem von ihnen befinden sich die Verzeichnisse soc_cv_av und soc_a10 . Sie können Verzeichnisse mit dem Namen soc_a10 entfernen. Kopieren Sie dann die Dateien libcs3.a, libcs3arm.a, libcs3unhosted.a aus /home/user/intelFPGA/16.1/embedded/host_tools/mentor/gnu/arm/baremetal/arm-altera-eabi/lib. in das Projektverzeichnis (/ home / user / DS-5-Workspace / BareMetalBoot-GNU). Kopieren Sie die Datei arm-names.inc von /home/user/intelFPGA/16.1/embedded/host_tools/mentor/gnu/arm/baremetal/arm-altera-eabi/lib/cortex-a9/ nach / home / user / DS- 5-Arbeitsbereich / BareMetalBoot-GNU / .

5.4. Ändern Sie im Makefile "CROSS_COMPILE: = arm-none-eabi-" in "CROSS_COMPILE: = arm-altera-eabi-". Ändern Sie auch den Pfad in hlib : HWLIBS_ROOT: = / home / user / DS-5-Workspace / hwlib

5.5. Führen Sie nun make . und lesen Sie alle Fehlermeldungen. Wenn make kein Symbol finden kann, sollten Sie es in den Verzeichnissen hwlib / src / soc_cv_av und hwlib / include / soc_cv_av finden und eine Kopie in hwlib / src und hwlib / include entsprechend erstellen. Nachdem Sie alle Fules gefunden haben, schlägt make mit dem Fehler "mkimage: not found" fehl, aber es ist nicht wichtig, da wir nur die Datei test.axf benötigen.

5.6. Ausführen einer Anwendung

5.6.1. Um eine Anwendung auszuführen, muss ein FPGA-Image (.sof-Datei) geladen werden, das beim Erstellen des Preloaders generiert wurde. Führen Sie den Programmierer wie in 2.1 aus. Rechts neben "Hardware-Setup" muss sich der Text "CV SoCKit [1-1]" befinden. Ist dies nicht der Fall, sollten Sie die Schreibberechtigung für den JTAG-Port festlegen (siehe oben) und auf die Schaltfläche Hardware-Setup klicken.

5.6.2. Klicken Sie auf "Automatische Erkennung" und wählen Sie eine beliebige Option aus einer Liste aus. Sie sehen eine Konfiguration von zwei Geräten: eines ist das, was Sie ausgewählt haben (z. B. 5CSEBA6), und das zweite ist SOCVHPS. Entfernen Sie das erste Gerät: Wählen Sie es aus und drücken Sie Entf. Klicken Sie auf "Datei hinzufügen" und öffnen Sie die Bilddatei (/home/user/ghrd-16/sockit_ghrd/output_files/soc_system.sof). Rechts von SOCVHPS erschien ein neues Gerät. Bewegen Sie es mit einer Maus an die erste Stelle in der Kette. Drücken Sie danach Start und laden Sie das Bild hoch.

5.6.3. Öffnen Sie in DS-5 "Debug Configuration" auf der Registerkarte "Files". Stellen Sie die Datei u-boot-spl in der Zeile "Anwendung auf Host zum Herunterladen" ein. Entfernen Sie eine Markierung bei "Symbole laden". Stellen Sie die Datei "test.axf" in die Zeile "Dateien". Überprüfen Sie auf der Registerkarte Debugger das Kontrollkästchen "Debugger-Skript für die Zielinitialisierung ausführen" und legen Sie die Skriptdatei "debug-unhosted.ds" im Projektverzeichnis fest. Bearbeiten Sie in der Datei den Pfad zum Preloader:
# Load the SPL preloader into memory.
#
loadfile "/home/user/ghrd-16/sockit_ghrd/software/spl_bsp/uboot-socfpga/spl/u-boot-spl" 0x0


Führen Sie den TTY-Terminalbildschirm aus und drücken Sie Debug. Dann startet der Preloader, eine Anwendung wird hochgeladen und ein Debugger wird an einem Startpunkt des Programms gesetzt. Klicken Sie auf "Weiter". In einem Fenster eines Terminals sehen Sie die Ausgabe des Preloaders, wie oben gezeigt, dann die folgenden:

 Disabled interrupts because preloader enabled ECC interrupts. Global Timer value at startup = 0x000000005A10B609 CPU frequency is 925000000 hertz. DDR frequency is 400000000 hertz. MPU peripheral frequency is 231250000 hertz. MB ZERO remapped to SDRAM. L3 interconnect remapped as inaccessible and SDRAM. Interrupt controller system API initialized. MMU initialized and enabled. L1 and L2 cache system initialized and enabled. GIC interrupts enabled. PIT started. PIT interrupt registered and enabled. GPIOs initialized. UART0 initialized. L3 interconnect remapped as accessible and SDRAM. Bridges initialized. Boot completed. Boot milestones: New buffer !ESTONE : GT TICKCOUNT : INCREMENTAL : CUMULATIVE initial GT : 0x000000005A10B609 : 0.000us : 0.000us frequency capture : 0x000000005A119D58 : 256.065us : 256.065us initial remapping : 0x000000005A11C936 : 48.562us : 304.627us interrupt sys init : 0x000000005A139FED : 521.094us : 825.721us mmu init : 0x000000005A62D774 : 22449.985us : 23275.706us cache init : 0x000000005A65CF96 : 841.488us : 24117.194us interrupts enabled : 0x000000005A65D0D7 : 1.388us : 24118.582us pit start : 0x000000005A65DD2E : 13.661us : 24132.242us pit enabled : 0x000000005A65DF67 : 2.461us : 24134.703us gpio init : 0x000000005A65FC12 : 31.736us : 24166.439us uart0 init : 0x000000005A66084D : 13.539us : 24179.978us fpga config : 0x0000000000000000 : 79769704095969360.000us : 79769704095993552.000us last remapping : 0x000000005A660981 : 6558428.303us : 24181.310us bridge init : 0x000000005A6611B6 : 9.085us : 24190.396us complete : 0x000000005A661222 : 0.467us : 24190.863us Hello world, 32bit-me! 


Glückwunsch! Sie haben gerade Ihre erste Bare-Metal-Anwendung auf dem Cortex-A9-Kern ausgeführt.

Source: https://habr.com/ru/post/de463717/


All Articles