Verwenden Sie Raspberry Pi ohne ein Linux-Betriebssystem?


33

Ich bin daran interessiert, den Raspberry Pi als reine Embedded-CPU-Einheit für die Entwicklung von Embedded-Anwendungen einzusetzen. Da der Raspberry Pi eine leistungsstarke CPU mit viel Speicher hat, ist er ein ausgezeichnetes Embedded-Board.

Ist es möglich, den Raspberry Pi ohne ein Linux-Betriebssystem zu verwenden? Wie kann ich das machen?


2
Ich denke nicht, dass dies eine echte Frage ist und nicht gut zum Q & A-Format passt.
Alex Chamberlain

5
Warum nicht? Sie glauben nicht, dass andere Leute nach der Verwendung von RaPi fragen können als unter Linux? Wo in der Liste der Statuten dieser Gruppe gibt es einen Abschnitt, der besagt, dass man solche Fragen nicht stellen kann?
FarhadA

2
Das habe ich nicht gesagt. Ich denke, es wäre ziemlich cool, einige Projekte zu sehen, die kein Linux verwenden, aber Sie haben tatsächlich keine Frage mit einer endgültigen Antwort gestellt, sondern einen Diskussionspunkt gemacht.
Alex Chamberlain

@AlexChamberlain Ich stimme zu - Ich habe es in eine Frage bearbeitet. FarhadA - Ich hoffe, das ist in Ordnung, in seinem aktuellen Zustand wäre es geschlossen. Bitte überprüfe und verbessere meine Bearbeitung!
Alex L

Ok, stimmt, ich muss es eine Frage machen, da dies eine Q & A-Seite ist :)
FarhadA

Antworten:


23

Ich habe mich mit Bare-Metal-Programmierung auf dem Raspberry Pi befasst und es hört sich so an, als wollten Sie das tun. Es gibt mehrere gute Forenthemen zum Thema Bare-Metal-Programmierung mit einigen Leuten, die sich viel Mühe gegeben haben, um ihren Code zum Laufen zu bringen. Sehen Sie sich diese an, um zu beginnen:

Anleitung zum Einstieg in Bare Metal auf Raspi

Programmieren des RPi auf dem Bare Metal

Programmieren in Basic on Bare Metal Tutorial 1

Im Allgemeinen können Sie auch zum Bare-Metal-Forum von Raspberry Pi gehen und sich dort umschauen.

Nach meinem Verständnis müssen Sie aufgrund der im Broadcom-Chip integrierten Startreihenfolge von der SD-Karte booten. Ich versuche, den Link für die Startsequenz zu finden, aber mein Google Fu funktioniert nicht. Ich bearbeite ihn später, wenn ich ihn finde.


3
Darüber hinaus können Sie dieses Lernprogramm verwenden: cl.cam.ac.uk/freshers/raspberrypi/tutorials/os Es geht darum, ein Betriebssystem zu erstellen. Wenn Sie jedoch Ihre Vorstellung von einem Betriebssystem erweitern, kann es auf eingebettete Systeme angewendet werden.
Ohblahitsme

6

Die einzige Möglichkeit zum Booten ist eine mit Fat32 formatierte SD-Karte, die von Poweron auf GPU-Firmware geladen wird und eine beliebige arm-Binärdatei mit dem Namen kernel.img ausführt An diesem Punkt


3
Ja, aber das ist nicht das, was ich tun möchte. Ich möchte wissen, ob es möglich ist, den Boot-Code des Chips zu ändern ein SPI-Flash-Speicher und booten stattdessen von dort. Auf diese Weise kann der Startcode auf einem SPI-Flash-Speicher wie AT25FS040 oder AT25DF641 oder ähnlichen Einheiten gespeichert werden. Für eingebettete Anwendungen reichen diese aus, um den gesamten Code zu speichern, und sie können nach dem Start in den SDRAM geladen werden. Die große Herausforderung besteht jedoch darin, den Boot-ROM-Code zu ändern.
FarhadA

9
Das haben Sie in Ihrer Frage überhaupt nicht gefragt.
Alistair Buxton

Ich weiß, aber meine Kenntnisse über die RaPi-Startsequenz sind begrenzt. Ich hatte die richtige Frage in meiner ursprünglichen Frage, bevor sie abgelehnt und auf dieses aktuelle Format bearbeitet wurde.
FarhadA

2
@FarhadA - Ihr erster Kommentar hier scheint mir eine praktische, beantwortbare Frage zu sein. Es wäre sicherlich besser, die ursprüngliche Form dieser Frage.
Mark Booth

Nun, wie gesagt, meine Kenntnisse der RasPi-Startsequenz sind begrenzt. Ich neige dazu, eine einfache Startdatei auf der SD-Karte zu erstellen und die Anwendung von einem SPI-basierten Flash auf meine eigene Erweiterungskarte zu laden. Ich mag es wirklich nicht, die SD-Karte in meinem System zu haben, aber es scheint die einzige schnelle und schmutzige Möglichkeit zu sein, dies zu tun. Jetzt muss ich lernen, wie man einen einfachen Bootcode für RasPi erstellt :)
FarhadA

