Usi Raspberry Pi senza un sistema operativo Linux?


33

Sono interessato a utilizzare Raspberry Pi come unità CPU integrata pura, per lo sviluppo di applicazioni integrate. Poiché Raspberry Pi ha una potente CPU con un bel po 'di memoria, è una scheda integrata eccellente.

È possibile utilizzare Raspberry Pi senza un sistema operativo Linux? Come posso fare questo?


2
Non penso che questa sia una vera domanda e non adatta al formato di domande e risposte.
Alex Chamberlain,

5
Perchè no? Non pensi che le persone possano chiedere di usare RaPi in modo diverso da un sistema operativo Linux? Dove nell'elenco degli statuti di questo gruppo c'è una sezione che dice che non si possono porre tali domande?
Farhad,

2
Non ho detto questo. In realtà penso che sarebbe bello vedere alcuni progetti che non usavano Linux, ma in realtà non hai fatto una domanda con una risposta definitiva, piuttosto hai fatto un punto di discussione.
Alex Chamberlain,

@AlexChamberlain Sono d'accordo - l'ho modificato in una domanda. FarhadA - Spero che vada bene, allo stato attuale sarebbe chiuso. Si prega di rivedere e migliorare la mia modifica!
Alex L

Ok, vero, devo fare una domanda, dato che questo è un sito di domande e
risposte

Risposte:


23

Ho esaminato la programmazione bare metal sul Raspberry Pi e sembra quello che vuoi fare. Ci sono molti buoni argomenti del forum sulla programmazione bare metal con alcune persone che hanno fatto molti sforzi per far funzionare il loro codice. Dai un'occhiata a questi per iniziare:

Guida all'inizio del metallo nudo su Raspi

Programmazione dell'RPi sul metallo nudo

Programmazione in Basic on Bare Metal Tutorial 1

o in generale puoi andare al Bare Metal Forum di Raspberry Pi e sfogliare.

La mia comprensione è che dovrai avviare dalla scheda SD a causa della sequenza di avvio integrata nel chip Broadcom. Sto cercando di trovare il link per la sequenza di avvio ma il mio google fu non funziona, lo modificherò più tardi se lo trovo.


3
Inoltre, puoi usare questo tutorial: cl.cam.ac.uk/freshers/raspberrypi/tutorials/os riguarda la costruzione di un sistema operativo, ma se estendi la tua idea di un sistema operativo, può essere applicato ai sistemi incorporati.
ohblahitsme,

6

l'unico modo in cui verrà avviato è da una sdcard formattata fat32, passa da poweron al caricamento del firmware gpu che esegue qualsiasi file binario arm chiamato kernel.img quindi se vuoi creare un kernel personalizzato che fa qualunque cosa tu stia cercando di fare il suo a questo punto


3
Sì, ma non è quello che voglio fare, vorrei sapere se è possibile modificare il codice di avvio del chip, quindi invece di andare sulla scheda SD per cercare l'immagine di avvio, può essere modificato per andare a una memoria flash SPI e avviare da lì invece. In questo modo, il codice di avvio può trovarsi su una memoria flash SPI come AT25FS040 o AT25DF641 o altre unità simili. Per le applicazioni integrate, queste sono sufficienti per memorizzare tutto il codice e possono essere caricate in SDRAM dopo l'avvio. ma la grande sfida è cambiare il codice ROM di avvio.
Farhad,

9
Non è affatto quello che hai posto nella tua domanda.
Alistair Buxton,

Lo so, ma la mia conoscenza della sequenza di avvio di RaPi è limitata, avevo la domanda corretta nella mia domanda originale prima che fosse votata e modificata in questo formato corrente.
Farhad,

2
@FarhadA - Il tuo primo commento qui mi sembra come se fosse una domanda pratica e rispondente a pieno titolo. Sarebbe sicuramente meglio che la forma originale di questa domanda.
Mark Booth,

Bene, come ho detto, la mia conoscenza della sequenza di avvio di RasPi è limitata. Mi sto orientando verso la creazione di un semplice file di avvio sulla scheda SD e caricare l'applicazione da un flash basato su SPI sulla mia scheda di espansione. Non mi piace davvero avere la scheda SD nel mio sistema, ma sembra essere l'unico modo rapido e sporco per farlo. Ora ho bisogno di imparare come creare un semplice codice di avvio per RasPi :)
FarhadA

4

Ho creato un emulatore IBM S / 390 in C # che teoricamente funzionerà sotto Mono / Linux mentre si compila al codice CIL e non usa alcuna risorsa .NET non supportata. Ciò consentirà soluzioni integrate che utilizzano tabelle di controllo indipendenti dalla piattaforma con un interprete di macchina a stati finiti personalizzato. Avrebbe comunque Linux O / S essenziale in background.


2

Esempio di lampeggiatore minimale completamente automatizzato in metallo nudo

Testato su host Ubuntu 16.04, Raspberry Pi 2. Utilizzo:

  1. Inserisci la scheda SD sull'host

  2. Crea l'immagine:

    ./make.sh /dev/mmblck0 p1
    

    Dove:

    • /dev/mmblck0 è il dispositivo della scheda SD
    • p1è la prima partizione del dispositivo ( /dev/mmblck0p1)
  3. Scheda SD inserita su PI

  4. Spegni e riaccendi

inserisci qui la descrizione dell'immagine

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

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"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.