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ć?


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.


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


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.


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"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.