4

Ich habe einen IBM S / 390-Emulator in C # erstellt, der theoretisch unter Mono / Linux ausgeführt wird, da er in CIL-Code kompiliert wird und keine nicht unterstützten .NET-Ressourcen verwendet. Dies ermöglicht eingebettete Lösungen, die plattformunabhängige Steuertabellen mit einem benutzerdefinierten Interpreter für Zustandsmaschinen verwenden. Im Hintergrund würde es jedoch immer noch wichtige Linux-Betriebssysteme geben.


2

Beispiel eines vollautomatischen Minimal-Bare-Metal-Blinkers

Getestet auf Ubuntu 16.04 Host, Raspberry Pi 2. Verwendung:

  1. Legen Sie eine SD-Karte in den Host ein

  2. Mach das Bild:

    ./make.sh /dev/mmblck0 p1
    

    Woher:

    • /dev/mmblck0 ist das Gerät der SD-Karte
    • p1ist die erste Partition des Gerätes ( /dev/mmblck0p1)
  3. Legen Sie die SD-Karte in PI ein

  4. Schalten Sie das Gerät aus und wieder ein

Bildbeschreibung hier eingeben

GitHub-Upstream: https://github.com/cirosantilli/raspberry-pi-bare-metal-blinker/tree/d20f0337189641824b3ad5e4a688aa91e13fd764

start.S

.global _start
_start:
    mov sp, #0x8000
    bl main
hang:
    b hang

Haupt c

#include <stdint.h>

/* This is bad. Anything remotely serious should use timers
 * provided by the board. But this makes the code simpler. */
#define BUSY_WAIT __asm__ __volatile__("")
#define BUSY_WAIT_N 0x100000

int main( void ) {
    uint32_t i;
    /* At the low level, everything is done by writing to magic memory addresses. */
    volatile uint32_t * const GPFSEL4 = (uint32_t *)0x3F200010;
    volatile uint32_t * const GPFSEL3 = (uint32_t *)0x3F20000C;
    volatile uint32_t * const GPSET1  = (uint32_t *)0x3F200020;
    volatile uint32_t * const GPCLR1  = (uint32_t *)0x3F20002C;

    *GPFSEL4 = (*GPFSEL4 & ~(7 << 21)) | (1 << 21);
    *GPFSEL3 = (*GPFSEL3 & ~(7 << 15)) | (1 << 15);
    while (1) {
        *GPSET1 = 1 << (47 - 32);
        *GPCLR1 = 1 << (35 - 32);
        for (i = 0; i < BUSY_WAIT_N; ++i) { BUSY_WAIT; }
        *GPCLR1 = 1 << (47 - 32);
        *GPSET1 = 1 << (35 - 32);
        for (i = 0; i < BUSY_WAIT_N; ++i) { BUSY_WAIT; }
    }
}

ldscript

MEMORY
{
    ram : ORIGIN = 0x8000, LENGTH = 0x10000
}

SECTIONS
{
    .text : { *(.text*) } > ram
    .bss : { *(.bss*) } > ram
}

make.sh

#!/usr/bin/env bash

set -e

dev="${1:-/dev/mmcblk0}"
part="${2:-p1}"
part_dev="${dev}${part}"
mnt='/mnt/rpi'

sudo apt-get install binutils-arm-none-eabi gcc-arm-none-eabi

# Generate kernel7.img
arm-none-eabi-as start.S -o start.o
arm-none-eabi-gcc -Wall -Werror -O2 -nostdlib -nostartfiles -ffreestanding -c main.c -o main.o
arm-none-eabi-ld start.o main.o -T ldscript -o main.elf
# Get the raw assembly out of the generated elf file.
arm-none-eabi-objcopy main.elf -O binary kernel7.img

# Get the firmware. Those are just magic blobs, likely compiled
# from some Broadcom proprietary C code which we cannot access.
wget -O bootcode.bin https://github.com/raspberrypi/firmware/blob/597c662a613df1144a6bc43e5f4505d83bd748ca/boot/bootcode.bin?raw=true
wget -O start.elf https://github.com/raspberrypi/firmware/blob/597c662a613df1144a6bc43e5f4505d83bd748ca/boot/start.elf?raw=true

# Prepare the filesystem.
sudo umount "$part_dev"
echo 'start=2048, type=c' | sudo sfdisk "$dev"
sudo mkfs.vfat "$part_dev"
sudo mkdir -p "$mnt"
sudo mount "${part_dev}" "$mnt"
sudo cp kernel7.img bootcode.bin start.elf "$mnt"

# Cleanup.
sync
sudo umount "$mnt"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.