Używasz Raspberry Pi bez systemu operacyjnego Linux?

33

Interesuje mnie wykorzystanie Raspberry Pi jako czysto wbudowanego procesora do programowania aplikacji wbudowanych. Ponieważ Raspberry Pi ma mocny procesor z dość dużą pamięcią, stanowi doskonałą wbudowaną płytę.

Czy można używać Raspberry Pi bez systemu operacyjnego Linux? W jaki sposób mogę to zrobić?

FarhadA
źródło
2
Nie sądzę, żeby to było prawdziwe pytanie i nie pasowało do formatu pytań i odpowiedzi.
Alex Chamberlain,
5
Dlaczego nie? Nie sądzisz, że ludzie mogą pytać o korzystanie z RaPi w jakikolwiek inny sposób niż w systemie Linux? Gdzie na liście regulaminów tej grupy znajduje się sekcja, która mówi, że nie można zadawać takich pytań?
FarhadA,
2
Nie powiedziałem tego. Myślę, że fajnie byłoby zobaczyć niektóre projekty, które nie korzystały z Linuksa, ale tak naprawdę nie zadałeś pytania z jednoznaczną odpowiedzią, a raczej zrobiłeś dyskusję.
Alex Chamberlain,
@AlexChamberlain Zgadzam się - edytowałem to w pytanie. FarhadA - Mam nadzieję, że to jest w porządku, w obecnym stanie byłoby zamknięte. Przejrzyj i popraw moją edycję!
Alex L
Ok, prawda, muszę zadać pytanie, ponieważ jest to strona z
pytaniami

Odpowiedzi:

23

Zajrzałem do programowania na gołym metalu na Raspberry Pi i brzmi to tak, jak chcesz. Istnieje kilka dobrych tematów forum na temat programowania bez systemu metalowego z niektórymi ludźmi, którzy włożyli wiele wysiłku w uruchomienie swojego kodu. Sprawdź, jak zacząć:

Przewodnik po początkach gołego metalu na Raspi

Programowanie RPi na goły metal

Samouczek programowania w języku Bare Metal 1

lub ogólnie możesz odwiedzić forum Bare Metal Raspberry Pi i po prostu się rozejrzeć.

Rozumiem, że będziesz musiał uruchomić komputer z karty SD ze względu na sekwencję rozruchową wbudowaną w układ Broadcom. Próbuję znaleźć link do sekwencji rozruchowej, ale moje google fu nie działa, w razie potrzeby dokonam edycji później.

Dan B.
źródło
3
Ponadto możesz skorzystać z tego samouczka: cl.cam.ac.uk/freshers/raspberrypi/tutorials/os dotyczy budowania systemu operacyjnego, ale jeśli rozszerzysz swoją koncepcję systemu operacyjnego, można go zastosować do systemów wbudowanych.
ohblahitsme
6

Jedynym sposobem, w jaki się uruchomi, jest sformatowanie sdcard z Fat32, przejście z ładowania oprogramowania układowego PowerP do GPU, które wykonuje dowolny plik binarny uzbrajania o nazwie kernel.img, więc jeśli chcesz stworzyć niestandardowe jądro, które robi wszystko, co chcesz, to zrobić w tym momencie

Joe
źródło
3
Tak, ale to nie jest to, co chcę zrobić, chciałbym wiedzieć, czy można zmienić kod rozruchowy układu, więc zamiast iść na kartę SD w poszukiwaniu obrazu rozruchowego, można go zmienić, aby przejść do zamiast tego pamięć flash SPI i rozruch. W ten sposób kod rozruchowy może znajdować się w pamięci flash SPI, takiej jak AT25FS040 lub AT25DF641 lub inne podobne jednostki. W przypadku aplikacji osadzonych wystarczą one do przechowywania całego kodu i można je załadować do pamięci SDRAM po uruchomieniu. ale dużym wyzwaniem jest zmiana kodu rozruchowego ROM.
FarhadA,
9
W ogóle nie o to pytałeś w swoim pytaniu.
Alistair Buxton
Wiem, ale moja wiedza na temat sekwencji rozruchowej RaPi jest ograniczona, w swoim pierwotnym pytaniu miałem właściwe pytanie, zanim zostało ono odrzucone i zmienione na bieżący format.
FarhadA
2
@FarhadA - Twój pierwszy komentarz tutaj wydaje mi się, że byłby to praktyczne i możliwe do odpowiedzi pytanie samo w sobie. Na pewno byłoby lepiej niż oryginalna forma tego pytania.
Mark Booth,
Cóż, jak powiedziałem, moja wiedza na temat sekwencji rozruchowej RasPi jest ograniczona. Skłaniam się do stworzenia prostego pliku rozruchowego na karcie SD i załadowania aplikacji z pamięci flash opartej na SPI na mojej własnej karcie rozszerzeń. Naprawdę nie lubię mieć karty SD w moim systemie, ale wydaje się, że jest to jedyny szybki i brudny sposób na zrobienie tego. Teraz muszę się nauczyć, jak utworzyć prosty kod rozruchowy dla RasPi :)
FarhadA
4

Utworzyłem emulator IBM S / 390 w języku C #, który teoretycznie będzie działał pod Mono / Linux, ponieważ kompiluje się do kodu CIL i nie używa żadnych nieobsługiwanych zasobów .NET. Pozwoli to na osadzone rozwiązania wykorzystujące niezależne od platformy tabele sterujące z niestandardowym interpreterem maszyn skończonych. Mimo to nadal miałby niezbędne Linux O / S w tle.

Kenneth Dakin
źródło
2

Przykład w pełni zautomatyzowanego minimalnego metalowego migacza

Testowane na hoście Ubuntu 16.04, Raspberry Pi 2. Zastosowanie:

  1. Włóż kartę SD na hoście

  2. Zrób zdjęcie:

    ./make.sh /dev/mmblck0 p1
    

    Gdzie:

    • /dev/mmblck0 jest urządzeniem karty SD
    • p1jest pierwszą partycją urządzenia ( /dev/mmblck0p1)
  3. Wstawiona karta SD na PI

  4. Wyłącz i włącz zasilanie

wprowadź opis zdjęcia tutaj

GitHub w górę: https://github.com/cirosantilli/raspberry-pi-bare-metal-blinker/tree/d20f0337189641824b3ad5e4a688aa91e13fd764

start.S

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

main.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"
Ciro Santilli
źródło